僕なりの Linux(Ubuntu) 備忘録

# apt

ubuntuの最新パッケージ一覧を取得

```bash
sudo apt update
```

ubuntuの最新パッケージの更新

```bash
# 全て
sudo apt upgrade
# 一覧
apt list --upgradable
# 指定
sudo apt install --only-upgrade <packageName>
```

依存関係が変わり不要となったパッケージの削除

```bash
sudo apt autoremove
```

> 参考：
>
> https://qiita.com/ynott/items/0c3d99cba3753c7d0ae6
>
> https://qiita.com/010Ri/items/ab1b8034c51fe032a5ad
>
> https://oji-cloud.net/2019/06/16/post-2196/



# grep

`grep -n 文字列 ファイルのパス `

オプション-nは行番号を表示する

`grep -C 表示する前後の行数 ファイルのパス`



```bash
grep -nir '文字列' ./パス --exclude="ファイル名"
grep -nir '文字列' ./パス --exclude-dir="ディレクトリ名"
```



一括置換

```bash
grep -rl '置換対象の文字列' ./* | xargs sed -i.bak -e 's/置換対象の文字列/置換後の文字列/g'
```

`sed -i.bak`でバックアップファイル作成



> 参考：
>
> 



# find

基本的な使い方

```bash
find 探したいパス -name ファイル名
```

- ワイルドカードを使う時は`*`を使う



180日前から現在までの、カレント直下の、ディレクトリで、修正されたディレクトリを表示する。

```bash
find  ./ -maxdepth 1 -type d -mtime -180
```



# less

ログの更新をリアルタイムで追跡

```bash
less +F ファイル名
```

grepとlessで対象のみを出力

```bash
grep '検索したい文字列' ファイル名 | less
grep -C 2 '対象の文字列' ファイル名 | less
// -A 前 -B 後 -C 前後
```

lessの中で検索

```bash
/検索したい文字列
```



# lftp

よく使うコマンド達

```bash
lftp -u username,password host
lftp sftp://${HOST} -p ${PORT} -u ${USER}

# downloadする
get filename
mget filenames

# Uploadする
put filename
mput filename

# カレントディレクトリをdownload
mirror -F dirname

#カレントディレクトリをupload
mirror -R
```



設定ファイル（`.lftprc`）

- 自己証明やIPが動的に動くサーバへの接続時に接続を拒否される時がある。つまり ssl/tls プロトコルでの接続ができない時がある。

    ```diff
    + set ssl:check-hostname no
    + set ssl:verify-certificate no
    ```

    1. `ssl:check-hostname no`: この設定は、lftpがSSL/TLS接続でサーバーの証明書を検証する際に、その証明書のホスト名が接続先のホスト名と一致するかどうかのチェックを行わない。
    2. `ssl:verify-certificate no`: この設定により、lftpはSSL/TLS接続でサーバーから提供される証明書の信頼性（証明書が信頼できる発行元によって署名されているかどうか）を検証しない。



# sftp

```bash
# 接続する
sftp username@host
> password

sftp sshHost

# ダウンロードする
get fileName
get -r dirName
```

# diff

Linuxdiff

```bash
diff -uwBb ./{main,recruit}/cms-admin/.htaccess
```



vim diff

```bash
vimdiff ./{main,recruit}/cms-admin/.htaccess

開いた状態で :vertical diffsplit recruit/cms-admin/.htaccess` `
```



# file

- テキストファイル

    文字だけで構成される、人間が読むことのできるファイル

- バイナリファイル

    テキストファイル以外の人間が読むことのできないファイル

拡張子：人間が種類を区別しやすくするための印。中身と関係ない

ファイルシグネチャ： ファイルの先頭に数バイト決められた文字列が並んでいる。OSはこれで種類を判断する 

```bash
file {filename}
```

でファイルの情報を表示。textだったらテキストファイル、dataだったらバイナリファイルか表示不能なファイル



# crontab

```bash
[artis@sitexweb2 crontab]$ crontab -l
0  * * * * /usr/bin/php /data/www/app/cli-generator.php 1>/dev/null 2>>/home/hoge/tools/crontab/error.log
30 0 * * * /usr/bin/sh  /home/hoge/tools/backup/backup.sh 1>/dev/null 2>>/home/hoge/tools/backup/error.log
// cronに設定されている内容をリストで出力する

[artis@sitexweb2 crontab]$ crontab -l > crontab.txt
// cronに設定されている内容をcrontab.txtに書き込む(最新とtxtに書き込まれている内容に差がある場合があるから)

[artis@sitexweb2 crontab]$ vim crontab.txt
// 任意の行を削除する

[artis@sitexweb2 crontab]$ crontab < crontab.txt
// crontab.txtに書き込んだ内容をcrontabに反映する。

[artis@sitexweb2 crontab]$ crontab -l
30 0 * * * /usr/bin/sh  /home/hoge/tools/backup/backup.sh 1>/dev/null 2>>/home/hoge/tools/backup/error.log
```



# ping

```bash
ping [option] <host>
ping -c 5 www.google.com
```



# ftp





# su

```bash
su
> password: rootユーザーのパスワード
```

でrootユーザーになれる。

プロンプトの記号が `$`→ `#`になる。

```bash
exti
Ctrl + C
```

でログアウト



# sudo

```bash
sudo [option] command
> password: 一般ユーザーのパスワード

[option]
-b 指定したコマンドをバックグラウンドで実行
-l そのユーザーに対して許可されているコマンド一覧表示
-u ユーザーを指定して実行
```

そのコマンドだけroot権限で実行できる。



# ユーザー・グループ

調べ方

1. 対象のディレクトリの所有者とグループを確認

    ```bash
    grep "グループ名" /etc/group
    # or
    getent group グループ名
    ```

    ```bash
    グループ名:パスワードフィールド（通常は使用されないためxが表示される）:グループID:グループメンバーのリスト
    ```

​	という出力がされる。そのグループに含まれる全ユーザーの一覧である。

2. そのグループに含まれているユーザーのみが、そのグループに付与されている権限を行使できる。つまり、出力された一覧に、期待しているユーザーがいない場合、そのユーザーはothersとして扱われる。



# 権限

wrx

- drwxrwxrwx 777  ディレクトリ

- frwxr-xr-x 755 ファイル(fのかわりに - の可能性あり)

- r 4 w 2 x 1  これの足し算で権限がきまる

    ```bash
    chmod 777 file名・directory名
    chmod -R 777 directory名
    ```

- 読み取り r

    - ファイル：内容を閲覧できる
    - ディレクトリ：それ内のファイル名やディレクトリ名の一覧を閲覧できる

- 書き込み w

    - ファイル：内容を変更・削除できる
    - ディレクトリ：それ内に新しいファイル￥ディレクトリを作成、既存のものを削除できる

- 実行 x

    - ファイル：プログラムやスクリプトなら、実行できる
    - ディレクトリ：それ内にcdで入ることができる



Apacheサーバーの権限

- Apache(HTTPD)プロセスは特定のユーザー（*apache*や*www-data*など）として実行される。Webサーバーがアクセスできるファイルやディレクトリに限定し、最小限の権限のみを与えるべき。
- 例えば、Webサイトのファイルにはrを与え、ログファイルやアップロードされたファイルにはwを与える。プログラムやスクリプトには必要なものにxを与える。



# ln

基本的な使い方

```bash
ln -s <targetDir/File> <linkName>
```

```bash
# 同じ名前のシンボリックリンクがカレントに貼られる
ln -s <targetDir>
```



シンボリックリンクの名前を変更したい時は、一旦削除して再度リンクを貼るのような手順を踏む

```bash
rm <linkName>
ln -s <targetDir> <linkName>
```





# WSL Shutdown

```bash
wsl --shutdown
```



# ファイル

そのファイルの情報を調べる

```bash
stat <filename>
```



標準出力をファイルに書き込む

```bash
ls -a > <file>
```



ファイル名のみ知りたい

```bash
cd targetDir
ls -F | grep -v / | sed s/\*$//g
```



ファイルの一部分のみ見たい

```bash
tail test.log -n 100
head test.log -n 100
```



２ファイルの中身を比較

```bash
# file1 と file2 をソートされた状態で比較する
sort file1.txt > file1_sorted.txt
sort file2.txt > file2_sorted.txt

# file1にはないがfile2にある行を表示
comm -13 file1_sorted.txt file2_sorted.txt
```

- ここでの `comm` コマンドのオプションは以下の意味がある：

    - `-1` : file1 にのみ存在する行を表示しない

    - `-3` : 両方のファイルに存在する行を表示しない




ファイルの行数

```bash
wc -l <file>
```



ファイル数を数える

```bash
ls -1 | wc -l
find . -type f | wc -l
```



# curl

```bash
curl -Ss -I -u "username:password" https://hoge.co.jp
```

`-Ss`・・・サーバーからのエラーメッセージを表示する

`-I`・・・HTTPヘッダーのみを取得する

`-u`・・・Basic認証で使用するIDPWを指定できる



# PHPの情報を調べる

- サーバーにインストールされている、PHPの情報や *PHP.ini* の情報を調べたい時に使います。

- 権限によっては見れない可能性もあるので注意。

      

`phpinfo()`関数を使う

- コマンドラインから直接`phpinfo()`関数を実行する

    ```bash
    php -i
    php -i | grep memory_limit
    ```

confファイルを直接確認する

- `php.ini`ファイルがどこにあるか確認した上で、直接ファイルの内容を確認する

    ```bash
    php --ini
    cd path_to/
    less -S php.ini
    ```

特定の設定値だけを確認する

- PHPのCLIツールを使用して直接確認できる

    ```bash
    php -r "echo init_get('memory_limit');"
    ```

    

# cat

- もちろんファイルの閲覧に使う（標準出力で見る）
- 標準出力なので、`>` を用いることで、ファイルに記述できる
- もともとはファイルを連結して標準出力に出力する、という意味

ファイルの閲覧

```bash
cat file1
```

別ファイルへの書き込み

```bash
cat file1 > file2
```

別ファイルへの追記

```bash
cat file1 >> file2
```

ファイルを連結して出力

```bash
cat file1 file3 file3
```

行番号を付けて出力

```bash
cat -n file1
```

標準入力での入力を書き込む

```bash
cat > file
hoge
fuga
```

ヒアドキュメントを利用して書き込む

```bash
cat <<EOF > file
hoge
fuga
moga
EOF
```



> 参考：
>
> https://qiita.com/sudo00/items/d910fbf5ff81bb3fee21
>
> https://eng-entrance.com/linux_command_cat