よく使うlinuxコマンドたち

油断するとすぐ忘れる…
初心者の友人に見せる目的もあるので超基本的なものもあります

随時更新予定


#超超超基本
- `cd` : ディレクトリを移動。/から始めると絶対パス
- `pwd`: カレントディレクトリの絶対パスを表示
- `ls`: カレントディレクトリのファイル/ディレクトリ一覧表示。`-l`オプションでパーミッションも見れる。`-a`オプションで隠しファイルも表示。だいたい`ls -la`で使ってる
- `rm`: ファイルの削除。ディレクトリは-rオプション
- `mv {移動元ファイルパス} {移動先ファイルパス}`: ファイル/ディレクトリの移動。どちらも同じ階層を指定すると後に書いたファイル名にリネーム
- `vi {ファイルパス}`: ファイル編集
- `cat {ファイルパス}`: ファイル閲覧

#検索
検索文字列は正規表現使用可、検索パスは相対でも絶対でもOK。`.`（カレントディレクトリ）を使うことが多い

- `ls | grep {検索文字列}`：カレントディレクトリ直下のファイル検索
- `find {検索対象パス} -name {検索文字列}`：ファイル名に検索文字列が入ってるもの検索。検索文字列は完全一致だけど、正規表現も使える
- `grep {検索文字列} -rl {検索対象パス}`：ファイルの中身に検索文字列が入ってるもの検索。`-rli`にすると大文字小文字の区別なく検索する

#容量、ファイルサイズ確認
オプション無しだとbyte単位なので非常に見辛い…　`-h`オプションをつけると見慣れた単位で出してくれる

- `df` ： ディスク全体の使用状況を表示。オプションをつければいい感じの単位で見れる。
- `du`：フォルダとその中にあるファイルの容量を表示。`-s`オプションでファイルの容量は表示せずフォルダの総容量だけ出してくれる。単位のオプションは`df`と同じ
- `free` ： メモリの使用状況を表示。`-m`オプションをつければいい感じの単位で見れる。
- `sudo du -gxd 5 / | awk '$1 >= 5{print}'`：5Gを超えるファイルを出力してくれる

（最後のは https://qiita.com/twipg/items/4cf763aa0a09ca1e387f から参照しました。おかげで非常に捗っております…ありがとうございます…）

#ssh関係
鍵の扱いとパーミッション（詳しくは後述）にご注意を…

- `ssh-keygen -t rsa -C "{メールアドレス}"` : 秘密鍵と公開鍵をカレントディレクトリに生成
- `scp {コピー元ファイルのパス} {コピー先ファイルのパス}`: ssh接続した上で指定ファイルをコピー。ディレクトリは`-r`オプションが必要
- `ssh (-i {秘密鍵までのファイルパス}) {ユーザー名}@{ドメイン名 or IPアドレス}`: sshログイン。あらかじめ公開鍵の設置とユーザー追加が必要。`.ssh/config`に設定されている場合、`-i`オプションはいらない。そうでなければ必須
- `logout`: sshのログアウト

#rsync
とてもはまりやすい（当社比）のでちゃんとメモ
参考：https://qiita.com/bezeklik/items/22e791df7187958d76c1

`rsync {同期元パス} {同期先パス}`でディレクトリやファイルを同期する。
sshを用いてサーバー間の同期も可能で、丸々コピーしてるわけではないので`scp`より高速
その特性から、ある程度まとまってるディレクトリを指定して同期する頻度の方が高い
（バックアップとか移行作業とか）

よく使うのは
`rsync -avz path/to/origin_dir user@server:path/to/copy_dir/`
の形
同期元パスの末尾に`/`を入れるとフォルダ以下だけしか同期されない。
上記の例で同期元を`origin_dir/`とした場合は同期先に`origin_dir`フォルダが作られないのでフォルダ構成が変わる場合がある。
上記の例（同期元末尾に`/`なし）だと`copy_dir`の下に`origin_dir`が作られる（はず…）
サーバー移行とかで全部同じ構成にしたいときは注意

`/`を入れると`/*`と解釈されるものと覚えればよさげ
参考：http://koseki.hatenablog.com/entry/20090424/rsync

`-a` を指定することでなるべくコピー元のファイルと同一条件でコピーする。
`-v` で詳細を出力する。
`-z`でデータ転送時に圧縮

`-h`をつけるとファイルサイズの情報も表示してくれる
ちなみに`-n`をつけるとdry-runしてくれる。

#パーミッション、ユーザー、グループ関係
参考
https://kazmax.zpp.jp/linux_beginner/etc_group.html
https://qiita.com/niiyz/items/53aa4195dcc69db2052b

- `chmod {数字} {ファイル名}` あるいは `chmod {u/g/o}{+/-}{r/w/x} {ファイル名}`: パーミッション変更。後者の方が直感的でわかりやすい。
例えば、chmod ug+w hoge.txtのように使えば、「hoge.txtの所有者、グループに書き込み権限付与」の意味
- `chown {ユーザー名} {ファイル名}`: ファイルの所有者変更。ディレクトリは`-R`オプション
- `chgrp {グループ名} {ファイル名}`: ファイルのグループ変更。ディレクトリは-Rオプション
- `sudo su`: スーパーユーザーに変更。変更後に`exit`すれば抜けられる
- `cat /etc/group | grep {特定のユーザー or グループ}`：指定したユーザー/グループの現在の状況確認
- `useradd {ユーザー名}`：ユーザーの追加。オプションでユーザーディレクトリを作るかどうか選べる
- `usermod -aG {グループ名} {ユーザー名}`：指定のユーザーを指定のグループに追加。`-a`がないとグループの書き換えになる

パーミッションエラーで書き込めない/開けないときはとりあえず上記で権限なり所有者なりを変えればいけることが多い。
もちろん与えてはいけない権限もある（ログファイル、設定ファイルの書き込み権限とか）のでそこは適宜。
特にssh関係のファイルはパーミッションを間違えるとログインに失敗する。（その場合`public key denied`とだけ言われることが多いので気づきにくい…）

#apache関係
- `sudo tail -f /var/log/httpd/error_log`: エラーログ垂れ流し（ほかのログも`/var/log/`以下に入ってる）
- `sudo apachectl graceful` あるいは `sudo apachectl restart`: 再起動

（apachectlの部分はhttpdの場合もあるし、パスが通っていない場合は絶対パスで指定する必要あり。構成によって変わる）
（gracefulの方は現在きている通信が終わってから再起動するのでより安全。）

#curl
- `curl -w '\n' 'http://hoge.com/apis/fuga' --data 'piyo=test' -XPOST`

指定したURLに任意のパラメータをつけてGET/POSTできる。例えば上記だと`http://hoge.com/apis/fuga`に`piyo=test`のパラメータをつけたPOSTを送れる

#プロセス関係
##実行中のプロセス表示
参考：https://qiita.com/shuntaro_tamura/items/4016868bda604baeac3c
コマンド自体は`ps`
オプションをつけて`ps aux`の形にすることが多い
それぞれ
- `a`：自分以外のユーザーのプロセスも表示する
- `u`：ユーザー名と開始時刻を表示する
- `x`：制御端末のないプロセスの情報も表示する

さらに特定のアプリケーションのプロセスを見たければ`ps aux | grep httpd`のようにすればいい感じ

##プロセス終了
`kill {プロセスのpid}`
https://eng-entrance.com/linux-command-kill
にオプションがいっぱいまとめられてました。pidは`ps aux`で確認できる

`kill -KILL {プロセスのpid}`とすれば強制終了させる

#IPアドレス関係
- `dig {ドメイン名}`：指定のドメインが向いてるIPを調べる。`ANSWER SECTION`に検索結果のIPが表示されるが、これが表示されない＝名前解決できてないということなので注意。`dig -x {IPアドレス}`で逆引きもできる。
- `curl inet-ip.info`：今いるところのグローバルIPを調べる