#
ドキュメント

Document

自分のための備忘録です。

Linux基本コマンド

find

例1

# 直下のpdfファイルを検索
$ find . -maxdepth 1 -name "*.pdf"

例2

$ find ~ -maxdepth 1 -name "*bash*"

例3 ファイルのみ変更

$ find -type f -print | xargs chmod 664

grep

# iオプションを抽出
man curl | grep -E '-i,'

curl

$ crul http://www.info-town.jp
# レスポンスヘッダを表示
$ curl -i http://www.info-town.jp
# レスポンスヘッダのみ表示
$ curl -I http://www.info-town.jp
# 進捗を表示しない
$ curl -s http://www.info-town.jp
# ファイルへ保存
$ curl -o http://www.info-town.jp /path/to/file

zip

ディレクトリを圧縮。

$ zip -r foo.zip foo/

tar

gzipは、ファイルの圧縮はできるがディレクトリの圧縮はできない。
ディレクトリを圧縮する場合はtarでアーカイブしてからgzip圧縮する(tarのzオプション)。

ディレクトリ圧縮は、ターゲットのディレクトリがある場所までcdしてから実行するのが安全。

# 圧縮
tar czf <created>.tar.gz source_directory
# 解凍
tar xzf foo.tar.gz

上記の方法はシンボリックリンクのリンク先はアーカイブに含めない。

オプション

-h, --dereference
follow symlinks; archive and dump the files they point to

$ man tar

解凍したファイルのfilectime()|filemtime()

  • filectime()は、解凍した日付
  • filemtime()は、サーバーのタイムスタンプを維持

awk

Awkの正規表現はERE。

開始と終了にマッチする複数の行を取得。

$ awk '/<start pattern>/,/<end pattern/' foo.log
# 行番号を表示
$ awk '/<start pattern>/,/<end pattern/ {print NR, $0}' foo.log

例 auth.logからログインからログアウトを取得

$  awk '/2018-12-23T05:12:05.585870\+00:00 ip-10-0-0-200 sshd\[2772\]: pam_unix\(sshd:session\): session opened for user ubuntu by \(uid=0\)/,/2018-12-23T05:12:31.580108\+00:00 ip-10-0-0-200 sshd\[2772\]: pam_unix\(sshd:session\): session closed for user ubuntu/' auth.log

# 表示結果
2018-12-23T05:12:05.585870+00:00 ip-10-0-0-200 sshd[2772]: pam_unix(sshd:session): session opened for user ubuntu by (uid=0)
2018-12-23T05:12:05.598987+00:00 ip-10-0-0-200 systemd: pam_unix(systemd-user:session): session opened for user ubuntu by (uid=0)
2018-12-23T05:12:05.603060+00:00 ip-10-0-0-200 systemd-logind[729]: New session 70759 of user ubuntu.
2018-12-23T05:12:15.838193+00:00 ip-10-0-0-200 sudo:   ubuntu : TTY=pts/0 ; PWD=/home/ubuntu ; USER=root ; COMMAND=/usr/bin/apt update
2018-12-23T05:12:15.839194+00:00 ip-10-0-0-200 sudo: pam_unix(sudo:session): session opened for user root by ubuntu(uid=0)
2018-12-23T05:12:20.712848+00:00 ip-10-0-0-200 sudo: pam_unix(sudo:session): session closed for user root
2018-12-23T05:12:31.579074+00:00 ip-10-0-0-200 sshd[2891]: Received disconnect from 124.18.18.2 port 62931:11: disconnected by user
2018-12-23T05:12:31.579439+00:00 ip-10-0-0-200 sshd[2891]: Disconnected from user ubuntu 124.18.18.2 port 62931
2018-12-23T05:12:31.580108+00:00 ip-10-0-0-200 sshd[2772]: pam_unix(sshd:session): session closed for user ubuntu

jq

curl https://quartetcom.zendesk.com/api/v2/users.json \
    -u h-sawai@quartetcom.co.jp:Za0em1007K | jq "." >  users.json

整形されていないJSONファイルoriginal.jsonを整形してformatted.jsonへ出力。

$ cat original.json | jq "." > formatted.json

ln -s

$ ln -s シンボリックリンク元 リンク先(シンボリックリンク=ショートカット)
  • シンボリックリンクをディレクトリに設定した場合、はリンク元/リンク先は同期される。
  • どちらかのディレクトリにファイルが追加されると、もう一方のディレクトリにも同期される。
  • どちらかのディレクトリのファイルを削除すると、もう一方のディレクトリからも同期される。
  • シンボリックリンクがディレクトリの場合には、シンボリックリンク(ディレクトリ)を削除した場合は、リンク元のディレクトリ(および内部のファイル)は削除されない。

重要 シンボリックリンク元、リンク配置先ともに絶対パスで指定する。相対パスだ希望どおりに動かない場合がある。 https://tweeeety.hateblo.jp/entry/20121129/1354192716

sed

$ sed -E -i "" s@https://example\.com@http://localhost:8888@g dump.sql

chmod

カレントディレクトリ内のディレクトリ・ファイルに再帰的に書き込み権限を付与。

$ chmod -R g+w ./*

なぜか画像ファイル(.jpg, .png)には上記では権限を付与できなかった。 以下のコマンドで付与。 以下のコマンドはディレクトリも644に変更してしまうため、ディレクトリがないことを確認後に実行。

$ chmod 664 ./*

scp

SCP(Secure Copy)は、SSHを使用してサーバからファイル(ディレクトリ)をダウンロードしたり、サーバにファイル(ディレクトリ)をアップロードする。

ダウンロード

ファイルをダウンロードする。

$ scp -P 10022 ubuntu@intra.quartetcom.co.jp:/path/to/file /path/to/local/file

フォルダをダウンロードする。
中身もダウンロードするときは、-rオプションを忘れない。

// intra.quartetcom.co.jpからフォルダごとローカルへダウンロードする例(オプション -r)を忘れない
scp -r -P 10022 ubuntu@intra.quartetcom.co.jp:/path/to/dir /path/to/local/dir

アップロード

scp -P 10022 /path/to/local/file ubuntu@intra.quartetcom.co.jp:/path/to/file

権限がないファイルをダウンロード

例として/var/log/auth.log関連をダウンロード。

$  ls -al /var/log | grep auth*

-rw-r-----  1 syslog adm    14372073 12月 14 12:05 auth.log
-rw-r-----  1 syslog adm    14302868 12月  9 06:25 auth.log.1
-rw-r-----  1 syslog adm     1232435 12月  3 06:25 auth.log.2.gz
-rw-r-----  1 syslog adm      720311 11月 25 06:25 auth.log.3.gz
-rw-r-----  1 syslog adm     1106865 11月 19 06:25 auth.log.4.gz

source_directoryへ一括コピー。

$ cd /var/log
$ sudo cp auth* source_directory

source_dirctorytarで圧縮。

$ sudo tar czf foo.tar.gz source_directory

foo.tar.gzの権限を変更。

$ sudo chown h-sawai foo.tar.gz

ローカルにダウンロード

$ scp -P 10022 h-sawai@lisket-stage:/var/log/foo.tar.gz ./foo.tar.gz

gatewayを仕様している場合

gatewayを使っているときは.ssh/configに設定したHostの値(例:lisket-web)を使う必要がある。

$ scp h-sawai@lisket-web:/home/h-sawai/whenever.bak20181015.log ./whenever.bak20181015.log

.ssh/config

Host lisket-web
Hostname 10.0.1.147
User h-sawai
StrictHostKeyChecking=no
ProxyCommand ssh -W %h:%p lisket-gateway

getwayを利用していないときは、.ssh/configのHostNameを指定すればよい。

$ mysqldump -uconststeps -p conststeps --single-transaction > /home/ubuntu/conststeps20180808.sql
$ scp -P 10022 ubuntu@intra.quartetcom.co.jp:/home/ubuntu/conststeps20180808.sql /Users/h-sawai/workspace/src/github.com/conststeps/conststeps20180808.sql

.ssh/config

Host intra
HostName        intra.quartetcom.co.jp
User            h-sawai
Port            10022

ps

$ ps aufx
  • f ASCII art process hierarchy (forest).
  • a Lift the BSD-style "only yourself" restriction, which is imposed upon the set of all processes when some BSD-style (without "-") options are used or when the ps personality setting is BSD-like. The set of processes selected in this manner is in addition to the set of processes selected by other means. An alternate description is that this option causes ps to list all processes with a terminal (tty), or to list all processes when used together with the x option.
  • x Lift the BSD-style "must have a tty" restriction, which is imposed upon the set of all processes when some BSD-style (without "-") options are used or when the ps personality setting is BSD-like. The set of processes selected in this manner is in addition to the set of processes selected by other means. An alternate description is that this option causes ps to list all processes owned by you (same EUID as ps), or to list all processes when used together with the a option.
  • u Display user-oriented format.

参考リンク

  • https://linuxjm.osdn.jp/html/procps/man1/ps.1.html
  • kthreadd

du

500MB以上のフォルダをルートから5階層走査して抽出。

$  du -g -x -m -d 5 | awk '$1 >= 500{print}'

re. https://qiita.com/silva114jp/items/6e1e64e9aeaca62b1c04

rm

ここではディレクトリ、特にシンボリックリンクを含むディレクトリの削除に絞って記載する。

$ ln -s /pth/to/dirA/sub /path/to/dirB/sub
dirA
    |
    |- sub 
        |
        |-- foo.txt
    
dirB
    |
    |-- text.txt
    |
    |-- sub -> dirA/sub
  • rm -r dirB/sub => シンボリックリンクの参照先(dirA/sub)は削除されない
  • rm -r dirB/sub/ => 【注意】 末尾にスラッシュありの場合はシンボリックリンクの参照先(dirA/sub)が削除される(基本的にこの形式は使用しない)
  • rm -r dirB => 内部のシンボリックリンクの参照先(dirA/sub)は削除されない。
  • rm -r dirB/ => 末尾にスラッシュありの場合に、内部のシンボリックリンクの参照先(dirA/sub)も削除されるのかを要確認(仮に参照先が削除されなくてもディレクトリの末尾にスラッシュ(/)をつけるのは非常に危険)

以上シンボリックリンクを含むディレクトリの削除は末尾にスラッシュ(/)を付与しない

# シンボリックリンクを含むディレクトリの削除は末尾にスラッシュ(`/`)を付与しない
# @see https://github.com/deployphp/deployer/blob/master/recipe/deploy/cleanup.php
OK $ rm -rf /path/to/dir
# 以下は非常にリスクが高いので使用しない
NG $ rm -rf /path/to/dir/   

ref.

  • https://stackoverflow.com/questions/62637046/how-to-make-rm-not-delete-symbolic-links
  • https://mimirswell.ggnet.co.jp/blog-165

cp

cp -Rは、環境によってシンボリックリンクの扱いが異なる。

  • UNIX/Macは、シンボリックリンクを実体ファイルとしてコピー(コピー先に実体ファイルがコピー)
  • Linuxは、シンボリックリンクをシンボリックリンクとしてコピー(コピー先にシンボリックリンクがコピー)

Linuxでシンボリックリンクを実体ファイルとしてコピーする場合は、Lオプションを使用して$cp -RLを使う。