Memo

メモ > サーバ > 各論: コマンド

■由来
Linuxコマンドは単語の意味を理解するとグッと身近なものになる http://qiita.com/tetsuya/items/46888bb4dfc8a6bfef02 新版 UNIX/Linux 由来/読み方辞書 http://x68000.q-e-d.net/~68user/unix/unix-term-dic.html 由来で覚えるlinux用語集 - Qiita https://qiita.com/essei0-0/items/65d0584ed28c951e5e2b 意外と知らないUnixコマンドの正式名称集 #入門 - Qiita https://qiita.com/kokiiii/items/5416793d4d846a98d093 あの日見たLinuxのディレクトリやコマンドのフルネームを僕達はまだ知らない - Qiita https://qiita.com/to-fmak/items/61d515762ab03bac57c9
■シェルスクリプトを使う
初心者向けシェルスクリプトの基本コマンドの紹介 - Qiita https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337 bashで始めるシェルスクリプト基礎の基礎 (1/2):Windowsユーザーに教えるLinuxの常識(8) - @IT https://www.atmarkit.co.jp/ait/articles/0202/05/news001.html /usr/bin/envを使って移植性の高いスクリプトを書く方法 | マイナビニュース https://news.mynavi.jp/article/20180620-650003/ bash の select は令和の時代も役に立つ, その一例 - ようへいの日々精進XP https://inokara.hateblo.jp/entry/2020/04/18/083329 Bash Scriptの作法 - Qiita https://qiita.com/autotaker1984/items/bc758fcf368c1a167353 なぜ今シェルスクリプトを学ぶのか・シェルスクリプトのTips - 理系学生日記 https://kiririmode.hatenablog.jp/entry/20220430/1651309058 【永久保存版】シェルスクリプト完全攻略ガイド #初心者 - Qiita https://qiita.com/osw_nuco/items/a5d7173c1e443030875f 仕組みと一緒に作りながら学ぶシェル #Bash - Qiita https://qiita.com/S4nTo/items/841fd36c615f7d103047
■ファイル・ディレクトリ操作
■ディレクトリ移動
$ cd … ホームディレクトリへ移動 $ cd - … 直前のディレクトリへ移動
「cd」は「Change Directory」の略 作業ディレクトリを移動するcdコマンドの詳細まとめました【Linuxコマンド集】 https://eng-entrance.com/linux-command-cd ■ファイルやディレクトリを一覧表示
$ ls $ ls -l … 詳細情報とともに一覧表示(「ll」としても同様) $ ls -t … 修正時刻の昇順に一覧表示 $ ls -lt … 詳細情報とともに修正時刻の昇順に一覧表示(「ll -t」としても同様) $ ls -tr … 修正時刻の降順に一覧表示 $ ls -ltr … 詳細情報とともに修正時刻の降順に一覧表示(「ll -tr」としても同様)
「ls」は「List Segments」の略 lsコマンドの使い方と覚えたい15のオプション【Linuxコマンド集】 https://eng-entrance.com/linux_command_ls ■ファイルサイズを適当な単位で表示
$ ll 合計 72 -rwxrwxr-x 1 refirio refirio 6424 5月 4 21:49 2016 test -rw-rw-r-- 1 refirio refirio 82 5月 4 21:40 2016 test.c -rw-rw-r-- 1 refirio refirio 1504 5月 4 21:43 2016 test.o -rw-rw-r-- 1 refirio refirio 444 5月 4 21:41 2016 test.s $ ll -h 合計 72K -rwxrwxr-x 1 refirio refirio 6.3K 5月 4 21:49 2016 test -rw-rw-r-- 1 refirio refirio 82 5月 4 21:40 2016 test.c -rw-rw-r-- 1 refirio refirio 1.5K 5月 4 21:43 2016 test.o -rw-rw-r-- 1 refirio refirio 444 5月 4 21:41 2016 test.s
■ファイルの表示
$ vim test.txt … Vimを起動 $ vi test.txt … 大抵の環境ではVimが立ち上がる $ view test.txt … Vimの読み取り専用モードで表示(Vimの行番号やカラースキーマが適用される) $ cat test.txt … 内容をすべて表示 $ more test.txt … スペースキーで1ページずつ表示 $ less test.txt … ↑↓で1行ずつ表示。スペースキーで1ページずつ表示
Linuxでテキストファイルを閲覧できるコマンドにはいろいろあるよ - 無理しない感じ http://hogesuke.hateblo.jp/entry/2014/04/08/041951 コマンド less ファイル表示プログラム (ページャ) http://x68000.q-e-d.net/~68user/unix/pickup?less インフラエンジニアとしてよく使うコマンド集 http://qiita.com/sion_cojp/items/04a2aa76a1021fe77079 ■ファイルを作成
$ touch test.txt … test.txt を作成 $ touch `date +%Y%m%d_%H-%M-%S`.txt … 日時をファイル名としたファイル(20160905_13-26-19.txt など)を作成
以下のようにcatを使えば、ファイルの内容を指定して新規作成できる ただしインデントの制御が完全ではなかったり、変数展開されたりなどがある あくまでも簡易な手段として使える程度のものとなりそう
$ cat <<EOF > test.txt … ファイルをまるごと書き換える ABCDEFG HIJKLMN EOF $ cat <<EOF >> test.txt … ファイルの末尾に追加して書き込む OPQRSTU VWXYZ EOF
catコマンドでファイルに書き込みをする | ハックノート https://hacknote.jp/archives/13756/ 知ると便利なヒアドキュメント - Qiita https://qiita.com/kite_999/items/e77fb521fc39454244e7 ■ファイルを複製
$ cp test1.txt test2.txt $ cp -rp test1.txt test2.txt … pオプションも付けると、コピー元の所有者ID、グループID、アクセス権、最終更新日時、最終アクセス日時をコピー元と同じにしてコピーする
■ファイル名を変更(ファイルを移動)
$ mv test1.txt test2.txt
■ファイルを一括移動
$ mv /var/www/vhosts/xxx/html/* /var/www/vhosts/yyy/html
■ファイルを削除
$ rm test.txt … test.txt を削除 $ rm test_*.txt … ワイルドカードで一括削除 $ rm -f test_*.txt … 確認なしに削除
■ファイルをカラにする
$ cp /dev/null lsyncd.log
既存のファイルを空にするLinuxコマンド - Qiita https://qiita.com/nabewata07/items/e67d008a1f10429bb3bf ■ファイルのタイムスタンプを変更
$ touch -t 201504201230 test.txt … test.txtのタイムスタンプを2015年4月20日の12:30に設定
■ファイルを検索
$ find ./ -type f -print | xargs grep 'ABC' … 文字列「ABC」が含まれるファイルを表示 $ find ./ -name test.txt -ls … ファイル名が「test.txt」のファイルを検索 $ find ./ -name test* -ls … ファイル名が「test」から始まるファイルを検索 # find / -name php.ini … 「php.ini」ファイルの場所を表示
findコマンドの使い方: UNIX/Linuxの部屋 http://x68000.q-e-d.net/~68user/unix/pickup?find xargsでfindの結果をgrepに渡している https://hydrocul.github.io/wiki/commands/xargs.html findコマンドの使い方を簡単に理解するための7つのルール+実践的な知識 #Linux - Qiita https://qiita.com/ko1nksm/items/7fec71f78a394a80ed2b 以下のように、grepでもファイルを検索できる rでディレクトリから検索、Eで正規表現、iで大文字小文字を区別しない
$ grep -r "検索したい文字" ./ $ grep -r -i -E "正規表現で検索したい文字" ./
以下のようにすると 「extends Controller」を含むファイルの一覧から、「Carbon」を含むファイル一覧を表示 となる(要検証)
$ find ./ -type f -print | xargs grep "extends Controller" -l | xargs grep "Carbon" -l
以下はさらに拡張子でも絞り込んだ例
$ find ./ -type f -name "*.php" | xargs grep "extends Controller" -l | xargs grep "Carbon" -l
逆引きUNIXコマンド/grepでパターンヒットがあったファイルのファイル名のみ表示する方法 - Linuxと過ごす https://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/grep... find http://codezine.jp/unixdic/w/find 【linux】更新日が最近のファイルを見つける(findコマンド) https://www.softel.co.jp/blogs/tech/archives/1332 【Linux】複数あるファイルの中から特定の文字列を検索するコマンド http://kawatama.net/web/1141 お仕事で知っておけば便利。コマンドを叩くだけで使えるワンライナーチートシート http://qiita.com/taiyop/items/bfeeb41259cb0d083d88 The Silver Searcher のススメ http://qiita.com/thermes/items/e1e0c94e2875df96921c 検索対象のディレクトリを複数指定したり、ワイルドカードで指定したりもできる 以下は7月10日のログディレクトリから「太郎」という文字を含むファイルを探す例
# find 20180710/ -type f -print | xargs grep '太郎'
以下のようにすると、20180710〜20180713を対象にできる(個別に指定する例)
# find 20180710/ 20180711/ 20180712/ 20180713/ -type f -print | xargs grep '太郎'
以下のようにすると、20180710〜20180719を対象にできる(ワイルドカードで指定する例)
# find 2018071*/ -type f -print | xargs grep '太郎'
以下のようにすると、ファイルの更新日時をもとに検索できる
$ find ./ -mtime -11 -ls … 更新日が10日以内のファイルを表示 $ find ./ -mtime +7 -and -mtime -15 -ls … 更新日が一週間前より古くて二週間前より新しい
mtimeはファイルの更新日時 ctimeはファイル名やパーミッションなども含めた更新日時 UNIXの部屋 コマンド: タイムスタンプ http://x68000.q-e-d.net/~68user/unix/pickup?%A5%BF%A5%A4%A5%E0%A5%B9%A5%BF%A5%F3%A5%D7 -11 ... 10日以内 +10 ... 10日以前 10 ... 10日前 +365 ... 一年間更新されていない -8 ... 一週間以内に変更された 7 ... 一週間前に更新された ■ファイルを検索(Perl) 複数ワードでファイル内全文をAND検索など、コマンドの組み合わせで難しいものはPerlで検索スクリプトを書くといい http://refirio.org/view/349 以下はプログラムの一例
################################################## #ファイル内検索プログラム ################################################## use strict; print 'Search words: '; my $input = <STDIN>; chop($input); &search('./', $input); exit; ### 再帰検索 sub search { my($dir, $word) = @_; # 半角スペース区切りで検索ワードを取得 my @keywords = split(/\s+/, $word); # 検索対象ディレクトリを開く my @dir; if (opendir(DIR, $dir)) { @dir = sort { $a cmp $b } readdir(DIR); closedir(DIR); } else { print "Can't open target directory: $dir\n"; } # 対象を順に検索 foreach my $file (@dir) { if ($file eq '.' or $file eq '..') { next; } my $target = "$dir$file"; if (-d $target) { # 対象がディレクトリなら再帰検索 &search("$target/", $word); } else { # 対象がファイルなら全文検索 my %hits; if (open(FH, $target)) { while (my $line = <FH>) { foreach my $keyword (@keywords) { if (index(lc($line), lc($keyword)) >= 0) { $hits{$keyword} = 1; } } } close(FH); } else { print "Can't read target file: $target\n"; } # AND検索チェック my $flag = 1; foreach my $keyword (@keywords) { if (!$hits{$keyword}) { $flag = 0; } } # 検索結果に表示 if ($flag) { print $target . "\n"; } } } return; }
例えば「search.pl」という名前で保存した場合、以下で検索できる
$ perl search.pl
■ディスク使用量を確認
# df … ディスク使用量を確認 ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 devtmpfs 485216 0 485216 0% /dev tmpfs 503468 0 503468 0% /dev/shm tmpfs 503468 412 503056 1% /run tmpfs 503468 0 503468 0% /sys/fs/cgroup /dev/xvda1 12570604 4890012 7680592 39% / tmpfs 100696 0 100696 0% /run/user/1000 # df -h … ディスク使用量を確認(見やすい単位で表示) ファイルシス サイズ 使用 残り 使用% マウント位置 devtmpfs 474M 0 474M 0% /dev tmpfs 492M 0 492M 0% /dev/shm tmpfs 492M 412K 492M 1% /run tmpfs 492M 0 492M 0% /sys/fs/cgroup /dev/xvda1 12G 4.7G 7.4G 39% / tmpfs 99M 0 99M 0% /run/user/1000 # lsblk … 利用できるブロックデバイスを一覧表示 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 12G 0 disk └─xvda1 202:1 0 12G 0 part /
【 df 】コマンド――ディスクの空き領域を表示する:Linux基本コマンドTips(58) - @IT https://atmarkit.itmedia.co.jp/ait/articles/1610/24/news017.html 【 lsblk 】コマンド――ブロックデバイスを一覧表示する:Linux基本コマンドTips(180) - @IT https://atmarkit.itmedia.co.jp/ait/articles/1802/02/news021.html xvda(xvda1)がデータを恒久的に保存するストレージ領域。この「xvda」という名前は、OSが勝手に付ける名前 それ以外は「tmp」と付いているように一時的な領域。メモリ上にディスクを作成することにより、一時的な高速ストレージとして使用する ストレージデバイス(ブロックストレージ)|ほげほげテクノロジー|note https://note.com/tech_share/n/nb93761a67477 [Linux] メモリ上に高速なディスクを作成する - tmpfs https://blog.katsubemakito.net/linux/ramdisk-tmpfs Linuxのファイルシステムについて勉強したメモ - Qiita https://qiita.com/toshihirock/items/ca717f8ad9c66ced4047 xvdaの名前は、「xvd」と「a」により成り立っている よって複数のストレージを接続すると、「xvdb」「xvdc」などの名前になるみたい 「xvd」は「Xen Virtual block Device」から来た名前で、「Xen(仮想化フレームワーク)によるVirtual Block Device(仮想ブロックデバイス)」の略 第12章 DRBDとXenの使用 https://blog.drbd.jp/drbd-users-guide-8.4/ch-xen.html mount - 「/ dev / xvda1」デバイスとは何ですか? https://www.it-mure.jp.net/ja/mount/%E3%80%8C-dev-xvda1%E3%80%8D%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9... ■ファイル数とディレクトリ数を数える
$ ls -laR | grep -c '^-' … 合計ファイル数 $ ls -laR | egrep -c '^d.+[^.]$' … 合計ディレクトリ数
あるディレクトリ以下の合計ファイル数を再帰的に知るunixコマンド http://logic.moo.jp/data/archives/336.html ■ファイルをサイズ順にソートして表示
# ll -S … ファイルサイズが大きいものから表示 # ll -Sr … ファイルサイズが小さいものから表示
■サイズの大きいファイルを検索
# du -s /* | sort -nr … ストレージサイズの大きい領域を表示 4194312 /mnt … メモリのスワップに4GBを割り当てている場合(単位はKBで表示される) 1281572 /usr 616296 /var 142244 /lib 62628 /boot
以下のようにして、容量を圧迫している箇所を探っていく
# du -s /* | sort -nr # du -s /var/* | sort -nr # du -s /var/www/* | sort -nr # du -s /var/www/html/* | sort -nr
以下のように -h をつけると、ファイルサイズを適当な単位で表示してくれる
# du -sh /* | sort -nr # ll -h /var/www/html
■ディレクトリ構成を tree 風に表示する
$ pwd;find . | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/| /g'
tree コマンドが無い環境で tree コマンドを実現 - Qiita https://qiita.com/yone098@github/items/bba8a42de6b06e40983b ディレクトリ構成を tree 形式に表示する - Qiita https://qiita.com/hide/items/9a2876486b975e77b9c0 ■所有者と権限を変更
# chown apache /var/www/html/test … ディレクトリの所有者をapacheに変更 # chown -hR apache /var/www/html/test … ディレクトリの所有者をapacheに変更(再帰的) # chgrp apache /var/www/html/test … ディレクトリのグループをapacheに変更 # chgrp -hR apache /var/www/html/test … ディレクトリのグループをapacheに変更(再帰的) # chown apache. /var/www/html/test … ディレクトリの所有者とグループをapacheに変更 # chown apache:apache /var/www/html/test … 上と同じ # chown -hR apache. /var/www/html/test … ディレクトリの所有者とグループをapacheに変更(再帰的) # chown -hR apache:apache /var/www/html/test … 上と同じ # chmod 775 /var/www/html/test … 権限を775に変更 # chmod -R 775 /var/www/html/test … 権限を775に変更(再帰的) # find /var/www/html/test -type d -print | xargs chmod 775 … ディレクトリのみ権限を775に変更(再帰的) # find /var/www/html/test -type f -print | xargs chmod 664 … ファイルのみ権限を664に変更(再帰的)
Linuxコマンド【 chown 】ファイルの所有者やグループを変更 - Linux入門 - Webkaru https://webkaru.net/linux/chown-command/ find + chmodでパーミッションの一括変更 http://ext.omo3.com/webmaster/chmod.html ■ファイル作成時の所属グループを、親ディレクトリのグループにする 以下のようにして、スティッキービットを設定する
# chmod g+s /var/www/html/test
ファイル作成時の所属グループを、ディレクトリのグループに設定する http://qiita.com/ritukiii/items/bbb34c372ce35ec55679 setuid、setgid、およびスティッキービットを使用する特殊なファイルアクセス権 - Oracle Solaris 11.2 でのファイルのセキュリティー保護とファイル整合性の検証 https://docs.oracle.com/cd/E56342_01/html/E53949/secfile-69.html ■ファイル作成時の初期パーミッションを変更する とあるユーザのファイル作成時の初期パーミッションが644だとして、これを例えば664などに変更できる 0002 は 002 という指定でもいい
$ umask 0002 … 設定 $ umask … 確認 0002
希望の値は、ファイルは 666 から、ディレクトリは 777 からデフォルトのアクセス権を引けば求められる 例えばデフォルトのファイルパーミッションを 664 にしたい場合、 666 - 664 = 002 となり、002 もしくは 0002 と設定すればいいことが判る ただし、この設定はSSH接続を切断すると初期化されてしまうので注意 umask の値は、ログイン時に読み込まれる /etc/profile で指定されているので、ここを編集すれば恒久的に変更できる
# vi /etc/profile
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then umask 002 else #umask 022 umask 002 fi
uidが200以上か否かで umask の値が変わるが、 上記のように変更するとすべてのユーザのファイル作成の初期パーミッションが644から664になる デフォルトのアクセス権 - umask https://kazmax.zpp.jp/linux_beginner/default_permission.html デフォルトのパーミッション設定: umask | 知識の箱 http://www.rivhiro-weather.com/knowledge/?p=168 ファイルやディレクトリ作成時の初期パーミッション設定を変えたい〜umask〜 - ITmedia エンタープライズ https://www.itmedia.co.jp/help/tips/linux/l0353.html umaskのデフォルト値 (CentOS6.4) - Web Application Security Memo https://www.pupha.net/archives/151/ umaskはどこで設定されている? | VPSサーバーでWebサイト公開 備忘録 ~Linux、MySQLからAJAXまで http://wordpress.honobono-life.info/lin-base/umask%E3%81%AF%E3%81%A9%E3%81%93%E3%81%A7%E8%A8%AD%E5%A... umask の初期設定を全部のユーザーに適用する - それマグで! https://takuya-1st.hatenablog.jp/entry/2018/02/13/190949 ■ディレクトリを作成
$ mkdir test … ディレクトリを作成 $ mkdir -p test/abc … 複数階層のディレクトリを作成 $ cd $_ … 作成したディレクトリに移動
「$_」で、ひとつ前に実行したコマンドラインの最後の引数を参照できる もしくは、「ESC → .」で直前のコマンドの最後のパラメータを補完できる [小ネタ] mkdir したディレクトリに cd する方法 9 選 +1 (BASH) | Developers.IO http://dev.classmethod.jp/etc/make-and-cd-patterns/ ■ディレクトリ名を変更
$ mv test1 test2
■ディレクトリを複製
$ cp test test_backup … 「cp: omitting directory `test'」と表示され、コピーできない $ cp -r test test_backup … ディレクトリをコピーする際は「r」オプションを付ける $ cp -rp test test_backup … pオプションも付けると、コピー元の所有者ID、グループID、アクセス権、最終更新日時、最終アクセス日時をコピー元と同じにしてコピーする $ cp -rp test/* /test_backup/ ... 隠しファイルや隠しフォルダはコピー対象にならない $ cp -rp test/. /test_backup/ ... 隠しファイルや隠しフォルダもコピー対象になる
以下は使用例
$ cp -rp /var/www/vhosts/xxx/html/phpmyadmin /var/www/vhosts/yyy/html
cpコマンドで不可視ファイルまでコピーする - Qiita https://qiita.com/sayama0402/items/cdf7debc9784ebac0115 ■ディレクトリを複製(特定ディレクトリを除外) cpでは特定ディレクトリのみ除外して複製することはできないが、rsyncを使えば可能 普通に複製する場合、以下のようにする
$ rsync -a /var/www/vhosts/test/ /var/www/vhosts/test_backup/
/var/www/vhosts/test/ を /var/www/vhosts/test_backup/ に複製するが、 /var/www/vhosts/test/blog/ は除外したい場合、以下のようにする(除外設定は、複製元のパスを基準に指定する)
$ rsync -a /var/www/vhosts/test/ /var/www/vhosts/test_backup/ --exclude '/blog/'
【linux】特定のディレクトリを除いてコピーしたい https://www.softel.co.jp/blogs/tech/archives/5267 ■ディレクトリを移動
$ mv /var/www/vhosts/terraport/html/deploy /var/www/vhosts/main/html $ mv target/ ../ … 一階層上に移動
■ディレクトリを削除
$ rm -rf ディレクトリ名 $ rm -rf 201603* … ワイルドカードで一括削除 $ rm -rf 20160[3-8]* … 正規表現で一括削除
r ... 中身のファイルも含めてディレクトリごと削除 f ... 確認なしに削除 ■ファイルを圧縮&展開
$ tar zcvf compress.tar.gz file1 file2 … TAR+GZIP形式で圧縮 $ gzip -dc compress.tar.gz | tar xvf … TAR+GZIP形式で展開 $ zip compress.zip file1 file2 … ZIP形式で圧縮 $ zip 201909.zip 201909*.jpg … ZIP形式で圧縮(正規表現で指定して圧縮) $ zip -r compress.zip directory … ZIP形式で圧縮(ディレクトリを再帰的に圧縮) $ unzip compress.zip … ZIP形式で展開
展開後、所有者と権限を調整する場合の例
# chown -R apache compress … 所有者をapacheに変更(再帰的) # find compress -type d -print | xargs chmod 775 … ディレクトリの権限を775に変更(再帰的) # find compress -type f -print | xargs chmod 664 … ファイルの権限を664に変更(再帰的)
古いログを削除する前にバックアップする場合の例
# cd /var/log/command/xxx … 作業ディレクトリへ移動 # zip -r 2016.zip 2016*/ … 「2016」から始まるディレクトリを1つに圧縮 # rm -rf 2016*/ … 「2016」から始まるディレクトリを削除
特定のディレクトリを除外して圧縮
$ zip -r example.zip example/ … ZIP形式でディレクトリを圧縮 $ zip -r example.zip example/ -x example/monitor/\* … ZIP形式でディレクトリを圧縮(monitorを除外) $ zip -r example.zip example/ -x example/monitor/\* example/switch/\* … ZIP形式でディレクトリを圧縮(monitorとswitchを除外)
tarで圧縮する時に特定のディレクトリは除外する方法 - ex1-lab https://ex1.m-yabe.com/archives/2145 カゲンぱぱのイイカゲンメモ帳: linuxのzipコマンドで特定フォルダーとファイルを除外する http://kagen88.blogspot.jp/2012/12/linuxzip.html ■ファイルを暗号化&復号化
$ openssl enc -e -aes128 -in plain.txt -out crypted.txt … 暗号化 $ openssl enc -d -aes128 -in crypted.txt -out plain.txt … 復号化
opensslコマンドの使い方: UNIX/Linuxの部屋 http://x68000.q-e-d.net/~68user/unix/pickup?openssl OpenSSLでファイルの暗号化・複合化するための備忘録 - Qiita https://qiita.com/Yarimizu14/items/49690c141b62507e00d9 opensslコマンドで簡単なファイル暗号化 - Qiita https://qiita.com/ikuwow/items/1cdb057352c06fd3d727 ■ファイルを比較
$ diff config.default.php config.php … ファイルを比較 $ diff -u config.default.php config.php … git風にファイルを比較 $ diff -ybBw config.default.php config.php … WinMerge風にファイルを比較
diffコマンドを便利に使う | bacchi.me https://bacchi.me/linux/diff-tips/
■コマンド入力
Ctrl+A で入力中の行頭に移動 Ctrl+E で入力中の行末に移動 Ctrl+K でカーソルより行末方向の文字を削除(キルバッファに格納) Ctrl+Y でキルバッファに格納された文字を貼り付け
■コマンド履歴
$ history … 履歴を表示 $ history 10 … 履歴を10件表示 $ !123 … 履歴から123のコマンドを実行 $ !! … 直前のコマンドを実行
Ctrl+R でreverse-i-searchが呼び出される その状態で文字列を入力すると過去のコマンドが履歴から検索され、入力候補として表示される 再度 Ctrl+R でさらに昔の候補が表示される ESCで終了できる [ターミナル] コマンドの履歴検索と実行 http://dev.classmethod.jp/tool/terminal-reverse-i-search/ ■コマンド履歴に実行日時を追加 ※未検証 コマンド履歴に日光日時は記録されていないが、記録しておくとトラブル時の調査に役立つ可能性がある HISTTIMEFORMAT を設定することで、自動で記録することはできるみたい 永続化の作業が別途必要みたいなので注意 historyにコマンドの実行時刻が表示されるようにする - Qiita https://qiita.com/kawaz/items/92457e3d1664383b18bc history コマンドに日時を付与する - Qiita https://qiita.com/bezeklik/items/56a597acc2eb568860d7 ■コマンド履歴を削除 ※未検証 削除を履歴に残したいなら「history -d 行番号」を実行、 履歴に残したくないなら「~/.bash_history」を編集、 で良さそう 間違って入力したコマンドのhistoryの削除 - Qiita https://qiita.com/katamuki/items/f9806bad3641baac2747 【 history 】コマンド――コマンド入力の履歴を表示、再利用する:Linux基本コマンドTips(154) - @IT https://atmarkit.itmedia.co.jp/ait/articles/1710/20/news015.html
■コマンド実行の優先度を下げる
niceコマンドを使えば、優先度を変えてプログラムを実行できる 具体的には、サーバに負荷がかかるコマンドを打つ場合、下記をコマンドの先頭に付ける
$ ionice -c 2 -n 7 nice -n 19
-c 2:ディスクI/Oの実行優先度をベストエフォートで実行 -n 7:さらにこのコマンドの優先度を低くする -n 19:プロセスの実行優先度を一番低くする 以下は付けなかった場合と付けた場合のコマンド例 実行結果は同じ
$ du -s /var/www/html/* | sort -nr $ ionice -c 2 -n 7 nice -n 19 du -s /var/www/html/* | sort -nr
インフラエンジニアとしてよく使うコマンド集 - Qiita https://qiita.com/sion_cojp/items/04a2aa76a1021fe77079 nice【コマンド】とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 https://wa3.i-3-i.info/word15019.html 「nice」というのは英語のniceness(優しさ・親切さ)が語源になっている 「他のプロセスに対して優しい・親切な実行方法」ということらしい linuxのコマンド、nice,reniceの語源由来って?linuxの... - Yahoo!知恵袋 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11215881816 nice (Unix) - Wikipedia https://en.wikipedia.org/wiki/Nice_(Unix)#Etymology
■コマンド実行の言語を指定する
OSの設定が日本語でも、コマンドの前に「LC_ALL=C」を付加すれば英語で実行結果を取得できる 実行結果をもとに何らかの処理を行う場合、日本語混じりでない方が都合がいいことがある
$ ll 合計 16 drwxr-xr-x 2 apache apache 4096 11月 11 2020 images -rw-r--r-- 1 apache apache 6 11月 11 2020 test1.txt -rw-r--r-- 1 apache apache 17 11月 26 2020 test2.txt -rw-r--r-- 1 apache apache 35 11月 26 2020 test3.txt $ LC_ALL=C ll total 16 drwxr-xr-x 2 apache apache 4096 Nov 11 2020 images -rw-r--r-- 1 apache apache 6 Nov 11 2020 test1.txt -rw-r--r-- 1 apache apache 17 Nov 26 2020 test2.txt -rw-r--r-- 1 apache apache 35 Nov 26 2020 test3.txt
■y(yes)を自動入力してコマンドを実行する
例えば以下のように実行確認を求めてくるシェルスクリプトがあるとして、
./test.sh 実行してもよろしいですか? [Y/n]:
この「y」入力を手動ではなく自動で行う方法 以下のようにすることで対応できる
echo y | ./test.sh
もしくはyesコマンド(延々と「y」を入力するだけのコマンド)を使って、 以下のようにすることでも対応できる
yes | ./test.sh
サーバをコマンドで自動構築する場合に活用できる コマンドの途中で聞いてくる yes を自動入力したい?それ yes で出来るよ - 自主的20%るぅる https://www.agent-grow.com/self20percent/2018/08/06/linux-command-auto-yes/ シェルスクリプトで [y/n] を入力させて処理を分岐する方法 | LFI https://linuxfan.info/shell-script-y-n
■rootになる
$ su … ホームディレクトリは作業ユーザのままで、シェルや環境変数も引き継ぐ $ su - … ホームディレクトリが /root になり、rootの環境変数を使用する $ sudo su - … ユーザパスワードでrootになる(sudoを許可されている必要がある) # exit … rootからログアウト
「su」は「Substitute User」の略 Linux (Unix) の su コマンドの su は何の略か - 元RX-7乗りの適当な日々 https://www.na3.jp/entry/20190326/p1 第410回 あなたの人生を少しだけ豊かにするsudoの使い方:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社 https://gihyo.jp/admin/serial/01/ubuntu-recipe/0410 今は「sudo -i」などの使われるらしい ただし「sudo su -」とまったく同じ意味では無いので注意 sudo su とかしてる人はだいたいおっさん https://zenn.dev/tmtms/articles/202105-sudo-su
■ファイルのハッシュを確認
https://ja.osdn.net/projects/filezilla/releases/ などにある「ハッシュ」は、ファイルの内容が改ざんされていないか確認するためのもの 以下のような方法でファイルのハッシュを確認できる ■Unix
$ md5sum target.txt ac831b62e07eef4d60e778a769d40e2e target.txt $ sha1sum target.txt bd950235476818fcb481e8a29f876b8e5328d380 target.txt $ sha256sum target.txt 1639e3c3377b98ddc5e3adc806f26ef4f2cf6031788ed7d38b6207b1371f6849 target.txt
■Windows PowerShell
Get-FileHash target.txt -Algorithm md5 Get-FileHash target.txt -Algorithm sha1 Get-FileHash target.txt -Algorithm sha256
■PHP
<?php echo hash_file('md5', 'target.txt'); echo '<hr>'; echo hash_file('sha1', 'target.txt'); echo '<hr>'; echo hash_file('sha256', 'target.txt');
■参考 hashアルゴリズムとハッシュ値の長さ一覧 - Qiita https://qiita.com/KEINOS/items/c92268386d265042ea16
■アプリケーションがインストールされているか確認
# rpm -q httpd httpd-2.4.6-67.el7.centos.6.x86_64
■アプリケーションの検索
# yum search httpd
■アプリケーションを追加
# yum install httpd # yum -y install httpd … 確認せずにインストール
■アプリケーションを削除
# rpm -q postgresql postgresql-8.4.20-1.el6_5.x86_64 # yum remove postgresql … 古いpostgresqlを削除。「remove」は「erase」としても同じ
■アプリケーションの詳細情報を確認
# yum info httpd 読み込んだプラグイン:fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: www.ftp.ne.jp * epel: ftp.kddilabs.jp * extras: www.ftp.ne.jp * remi-safe: mirrors.mediatemple.net * updates: www.ftp.ne.jp * webtatic: sp.repo.webtatic.com インストール済みパッケージ 名前 : httpd アーキテクチャー : x86_64 バージョン : 2.4.6 リリース : 67.el7.centos.6 容量 : 9.4 M リポジトリー : installed 提供元リポジトリー : updates 要約 : Apache HTTP Server URL : http://httpd.apache.org/ ライセンス : ASL 2.0 説明 : The Apache HTTP Server is a powerful, efficient, and extensible : web server.
■ログを確認
KEIROMICHI | IPアドレスから住所検索 http://keiromichi.com/ IPひろば http://www.iphiroba.jp/ ANSI Whois Gateway http://whois.ansi.co.jp/ 使用中のIPアドレス確認 https://www.cman.jp/network/support/go_access.cgi ■Linux OSが起動した直後からsyslogが起動するまでのログ(dmesgコマンドでも確認できる / 起動してからは /var/log/messages に記録される)
# cat /var/log/dmesg
システム全般に関するログ。ファイヤーウォールのログなども記録される
# cat /var/log/messages
認証に関するログ(suやsudoの実行履歴など。rootの操作内容が残るわけではないので、root権限が必要な処理はsudo経由で実行させることが好ましい)
# cat /var/log/secure
監査に関するログ(セキュリティに関するイベントが記録される)
# cat /var/log/audit/audit.log
cronに関するログ
# cat /var/log/cron
メールに関するログ
# cat /var/log/maillog
yumによるパッケージ情報操作に関するログ
# cat /var/log/yum.log
システム起動時に画面に表示されていた内容
# cat /var/log/boot.log
sudoポリス「誰だ! 本番環境でsudo suしてるのは!」 - Qiita https://qiita.com/keys/items/ba03b71fd34ebbff4c6e ログインに成功したログ(バイナリファイル。内容はlastコマンドで確認する)
# /var/log/wtmp
ログインに失敗したログ(バイナリファイル。内容はlastbコマンドで確認する)
# /var/log/btmp
各ユーザーの最後にログインした日時のログ(バイナリファイル。内容はlastlogコマンドで確認する)
# /var/log/lastlog
ログインに成功したログを整形して表示
# last -n 10 refirio
ログインに成功したログを整形して表示(ホストを省略せずに最後に表示)
# last -n 100 refirio -a
ログインに失敗したログを整形して表示
# last -n 10 refirio
各ユーザーの最後にログインした日時のログを整形して表示
# lastlog
【last, lastlog】Linuxでログイン履歴を確認するコマンド | UX MILK https://uxmilk.jp/26163 last、lastb、lastlogの結果にIPアドレスは含まれていないが、 /var/log/messages を見ればログインしたときのIPアドレスは判る コマンド一つ一つの実行者のIPアドレスまでは記録されないようだが、実行中に限れば以下の方法で調べることはできる SSHで接続して処理を実行中のユーザーの接続元IPを確認する方法 http://www.lesstep.jp/wiki/index.php?SSH%E3%81%A7%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%A6%E5%87%A6%E7%90... ■Apache アクセスログ
# cat /var/log/httpd/access_log
アクセスログ(SSLの場合)
# cat /var/log/httpd/ssl_access_log
エラーログ
# cat /var/log/httpd/error_log
エラーログ(SSLの場合)
# cat /var/log/httpd/ssl_error_log
ログの解析については、後述の 「Apacheのログをコマンドで解析」 も参照 ■nginx アクセスログ
# cat /var/log/nginx/access.log
エラーログ
# cat /var/log/nginx/error.log
■Vsftpd アクセスログ(ファイルのアップロード、ダウンロード、削除などが記録される)
# cat /var/log/xferlog
環境によっては /var/log/xferlog/vsftpd.log などの名前に変更されているかもしれない ログの解析については、後述の 「FTPのログを解析」 も参照 ■Postfix メールに関するログ
# cat /var/log/maillog
ログの解析については、後述の 「メールのログを解析」 「メールのログをコマンドで解析」 「メールのログをmaillogconvert.plで変換してコマンドで解析」 も参照 ■PHP アクセスログ なし(Apacheに依存) エラーログ なし(Apacheに依存) ■MySQL アクセスログ なし(記録していない) エラーログ・アプリケーションログ
# cat /var/log/mysqld.log
専用ログ スロークエリログファイル(slow_query_log_file で設定)
# cat /var/run/mysqld/mysqld-slow.log mysql> SELECT * FROM mysql.slow_log;
■Zabbix Zabbixサーバのログ
# cat /var/log/zabbix/zabbix_server.log
Zabbixエージェントのログ
# cat /var/log/zabbix/zabbix_agentd.log
Zabbixプロキシサーバのログ
# cat /var/log/zabbix/zabbix/_proxy.log
■SFTP デフォルト設定ではSFTPの操作はログに記録されないが、設定を変更することで記録できる 主に以下のページを参考に設定 SFTPの操作をログに残すための設定 #Linux - Qiita https://qiita.com/Sophick12224/items/b62e5f1af335a29217e0 SFTPサーバーのログ取得設定 - インフォサーカス・インコーポレイテッド - Info Circus, Inc. https://www.infocircus.jp/2020/08/06/sftp-server-logging-config/ sshd_config内にある設定で「-l INFO」を付与する
# vi /etc/ssh/sshd_config
Subsystem sftp /usr/libexec/openssh/sftp-server ↓ Subsystem sftp /usr/libexec/openssh/sftp-server -l INFO
# systemctl restart sshd
「INFO」は、ファイルの転送・許可の変更などに関する情報を記録する ログは /var/log/messages に記録される 一例だが以下の操作を行ったとき、 1. SFTPで /home/ec2-user にアクセス 2. ディレクトリ test を作成 3. ファイル test/test.txt を作成 4. ファイル test/test.txt を test/test1.txt に名前変更 5. ディレクトリ test を test1 に名前変更 6. ファイル test1/test1.txt を削除 7. ディレクトリ test1 を削除 8. 接続を終了 /var/log/messages には以下の内容が記録されていた(実際は空行なし) SSH接続の際はIPアドレスは記録されないようだが、SFTP接続の際は記録されている
Dec 5 05:04:51 ip-10-1-0-246 systemd: Started Session 15 of user ec2-user. Dec 5 05:04:51 ip-10-1-0-246 systemd-logind: New session 15 of user ec2-user. Dec 5 05:04:51 ip-10-1-0-246 sftp-server[23652]: session opened for local user ec2-user from [203.0.113.1] Dec 5 05:04:51 ip-10-1-0-246 sftp-server[23652]: opendir "/home/ec2-user" Dec 5 05:04:51 ip-10-1-0-246 sftp-server[23652]: closedir "/home/ec2-user" Dec 5 05:05:00 ip-10-1-0-246 sftp-server[23652]: mkdir name "/home/ec2-user/test" mode 0777 Dec 5 05:05:02 ip-10-1-0-246 sftp-server[23652]: opendir "/home/ec2-user" Dec 5 05:05:02 ip-10-1-0-246 sftp-server[23652]: closedir "/home/ec2-user" Dec 5 05:05:04 ip-10-1-0-246 sftp-server[23652]: opendir "/home/ec2-user/test" Dec 5 05:05:04 ip-10-1-0-246 sftp-server[23652]: closedir "/home/ec2-user/test" Dec 5 05:05:07 ip-10-1-0-246 sftp-server[23696]: session opened for local user ec2-user from [203.0.113.1] Dec 5 05:05:07 ip-10-1-0-246 sftp-server[23696]: opendir "/home/ec2-user/test" Dec 5 05:05:07 ip-10-1-0-246 sftp-server[23696]: closedir "/home/ec2-user/test" Dec 5 05:05:07 ip-10-1-0-246 sftp-server[23696]: open "/home/ec2-user/test/test.txt" flags WRITE,CREATE,TRUNCATE mode 0666 Dec 5 05:05:07 ip-10-1-0-246 sftp-server[23696]: close "/home/ec2-user/test/test.txt" bytes read 0 written 6 Dec 5 05:05:07 ip-10-1-0-246 sftp-server[23696]: opendir "/home/ec2-user/test" Dec 5 05:05:07 ip-10-1-0-246 sftp-server[23696]: closedir "/home/ec2-user/test" Dec 5 05:05:39 ip-10-1-0-246 sftp-server[23652]: rename old "/home/ec2-user/test/test.txt" new "/home/ec2-user/test/test1.txt" Dec 5 05:05:40 ip-10-1-0-246 sftp-server[23652]: opendir "/home/ec2-user" Dec 5 05:05:40 ip-10-1-0-246 sftp-server[23652]: closedir "/home/ec2-user" Dec 5 05:05:59 ip-10-1-0-246 sftp-server[23652]: rename old "/home/ec2-user/test" new "/home/ec2-user/test1" Dec 5 05:06:07 ip-10-1-0-246 sftp-server[23696]: session closed for local user ec2-user from [203.0.113.1] Dec 5 05:06:11 ip-10-1-0-246 sftp-server[23652]: opendir "/home/ec2-user/test1" Dec 5 05:06:11 ip-10-1-0-246 sftp-server[23652]: closedir "/home/ec2-user/test1" Dec 5 05:06:14 ip-10-1-0-246 sftp-server[23652]: remove name "/home/ec2-user/test1/test1.txt" Dec 5 05:06:20 ip-10-1-0-246 sftp-server[23652]: opendir "/home/ec2-user" Dec 5 05:06:20 ip-10-1-0-246 sftp-server[23652]: closedir "/home/ec2-user" Dec 5 05:06:21 ip-10-1-0-246 sftp-server[23652]: opendir "/home/ec2-user" Dec 5 05:06:21 ip-10-1-0-246 sftp-server[23652]: closedir "/home/ec2-user" Dec 5 05:06:23 ip-10-1-0-246 sftp-server[23652]: opendir "/home/ec2-user/test1" Dec 5 05:06:23 ip-10-1-0-246 sftp-server[23652]: closedir "/home/ec2-user/test1" Dec 5 05:06:23 ip-10-1-0-246 sftp-server[23652]: rmdir name "/home/ec2-user/test1" Dec 5 05:06:23 ip-10-1-0-246 sftp-server[23652]: opendir "/home/ec2-user" Dec 5 05:06:23 ip-10-1-0-246 sftp-server[23652]: closedir "/home/ec2-user" Dec 5 05:06:35 ip-10-1-0-246 sftp-server[23652]: session closed for local user ec2-user from [203.0.113.1] Dec 5 05:06:35 ip-10-1-0-246 systemd-logind: Removed session 15.
■grepの使用例
# tail -n 100 /var/log/secure | grep warning # tail -n 100 /var/log/secure | grep refuse # tail -n 100 /var/log/secure | grep fail # tail -n 100 /var/log/secure | grep error # tail -n 100 /var/log/messages | grep invalid # tail -n 100 /var/log/messages | grep fail # tail -n 100 /var/log/messages | grep error
件数を取得
# grep ConnectException -c /var/log/httpd/error_log
正規表現で検索
# cat error_log | grep digest # cat error_log | grep done ↓ # cat error_log | egrep '(digest|done)'
圧縮されたログを表示
# zcat /var/log/httpd/access_log
圧縮されたログを検索
# zgrep XXX /var/log/httpd/access_log
gzのファイルを展開せずにgrepする - Qiita https://qiita.com/aaaaAAAA1111/items/7b56b2f5c3073f8f6b19 ■ファイルの監視
# tail -f /var/log/httpd/access_log … 対象ファイルに変更があれば即座に反映(「Ctrl+c」で終了) # tail -n 5 -f /var/log/httpd/access_log … 対象ファイルに変更があれば即座に反映(デフォルトで5件まで表示) # tail -f /var/log/httpd/access_log | grep /test/ … 対象ファイルから「/test/」を検索。変更があれば即座に反映 # tail -n 5 -f /var/log/httpd/access_log /var/log/httpd/error_log … 複数ファイルを同時に監視(ただしmultitailを使う方が良さそう)
multitailで複数のログを同時に監視 https://rcmdnk.com/blog/2016/03/06/computer-linux-mac/ 複数ファイルを tail できる multitail が便利! http://loumo.jp/wp/archive/20130228202358/
# cd /var/log/httpd # multitail -f access_log -f error_log … 「-f」が「-F」でいいかは要動作確認
[Linux]「tail -f」での監視はもう古い!?超絶便利なlessコマンド http://qiita.com/shuntaro_tamura/items/faaebb3282c37a718b76 tail -fやtailfを使うのはやめてless +Fを使おう http://qiita.com/LOUIS_rui/items/8d935526571ccfe171ae エンジニアなら知っておきたい lessコマンドtips 11選 http://qiita.com/ine1127/items/64b5b6cf52471c3fe59c 「tail -f」を使うのは情弱、情強は「less +F」を使う http://www.softantenna.com/wp/unix/stop-using-tail-f/
■ログをコピー
Apacheのログ
/var/log/httpd/access_log
すべてのログを /var/www/logs/ 内にコピーする例
\cp -f /var/log/* /var/www/logs/ \cp -f /var/log/audit/* /var/www/logs/audit/ \cp -f /var/log/conman/* /var/www/logs/conman/ \cp -f /var/log/conman.old/* /var/www/logs/conman.old/ \cp -f /var/log/cups/* /var/www/logs/cups/ \cp -f /var/log/httpd/* /var/www/logs/httpd/ \cp -f /var/log/mail/* /var/www/logs/mail/ \cp -f /var/log/pm/* /var/www/logs/pm/ \cp -f /var/log/ppp/* /var/www/logs/ppp/ \cp -f /var/log/prelink/* /var/www/logs/prelink/
一部のログを /var/www/logs/ 内にコピーする例
\cp -f /var/log/httpd/access_log /var/www/logs/access_log \cp -f /var/log/httpd/access_log* /var/www/logs/ \cp -f /var/log/httpd/error_log /var/www/logs/error_log \cp -f /var/log/cron /var/www/logs/cron \cp -f /var/log/maillog /var/www/logs/maillog \cp -f /var/log/mysqld.log /var/www/logs/mysqld.log \cp -f /var/log/secure /var/www/logs/secure \cp -f /var/log/vsftpd.log /var/www/logs/vsftpd.log \cp -f /var/log/yum.log /var/www/logs/yum.log
パーミッションを変更
chmod 644 /var/www/logs/*
過去のログ
\cp -f /var/log/httpd/access_log.1 /var/www/logs/access_log
削除
# rm -f /var/www/logs/*
■Apacheのログをコマンドで解析
※可能なら、最初からcatではなくgrepを使う方が高速。計測方法は「コマンドの実行時間を表示」を参照 ※SSL経由のアクセスの場合、ログは /var/log/httpd/ssl_access_log に記録されるので注意 ※コマンド以外だと、例えば以下のようなソフトがある ApacheLogViewerソフトでログからアクセス解析 [DokuWikiで情報発信] https://dokuwiki.oreda.net/access/apachelogviewer.html sedでこういう時はどう書く? - Qiita https://qiita.com/hirohiro77/items/7fe2f68781c41777e507 ■各項目の参照(cut版とsed版) IPアドレス
# cat /var/log/httpd/access_log | cut -d ' ' -f 1 # cat /var/log/httpd/access_log | sed 's/ .*$//'
日時
# cat /var/log/httpd/access_log | cut -d '[' -f 2 | cut -d ']' -f 1 # cat /var/log/httpd/access_log | sed 's/^.*\[\([^]]*\)\].*/\1/'
リクエスト
# cat /var/log/httpd/access_log | cut -d ' ' -f 7 # cat /var/log/httpd/access_log | sed 's/^[^"]*"\([^"]*\)".*/\1/'
リファラー
# cat /var/log/httpd/access_log | cut -d '"' -f 4 # cat /var/log/httpd/access_log | sed 's/.*"\([^"]*\)" .*$/\1/'
User Agent
# cat /var/log/httpd/access_log | cut -d '"' -f 6 # cat /var/log/httpd/access_log | sed 's/.*"\([^"]*\)"$/\1/'
■変換 日時を時間に変換
# cat /var/log/httpd/access_log | cut -d '[' -f 2 | cut -d ']' -f 1 | awk -F : '{print $2":"$3}'
■ソート ※IPアドレスを例に紹介。他の項目の場合も手順は同じ IPアドレス一覧
# cat /var/log/httpd/access_log | cut -d ' ' -f 1
ソート
# cat /var/log/httpd/access_log | cut -d ' ' -f 1 | sort
重複を除外して件数を表示(重複を除外する前にソートが必要)
# cat /var/log/httpd/access_log | cut -d ' ' -f 1 | sort | uniq -c
件数の降順にソート
# cat /var/log/httpd/access_log | cut -d ' ' -f 1 | sort | uniq -c | sort -nr
上位10件
# cat /var/log/httpd/access_log | cut -d ' ' -f 1 | sort | uniq -c | sort -nr | head -n 10
■除外 CSSや画像などへのアクセスを除外
# cat /var/log/httpd/access_log | egrep -iv '(.css|.js|.gif|.jpeg|.jpg|.jpe|.png|.ico|.swf)'
さらにbotからのアクセスを除外
# cat /var/log/httpd/access_log | egrep -iv '(.css|.js|.gif|.jpeg|.jpg|.jpe|.png|.ico|.swf|clawler|Googlebot|googlebot|DotBot|Slurp|msnbot|robots|spider|Wget|ScoutJet|mlbot)'
以下は旧版。grepよりもegrepの方が読みやすい
# cat /var/log/httpd/access_log | grep -ive "\(\.css\|\.js\|\.gif\|\.jpeg\|\.jpg\|\.jpe\|\.png\|\.ico\|\.swf\)" # cat /var/log/httpd/access_log | grep -ive "\(\.css\|\.js\|\.gif\|\.jpeg\|\.jpg\|\.jpe\|\.png\|\.ico\|\.swf\|clawler\|Googlebot\|googlebot\|DotBot\|Slurp\|msnbot\|robots\|spider\|Wget\|ScoutJet\|mlbot\)"
■絞り込み 特定ユーザの特定のアクセス
# cat /var/log/httpd/access_log | grep '203.0.113.1' | grep '/mypage/profile'
2016年2月10日のみ
# cat /var/log/httpd/access_log | grep '10/Feb/2016'
2016年2月10日15時のみ
# cat /var/log/httpd/access_log | grep '10/Feb/2016:15'
2016年2月10日15時20〜29分のみ
# cat /var/log/httpd/access_log | grep '10/Feb/2016:15:2'
2016年2月10日15時台の、リクエストが多かったページ上位10件
# cat /var/log/httpd/access_log | grep '10/Feb/2016:15' | cut -d ' ' -f 7 | sort | uniq -c | sort -nr | head -n 10
直近の10件のみ
# tail -n 10 /var/log/httpd/access_log
直近の1000件の、リクエストが多かったページ上位10件
# tail -n 1000 /var/log/httpd/access_log | cut -d ' ' -f 7 | sort | uniq -c | sort -nr | head -n 10
MP4とPDFへのアクセスのみ
# grep '01/Aug/2022:15' access_log | grep mp4 # grep '01/Aug/2022:15' access_log | grep pdf # cat /var/log/httpd/access_log | egrep -i '(.mp4)' # cat /var/log/httpd/access_log | egrep -i '(.pdf)' # grep '01/Aug/2022:15' access_log | egrep -i '(.mp4|.pdf)'
巨大ファイル(10MB以上の重いファイル)へのアクセスのみ
# cat /var/log/httpd/access_log | awk '($10 >= 10000000) {print $0}'
ファイル名を表示
# cat /var/log/httpd/access_log | awk '($10 >= 10000000) {print $7}'
ファイルサイズとファイル名を表示
# cat /var/log/httpd/access_log | awk '($10 >= 10000000) {print int($10/1024/1024)"MB:"$7}' | uniq | sort -nr
特定日時で絞り込んで巨大ファイルへのアクセスを確認(「$(NF-2)」は「末尾から数えて3番目」の値。末尾は0なので単に「$NF」と書く)
# cat /var/log/httpd/access_log | grep '27/Jun/2019:09:1[2-6]' | awk '($(NF-2) >= 10000000) {print $0}'
エラーのみ
# cat /var/log/httpd/access_log | awk '($9 >= 400 || $7 >= 400) {print $0}'
エラーの比率
# cat /var/log/httpd/access_log | awk '($9 < 400) {ok++} ($9 >= 400 || $7 >= 400) {ng++} END {print ng/(ok+ng)*100}'
■レスポンスタイム解析 以下のように、ログフォーマットに「%D」が記載されているものとする(レスポンスタイムがマイクロ秒で記録される)
LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined
※末尾のデータは「$NF」で参照できるが、例えば末尾からn番目の場合は「$(NF-n)」で参照できる ※1秒 = 1,000ミリ秒 = 1,000,000マイクロ秒 レスポンスタイムを参照
# cat /var/log/httpd/access_log | awk '{print $NF}'
1秒以上かかったレスポンス数
# cat /var/log/httpd/access_log | awk '$NF > 1000000 {print $NF/1000, $7}' | wc -l
レスポンスの遅かったリクエストトップ10
# cat /var/log/httpd/access_log | awk '{print $NF/1000, $7}' | sort -nr | head -n 10
平均レスポンスタイム(ミリ秒)
# cat /var/log/httpd/access_log | awk '{sum += $NF; count++}; END{print (sum/count)/1000}'
2016年11月5日15時台の、平均レスポンスタイム(ミリ秒)
# cat /var/log/httpd/access_log | grep '05/Nov/2016:15' | awk '{sum += $NF; count++}; END{print (sum/count)/1000}'
※例えば以下の形式(末尾から2つ目がレスポンスタイム)で記録されている場合、 LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Forwarded-For}i %{X-Forwarded-Proto}i" combined 以下のように $(NF-2) と指定すれば解析できる
# cat /var/log/httpd/access_log | awk '{print $(NF-2)/1000, $7}' | sort -nr | head -n 10 # cat /var/log/httpd/access_log | awk '{sum += $(NF-2); count++}; END{print (sum/count)/1000}' # cat /var/log/httpd/access_log | grep '05/Nov/2016:15' | awk '{sum += $(NF-2); count++}; END{print (sum/count)/1000}'
■5分以内のApacheログを表示 ※月をまたぐと、余計なデータが表示されてしまう あらかじめ日でgrepしておくか。高速化にもなるかも。要検証 grep '01/Jun/2018' /var/log/nginx/access.log | awk -F'\\[|\\]' '"01/Jun/2018:01:00:00" < $2'
# date … 現在の日時を表示 # date "+%Y-%m-%d %H:%M:%S" … フォーマットして表示(「+」に続けてフォーマットを指定) # LC_ALL=C date "+%d/%b/%Y:%H:%M:%S" … 日本語環境でも英語表記で表示 # LC_ALL=C date -d '5 minutes ago' "+%d/%b/%Y:%H:%M:%S" … 5分前の日時を英語表記で表示 # tail -n 10 /var/log/httpd/access_log | awk -F'\\[|\\]' '{ print $2 }' … Apacheログの日時を取得 # tail -n 10 /var/log/nginx/access.log | awk -F'\\[|\\]' '{ print $2 }' … nginxログの日時を取得 # awk -F'\\[|\\]' '"31/May/2018:19:30:00" < $2' /var/log/httpd/access_log … 特定日時以降のApacheログを表示 # awk -F'\\[|\\]' '"31/May/2018:19:30:00" < $2' /var/log/nginx/access.log … 特定日時以降のnginxログを表示
$ vi get_access_log.sh … 5分以内のログを表示
#!/bin/bash # 5分前の日時を取得 datetime=`LC_ALL=C date -d '5 minutes ago' "+%d/%b/%Y:%H:%M:%S"` # 5分以内のApacheログを表示 awk -F'\\[|\\]' '"'"${datetime}"'" < $2' /var/log/httpd/access_log # 5分以内のnginxログを表示 #awk -F'\\[|\\]' '"'"${datetime}"'" < $2' /var/log/nginx/access.log
■メモ あなたはだんだん、ファイルを読むのにlessコマンドを使いたくなる http://qiita.com/marrontan619/items/95e954972706f32be255 Apache ログを awk と uniq だけで集計する https://qiita.com/bezeklik/items/f5c292c4360cde140bef アクセスログからピーク時の分間hit数を割り出す https://hacknote.jp/archives/11938/ Apacheのログからエラーアクセスだけ抽出 http://hole.sugutsukaeru.jp/archives/625 Apacheのレスポンス分析に必要なスクリプトまとめ http://koduki.hatenablog.com/entry/2012/11/24/171534 Apacheのログから応答速度分布やエラー状況を分析する(原始的な方法) http://www.teradas.net/archives/5298/ 突然のTwitter砲にもなんとか耐えたさくらVPSに感謝する https://blog.riywo.com/2011/02/07/162154/ awkで末尾から数えてn番目のフィールドを取り出す。 http://qiita.com/koitatu3/items/3d746c7e292908c6167e ログ分析に使えるLinuxコマンド6選 - Qiita https://qiita.com/moneymog/items/16d2f843c344a5ace51a grepでAND検索とOR検索 #UNIX - Qiita https://qiita.com/ritukiii/items/968f17f9c308743e85a7 date コマンド | コマンドの使い方(Linux) | hydroculのメモ https://hydrocul.github.io/wiki/commands/date.html "date" 日付・時刻の表示 @LCD -Linux Command Dictionary-|Replog!株式会社レップワンスタッフによるブログです http://www.rep1.co.jp/staff/200vcxg/217rav/date_lcd_-linux_command_dictio_2.htm 特別なコマンド無しで「◯◯時からXX時までの間のログを抽出」というように、時間指定でログを抽出させる方法(awk,sed) https://orebibou.com/2015/04/%E7%89%B9%E5%88%A5%E3%81%AA%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E7%84%A... awkへシェルスクリプトの変数を渡す - Qiita https://qiita.com/yamao2253/items/cf69b68447214036e914 俺の愛用ワンライナー、Web企業のエンジニア16人に聞きました - エンジニアHub|若手Webエンジニアのキャリアを考える! https://employment.en-japan.com/engineerhub/entry/2018/05/08/110000 ■Apacheのログをツールで解析 【Apache】アクセスログ解析ソフトの一覧 http://matome.naver.jp/odai/2142278136708605501 便利ツール(9)アクセスログ解析ソフト「ApacheLogViewer」 http://win.kororo.jp/weblog/2006/08/17/post_0808.php 「生ログ」を解析してみよう! http://jugemstaff.jugem.jp/?eid=25
■FTPのログを解析
FTPソフトで接続して 1. ファイルを新規にアップロード 1. ファイルを上書きアップロード 2. ファイルを削除 3. ディレクトリを作成 4. ディレクトリを削除 としたときのログ /var/log/xferlog は以下のとおり 「どのディレクトリに移動した」のようなログは残らないが、アップロードや削除はログに残っている
Wed Nov 30 11:38:26 2022 [pid 91078] CONNECT: Client "203.0.113.1" Wed Nov 30 11:38:26 2022 [pid 91078] DEBUG: Client "203.0.113.1", "SSL version: TLSv1/SSLv3, SSL cipher: ECDHE-RSA-AES128-SHA, not reused, no cert" Wed Nov 30 11:38:26 2022 [pid 91077] [refirio] OK LOGIN: Client "203.0.113.1" Wed Nov 30 11:38:27 2022 [pid 91078] [refirio] DEBUG: Client "203.0.113.1", "SSL version: TLSv1/SSLv3, SSL cipher: ECDHE-RSA-AES128-SHA, reused, no cert" Wed Nov 30 11:38:27 2022 [pid 91078] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: SSL_RECEIVED_SHUTDOWN" Wed Nov 30 11:38:27 2022 [pid 91078] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: 3" Wed Nov 30 11:38:27 2022 [pid 91079] [refirio] OK UPLOAD: Client "203.0.113.1", "/html/test.txt", 0.00Kbyte/sec Wed Nov 30 11:38:27 2022 [pid 91078] [refirio] DEBUG: Client "203.0.113.1", "SSL version: TLSv1/SSLv3, SSL cipher: ECDHE-RSA-AES128-SHA, reused, no cert" Wed Nov 30 11:38:27 2022 [pid 91078] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: NONE" Wed Nov 30 11:38:27 2022 [pid 91078] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: SSL_SENT_SHUTDOWN" Wed Nov 30 11:38:27 2022 [pid 91078] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: 3" Wed Nov 30 11:38:32 2022 [pid 91078] [refirio] DEBUG: Client "203.0.113.1", "SSL version: TLSv1/SSLv3, SSL cipher: ECDHE-RSA-AES128-SHA, reused, no cert" Wed Nov 30 11:38:32 2022 [pid 91078] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: SSL_RECEIVED_SHUTDOWN" Wed Nov 30 11:38:32 2022 [pid 91078] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: 3" Wed Nov 30 11:38:32 2022 [pid 91079] [refirio] OK UPLOAD: Client "203.0.113.1", "/html/test.txt", 0.00Kbyte/sec Wed Nov 30 11:38:32 2022 [pid 91078] [refirio] DEBUG: Client "203.0.113.1", "SSL version: TLSv1/SSLv3, SSL cipher: ECDHE-RSA-AES128-SHA, reused, no cert" Wed Nov 30 11:38:32 2022 [pid 91078] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: NONE" Wed Nov 30 11:38:32 2022 [pid 91078] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: SSL_SENT_SHUTDOWN" Wed Nov 30 11:38:33 2022 [pid 91078] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: 3" Wed Nov 30 11:38:37 2022 [pid 91072] [refirio] OK DELETE: Client "203.0.113.1", "/html/test.txt" Wed Nov 30 11:38:42 2022 [pid 91072] [refirio] OK MKDIR: Client "203.0.113.1", "/html/test" Wed Nov 30 11:38:45 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL version: TLSv1/SSLv3, SSL cipher: ECDHE-RSA-AES128-SHA, reused, no cert" Wed Nov 30 11:38:45 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: NONE" Wed Nov 30 11:38:45 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: SSL_SENT_SHUTDOWN" Wed Nov 30 11:38:45 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: 3" Wed Nov 30 11:38:48 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL version: TLSv1/SSLv3, SSL cipher: ECDHE-RSA-AES128-SHA, reused, no cert" Wed Nov 30 11:38:48 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: NONE" Wed Nov 30 11:38:48 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: SSL_SENT_SHUTDOWN" Wed Nov 30 11:38:48 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: 3" Wed Nov 30 11:38:48 2022 [pid 91072] [refirio] OK RMDIR: Client "203.0.113.1", "/html/test" Wed Nov 30 11:38:48 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL version: TLSv1/SSLv3, SSL cipher: ECDHE-RSA-AES128-SHA, reused, no cert" Wed Nov 30 11:38:48 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: NONE" Wed Nov 30 11:38:48 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: SSL_SENT_SHUTDOWN" Wed Nov 30 11:38:49 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: 3" Wed Nov 30 11:38:50 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL version: TLSv1/SSLv3, SSL cipher: ECDHE-RSA-AES128-SHA, reused, no cert" Wed Nov 30 11:38:50 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: NONE" Wed Nov 30 11:38:50 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: SSL_SENT_SHUTDOWN" Wed Nov 30 11:38:50 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: 3" Wed Nov 30 11:38:53 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "Connection terminated without SSL shutdown - buggy client?"
FTPソフトで「最新の情報に更新」をすると、以下が記録された
Wed Nov 30 11:38:48 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL version: TLSv1/SSLv3, SSL cipher: ECDHE-RSA-AES128-SHA, reused, no cert" Wed Nov 30 11:38:48 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: NONE" Wed Nov 30 11:38:48 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: SSL_SENT_SHUTDOWN" Wed Nov 30 11:38:48 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "SSL shutdown state is: 3"
上記に関する部分を除外すると、以下のようになる 作業内容と一致している
Wed Nov 30 11:38:26 2022 [pid 91078] CONNECT: Client "203.0.113.1" Wed Nov 30 11:38:26 2022 [pid 91077] [refirio] OK LOGIN: Client "203.0.113.1" Wed Nov 30 11:38:27 2022 [pid 91079] [refirio] OK UPLOAD: Client "203.0.113.1", "/html/test.txt", 0.00Kbyte/sec Wed Nov 30 11:38:32 2022 [pid 91079] [refirio] OK UPLOAD: Client "203.0.113.1", "/html/test.txt", 0.00Kbyte/sec Wed Nov 30 11:38:37 2022 [pid 91072] [refirio] OK DELETE: Client "203.0.113.1", "/html/test.txt" Wed Nov 30 11:38:42 2022 [pid 91072] [refirio] OK MKDIR: Client "203.0.113.1", "/html/test" Wed Nov 30 11:38:48 2022 [pid 91072] [refirio] OK RMDIR: Client "203.0.113.1", "/html/test" Wed Nov 30 11:38:53 2022 [pid 91071] [refirio] DEBUG: Client "203.0.113.1", "Connection terminated without SSL shutdown - buggy client?"
上記はFTPだが、SFTPの場合は操作ログが残らないようなので注意 設定を変更することで残すことはできるみたい(未検証) SFTPの操作をログに残すための設定 - Qiita https://qiita.com/Sophick12224/items/b62e5f1af335a29217e0
■監査に関するログを解析
監査に関するログは /var/log/audit/audit.log に保存されるが、ログの日時がタイムスタンプだったりと扱いづらい 確認の際はausearchコマンドを使用するといい
# ausearch -i -if /var/log/audit/audit.log --start 16:50:00 --end 17:00:00
【ausearch】SELinuxのログの見方とトラブルシュート, 監査設定, tail リアルタイム表示〜 | SEの道標 https://milestone-of-se.nesuke.com/sv-basic/linux-basic/audit-log-ausearch/ Linuxの監査システム Auditについて理解する - Qiita https://qiita.com/Brutus/items/7ec3d06adf6af6ca24b7 ausearchをcronで定期実行させる - 14Room https://naked123.hatenablog.com/entry/2017/05/08/090532 Linuxコマンドメモ(一)(随時更新) - Ousei Blog https://ousei.hatenablog.com/entry/linux-command-memo B.2. 監査レコードタイプ Red Hat Enterprise Linux 6 | Red Hat Customer Portal https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security_guide/sec-aud...
■メールを表示
PEARの時代は Mail_mimeDecode を使っていたが、Composerでは定番とされるようなライブラリは無いみたい Composerで使える、メール解析って何がある? | 株式会社ビヨンド https://beyondjapan.com/blog/2017/04/mail-parser-on-composer/ 受信したメールをPHPで解析してDBに格納する - Qiita https://qiita.com/ga_ku/items/2f2640905f91aeb82d6c 日本語メールの仕組み | SendGridブログ https://sendgrid.kke.co.jp/blog/?p=10958 MIMEエンコードされたメールのデコード方法 - Qiita https://qiita.com/sheepland/items/2065ffcc7ec8c03145cc 以下のメール解析に役立ちそう PHPでのHTMLメール・デコメールの送り方 https://www.systemexpress.co.jp/php/htmlmail.html 以下にメール全般の基礎がまとめられている おさえておきたいメールの基礎用語 | SendGridブログ https://sendgrid.kke.co.jp/blog/?p=658
■メールをコマンドで表示
※Etcetra.txt の「メールを確認する」「root宛のメールを削除する」も参照 以下の場所にメールが保存されている(EC2だと /var/spool/mail に保存されている)
# cd /var/mail # ls -l 合計 144 -rw------- 1 pi mail 137159 2月 6 12:00 pi -rw------- 1 root mail 2200 9月 5 13:19 root $ cat root
メールを表示するにはmailコマンドを使用する コマンドを使えなければインストールする
# mail -bash: mail: コマンドが見つかりません $ sudo yum -y install mailx … mailコマンドインストール(CentOS系の場合) $ sudo apt-get install -y mailutils … mailコマンドインストール(Ubuntu系の場合)
「mail」とだけ入力すると、新着メールを表示できる 「?」が表示されると入力待ち状態。数字を入力すると該当するメールが、「h」と入力するとメールの一覧を表示できる 「q」と入力すると終了できる
# mail "/var/mail/root": 4 messages 4 new >N 1 pi@raspberrypi 土 12月 12 16: 14/522 *** SECURITY information for raspberrypi *** N 2 pi@raspberrypi 土 12月 12 16: 14/485 *** SECURITY information for raspberrypi *** N 3 pi@raspberrypi 土 12月 12 16: 14/522 *** SECURITY information for raspberrypi *** N 4 pi@raspberrypi 土 12月 12 16: 14/485 *** SECURITY information for raspberrypi *** ? 2 Return-Path: <pi@raspberrypi> X-Original-To: root Delivered-To: root@raspberrypi Received: by raspberrypi (Postfix, from userid 1000) id 66381BE9F5; Sat, 12 Dec 2020 16:16:15 +0900 (JST) To: root@raspberrypi From: pi@raspberrypi Auto-Submitted: auto-generated Subject: *** SECURITY information for raspberrypi *** Message-Id: <20201212071615.66381BE9F5@raspberrypi> Date: Sat, 12 Dec 2020 16:16:15 +0900 (JST) raspberrypi : Dec 12 16:16:15 : pi : unable to resolve host raspberrypi ? q Held 4 messages in /root/mbox
新着メールが無い場合、「mail」を実行しても以下の表示になる
# mail No mail for root
この場合、「-f」を付けると以前のメールを表示できる(環境によってはこのオプションはエラーになる?)
# mail -f "/root/mbox": 4 messages 2 new 2 unread >N 1 pi@raspberrypi 土 12月 12 16: 14/522 *** SECURITY information for raspberrypi *** N 2 pi@raspberrypi 土 12月 12 16: 14/485 *** SECURITY information for raspberrypi *** U 3 pi@raspberrypi 土 12月 12 16: 17/566 *** SECURITY information for raspberrypi *** U 4 pi@raspberrypi 土 12月 12 16: 16/504 *** SECURITY information for raspberrypi ***
以下のようにしてメールの削除と確認ができる (「d 番号」でメールを削除し、「h」で一覧できる)
# mail "/var/mail/root": 2 messages 2 new > 1 Mail Delivery System Wed Feb 15 14:42 82/3412 "Undelivered Mail Returned to Sender" 2 Mail Delivery System Wed Feb 15 14:44 82/3412 "Undelivered Mail Returned to Sender" & d 1 & h > 2 Mail Delivery System Wed Feb 15 14:44 82/3412 "Undelivered Mail Returned to Sender" & d 2 & h No applicable messages & q
逆引きUNIXコマンド/mailコマンドの操作とメールの指定削除 - Linuxと過ごす https://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/mail... mailコマンドは対話式だが、以下のようにすることでメール一覧を取得できる
# echo q | mail
また以下のようにすることで、新着メールと未読メールの件数を取得できる(本当に正しいコードかどうかは要検証)
# echo q | mail | grep -c '^.[NU]'
また以下のようなシェルスクリプトで、root宛てにメールが届いたときに任意のアドレスに通知できる (この場合 from@example.com が送信元としたいアドレス、to@example.com が通知先のアドレスとなる)
#!/bin/bash count=$(echo q | mail | grep -c '^.[NPU*]') if [ $count -ge 1 ]; then echo "You've Got ${count} Mail(s) for root." | mail -s "You've Got Mail" -r from@example.com to@example.com fi
■バーチャルメールボックスのメールを確認
※Etcetra.txt の「メールを確認する」も参照 メールの保存場所へ移動
# cd /home/virtualmail/ # ll 合計 4 drwxr-xr-x 4 mailuser mailuser 4096 11月 25 23:04 refirio.net
メールを確認
# ll refirio.net/test/Maildir/ 合計 44 drwxr-xr-x 2 mailuser mailuser 4096 12月 11 15:44 cur -rw-r--r-- 1 mailuser mailuser 399 12月 11 15:44 dovecot-uidlist -rw-r--r-- 1 mailuser mailuser 8 11月 25 23:14 dovecot-uidvalidity -r--r--r-- 1 mailuser mailuser 0 11月 25 23:10 dovecot-uidvalidity.619f9968 -rw-r--r-- 1 mailuser mailuser 5056 12月 11 15:44 dovecot.index.cache -rw-r--r-- 1 mailuser mailuser 4140 12月 11 15:46 dovecot.index.log -rw-r--r-- 1 mailuser mailuser 48 11月 25 23:14 dovecot.mailbox.log drwxr-xr-x 2 mailuser mailuser 4096 12月 11 15:54 new -rw-r--r-- 1 mailuser mailuser 11 11月 25 23:14 subscriptions drwxr-xr-x 2 mailuser mailuser 4096 12月 11 15:54 tmp
新着メールがある状態
# ll refirio.net/test/Maildir/ 合計 44 drwxr-xr-x 2 mailuser mailuser 4096 12月 11 15:44 cur -rw-r--r-- 1 mailuser mailuser 399 12月 11 15:44 dovecot-uidlist -rw-r--r-- 1 mailuser mailuser 8 11月 25 23:14 dovecot-uidvalidity -r--r--r-- 1 mailuser mailuser 0 11月 25 23:10 dovecot-uidvalidity.619f9968 -rw-r--r-- 1 mailuser mailuser 5056 12月 11 15:44 dovecot.index.cache -rw-r--r-- 1 mailuser mailuser 4140 12月 11 15:46 dovecot.index.log -rw-r--r-- 1 mailuser mailuser 48 11月 25 23:14 dovecot.mailbox.log drwxr-xr-x 2 mailuser mailuser 4096 12月 11 15:54 new -rw-r--r-- 1 mailuser mailuser 11 11月 25 23:14 subscriptions drwxr-xr-x 2 mailuser mailuser 4096 12月 11 15:54 tmp # ll refirio.net/test/Maildir/new/ 合計 4 -rw------- 1 mailuser mailuser 2346 12月 11 15:54 1639205681.Vfd04I155a9cM401882.refirio.net # ll refirio.net/test/Maildir/cur/ 合計 24 -rw------- 1 mailuser mailuser 2792 11月 25 23:13 1637849600.Vfd04I155a7fM749425.refirio.net:2,RS -rw------- 1 mailuser mailuser 4056 11月 29 23:22 1638195771.Vfd04I155a64M782368.refirio.net:2,S -rw------- 1 mailuser mailuser 2804 11月 29 23:42 1638196942.Vfd04I155a95M440234.refirio.net:2,S -rw------- 1 mailuser mailuser 2789 12月 4 15:49 1638600578.Vfd04I155a90M122562.refirio.net:2,RS -rw------- 1 mailuser mailuser 3336 12月 4 18:23 1638609801.Vfd04I155a99M649171.refirio.net:2,RS -rw------- 1 mailuser mailuser 2344 12月 11 15:44 1639205090.Vfd04I155a58M173551.refirio.net:2,S
新着メールを確認
# cat refirio.net/test/Maildir/new/1639205681.Vfd04I155a9cM401882.refirio.net Return-Path: <example@gmail.com> X-Original-To: test@refirio.net Delivered-To: test@refirio.net Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) by mail.refirio.net (Postfix) with ESMTP id D9F85CAD9 for <test@refirio.net>; Sat, 11 Dec 2021 15:54:40 +0900 (JST) Received: by mail-lf1-f41.google.com with SMTP id t26so21825132lfk.9 for <test@refirio.net>; Fri, 10 Dec 2021 22:54:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:from:date:message-id:subject:to; bh=kVIp+Wogyi4Zcccev+7pJGCEarR9keCB1jCzsDPwgmA=; b=XtSwYkXuBm/RGtUMg1BmV2xp3C+r7nOfNdxM2pHDXafMH5V6m2ow7hOBH5PBKE9LG8 NrscLqdt3twmqpuOLa6ZAd4QLu03bsAlXBjMhhZqAZkDMsfl36pM/d+ibnUlrZSUkkz+ ePZEuEkPBXg2YZBEmrvOjfSTo37PIOWbrZRNpgLcJmLvXud+mMwK63JCTOvYHN7D+NsL OvEMRXlSkCdHFYinxTV0CU4HNLaSGDlczyT/xWQsqf4pIIysRDkfKXoG57Nkrm7H7UJY FC+j8ifgn77b38B0ff1el1bDMLbt+m86BKf9aenK44VkfidmIaLS365PdQugqfKZg1WA KIAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=kVIp+Wogyi4Zcccev+7pJGCEarR9keCB1jCzsDPwgmA=; b=u7tqRDDwA8BIAZO9Tb6OMT+TkbsoUALTC9m+sba1Fdp597JmTIs4FqL/2hl43NZsLP rG/aDxTOpSJKD0ybi5FNecKB4vahjTvB+I59+iTXhUDhp3CQTMx7S1ajzzUSpqRI/CgY vQnzRaLyUe8zQScjJvdzlIGrKj6YFRI9VuTlthpZpdA4+SLbLNPSlNcYSycXM2L0SIQg ua8y5zIEgs6o/P9cCDiCX+Dwf/WJh6ouCmQE+OAA/wGhcnRNAi5sUDQLTUbA1QTanP8n bQbMEJyYr1ShU0Y82t/cOXoWw6kQ2ISBNTxnkGqJ8G7ZvoKlYx/3oRpt0VzKy4Wy/KjJ KfjA== X-Gm-Message-State: AOAM532Ce85LZVAUWbPf5eBdGfKlz0T6p0qtDYRKgvFzerUjR6Vx6JTP XF+6Klb7X3mfYz/CSXYVGPc7jjxemE2tAxoezAYnNKH3Vfc= X-Google-Smtp-Source: ABdhPJwRE6ZESquGtxGZM62QJtk9w1vvJpe/mw7HUVBA/SxUvS80swT7qSyoaqrO6P/rMNWmsEEtqIuSEzMADSkFSR4= X-Received: by 2002:ac2:44c3:: with SMTP id d3mr9021772lfm.610.1639205679066; Fri, 10 Dec 2021 22:54:39 -0800 (PST) MIME-Version: 1.0 From: =?UTF-8?B?5bGx6YeO5a+b5ZKM?= <example@gmail.com> Date: Sat, 11 Dec 2021 15:53:42 +0900 Message-ID: <CABiFHFMcu+=mnMzBrOLiPJoVsBbWMeXY1AdHVXrR_2r5w97s+g@mail.gmail.com> Subject: TEST MAIL 2 To: test@refirio.net Content-Type: text/plain; charset="UTF-8" This is a test message. from refirio.
メーラーで受信した状態
# ll refirio.net/test/Maildir/new/ 合計 0 # ll refirio.net/test/Maildir/cur/ 合計 28 -rw------- 1 mailuser mailuser 2792 11月 25 23:13 1637849600.Vfd04I155a7fM749425.refirio.net:2,RS -rw------- 1 mailuser mailuser 4056 11月 29 23:22 1638195771.Vfd04I155a64M782368.refirio.net:2,S -rw------- 1 mailuser mailuser 2804 11月 29 23:42 1638196942.Vfd04I155a95M440234.refirio.net:2,S -rw------- 1 mailuser mailuser 2789 12月 4 15:49 1638600578.Vfd04I155a90M122562.refirio.net:2,RS -rw------- 1 mailuser mailuser 3336 12月 4 18:23 1638609801.Vfd04I155a99M649171.refirio.net:2,RS -rw------- 1 mailuser mailuser 2344 12月 11 15:44 1639205090.Vfd04I155a58M173551.refirio.net:2,S -rw------- 1 mailuser mailuser 2346 12月 11 15:54 1639205681.Vfd04I155a9cM401882.refirio.net:2,
メーラーで既読にした状態
# ll refirio.net/test/Maildir/new/ 合計 0 # ll refirio.net/test/Maildir/cur/ 合計 28 -rw------- 1 mailuser mailuser 2792 11月 25 23:13 1637849600.Vfd04I155a7fM749425.refirio.net:2,RS -rw------- 1 mailuser mailuser 4056 11月 29 23:22 1638195771.Vfd04I155a64M782368.refirio.net:2,S -rw------- 1 mailuser mailuser 2804 11月 29 23:42 1638196942.Vfd04I155a95M440234.refirio.net:2,S -rw------- 1 mailuser mailuser 2789 12月 4 15:49 1638600578.Vfd04I155a90M122562.refirio.net:2,RS -rw------- 1 mailuser mailuser 3336 12月 4 18:23 1638609801.Vfd04I155a99M649171.refirio.net:2,RS -rw------- 1 mailuser mailuser 2344 12月 11 15:44 1639205090.Vfd04I155a58M173551.refirio.net:2,S -rw------- 1 mailuser mailuser 2346 12月 11 15:54 1639205681.Vfd04I155a9cM401882.refirio.net:2,S
メーラーで返信にした状態
# ll refirio.net/test/Maildir/cur/ 合計 28 -rw------- 1 mailuser mailuser 2792 11月 25 23:13 1637849600.Vfd04I155a7fM749425.refirio.net:2,RS -rw------- 1 mailuser mailuser 4056 11月 29 23:22 1638195771.Vfd04I155a64M782368.refirio.net:2,S -rw------- 1 mailuser mailuser 2804 11月 29 23:42 1638196942.Vfd04I155a95M440234.refirio.net:2,S -rw------- 1 mailuser mailuser 2789 12月 4 15:49 1638600578.Vfd04I155a90M122562.refirio.net:2,RS -rw------- 1 mailuser mailuser 3336 12月 4 18:23 1638609801.Vfd04I155a99M649171.refirio.net:2,RS -rw------- 1 mailuser mailuser 2344 12月 11 15:44 1639205090.Vfd04I155a58M173551.refirio.net:2,S -rw------- 1 mailuser mailuser 2346 12月 11 15:54 1639205681.Vfd04I155a9cM401882.refirio.net:2,RS
メールの内容を確認 「:2,RS」のような値も含めて指定する(指定する際はエスケープが必要)
# cat refirio.net/test/Maildir/cur/1639205681.Vfd04I155a9cM401882.refirio.net\:2\,RS Return-Path: <example@gmail.com> X-Original-To: test@refirio.net Delivered-To: test@refirio.net Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) by mail.refirio.net (Postfix) with ESMTP id D9F85CAD9 for <test@refirio.net>; Sat, 11 Dec 2021 15:54:40 +0900 (JST) Received: by mail-lf1-f41.google.com with SMTP id t26so21825132lfk.9 for <test@refirio.net>; Fri, 10 Dec 2021 22:54:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:from:date:message-id:subject:to; bh=kVIp+Wogyi4Zcccev+7pJGCEarR9keCB1jCzsDPwgmA=; b=XtSwYkXuBm/RGtUMg1BmV2xp3C+r7nOfNdxM2pHDXafMH5V6m2ow7hOBH5PBKE9LG8 NrscLqdt3twmqpuOLa6ZAd4QLu03bsAlXBjMhhZqAZkDMsfl36pM/d+ibnUlrZSUkkz+ ePZEuEkPBXg2YZBEmrvOjfSTo37PIOWbrZRNpgLcJmLvXud+mMwK63JCTOvYHN7D+NsL OvEMRXlSkCdHFYinxTV0CU4HNLaSGDlczyT/xWQsqf4pIIysRDkfKXoG57Nkrm7H7UJY FC+j8ifgn77b38B0ff1el1bDMLbt+m86BKf9aenK44VkfidmIaLS365PdQugqfKZg1WA KIAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=kVIp+Wogyi4Zcccev+7pJGCEarR9keCB1jCzsDPwgmA=; b=u7tqRDDwA8BIAZO9Tb6OMT+TkbsoUALTC9m+sba1Fdp597JmTIs4FqL/2hl43NZsLP rG/aDxTOpSJKD0ybi5FNecKB4vahjTvB+I59+iTXhUDhp3CQTMx7S1ajzzUSpqRI/CgY vQnzRaLyUe8zQScjJvdzlIGrKj6YFRI9VuTlthpZpdA4+SLbLNPSlNcYSycXM2L0SIQg ua8y5zIEgs6o/P9cCDiCX+Dwf/WJh6ouCmQE+OAA/wGhcnRNAi5sUDQLTUbA1QTanP8n bQbMEJyYr1ShU0Y82t/cOXoWw6kQ2ISBNTxnkGqJ8G7ZvoKlYx/3oRpt0VzKy4Wy/KjJ KfjA== X-Gm-Message-State: AOAM532Ce85LZVAUWbPf5eBdGfKlz0T6p0qtDYRKgvFzerUjR6Vx6JTP XF+6Klb7X3mfYz/CSXYVGPc7jjxemE2tAxoezAYnNKH3Vfc= X-Google-Smtp-Source: ABdhPJwRE6ZESquGtxGZM62QJtk9w1vvJpe/mw7HUVBA/SxUvS80swT7qSyoaqrO6P/rMNWmsEEtqIuSEzMADSkFSR4= X-Received: by 2002:ac2:44c3:: with SMTP id d3mr9021772lfm.610.1639205679066; Fri, 10 Dec 2021 22:54:39 -0800 (PST) MIME-Version: 1.0 From: =?UTF-8?B?5bGx6YeO5a+b5ZKM?= <example@gmail.com> Date: Sat, 11 Dec 2021 15:53:42 +0900 Message-ID: <CABiFHFMcu+=mnMzBrOLiPJoVsBbWMeXY1AdHVXrR_2r5w97s+g@mail.gmail.com> Subject: TEST MAIL 2 To: test@refirio.net Content-Type: text/plain; charset="UTF-8" This is a test message. from refirio.
なおこのとき、mailコマンドでは上記のメールを確認できなかった
# mail Heirloom Mail version 12.5 7/5/10. Type ? for help. "/var/spool/mail/root": 1 message > 1 example@refirio.net Sun Oct 24 18:13 17/612 "*** SECURITY information for refirio.net ***" & q Held 1 message in /var/spool/mail/root
ユーザの切り替えもできなかった
# su mailuser This account is currently not available. # su virtualmail su: user virtualmail does not exist
■メールのログを解析
メールを送信できたかどうかの判断に、メールログを解析することがある ログを調査する他にバウンスメールを解析する手段もある それぞれ後述する 迷惑メール扱いされた場合の対策は Trouble.txt の「メールを送信しても届かない / 迷惑メールとして処理される」を参照 そもそも迷惑メール扱いされないようにするための対策は、 Network.txt の「メールを送信する際、迷惑メール扱いされないための設定」を参照
■メールのログをコマンドで解析
メールに関するログは /var/log/maillog に記録されている 具体的には、以下のような内容となっている
Oct 2 07:44:21 web1 sendmail[21798]: u91MiLhk021798: from=<auto@refirio.net>, size=1528, class=0, nrcpts=1, msgid=<8933a528ed38e17adf4c065ed90c21cb@refirio.net>, proto=ESMTP, daemon=MTA, relay=localhost [127.0.0.1] Oct 2 07:44:21 web1 sendmail[21800]: u91MiLhk021798: to=<taro@example.com>, delay=00:00:00, xdelay=00:00:00, mailer=esmtp, pri=121528, relay=iron01.mailgw.jp. [210.171.0.59], dsn=2.0.0, stat=Sent (ok: Message 719393598 accepted)
ログの見方は以下を参照 /var/log/maillogとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 https://wa3.i-3-i.info/word13859.html mailログ確認方法 https://web.archive.org/web/20170819142211/http://support.fsv.jp/manual/analysis/log/check/mail.html メールサーバーが出すログの記述を把握する | GMOクラウドアカデミー https://academy.gmocloud.com/lesson/20160907/3592 Postfixのメールログの探し方・読み方・使い方を解説 - ベアメールブログ https://baremail.jp/blog/2021/10/05/1635/ メールサーバー - KAGOYA Internet Routing https://support.kagoya.jp/kir/manual/mail_server/log_smtp.html ステータスコードとエラーコードは以下を参照 メールのエラーコードと、メールサーバのmaillog解析方法まとめ http://oxynotes.com/?p=9810 冒頭のログからは、以下の情報を読み取れる 日時 ... 10月2日7時44分21秒に送信 ホストサーバー名 ... web1 プロセスの情報 ... sendmailがプロセスID [21798] で処理した メッセージID ... sendmailによってID [u91MiLhk021798] が割り当てられた 送受信者の情報 ... auto@refirio.net から送信された / taro@example.com に送信された メッセージサイズ ... 1528 メッセージ優先度 ... 0 メッセージ受信者数 ... 1 メッセージ識別番号 ... 8933a528ed38e17adf4c065ed90c21cb@refirio.net プロトコル情報 ... ESMTP サーバーデーモン名 ... MTA メッセージ送信サーバ ... localhost [127.0.0.1] リレー先サーバ ... iron01.mailgw.jp ステータス ... dsn=2.0.0, Sent (ok: Message 719393598 accepted) ※「relay=localhost [127.0.0.1]」は現れたり現れなかったりするような。また改めて違いを調べたい ※「dsn」は「Delivery Status Notifications」の略受信側のサーバが受信状況を送信側に通知する仕組み。「2.0.0」は成功 ※「Sent」は送信したということ ※メールログは1つの処理が複数行からなる。また、処理内容によってログ形式は変わるみたい?要勉強 生ログの解析は大変なので、maillogconvert.plなどを使って変換したログを解析する方が良さそう Postfix トラブル調査でメールログを調べる手順 http://plumpliver.com/postfix-maillog-procedure なお、外部のSMTPで送信した場合などは maillog にログが記録されない メール送信部分を管理しなくていいメリットはあるが、トラブル時の調査にログを見られないデメリットはあるので注意 Postfixによるメール送信設定 | 稲葉サーバーデザイン https://inaba-serverdesign.jp/blog/20160620/postfix_send_mail.html 「外部メールサービスの利用について」が参考になる
■メールのログをmaillogconvert.plで変換してコマンドで解析
maillogconvert.plを使うと、メールログを読みやすい形式にしてくれる http://hobbit.ddo.jp/awstatsdocs/awstats_tools.html 以下からダウンロードできる https://ja.osdn.net/projects/sfnet_awstats/ 以下はWindows環境での解析例
C:\xampp\perl\bin\perl maillogconvert.pl standard < C:\mail\maillog > mail.log
以下はUnix環境での解析例
perl maillogconvert.pl standard < /var/log/maillog > mail.log
ログローテートに注意すること(ローテートされているかは「ll /var/log/ | grep maillog」のようにして調べることができる) 以下のように変換される
2016-10-02 07:44:21 auto@refirio.net taro@example.com localhost mail01.example.com SMTP - 1 1528
変換されたログからは、以下の情報を読み取れる 日時 ... 10月2日7時44分21秒に送信 送受信者の情報 ... auto@refirio.net から taro@example.com に送信された メッセージ送信サーバ ... localhost リレー先サーバ ... mail01.example.com プロトコル情報 ... SMTP SMTPレスポンスコード ... 1 メッセージサイズ ... 1528 PHPから送信したときは、送信者は「apache」になるみたい?次の行もセットで記録されるみたい?
2016-10-02 08:15:59 apache example@docomo.ne.jp localhost 127.0.0.1 SMTP - 1 928 2016-10-02 08:15:59 apache@web1.refirio.net example@docomo.ne.jp localhost mfsmax.docomo.ne.jp SMTP - 1 1151
以下のようなログが大量に記録されているが、中国からのアクセス。リレーメールを拒否した際のログ
2016-10-05 04:07:14 <> example@163.com 183.240.203.45 - SMTP - 550 ? 2016-10-05 04:07:14 example@s.jp example@163.com 183.240.203.45 - SMTP - 550 0
送信元が「<>」なのは送信元が不明なメール。スパムの可能性が高い こういったメールを拒否して運用することは多いが、必要なメールも拒否してしまう可能性はあるので注意 【postfix】envelope-FROMを強制的に付与する http://ameblo.jp/server-study/entry-10270572107.html 変換の際に作成されたmail.logは、理由がなければ削除しておく 引き続き、解析方法や集計方法について勉強中 ■SMTPレスポンスコード maillogconvert.plでは、成功時のSMTPレスポンスコードは 1 になるみたい また、原因不明のエラーは 999 になるみたい その他のレスポンスコードは以下を参照 SMTP応答コード http://www.puni.net/~mimori/smtp/reply.html バウンスメールを受け取らなくても、これでメールが届いたかどうかは十分に判る? バウンスメールの本文からしか判らない情報もあるみたい?要勉強 ■コマンドでの解析例 2016年10月2日15時のみ
# cat mail.log | grep '2016-10-02 15'
特定の送信元
# cat mail.log | awk '($3 == "apache@refirio.net") {print $0}'
特定の送信先
# cat mail.log | awk '($4 == "example@example.com") {print $0}'
エラーのみ
# cat mail.log | awk '($9 != 1) {print $0}'
■バウンスメールを解析
メールログの調査だけではなく、バウンスメールも解析するといい でも「バウンスは発生しないが、メールも届かない」はあり得るのでこれも絶対ではない(迷惑メール扱いされた、など) Postfix+VERPでメールを識別できるようにする…という方法はあるが、 maillogを解析して「どのアドレスに届かなかったか」が判ればある程度は対応できる が、可能ならmaillogとバウンスメールの両方を調査できる状態にしておくことが好ましい バウンスメールとは何か? http://bouncehammer.jp/ja/what-is-bounced-email バウンスが発生する3つのタイミング http://bouncehammer.jp/ja/email-topics/when-does-email-bounce 携帯電話宛バウンスの見分け http://bouncehammer.jp/ja/email-topics/distinguish-between-the-unknown-and-the-filtered 携帯のドメイン指定フィルタが原因でバウンスしてしまいました。再送するにはどうすればよいですか? https://support.sendgrid.kke.co.jp/hc/ja/articles/206442433 VERP でメール不達エラーの宛先アドレスを識別する https://fumiyas.github.io/2014/12/25/verp.postfix-advent-calendar.html バウンス理由の一覧 | Sisimai: Mail Analyzing Interface https://libsisimai.org/ja/reason/ ■バウンスメールの送信 バウンスメールを返すか否かは、送信先サーバの設定にも依存する よって「バウンスメールが送られてこない=メールが届いた」というわけでは無いので注意 以下は「存在しないアカウント宛に送られたメールには、バウンスメールを返さない」設定の例 unknown user のバウンスメールの削除 http://www.ice.is.kit.ac.jp/~umehara/misc/comp/20091218c.html ■バウンスメールの送信先 バウンスメールは、「Return-Path」に対して通知される ただし Return-Path に差出人のメールアドレスと異なるメールアドレスを指定すると、迷惑メール扱いされやすくなるので注意 詳細は Trouble.txt の「メールを送信しても届かない / 迷惑メールとして処理される」を参照 Return-Pathとは何か? | SendGridブログ https://sendgrid.kke.co.jp/blog/?p=12803 Return-Path(エンベロープFrom)とは? | JCOMサポート https://cs.myjcom.jp/knowledgeDetail?an=000003212 また、root宛にも同じ内容が通知されるみたい ただしメールを見落としがちだし確認も手間なので、root宛メールは自身のメールアドレス(もしくはサーバ管理用のメールアドレス)に転送しておくのが無難 rootメールの転送については、Basis.txtの「root宛メールを転送」を参照 以下は相手に届かないけどバウンスメールも送られない…というケース 携帯のドメイン指定フィルタが原因でバウンスしてしまいました。再送するにはどうすればよいですか? https://support.sendgrid.kke.co.jp/hc/ja/articles/206442433-%E6%90%BA%E5%B8%AF%E3%81%AE%E3%83%89%E3%... ■バウンスメールの書式 バウンスメールの書式はRFCで定義されているが、定義に沿っていないものもあるようなので注意 5.3 バウンスメールにより通知される送信失敗|Cuenote https://www.cuenote.jp/documents/smtp/000203.html 以下はRFCによるものだが推測も含む メールヘッダの「Content-Type」に以下が記録されるみたい これにより、バウンスメールか否かを判断できそう
multipart/report; report-type=delivery-status;
バウンスメールの場合、メール本文に以下のような情報が記載される これにより、バウンスの理由などを判断できそう
Reporting-MTA: dns; web1.refirio.net Received-From-MTA: DNS; localhost Arrival-Date: Tue, 1 Jun 2021 13:06:22 +0900 Final-Recipient: RFC822; xxxxxxxxxx@ezweb.be.jp Action: failed Status: 5.1.2 Remote-MTA: DNS; ezweb.be.jp Diagnostic-Code: SMTP; 550 Host unknown Last-Attempt-Date: Tue, 1 Jun 2021 13:06:22 +0900
以下のようなものもある。似た内容が記録されるが、項目には差がある
Reporting-MTA: dns; web1.refirio.net Arrival-Date: Tue, 1 Jun 2021 08:52:57 +0900 Final-Recipient: RFC822; xxxxxxxxxxxx@icliud.com Action: delayed Status: 4.4.1 Remote-MTA: DNS; icliud.com Last-Attempt-Date: Tue, 1 Jun 2021 13:45:01 +0900 Will-Retry-Until: Sun, 6 Jun 2021 08:52:57 +0900
「550」のような値は応答コード、「5.1.1」のような値はステータスコード これらにより、バウンスメール扱いとなった理由を知ることができる メール配信が失敗した時のエラーコード一覧!エラー内容を把握して配信リストの質を高めよう - Benchmark Email https://www.benchmarkemail.com/jp/blog/error-codes-of-bounced-emails/ メールのエラーコード(SMTPステータスコード)の意味と対策 | ベアメールブログ https://baremail.jp/blog/2021/02/25/1020/ ■バウンスメールの種類 バウンスメールはソフトバウンスとハードバウンスに分けられる ソフトバウンスは、メールアドレスが正しく、受信者のサーバに到達したが、以下の様な理由で返されたということを意味する ・メールボックスが一杯だった ・サーバがダウンしていた ・メッセージサイズが大きすぎた ハードバウンスは、以下の様な理由で受信を恒久的に拒否された場合に発生する ・メールアドレスが無効/不正 ・メールアドレスが存在しない ハードバウンスが発生したメールアドレスにメールを送り続けると、手当たり次第にスパムを送信していると判定される可能性がある メール送信サービスによっては、ハードバウンスの割合が一定数を超えると利用警告されることがあるので注意 場合によっては、実際にメールを送信する前にアドレスの妥当性を検証する仕組みの導入を検討する メールアドレスをリアルタイムに検証してハードバウンスをなくす方法 | SendGridブログ https://sendgrid.kke.co.jp/blog/?p=7837 なお、ハードバウンスは 「応答コードが550で、ステータスコードが5.1.1 もしくは 5.1.2」 という判定ができそう(要検証) バウンスメールとその対策 | SendGridブログ https://sendgrid.kke.co.jp/blog/?p=1338 ステータスコードが5.2.0としてバウンスメールになることもあるが、 これはドメイン指定拒否の場合に記録されるものみたい 携帯電話宛バウンスの宛先不明とドメイン指定拒否を見分ける | Sisimai: Mail Analyzing Interface https://libsisimai.org/ja/docs/distinguish-between-the-unknown-and-the-filtered.html メールを解析していると、はじめから件名に「[SPAM]」と付いていることがある プロバイダなどが自動で付与しているものだと思われるので、基本的にはスパム扱いで問題なさそう タイトルに[spam]とついたメールが届く | よくある質問(FAQ) | BIGLOBE会員サポート https://faq.support.biglobe.ne.jp/faq_detail.html?faq_id=12363
■システムをリアルタイムに監視
Sysstatをインストールしておくと、sarコマンドでシステムの状況を表示できるようになる インストールするだけで、システムの状況が /etc/cron.d/sysstat によって /var/log/sa/ 内に記録されるようになる。 記録された情報は
# sar -f /var/log/sa/sa05
で確認できる。(上の例は、ある月の5日の情報)また
# sar [オプション] [秒] [カウント]
とすれば現在の状況をリアルタイムに監視できる。 使用例は以下のとおり。
# sar -q 1 10 … システム全体の負荷 # sar -u 1 10 … CPUの使用状況 # sar -P ALL 1 10 … CPUの使用状況(コアごと) # sar -r 1 10 … メモリの使用状況 # sar -W 1 10 … スワップの確認 # sar -b 1 10 … I/Oの確認 # sar -d -p 1 10 … ブロックデバイスの確認 # sar -n DEV 1 10 … ネットワークデバイスの確認 # sar -n DEV 1 10 | grep eth0 … ネットワークデバイスの確認(eth0のみ) # sar -q -s 10:00:00 -e 12:30:00 -f /var/log/sa/sa05 … 時間を指定して確認
sarコマンドでLinuxサーバのシステムモニタリングを行う方法 http://naoberry.com/tech/sar/
■コマンドの実行時間を表示
$ time sleep 3 real 0m3.001s user 0m0.000s sys 0m0.000s
real ... プログラムの呼び出しから終了までにかかった実時間(秒) user ... プログラム自体の処理時間(秒)(ユーザCPU時間) sys ... プログラムを処理するために、OSが処理をした時間(秒)(システム時間) 以下は計測例。余計なcatを挟まない方が高速であることが判る ログ解析コマンドのチューニングなどに使える
# time cat /var/log/httpd/access_log | grep -ie "\(\.ico\)" real 0m0.005s user 0m0.000s sys 0m0.000s # time grep -ie "\(\.ico\)" /var/log/httpd/access_log real 0m0.004s user 0m0.000s sys 0m0.000s
■CentOSのバージョンと何ビットマシンかを調べる
CentOSのバージョンと?bitマシンかを調べる。 http://qiita.com/GENYA/items/9ffbd78cb7f82ecc5b7e
# cat /etc/redhat-release … CentOSのバージョンを調べる CentOS release 6.7 (Final) # uname -m … 何ビットマシンかを調べる x86_64 # arch … 「uname -m」と同じ結果が表示される x86_64
「x86_64」「amd64」という文字があれば64ビット 「i386」「i686」「x86」という文字があればは32ビット 「x86」自体はビット数とは関係なく、IntelCPUの総称 x86はプロセッサの型番から来ている x86 - Wikipedia https://ja.wikipedia.org/wiki/X86 以下のようにすると、マシンに関するすべての情報が表示される
# uname -a … 何ビットマシンかを調べる Linux refirio.net 2.6.32-573.1.1.el6.x86_64 #1 SMP Sat Jul 25 17:05:50 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
■各種バージョンを調べる
$ uname -r … カーネルのバージョンを調べる 2.6.32-573.1.1.el6.x86_64 $ php -v … PHPのバージョンを調べる PHP 5.3.3 (cli) (built: Feb 9 2016 10:36:17) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies $ mysql -u root -p'1234' -D mysql -e "SELECT VERSION()" … MySQLのバージョンを調べる +-----------+ | VERSION() | +-----------+ | 5.1.73 | +-----------+ $ psql --version … PostgreSQLのバージョンを調べる psql (PostgreSQL) 9.2.24
■CPUを調べる
$ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 63 model name : Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz stepping : 2 〜略〜 cache_alignment : 64 address sizes : 46 bits physical, 48 bits virtual power management:
■サーバの日時を確認
$ date 2016年 1月 20日 水曜日 19:55:25 JST
■サーバの日時を設定
dateコマンドでLinuxサーバの時刻変更 http://qiita.com/na0AaooQ/items/af6b853faf32c58c21d3
$ date -s "12/08 13:00 2016" … 任意の日時に変更 $ date … 日時の確認
AWSのEC2で上の設定を行い、S3を使おうとすると以下の例外が発生する S3Exception: The difference between the request time and the current time is too large. WindowsOS上のインターネット時刻同期無効化後、RDP切断、ヘルスチェックエラー https://forums.aws.amazon.com/thread.jspa?tstart=0&threadID=147084 AWSでは時刻の変更は非推奨みたい
■プロセスを確認&強制終了
■top
$ top … システム全体の負荷を表示。プロセス、CPU、メモリ、スワップの統計情報も表示
「%CPU」と「%MEM」で、CPUとメモリの使用率が判る。ただし数値が大きくても、すぐに終わる処理なら問題はない CPUの使用時間は「TIME+」で判る 時間は「分、秒、1/10秒」もしくは「時、分、秒」で表示される。しばらく眺めてどちらの表示なのか判断する top実行中に「1」を入力 … 「Cpu(s)」の項目で、CPUごとのデータを表示 top実行中に「c」を入力 … COMMAND列に、コマンドの詳細を表示 top実行中に「Shift+p」 … CPU使用率順にソート(デフォルト) top実行中に「Shift+m」 … メモリ使用率順にソート top実行中に「Shift+o」 … ソートできる項目が一覧表示されるので、ソートしたいアルファベットを入力してEnter topコマンドを終了したい場合、「q」もしくは「Ctrl+c」を入力する topコマンドの使い方 - Qiita https://qiita.com/k0kubun/items/7368c323d90f24a00c2f topコマンドで覚えておきたい使い方14個 | 俺的備忘録 〜なんかいろいろ〜 https://orebibou.com/2015/07/top%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%8... ■ps
$ ps aux … BSDオプションでプロセスを確認。topとは違い、リアルタイムではない $ ps aux | grep プロセス名 … プロセス名で絞り込み $ ps aux --sort=-pcpu … CPUの降順にソート $ ps aux --sort=-pmem … メモリの降順にソート $ ps auxw --sort=-pcpu … wを付けるとCOMMANDを省略せずに表示 $ pstree … ツリー状に表示 $ pstree -c … サブツリーをまとめずに、ツリー状に表示 $ ps aux -L … スレッドを確認する PIDがプロセスID、LWPがスレッドID、NLWPがスレッド数 $ ps -ef … UNIXオプションでプロセスを確認 BSDオプションに比べると情報量は少ないが、親プロセス(PID)が含まれる プロセスの親子関係も含めて確認する場合は便利 $ ps auxf … BSDオプションでも、fをつけるとCOMMANDがツリー表示される
「ps aux」のようにオプションにハイフンを付けないものは、「BSDオプション」と呼ばれる記法 「ps -ef」のようにオプションにハイフンを付けるものは、「UNIX」オプションと呼ばれる記法 Linuxではどちらの記法も指定可能で、混在させることもできる ps - CodeZine(コードジン) https://codezine.jp/unixdic/w/ps ps のオプションについてのメモ書き - 双六工場日誌 http://sechiro.hatenablog.com/entry/20120805/1344139544 逆引きUNIXコマンド/psコマンドでスレッドを確認する方法 http://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/ps%E3... psでCPU使用率をはからないように - ikeasの日記 http://d.hatena.ne.jp/ikeas/20091130/1259595249 topとはCPU使用率の計算方法が異なるようなので注意 ■プロセスの強制終了
$ kill -KILL プロセス番号 … プロセスを強制終了 $ kill -9 プロセス番号 … 「-KILL」と「-9」は同じ意味
pgrep, pkill を使用してプロセスを殺す http://d.hatena.ne.jp/lurker/20061102/1162427170
■MySQLでプロセスを確認&強制終了
MYSQL障害解析の被疑箇所別 勘所 まとめ http://www.hachim.jp/study-by-incident/mysql-unyo-viewpoint-2.html MySQL プロセスを強制終了する http://mysql.javarou.com/dat/000580.html MySQLで処理に長時間かかっている複数クエリをまとめて殺す方法 http://tech.basicinc.jp/MySQL/2014/04/06/mysql_processlist_kill/ MySQLはシングルプロセスでマルチスレッドなので、topやpsでは1プロセスしか確認できない
$ top 3008 mysql 20 0 16.7g 7.4g 4748 S 16.9 47.0 1710:57 mysqld 1081 apache 20 0 452m 32m 7780 S 2.3 0.2 0:12.92 httpd 6524 apache 20 0 450m 30m 7744 S 1.0 0.2 0:11.13 httpd 14172 apache 20 0 448m 28m 7784 S 1.0 0.2 0:12.11 httpd 1352 root 20 0 0 0 0 S 0.3 0.0 21:55.68 kondemand/4 1516 root 39 19 0 0 0 S 0.3 0.0 301:43.94 kipmi0 $ ps aux --sort=-pcpu USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND mysql 3008 1.5 46.9 17528172 7719056 ? Sl 2015 1711:00 /usr/libexec/mysqld --defaults-file=/etc/my.cnf - root 1724 0.2 0.3 797704 54604 ? Ssl 2015 582:05 /usr/sbin/eecd bwave 17628 0.2 0.0 15300 1572 pts/0 S+ 10:17 0:32 top apache 373 0.1 0.1 442372 22744 ? S 11:14 0:09 /usr/sbin/httpd -DSTATUS -f /etc/httpd/conf/httpd. apache 820 0.1 0.1 461384 32292 ? S 10:05 0:15 /usr/sbin/httpd -DSTATUS -f /etc/httpd/conf/httpd. apache 1081 0.1 0.2 463188 33328 ? S 10:05 0:12 /usr/sbin/httpd -DSTATUS -f /etc/httpd/conf/httpd.
スレッドの確認は、以下のようにmysqlコマンド内で SHOW PROCESSLIST を使う KILL でスレッドの強制終了ができる
mysql> SHOW PROCESSLIST; +----+------+----------------+--------+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+----------------+--------+---------+------+-------+------------------+ | 9 | root | localhost:4049 | testdb | Sleep | 39 | | NULL | | 13 | root | localhost:4451 | test | Query | 0 | NULL | SHOW PROCESSLIST | +----+------+----------------+--------+---------+------+-------+------------------+ 2 rows in set (0.00 sec) mysql> KILL 9; Query OK, 0 rows affected (0.00 sec) mysql> SHOW PROCESSLIST; +----+------+----------------+------+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+----------------+------+---------+------+-------+------------------+ | 13 | root | localhost:4451 | test | Query | 0 | NULL | SHOW PROCESSLIST | +----+------+----------------+------+---------+------+-------+------------------+ 1 row in set (0.00 sec)
なお
mysql> SHOW PROCESSLIST;
の代わりに
mysql> SELECT * FROM information_schema.PROCESSLIST;
として一覧することもできる。この場合、
mysql> SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 60;
このようにすれば、60秒より長く実行され続けているクエリを探すこともできる (デッドロックが発生したときなど、長く処理されているものを強制終了させるときに使える) 上記の方法だと長いSQLが省略表示されてしまうが、 以下のように「\G」をつけると全文を確認できる
mysql> SHOW FULL PROCESSLIST \G; *************************** 1. row *************************** Id: 164233 User: webmaster Host: 10.0.0.225:54468 db: NULL Command: Query Time: 0 State: starting Info: SHOW FULL PROCESSLIST *************************** 2. row *************************** Id: 164473 User: webmaster Host: 10.0.0.225:54812 db: test Command: Execute Time: 0 State: Sending data Info: select * from `test` where `status` is null *************************** 3. row *************************** Id: 164703 User: webmaster Host: 10.0.0.119:51828 db: test Command: Sleep Time: 198 State: Info: NULL *************************** 4. row *************************** 〜略〜 *************************** 10. row *************************** Id: 164778 User: webmaster Host: 10.0.0.119:51892 db: test Command: Execute Time: 0 State: Sending data Info: select * from `test` where `status` is null 10 rows in set (0.00 sec) ERROR: No query specified
実行中のプロセスの一覧を表示する - MySQL 逆引きリファレンス http://mysql.javarou.com/dat/000582.html ■RDS ※未検証 RDSでは「KILL 9;」ではエラーになり、「CALL mysql.rds_kill(9);」のようにする必要があるみたい …だが、普通に「KILL 9;」でもKILLできるような… Amazon RDS な MySQL で 不要 process を kill する - Garbage in, gospel out http://libitte.hatenablog.jp/entry/20141202/1417452564 RDS上のMySQLでKILLは使えない | // sakura note https://saku.io/cant-use-kill-on-rds-mysql/
■MySQLで文字コードを確認
mysql> SHOW VARIABLES LIKE '%char%'; … MySQLの文字コードを確認 mysql> SHOW CREATE DATABASE `test`; … 特定データベースの文字コードを確認 mysql> SHOW CREATE TABLE `address`; … 特定テーブルの文字コードを確認
■MySQLでスロークエリログを記録
Mysql slow queryの設定と解析方法 - 主夫ときどきプログラマ http://masayuki14.hatenablog.com/entry/20120704/1341360260
mysql> SELECT * FROM mysql.slow_log; … スロークエリを確認 Empty set (0.30 sec) mysql> SHOW GLOBAL VARIABLES LIKE 'slow_query_log'; … スロークエリのON/OFFを確認(初期設定はOFF) +----------------+-------+ | Variable_name | Value | +----------------+-------+ | slow_query_log | OFF | +----------------+-------+ 1 row in set (0.25 sec) mysql> SHOW GLOBAL VARIABLES LIKE 'long_query_time'; … スロークエリの記録時間を確認(初期設定は10秒) +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ 1 row in set (0.00 sec) mysql> SHOW GLOBAL VARIABLES LIKE 'log_output'; … スロークエリの記録先を確認(初期設定はファイル) +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_output | FILE | +---------------+-------+ 1 row in set (0.00 sec) mysql> SHOW GLOBAL VARIABLES LIKE 'slow_query_log_file'; … スロークエリの記録ファイルを確認(初期設定は /var/lib/mysql/refirio-slow.log) +---------------------+---------------------------------+ | Variable_name | Value | +---------------------+---------------------------------+ | slow_query_log_file | /var/lib/mysql/refirio-slow.log | +---------------------+---------------------------------+ 1 row in set (0.01 sec) mysql> SET GLOBAL slow_query_log = ON; … スロークエリのON/OFFを変更 mysql> SET GLOBAL long_query_time = 1.0; … スロークエリの記録時間を変更 mysql> SET GLOBAL log_output = 'TABLE'; … スロークエリの記録先をデータベースに変更 mysql> SELECT * FROM mysql.slow_log; … スロークエリを確認 mysql> SELECT * FROM mysql.general_log; … 一般ログを確認 mysql> SELECT * FROM mysql.slow_log ORDER BY query_time DESC LIMIT 10; … スロークエリを時間の長い順に表示する例
なお以下のようにすると、スロークエリログをファイルに書き出せる
$ echo 'SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 100;' | mysql -u ユーザー名 -p データベース名 > ダンプファイル名
■ファイルに記録したスロークエリを解析する例 スロークエリの出力ファイルを変更する場合
mysql> set global slow_query_log_file = '/tmp/mysql-slow.log';
スロークエリを表示
$ vi /var/run/mysqld/mysqld-slow.log
スロークエリを解析(実行時間の遅い順に表示)
$ mysqldumpslow -s t /var/run/mysqld/mysqld-slow.log
■MySQLで実行中のクエリを確認
実行中のクエリを確認
mysql> SHOW PROCESSLIST\G
1000文字を超えるSQLも表示
mysql> SHOW FULL PROCESSLIST\G
MySQLをチューニング,そしてスケールアップ/スケールアウトへ http://gihyo.jp/dev/serial/01/MySQL-tuning-scale/0005?page=2
■MySQLで現在のコネクション数を確認
$ /usr/bin/mysql -s -N -u [USER] -p[PASSWD] -e "SHOW STATUS LIKE 'Threads_connected';" | cut -f2
■MySQLのデータ容量を確認
MySQLでDBとテーブルのサイズを確認するSQL http://qiita.com/iKenji/items/b868877492fee60d85ce ■DBのサイズ
SELECT table_schema AS DB, SUM(data_length) / 1024 / 1024 AS MB FROM information_schema.tables GROUP BY table_schema ORDER BY SUM(data_length + index_length) DESC; +------------------------+-------------+ | DB | MB | +------------------------+-------------+ | test | 40.50000000 | | company | 29.70312500 | | abc | 13.28125000 | +------------------------+-------------+
■テーブルのサイズ
SELECT table_name, engine, table_rows AS tbl_rows, FLOOR((data_length + index_length) / 1024) AS allKB, #総容量 FLOOR((data_length) / 1024) AS dataKB, #データ容量 FLOOR((index_length) / 1024) AS indexKB #インデックス容量 FROM information_schema.tables WHERE table_schema = database() ORDER BY (data_length + index_length) DESC; +------------+--------+----------+-------+--------+---------+ | table_name | engine | tbl_rows | allKB | dataKB | indexKB | +------------+--------+----------+-------+--------+---------+ | rooms | InnoDB | 1829 | 1552 | 1552 | 0 | | buildings | InnoDB | 554 | 160 | 160 | 0 | | users | InnoDB | 2 | 96 | 16 | 80 | +------------+--------+----------+-------+--------+---------+
■MySQLのインデックスを確認
mysql> SHOW INDEX FROM tablename;
■MySQLでユーザを削除
mysql> DELETE FROM mysql.user WHERE user = 'username'; … 「username」を削除 mysql> FLUSH PRIVILEGES; … 設定を反映
■MySQLでデータベースエンジン(InnoDBかMyISAM)を確認
mysql> USE information_schema; mysql> SELECT table_name, engine FROM TABLES WHERE table_schema = 'tablename';
■MySQLでMyISAMをInnoDBに変更
MyISAMとInnoDBのどちらを使うべきか http://opendatabaselife.blogspot.jp/2009/10/myisaminnodb.html MySQLでMyISAMからInnoDBに乗り換える際に知らないとハマる、怖い話 http://y-ken.hatenablog.com/entry/mysql-migration-from-mysiam-to-innodb-tips
mysql> ALTER TABLE tablename ENGINE=InnoDB; mysql> SELECT COUNT(*) FROM tablename WHERE text LIKE '%テスト%'; +----------+ | COUNT(*) | +----------+ | 558622 | +----------+ 1 row in set (5.08 sec)
InnoDBにすると、集計が1秒ほど遅くなった
■MySQLのバックアップ(エクスポートとインポート)
■エクスポート
$ mysqldump -u ユーザー名 データベース名 > ダンプファイル名 $ mysqldump -u webmaster -p test > /var/www/backups/mysql_test_20140130.sql $ mysqldump -u webmaster -p test --default-character-set=binary > /var/www/backups/mysql_test_20140130.sql
「--default-character-set」に「binary」を指定しても文字化けする場合、「utf8」や「latin1」も試す dump時に「Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces」のようなエラーが表示される場合、 「--no-tablespaces」を付与して実行する 具体的には以下のようになる
$ mysqldump -u webmaster -p test --default-character-set=binary --no-tablespaces > /var/www/backups/mysql_test_20140130.sql
MySQL5.7から、dumpにはPROCESS権限が必要になった よってdumpを実行したいユーザにこの権限を追加で付与してもいいが、上記のように「--no-tablespaces」を付与することでも対応できる バックアップの手順を見直したほうがよさそうでしょうか? https://www.chatwork.com/#!rid119727508-1472084389675421696 mysqldumpで「Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces」となる場合の対処: 小粋空間 https://www.koikikukan.com/archives/2021/02/17-235555.php MySQL | ユーザーに設定できる権限の種類と一覧 https://www.dbonline.jp/mysql/user/index5.html mysqldumpでPROCESS権限(PROCESS privilege)を要求される - いっさいがっさい https://isgs-lab.com/424/ dump時に「Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"') FROM information_schema.COLUMN_STATISTICS」のようなエラーが表示される場合、 「--skip-column-statistics」を付与して実行する mysqldumpコマンドで "Unknown table 'COLUMN_STATISTICS' in information_schema (1109)" と怒られる原因と対策 - モヒカンメモ https://blog.pinkumohikan.com/entry/mysqldump-disable-column-statistics dump時に「database 'XXX' when using LOCK TABLES」のようなエラーが表示される場合、 「--single-transaction」を付与して実行する 【MySQL】 mysqldumpしようとしたら 「 when doing LOCK TABLES 」でdumpできない - 旅するえんじにあ - Engineers to Travel - https://deadcode.hatenablog.jp/entry/2014/05/08/223627 ■テーブルを指定してエクスポート
$ mysqldump -u ユーザー名 -p データベース名 テーブル名 > ダンプファイル名 $ mysqldump -u ユーザー名 -p データベース名 テーブル名1 テーブル名2 > ダンプファイル名
MySQLで特定のテーブルをdumpする方法。 - Qiita https://qiita.com/kooohei/items/530f46b6ef8909227dc8 ■テーブルを除外してエクスポート ※未検証
$ mysqldump -u username -p -t database_name --ignore-table=database_name.table_name $ mysqldump -u username -p -t database_name --ignore-table=database_name.table_name --ignore-table=database_name.another_table_namme
指定したテーブル以外のレコードをdumpする #MySQL - Qiita https://qiita.com/kadoppe/items/ca54fdc57097e109a151 ■一行ずつのINSERTでエクスポート dump時に「--skip-extended-insert」を付けると、一行ずつのINSERTでエクスポートされる 具体的には以下のようになる
# mysqldump -u ユーザー名 -p データベース名 --skip-extended-insert > /var/www/backups/mysql_test_20140130.sql
mysqldumpで一行ずつのINSERT文を出力する方法 - ハックノート https://hacknote.jp/archives/5557/ ■検索結果をエクスポート
$ echo 'SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 100;' | mysql -u ユーザー名 -p データベース名 > ダンプファイル名
MySQLで抽出結果をファイルに出力する方法 - Qiita https://qiita.com/tasmas256/items/ec7e23278ee2b40aad79 ■検索結果をCSVとしてエクスポート
$ SELECT id, name FROM staffs INTO OUTFILE ダンプファイル名 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
RDSなど「INTO OUTFILE」が使えない環境の場合、以下のようにする
$ echo 'SELECT id, name FROM staffs;' | mysql -u ユーザー名 -p データベース名 | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > ダンプファイル名
MySQLのデータをCSVに吐こうとするとエラーになる。 - H_Yamaguchiのブログ http://h-yamaguchi.hatenablog.com/entry/2013/09/19/155205 mysql - Exporting table from Amazon RDS into a csv file - Stack Overflow https://stackoverflow.com/questions/9536224/exporting-table-from-amazon-rds-into-a-csv-file ■インポート
$ mysql -u root データベース名 < ダンプファイル名 $ mysql -u webmaster -p test < mysql_test_20140130.sql $ mysql -u webmaster -p test --default-character-set=binary < mysql_test_20140130.sql
■WindowsのXAMPP環境での実行例
C:\xampp\mysql\bin\mysqldump -u root -p test --default-character-set=binary > mysql_test_20140130.sql C:\xampp\mysql\bin\mysql -u root -p test --default-character-set=binary < mysql_test_20140130.sql
■PHPからの実行例
<?php echo shell_exec('mysqldump -u webmaster -p"1234" test --default-character-set=binary > mysql_test_20140130.sql'); exit('Complete');
PHPで独自にSQLエクスポートの仕組みを作るより、圧倒的に高速 データが巨大すぎて独自システムからエクスポートできなかったものも、難なくエクスポートできた 同様に、以下のようにしてインポートもできた
<?php echo shell_exec('mysql -u webmaster -p"1234" twitter_test --default-character-set=binary < mysql_test_20140130.sql'); exit('Complete');
■文字化け対策 文字化けする場合は「--default-character-set=binary」を指定して試す mysqldumpで文字化けデータを頑張ってダンプ&リストア http://koexuka.blogspot.jp/2009/04/mysqldumpdump.html ■SOURCEコマンド MySQLにログイン後、SOURCEコマンドを実行してインポートすることもできる
mysql> SOURCE mysql_test_20140130.sql
ファイル読込|データのインポート・エクスポート|MySQL|PHP & JavaScript Room http://phpjavascriptroom.com/?t=mysql&p=mysqlimport ■LOADコマンド LOADコマンドでの登録が一番高速らしい CSVを作成する際に、バリデーションなどは行っておく必要はある
$ cat /tmp/eccube.csv 1,'アイスクリーム',NULL,1,中略,NULL,0,2,'2016-09-13 09:22:23','2016-09-13 09:22:23',2
LOAD DATA INFILE "/tmp/eccube.csv" INTO TABLE dtb_products FIELDS TERMINATED BY "," LINES TERMINATED BY "\n";
MySQLに大量のデータを入れるときに最適な方法は? http://naoberry.com/tech/mysqldata/ ■MySQLを定期バックアップ MySQLデータベース自動バックアップ運用(mysqldump) http://centossrv.com/mysql-backup.shtml
■PostgreSQLでユーザを確認
$ psql -c "SELECT * FROM pg_shadow;"
■メールのキューを確認
# mailq … メールキューを確認 # mailq | grep 'Request.' … メールキューの合計サイズと件数を確認 -- 1 Kbytes in 1 Request. # mailq | grep 'Request.' | awk '{print $5}' … メールキューの件数を確認 1
Linux(CentOS 6) - メールキューの確認方法と削除方法 http://nobuneko.com/blog/archives/2013/05/linux_centos_6_mailq_postsuper.html
■ユーザ情報を確認
# cat /etc/passwd … ユーザ一覧を表示(誰でも表示可能) # cat /etc/shadow … ユーザのパスワードを表示(rootのみ表示可能 / パスーワードはハッシュ化されている) $ w … ログインユーザを確認 18:49:52 up 146 days, 5:08, 3 users, load average: 0.44, 0.30, 0.12 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT webmaste pts/0 p7cdba6cd.osakff Mon02 40:05m 0.00s 0.00s -bash ec2-user pts/1 p7cdba6cd.osakff 18:48 0.00s 0.00s 0.00s w ec2-user pts/2 p7cdba6cd.osakff 11May17 6days 0.10s 0.10s -bash
※ログインしているユーザの名前、それらのユーザが何をしているか、およびコンピュータにかかっている負荷を要約して表示する
$ last -5 … ログイン履歴を確認(最近の5件) ec2-user pts/1 p7cdba6cd.osakff Tue May 30 19:44 still logged in ec2-user pts/1 p7cdba6cd.osakff Tue May 30 18:48 - 19:42 (00:53) ec2-user pts/1 p7cdba6cd.osakff Tue May 30 18:48 - 18:48 (00:00) ec2-user pts/1 p7cdba6cd.osakff Tue May 30 18:47 - 18:47 (00:00) ec2-user pts/1 p7cdba6cd.osakff Tue May 30 11:19 - 11:36 (00:17) wtmp begins Fri Oct 30 16:59:37 2015 $ last -5 webmaster … 特定ユーザのログイン履歴を確認 webmaste pts/0 p7cdba6cd.osakff Mon May 29 02:44 still logged in webmaste pts/3 p7cdba6cd.osakff Wed May 24 17:24 - 20:07 (02:43) webmaste pts/1 p7cdba6cd.osakff Wed May 24 17:23 - 17:28 (00:05) webmaste pts/1 p7cdba6cd.osakff Wed May 24 17:20 - 17:21 (00:00) webmaste pts/0 p7cdba6cd.osakff Wed May 24 15:59 - 16:29 (00:29)
■ユーザ情報を変更
■SSHでのログインを許可
# cat /etc/passwd | grep test-user test-user:x:502:502::/home/test-user/:/sbin/nologin # usermod -s /bin/bash test-user # cat /etc/passwd | grep test-user test-user:x:502:502::/home/test-user/:/bin/bash
■ホームディレクトリを変更 以下でホームディレクトリを変更する 「実行中のプロセスがある」のようなメッセージが表示された場合、いったんすべての接続を終了してから試す
# usermod -d /home/test-user/ test-user
■グループ情報を確認
# vi /etc/group … グループ一覧を表示(誰でも表示可能) # vi /etc/gshadow … グループのパスワードを表示(rootのみ表示可能 / パスーワードはハッシュ化されている)
■コマンドを一定時間ごとに実行させる
$ watch ls -l /var/www/html/ … 2秒ごとにコマンドを実行(ファイルの監視。2秒はデフォルトの間隔)
watchコマンドで覚えておきたい使い方6個 http://orebibou.com/2015/07/watch%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%...
■サービスの自動起動を確認する
# chkconfig --list … 自動起動を確認する # chkconfig --list サービス名 … サービスの自動起動を確認する # chkconfig --add サービス名 … サービス設定の追加 # chkconfig --del サービス名 … サービス設定の追加 # chkconfig サービス名 on … サービスの自動起動を有効化 # chkconfig サービス名 off … サービスの自動起動を有効化 # chkconfig --list httpd httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
ランレベルの2〜5がonになっていれば自動起動が有効 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ランレベル 状態 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 システムの停止 1 シングルユーザモード 2 マルチユーザモード 3 マルチユーザモード(コンソールログイン) 4 未使用 5 マルチユーザモード(ディスプレイマネージャ使用) 6 システム再起動 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
■サーバをシャットダウン・再起動する
# shutdown -h now … すぐにシャットダウンする # shutdown -r now … すぐに再起動する # shutdown -h 0:0 … 0時にシャットダウンする # shutdown -r 10:30 … 10時半に再起動する # halt … マシンを停止する # reboot … マシンを再起動する # poweroff … マシンの電源を切る
■特殊なコマンド
シェルスクリプトの [ は /bin/[ と言ったり [ "x$var" = "xval" ] と書く人はオジサン - Qiita https://qiita.com/ko1nksm/items/f772b782a760bbfa1b28
■危険なコマンド
【危険シェル芸】禁じられた闇の魔術とその防衛術 - Qiita https://qiita.com/_-_-_-_-_/items/214d537aae2c1488692c Bashの邪悪なコマンド9選 - Qiita https://qiita.com/rana_kualu/items/be32f8302017b7aa2763 Amazon Linux 2 で「rm -rf /*」を実行してみた | DevelopersIO https://dev.classmethod.jp/articles/tried-rm-rf-root-on-amazon-linux-2/

Advertisement