ネットサーフィン中、『vtop』なるパフォーマンス監視コマンドを知ったのでお試し。名前の通り、topコマンド風に利用できるようだ。
Node.jsで書かれているらしく、以下のコマンドでインストールできる。
npm install -g vtop
インストールできたら、以下のようにコマンドを実行してモニタリングをする。
vtop
EXCELグラフ作成 [ビジテク] データを可視化するノウハウ 2013/2010/2007対応
ネットサーフィン中、『vtop』なるパフォーマンス監視コマンドを知ったのでお試し。名前の通り、topコマンド風に利用できるようだ。
Node.jsで書かれているらしく、以下のコマンドでインストールできる。
npm install -g vtop
インストールできたら、以下のようにコマンドを実行してモニタリングをする。
vtop
EXCELグラフ作成 [ビジテク] データを可視化するノウハウ 2013/2010/2007対応
そういう処理についてをTwitterで見かけたので、念のため備忘で残しておく。
まあ特に難しい事をせずとも、bashの変数展開やsed、awkで取得できる。面倒なので、とりあえずパイプで受け取った結果から拡張子のみを取得するコマンドを以下に記載する(特に変数展開の処理は、普通にスクリプト書くならこんなやり方しなくてもいいかと思うが…)。
find ./ -type f | xargs -I@ -n1 sh -c 'echo @ | (read X;echo ${X##*.})' find ./ -type f | sed 's/.*\.//' find ./ -type f | awk -F. '{print $NF}'
blacknon@BS-PUB-UBUNTU-01:~/test_d$ ls -la 合計 8 drwxrwxr-x 2 blacknon blacknon 4096 5月 15 01:19 . drwxr-xr-x 24 blacknon blacknon 4096 5月 14 20:47 .. -rw-rw-r-- 1 blacknon blacknon 0 5月 15 01:19 sample.csv -rw-rw-r-- 1 blacknon blacknon 0 5月 15 01:19 sample.log -rw-rw-r-- 1 blacknon blacknon 0 5月 14 20:48 sample.txt -rw-rw-r-- 1 blacknon blacknon 0 5月 15 01:19 sample.xml blacknon@BS-PUB-UBUNTU-01:~/test_d$ find ./ -type f | xargs -I@ -n1 sh -c 'echo @ | (read X;echo ${X##*.})' log txt csv xml blacknon@BS-PUB-UBUNTU-01:~/test_d$ find ./ -type f | sed 's/.*\.//' log txt csv xml blacknon@BS-PUB-UBUNTU-01:~/test_d$ find ./ -type f | awk -F. '{print $NF}' log txt csv xml
Linuxステップアップラーニング
Chromeのアップデートをしたところ、こちらの手順で作成していたオレオレ証明書が、何故か信用されない証明書として扱われるようになってしまった。なんじゃこりゃ、と思って調べて見たところ、こちらをみるとどうやらRFC2818ではSubjectAltNameに利用するホスト名を記述する方法が推奨されているらしく、CommonNameは非推奨になっているらしい。で、Chrome 58からはそれに則ってSubjectAltNameが無いとエラーになるという。おおぅ…
こうなるとサーバ証明書を作り直す必要がある。作り直すのはサーバ証明書だけでよい。
とりあえず、まず以下のようにコマンドを実行しCSR(newreq.pem)を作成する。
openssl req \ -new \ -key server.key \ -out newreq.pem \ -days 3650 \ -subj "/C=JP/ST=Tokyo/L=Tachikawa/O=Test.Inc/CN=*.blacknon.local" \ -config <(printf "[req]\nreq_extensions = v3_req\ndistinguished_name = req_distinguished_name\n[req_distinguished_name]\n[v3_req]\nbasicConstraints = CA:FALSE\nkeyUsage = nonRepudiation, digitalSignature, keyEncipherment\nsubjectAltName='DNS.1:*.blacknon.local'") \
CSRの作成後、ICAの設定ファイル(前回の作成手順だと/etc/pki/tls/openssl_ica.cnf)で以下の項目のコメントアウトを解除する。
● /etc/pki/tls/openssl_ica.cnf
copy_extensions = copy
コメントアウトの解除後、以下のコマンドを実行してSubjectAltName付きの証明書を発行する。
/etc/pki/tls/misc/ICA -sign
以上。あとは、発行した証明書を使って設定してやるだけだ。
【参考】
SSL/TLSを理解する ~共通鍵暗号・公開鍵暗号・ハッシュ関数・電子署名・証明書~
ふと、sedで特定のパターンで指定した範囲の行に対して、改行を含んだ置換を実施する場合ってどうすりゃ良いんだっけかなと思ったので、備忘で残しておく。
結論としては、以下のように「/START/,/END/」で範囲を指定してやり、その範囲に対してNコマンドでラインを読み込んでやってから置換をしてやればいいようだ。
sed '/START/,/END/{N;s/BEFORE/AFTER/}'
[root@BS-PUB-CENT7-01 ~]# cat test1.txt AAA BBB CCC DDD EEE FFF GGG [root@BS-PUB-CENT7-01 ~]# sed '/BBB/,/DDD/{N;s/^BBB\nCCC/222\n333/}' test1.txt AAA 222 333 DDD EEE FFF GGG [root@BS-PUB-CENT7-01 ~]# sed '/BBB/,/DDD/{N;s/^BBB\nCCC/222\n333\n444/}' test1.txt AAA 222 333 444 DDD EEE FFF GGG
sed & awkプログラミング 改訂版 (A nutshell handbook)
ちょっと前から、ランサムウェア「WannaCrypt」が流行しているが、これの感染経路はWindows(Windows 10未満のバージョン)で利用されているSMBv1の脆弱性らしい。で、Linuxだとその脆弱性には影響を受けないのだが、そういえばSambaでSMBv1を無効化するのってどうすりゃ良いんだっけと思ったので、備忘で残しておく。
SambaでSMBv1を無効化するには、設定ファイルである「/etc/samba/smb.conf」にて、[global]配下に以下の項目を追記してやる。
●/etc/samba/smb.conf
[global] min protocol = SMB2
設定追記後は、サービスを再起動したらSMBv1が無効化されるはずだ。
下手に無効化すると、古いプリンター機器とかとの連携に支障が出ると思うので、やるならちゃんと下調べしてからやったほうが良いと思う。
【改訂新版】サーバ構築の実例がわかるSamba[実践]入門 (Software Design plus)
以前にもLeetSpeakへの変換を行うコマンド『leetpass』を触ったことがあったが、Perlにも同様の事ができるライブラリ『Acme::LeetSpeak』があったので、これを使って標準入力からLeetSpeakを取得してみる。まず、以下のコマンドでライブラリの導入をする。
cpan Acme/LeetSpeak.pm
ライブラリの導入後は、以下のようにperlを実行することで指定した文字列からLeetSpeakに変換してくれる。
echo Strings | perl -lne 'use Acme::LeetSpeak;print(leet($_))'
[root@BS-PUB-CENT7-01 ~]# echo Strings | perl -lne 'use Acme::LeetSpeak;print(leet($_))' StR1/\/95 [root@BS-PUB-CENT7-01 ~]# yes "echo Strings | perl -lne 'use Acme::LeetSpeak;print(leet(\$_))'" | head -15 | sh S+rI[\]gs S+rI[\]GS S+R!|\|95 StR1[\]9S $7r1n95 S+R!N9s $tRiN9$ S7RIN95 S+rIN95 StR!nG5 S+R!|\|GS $Tr!/\/Gs 5TrI|\|g5 $+Ri|\|95 S7RIn9s
Perl Hacks ―プロが教えるテクニック & ツール101選
Linuxにある程度慣れていると、現在のファイルのパーミッションは記号表記で、設定の際は数字表記でやることが多いだろう。で、いつも記号表記でばかり確認しているのだが、ふと数字表記で現在のパーミッションを取得できるのかなと思い調べてみた。個人的には大体lsで調べるのだが、残念ながらそういったオプションは無いらしい。
statコマンドで、以下のように指定することでファイルのパーミッションを数字表記で取得できるようだ。
stat PATH -c '%a'
[root@BS-PUB-CENT7-01 ~]# ls -la ./test.pl -rw-r--r--. 1 root root 99 5月 20 11:26 ./test.pl [root@BS-PUB-CENT7-01 ~]# stat ./test.pl -c '%a' 644
これを利用してlsと組み合わせることで、以下のようにlsの表記とセットで表示させることができる。
(ファイル名にスペースが含まれないことが前提になる)
ls -la | awk 'NR>1{cmd="stat "$NF" -c %a";cmd|getline c;close(cmd);print c,$0}'
[root@BS-PUB-CENT7-01 ~]# ls -la 合計 60 dr-xr-x---. 8 root root 4096 5月 20 16:06 . dr-xr-xr-x. 17 root root 4096 1月 20 00:01 .. -rw-------. 1 root root 1537 5月 16 09:50 .bash_history -rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout -rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile -rw-r--r--. 1 root root 176 12月 29 2013 .bashrc drwxr-xr-x. 4 root root 31 5月 16 10:03 .config drwxr-xr-x. 6 root root 89 5月 20 11:29 .cpan -rw-r--r--. 1 root root 100 12月 29 2013 .cshrc -rw-------. 1 root root 40 5月 20 16:06 .lesshst drwxr-xr-x. 3 root root 18 5月 16 09:59 .local drwxr-----. 3 root root 18 5月 16 09:58 .pki -rw-r--r--. 1 root root 129 12月 29 2013 .tcshrc -rw-------. 1 root root 2539 5月 20 11:26 .viminfo drwxr-xr-x. 15 root root 4096 5月 16 10:09 DevAudit -rw-------. 1 root root 986 1月 1 2016 anaconda-ks.cfg drwxr-xr-x. 5 root root 36 5月 20 11:29 perl5 -rw-r--r--. 1 root root 99 5月 20 11:26 test.pl -rw-r--r--. 1 root root 28 5月 18 08:50 test1.txt -rw-r--r--. 1 root root 86 5月 18 08:40 test2.txt [root@BS-PUB-CENT7-01 ~]# ls -la | awk 'NR>1{cmd="stat "$NF" -c %a";cmd|getline c;close(cmd);print c,$0}' 550 dr-xr-x---. 8 root root 4096 5月 20 16:06 . 555 dr-xr-xr-x. 17 root root 4096 1月 20 00:01 .. 600 -rw-------. 1 root root 1537 5月 16 09:50 .bash_history 644 -rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout 644 -rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile 644 -rw-r--r--. 1 root root 176 12月 29 2013 .bashrc 755 drwxr-xr-x. 4 root root 31 5月 16 10:03 .config 755 drwxr-xr-x. 6 root root 89 5月 20 11:29 .cpan 644 -rw-r--r--. 1 root root 100 12月 29 2013 .cshrc 600 -rw-------. 1 root root 40 5月 20 16:06 .lesshst 755 drwxr-xr-x. 3 root root 18 5月 16 09:59 .local 740 drwxr-----. 3 root root 18 5月 16 09:58 .pki 644 -rw-r--r--. 1 root root 129 12月 29 2013 .tcshrc 600 -rw-------. 1 root root 2539 5月 20 11:26 .viminfo 755 drwxr-xr-x. 15 root root 4096 5月 16 10:09 DevAudit 600 -rw-------. 1 root root 986 1月 1 2016 anaconda-ks.cfg 755 drwxr-xr-x. 5 root root 36 5月 20 11:29 perl5 644 -rw-r--r--. 1 root root 99 5月 20 11:26 test.pl 644 -rw-r--r--. 1 root root 28 5月 18 08:50 test1.txt 644 -rw-r--r--. 1 root root 86 5月 18 08:40 test2.txt
findコマンドで、printfオプションで%mを用いることで、数字表記でのパーミッションを表示させることも可能だ。
以下の例では、カレントディレクトリ配下のファイル・ディレクトリに対してパーミッションやサイズ、ユーザ名等を取得している。
find . -maxdepth 1 -printf "%m %u:%g %s %p \n"
[root@BS-PUB-CENT7-01 ~]# find . -maxdepth 1 -printf "%m %u:%g %s %p \n" 550 root:root 4096 . 644 root:root 18 ./.bash_logout 644 root:root 176 ./.bash_profile 644 root:root 176 ./.bashrc 644 root:root 100 ./.cshrc 644 root:root 129 ./.tcshrc 600 root:root 986 ./anaconda-ks.cfg 600 root:root 1537 ./.bash_history 755 root:root 4096 ./DevAudit 740 root:root 18 ./.pki 755 root:root 31 ./.config 755 root:root 18 ./.local 644 root:root 28 ./test1.txt 644 root:root 86 ./test2.txt 644 root:root 99 ./test.pl 600 root:root 2539 ./.viminfo 755 root:root 89 ./.cpan 755 root:root 36 ./perl5 600 root:root 47 ./.lesshst
とりあえず2個。
lsとstat組み合わせた方が読みやすいかもしれない。
新しいLinuxの教科書
ちょっとした処理のために、bashでファイルから改行を含むn文字~x文字分の範囲を抽出したいなぁと思い、最初はreadで実現しようと思ったのだが、どうも改行を含む文字数となるとうまくいかなかった。
で、tailとheadでとりあえず実現したので、念のため備忘として残しておく。なお、この際改行も文字数として含まれるので注意すること。
cat file | tail -c +$((開始文字数 + 1)) | head -c $((終了文字数 + 1))
[root@BS-PUB-CENT7-01 ~]# cat test3.txt 123 456 789 ABC DEF GHI JKL MNO PQR STU VWX YZ [root@BS-PUB-CENT7-01 ~]# cat test3.txt | tail -c +$((4 +1)) 456 789 ABC DEF GHI JKL MNO PQR STU VWX YZ [root@BS-PUB-CENT7-01 ~]# cat test3.txt | tail -c +$((4 +1)) | head -c $((7+1)) 456 789
[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)
ちょっと前にscriptコマンドで取得したターミナルログにタイムスタンプを付与する方法について記述したが、今回はその状態でさらにscriptreplayを行えるようにしてみる。
ここで厄介なのが、scriptreplayで用いるタイミングが記録されたファイルの書き方が、そのタイムスタンプ+表示されていた文字数になっている事。行数とかとくに気にされてないので、各行にタイムスタンプが差し込まれている現状だとその文字数が一体何行になるのかを知る必要がある。
こっちは簡単。単純にcutコマンドを使ってファイルからタイムスタンプの部分を除外してやれば良い。
●ログ取得時
LANG=C script -fqt 2> log.time >(awk '{print strftime("%F %T ") $0}{fflush() }'>> log.session)
●ログ再生時
scriptreplay -t log.time <(cut -c 21- log.session)
こっちが、冒頭で書いた点について気にしないといけないのでちょっと難しい。
少々長くなるのだが、ここでは以下のようにawkでタイミングごとの文字数を取得し、tailとheadでログファイルを指定された文字数の範囲を抽出して行数を計算することで対応している。ログ取得時のコマンドは同じなので割愛。
●ログ再生時
scriptreplay -t <(awk 'BEGIN{i=0}{cmd="cat log.session|cut -c 21-|tail -c +"i" |head -c "$2"|wc -l";cmd|getline c;i+=$2;print $1,$2+c*20}' log.time) log.session
とりあえずこんな感じだろうか。
これで、何時頃にどのようなコマンドを実行したのかを確認しつつ、操作時の挙動についても再生ができるはずだ。(vimとかの操作はちょっと厳しいかもしれない…)
なお、ターミナルログ自体はちゃんとタイムスタンプ付きで読める状態(vimとか使ったらわからないが…)になっている。
[root@BS-PUB-CENT7-01 ~]# cat log.session 2017-05-20 21:09:17 Script started on 2017年05月20日 21時09分17秒 2017-05-20 21:09:17 [root@BS-PUB-CENT7-01 ~]# 2017-05-20 21:09:17 [root@BS-PUB-CENT7-01 ~]# 2017-05-20 21:09:19 [root@BS-PUB-CENT7-01 ~]# ls -la 2017-05-20 21:09:19 total 120 2017-05-20 21:09:19 dr-xr-x---. 8 root root 4096 5月 20 21:09 . 2017-05-20 21:09:19 dr-xr-xr-x. 17 root root 4096 1月 20 00:01 .. 2017-05-20 21:09:19 -rw-------. 1 root root 18862 5月 20 21:09 .bash_history 2017-05-20 21:09:19 -rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout 2017-05-20 21:09:19 -rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile 2017-05-20 21:09:19 -rw-r--r--. 1 root root 176 12月 29 2013 .bashrc 2017-05-20 21:09:19 drwxr-xr-x. 4 root root 31 5月 16 10:03 .config 2017-05-20 21:09:19 drwxr-xr-x. 6 root root 89 5月 20 11:29 .cpan 2017-05-20 21:09:19 -rw-r--r--. 1 root root 100 12月 29 2013 .cshrc 2017-05-20 21:09:19 -rw-------. 1 root root 47 5月 20 16:26 .lesshst 2017-05-20 21:09:19 drwxr-xr-x. 3 root root 18 5月 16 09:59 .local 2017-05-20 21:09:19 drwxr-----. 3 root root 18 5月 16 09:58 .pki 2017-05-20 21:09:19 -rw-r--r--. 1 root root 129 12月 29 2013 .tcshrc 2017-05-20 21:09:19 -rw-------. 1 root root 3602 5月 20 19:27 .viminfo 2017-05-20 21:09:19 -rw-r--r--. 1 root root 618 5月 20 17:08 20170520_170807.log 2017-05-20 21:09:19 -rw-r--r--. 1 root root 295 5月 20 18:50 =time 2017-05-20 21:09:19 drwxr-xr-x. 15 root root 4096 5月 16 10:09 DevAudit 2017-05-20 21:09:19 -rw-r--r--. 1 root root 224 5月 20 17:06 aa 2017-05-20 21:09:19 -rw-------. 1 root root 986 1月 1 2016 anaconda-ks.cfg 2017-05-20 21:09:19 -rw-r--r--. 1 root root 311 5月 20 21:09 log.session 2017-05-20 21:09:19 -rw-r--r--. 1 root root 0 5月 20 21:09 log.time 2017-05-20 21:09:19 -rw-r--r--. 1 root root 258 5月 20 18:45 ls.log 2017-05-20 21:09:19 drwxr-xr-x. 5 root root 36 5月 20 11:29 perl5 2017-05-20 21:09:19 -rw-r--r--. 1 root root 496 5月 20 20:55 q 2017-05-20 21:09:19 -rw-r--r--. 1 root root 99 5月 20 11:26 test.pl 2017-05-20 21:09:19 -rw-r--r--. 1 root root 764 5月 20 18:56 test.session 2017-05-20 21:09:19 -rw-r--r--. 1 root root 91 5月 20 18:56 test.time 2017-05-20 21:09:19 -rw-r--r--. 1 root root 28 5月 18 08:50 test1.txt 2017-05-20 21:09:19 -rw-r--r--. 1 root root 86 5月 18 08:40 test2.txt 2017-05-20 21:09:19 -rw-r--r--. 1 root root 47 5月 20 20:33 test3.txt 2017-05-20 21:09:19 -rw-r--r--. 1 root root 554 5月 20 18:51 time 2017-05-20 21:09:19 -rw-r--r--. 1 root root 2081 5月 20 18:50 typescript 2017-05-20 21:09:19 [root@BS-PUB-CENT7-01 ~]# 2017-05-20 21:09:19 [root@BS-PUB-CENT7-01 ~]# 2017-05-20 21:09:20 [root@BS-PUB-CENT7-01 ~]# 2017-05-20 21:09:21 [root@BS-PUB-CENT7-01 ~]# pwd 2017-05-20 21:09:21 /root 2017-05-20 21:09:21 [root@BS-PUB-CENT7-01 ~]# 2017-05-20 21:09:22 [root@BS-PUB-CENT7-01 ~]# 2017-05-20 21:09:22 [root@BS-PUB-CENT7-01 ~]# 2017-05-20 21:09:22 [root@BS-PUB-CENT7-01 ~]# 2017-05-20 21:09:25 [root@BS-PUB-CENT7-01 ~]# exit 2017-05-20 21:09:25 exit
Bash Pocket Reference
LinuxやOS Xでファイルの中身を表示する際、catなどで開くと一瞬で中身を表示してくれるのだが、これを1文字づつゆっくり表示させることができないかと思いやってみた。
意外と簡単にできるようだ。ここでは、例としてtest1.txtというファイルに対して処理を行っている。
無難にwhileとreadを組み合わせてやる場合、以下のようにコマンドを実行する。
cat test1.txt | while IFS= read -rN1 c; do printf "$c";sleep 0.1;done while IFS= read -rN1 c; do printf "$c";sleep 0.1;done < test1.txt
もしくはちょっと長くなるのだが、scriptreplayコマンドを利用する方法も面白いかもしれない。
scriptreplay -t <(yes 0.1 1 | head -$(wc -m test1.txt | awk '{print $1}')) <(cat <(echo '') test1.txt) scriptreplay -t <(yes 0.1 1) <(cat <(echo '') test1.txt) 2> /dev/null
ちょっとだけLinuxにさわってみたい人のための Bash on Ubuntu on Windows入門
よくターミナルでの作業ログなどを記録する際に用いられるscriptコマンドだが、オプション自体はあまり多くは無いのだがうまいこと使えれば色々な使い方ができる。個人的にはよく利用されていると思っていたのだが、あまり周りで使ってる人がいないようなので、とりあえず個人的に知っている使い方についてまとめてみることにした。
オプション無しで実行することにより、カレントディレクトリに「typescript」というファイルを作成して作業終了後に操作ログを出力してくれる。
script
指定したファイルに記録する場合は、以下のように引数として出力先のPATHを指定してやればよい。
script PATH script ./$(date +%Y%m%d_%H%M%S).log # ログ名にタイムスタンプを付与する場合
オプション無しで実行した場合、既存のファイルがあった場合上書きしてしまう。
追記する場合は、「-a」オプションを付与することで対応できる。
script -a
[root@BS-PUB-CENT7-01 ~]# script スクリプトを開始しました、ファイルは typescript です [root@BS-PUB-CENT7-01 ~]# echo aaa aaa [root@BS-PUB-CENT7-01 ~]# exit exit スクリプトを終了しました、ファイルは typescript です [root@BS-PUB-CENT7-01 ~]# cat typescript スクリプトは 2017年05月20日 17時13分53秒 に開始しました[root@BS-PUB-CENT7-01 ~]# echo aaa aaa [root@BS-PUB-CENT7-01 ~]# exit exit スクリプトは 2017年05月20日 17時13分58秒 に終了しました[root@BS-PUB-CENT7-01 ~]# [root@BS-PUB-CENT7-01 ~]# script -a スクリプトを開始しました、ファイルは typescript です [root@BS-PUB-CENT7-01 ~]# echo bbb bbb [root@BS-PUB-CENT7-01 ~]# [root@BS-PUB-CENT7-01 ~]# exit exit スクリプトを終了しました、ファイルは typescript です [root@BS-PUB-CENT7-01 ~]# cat typescript スクリプトは 2017年05月20日 17時13分53秒 に開始しました[root@BS-PUB-CENT7-01 ~]# echo aaa aaa [root@BS-PUB-CENT7-01 ~]# exit exit スクリプトは 2017年05月20日 17時13分58秒 に終了しましたスクリプトは 2017年05月20日 17時14分04秒 に開始しました[root@BS-PUB-CENT7-01 ~]# echo bbb bbb [root@BS-PUB-CENT7-01 ~]# [root@BS-PUB-CENT7-01 ~]# exit exit スクリプトは 2017年05月20日 17時14分08秒 に終了しました[root@BS-PUB-CENT7-01 ~]#
Linuxのscriptコマンドでは、以下のようにすることで指定したコマンドの内容のみをログに記録する事ができる。
(BSD系の場合はちょっと指定方法が違うので注意)
script -c 'Command' PATH # Linux script PATH 'Command' #BSD(Mac OS X)
実行コマンドの終了ステータスをscriptコマンド側で得る場合は、「-e」オプションも付与することで取得可能だ。
script -ec 'Command' PATH
[root@BS-PUB-CENT7-01 ~]# script -c 'ls -l /c' ls.log スクリプトを開始しました、ファイルは ls.log です ls: /c にアクセスできません: そのようなファイルやディレクトリはありません スクリプトを終了しました、ファイルは ls.log です [root@BS-PUB-CENT7-01 ~]# echo $? 0 [root@BS-PUB-CENT7-01 ~]# [root@BS-PUB-CENT7-01 ~]# script -ec 'ls -l /c' ls.log スクリプトを開始しました、ファイルは ls.log です ls: /c にアクセスできません: そのようなファイルやディレクトリはありません スクリプトを終了しました、ファイルは ls.log です [root@BS-PUB-CENT7-01 ~]# [root@BS-PUB-CENT7-01 ~]# echo $? 2
通常、ログファイルへの書き込みはscriptコマンドの実行終了時になるが、「-f」オプションを付与することで即座に書き込みをさせるようにできる。
script -f
ログ取得開始メッセージを非表示にする場合、「-q」オプションを付与する。
script -q
[root@BS-PUB-CENT7-01 ~]# script スクリプトを開始しました、ファイルは typescript です [root@BS-PUB-CENT7-01 ~]# [root@BS-PUB-CENT7-01 ~]# exit exit スクリプトを終了しました、ファイルは typescript です [root@BS-PUB-CENT7-01 ~]# [root@BS-PUB-CENT7-01 ~]# script -q [root@BS-PUB-CENT7-01 ~]# [root@BS-PUB-CENT7-01 ~]# exit exit [root@BS-PUB-CENT7-01 ~]#
以前にもここで触れたのだが、scriptコマンドでは、-tオプションで各種操作のタイミングを取得しておくことで、scriptreplayコマンドを使って操作内容を再生することができる。
なお、この機能を利用する際は日本語環境だとうまくいかない(タイムログの中で計算している文字数と合わなくなる)ので、LANG=Cを実行前に行っておくと良いだろう。以下の例では、log.timeに操作のタイミングを、log.sessionに操作内容を記録している。
LANG=C script -t 2> log.time log.session
記録されたタイミングログと操作ログを組み合わせ、以下のようにscriptreplayコマンドを実行することで、操作内容を再生できる。
scriptreplay -t log.time log.session
以前ここに書いた内容だが、scriptコマンドで取得したログにTeratermログのようなタイムスタンプを付与する場合は、以下のように出力時にawkを間に入れてやることで対応が可能だ。
script -fq >(awk '{print strftime("%F %T ") $0}{fflush() }'>> PATH)
もしscriptreplayと組み合わせて使用する場合は、以前ここにも書いたのだが、以下のようにコマンドを実行すれば良い。
(ログのタイミングを記録するのがlog.time、ターミナルログ自体はlog.sessionで記述している)
●ログ取得時
LANG=C script -fqt 2> log.time >(awk '{print strftime("%F %T ") $0}{fflush() }'>> log.session)
●scriptreplay実行時
scriptreplay -t log.time <(cut -c 21- log.session) # タイムスタンプ無しで再生する場合 scriptreplay -t <(awk 'BEGIN{i=0}{cmd="cat log.session|cut -c 21-|tail -c +"i" |head -c "$2"|wc -l";cmd|getline c;i+=$2;print $1,$2+c*20}' log.time) log.session # タイムスタンプ付きで再生する場合
ログの出力先を他のターミナルセッションにすることで、現在操作中の内容を他のセッションの利用者(別にssh接続している人間)に見せる事ができる。
詳細については以前こちらに記述しているので、そっちを参照。
script -fq /dev/pts/n
大体こんなところだろうか。
他にも色々と使い方があると思うが、ひとまずこんな感じで。
Windows/Linuxのトラブル追跡実践ノウハウ エンジニア必携
よく、バックグラウンドで実行したいコマンドに対して、以下のように末尾に&を付けて実行させているのだが、この場合処理が終了するとジョブの実行完了メッセージが表示される。
[root@BS-PUB-CENT7-01 ~]# cat test1.txt > ./test1.txt.bk & [1] 17008 [root@BS-PUB-CENT7-01 ~]# [1]+ 終了 cat test1.txt > ./test1.txt.bk
このメッセージを非表示にしたい場合、以下のように実行するコマンドを()で囲ってグループにしてやるといいようだ。
(cmd &)
[root@BS-PUB-CENT7-01 ~]# cat test1.txt > ./test1.txt.bk & [1] 17010 [root@BS-PUB-CENT7-01 ~]# [1]+ 終了 cat test1.txt > ./test1.txt.bk [root@BS-PUB-CENT7-01 ~]# [root@BS-PUB-CENT7-01 ~]# (cat test1.txt > ./test1.txt.bk &) [root@BS-PUB-CENT7-01 ~]# [root@BS-PUB-CENT7-01 ~]# jobs [root@BS-PUB-CENT7-01 ~]#
[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)
Nginxで、現在読み込まれているモジュールの一覧を取得する必要があったので、備忘で残しておく。
Nginxでは、-Vオプションを付与することでコンパイル時の情報が得られるので、以下のようにコマンドを実行することでそこからコンパイル時のモジュール情報を抽出できる。
nginx -V 2>&1 | grep -oP '[a-z_]+_module'
[root@BS-PUB-CENT7-01 ~]# nginx -V 2>&1 nginx version: nginx/1.12.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC) built with OpenSSL 1.0.1e-fips 11 Feb 2013 TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' [root@BS-PUB-CENT7-01 ~]# nginx -V 2>&1 | grep -oP '[a-z_]+_module' http_addition_module http_auth_request_module http_dav_module http_flv_module http_gunzip_module http_gzip_static_module http_random_index_module http_realip_module http_secure_link_module http_slice_module http_ssl_module http_stub_status_module http_sub_module mail_ssl_module stream_realip_module stream_ssl_module stream_ssl_preread_module
nginx実践ガイド impress top gearシリーズ
bashで、ファイルから1文字づつ読み込んで処理をさせる(改行も含む)場合、以下のようにwhileとreadを組み合わせてやると良いだろう。
readで改行を含めてn個づつ処理を指せる場合、オプションは-nではなく-Nを指定する必要があるので注意。
while IFS= read -rN1 char; do printf "$char"; sleep 0.1; done < test1.txt
[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)
WebアプリケーションのオープンソースSSOツールというと有名なのがOpenAMだと思うが、他にも無いのかなと調べて見たところ、『LemonLDAP::NG』なるツールを見かけた。ドキュメントもかなり揃ってるし、スクリーンショットを見る限り良さげな感じ。今回は、とりあえずCentOS 7にインストールをして動作させるまでをやってみる(ActiveDirectoryやOpenLDAPとの連携まではまた後日)。複数台に役割を分散させることができるようなのだが、ここでは一台で全ての役割を担当させている。ちなみにWebサーバはApacheかNginxを選べるようなのだが、ここではNginxを選択。
まずこちらのドキュメントの通り、以下のコマンドで事前にインストールが必要になるパッケージを導入する。
この時点でNginxについてもインストールしてしまう。
yum install -y epel-release yum install -y perl-Apache-Session perl-LDAP perl-XML-SAX perl-XML-NamespaceSupport perl-HTML-Template perl-Regexp-Assemble perl-Regexp-Common perl-Error perl-IPC-ShareLite perl-Cache-Cache perl-FreezeThaw perl-XML-Simple perl-version perl-CGI-Session perl-DBD-Pg perl-XML-LibXML-Common perl-BSD-Resource perl-XML-LibXML perl-Crypt-Rijndael perl-IO-String perl-XML-LibXSLT perl-SOAP-Lite perl-Config-IniFiles perl-JSON perl-Digest-HMAC perl-Digest-SHA perl-String-Random perl-MIME-Lite perl-Email-Date-Format perl-Crypt-OpenSSL-RSA perl-Crypt-OpenSSL-X509 perl-Clone perl-Authen-SASL perl-Log-Log4perl perl-Unicode-String perl-Net-CIDR-Lite perl-Cache-Memcached perl-Convert-PEM perl-Mouse perl-Plack perl-Authen-Captcha
Nginxについては、「http_auth_request_module」などが読み込まれている必要があるので、Nginxのリポジトリを登録してインストールをする。
cat << "EOF" >> /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1 EOF yum install -y nginx
事前に必要となるパッケージ類のインストールが終わったら、LemonLDAP::NGのインストールを始めよう。
まず以下のコマンドでLemonLDAP::NG用のリポジトリを登録する。
cat << "EOF" >> /etc/yum.repos.d/lemonldap-ng.repo [lemonldap-ng] name=LemonLDAP::NG packages baseurl=https://lemonldap-ng.org/redhat/stable/$releasever/noarch enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-OW2 EOF
リポジトリ登録後、以下のコマンドを実行してLemonLDAP::NGをインストールする。
yum update -y rpm --import https://lemonldap-ng.org/_media/rpm-gpg-key-ow2 yum install -y lemonldap-ng
インストールが完了したら、ひとまずサンプル名になっているドメイン名をLemonLDAP::NGで使用するドメイン名(以下の例では、lemon.blacknon.local)に置換する。
「/etc/lemonldap-ng/for_etc_hosts」の中を見るとわかるのだが、指定したドメイン名に対し、更にサブドメインとしてauth.*やmanager.*といったドメインが利用されるので、これらも含めてDNSに登録しておくと良いだろう。
sed -i 's/example\.com/lemon.blacknon.local/g' /etc/lemonldap-ng/* /var/lib/lemonldap-ng/conf/lmConf-1.js /var/lib/lemonldap-ng/test/index.pl echo "127.0.0.1 lemon.blacknon.local" >> /etc/hosts cat /etc/lemonldap-ng/for_etc_hosts >> /etc/hosts
次に、Nginxとの連携用のパッケージを導入、サービスを起動させる。設定ファイルをシンボリックリンクで配置する。
yum install -y lemonldap-ng-fastcgi-server systemctl enable llng-fastcgi-server systemctl start llng-fastcgi-server
設定ファイルのシンボリックリンクを配置する。
ln -s /etc/lemonldap-ng/handler-nginx.conf /etc/nginx/conf.d/ ln -s /etc/lemonldap-ng/manager-nginx.conf /etc/nginx/conf.d/ ln -s /etc/lemonldap-ng/portal-nginx.conf /etc/nginx/conf.d/ ln -s /etc/lemonldap-ng/test-nginx.conf /etc/nginx/conf.d/
本来であれば、この後ActiveDirectoryやLDAPサーバなどとの連携設定を行う必要があるのだが、ひとまず今の時点でもブラウザからアクセスくらいはできる。
今回はとりあえずそこまでで一区切りとするので、以下のコマンドを実行してNginxを起動する。
systemctl start nginx
ブラウザから「http://auth.lemon.blacknon.local」にアクセスすると、ログイン画面が表示される。
デフォルトで利用できるユーザが幾つかあるので、とりあえずそちらを利用してログインしてみよう。
次回以降、LDAP連携等を行ってのテストを行おう(気が向けば)。
ひと目でわかるAzure Active Directory
bashで、オプションにパスワードを指定したりした場合など、実行したコマンドをbash_historyに記録させたくない場合がある。
そういった場合、以下のコマンドを実行(起動時に設定するなら.bashrcなどに追記)してやることで、コマンド実行時に頭に空白がある場合はhistoryにコマンドが残らないよう設定ができる。
export HISTCONTROL=ignorespace # 空白から始まるコマンドをhistoryに記録しない export HISTCONTROL=ignoreboth # 空白のみ+空白から始まるコマンドをhistoryに記録しない
上のコマンド実行後は、historyに記録しないコマンドの先頭にはスペースを入力してやればよい。
□cmd
[root@BS-PUB-CENT7-01 ~]# echo 1 1 [root@BS-PUB-CENT7-01 ~]# history | tail -10 988 echo grep $^ 989 echo grep $ 990 echo grep $x 991 echo grep $?:PO<> 992 echo grep $? 993 man /bash 994 man bash 995 clear 996 echo 1 997 history | tail -10 [root@BS-PUB-CENT7-01 ~]# export HISTCONTROL=ignorespace [root@BS-PUB-CENT7-01 ~]# echo 2 2 [root@BS-PUB-CENT7-01 ~]# history | tail -10 990 echo grep $x 991 echo grep $?:PO<> 992 echo grep $? 993 man /bash 994 man bash 995 clear 996 echo 1 997 history | tail -10 998 export HISTCONTROL=ignorespace 999 history | tail -10
…まぁ、といってもbash_historyに記録させないようにしているだけなので、auditログやSnoopyLoggerで別にログを取っている場合は当然残るし、scriptコマンドなどを裏で使っている場合でも同様なので、気休め程度かな。
Bash Pocket Reference
先日からscriptコマンドの出力ログにタイムスタンプを付与させる処理について色々とやっていたのだが、ふとnohupでも同様のことができるのではないかと思いやってみた。
で、想定どおり同様の方法でタイムスタンプの付与が行える事が確認できた。
nohup コマンド > >(awk '{print strftime("%F %T : ") $0}{fflush() }'>> PATH)
[root@BS-PUB-CENT7-01 ~]# seq 1 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@BS-PUB-CENT7-01 ~]# nohup seq 1 15 > >(awk '{print strftime("%F %T : ") $0}{fflush() }'>> test_nohup.log) nohup: 標準入力を無視し、標準エラー出力を標準出力にリダイレクトします [root@BS-PUB-CENT7-01 ~]# cat test_nohup.log 2017-05-22 06:04:30 : 1 2017-05-22 06:04:30 : 2 2017-05-22 06:04:30 : 3 2017-05-22 06:04:30 : 4 2017-05-22 06:04:30 : 5 2017-05-22 06:04:30 : 6 2017-05-22 06:04:30 : 7 2017-05-22 06:04:30 : 8 2017-05-22 06:04:30 : 9 2017-05-22 06:04:30 : 10 2017-05-22 06:04:30 : 11 2017-05-22 06:04:30 : 12 2017-05-22 06:04:30 : 13 2017-05-22 06:04:30 : 14 2017-05-22 06:04:30 : 15
使うことがあるのかと言われると微妙だが、まぁとりあえずできるということで。
Linuxステップアップラーニング
前にユーザが所属しているグループの一覧を取得する処理について記述したが、今回はLinuxで各グループごとに所属しているユーザ一覧が必要になったので、出力用のコマンドを備忘で残しておく。
サブグループとして後から追加させたりしたユーザについては、getentコマンドで取得可能だ。
getent group
[root@BS-PUB-CENT7-01 ~]# getent group root:x:0: bin:x:1: daemon:x:2: sys:x:3: adm:x:4: tty:x:5: disk:x:6: lp:x:7: mem:x:8: kmem:x:9: wheel:x:10: …
ただ、あくまでもサブグループとして後からグループに参加させたりしたユーザのみしか表示されないので、システムユーザだったり、プライマリグループに所属しているユーザは表示されない。
それらを表示させるため、以下のようにちょっと無理やり出力させるコマンドを書いてみた。
getent group | awk -F: '{cmd="lid -ng "$1"|tr -d \"\n\" ";cmd|getline c;close(cmd);print $1":"c}'
[root@BS-PUB-CENT7-01 ~]# getent group | awk -F: '{cmd="lid -ng "$1"|tr -d \"\n\" ";cmd|getline c;close(cmd);print $1":"c}' root: root sync shutdown halt operator bin: bin daemon: daemon sys: daemon adm: adm tty: adm disk: adm lp: lp mem: lp kmem: lp wheel: lp cdrom: lp mail: mail postfix man: mail postfix dialout: mail postfix floppy: mail postfix games: mail postfix tape: mail postfix video: mail postfix ftp: ftp lock: ftp …
Linuxステップアップラーニング
CentOS 7にMavenをインストールする必要があったので、備忘で残しておく。
まず、MavenにはJDKが必要になるので、以下のコマンドでOracle JDKをインストールする。
yum install -y wget wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm rpm -ihv jdk-8u131-linux-x64.rpm
次に、以下のコマンドでMavenのインストールを行う。
cd /opt wget http://ftp.riken.jp/net/apache/maven/maven-3/3.5.0/binaries/apache-maven-3.5.0-bin.tar.gz tar xzvf apache-maven-3.5.0-bin.tar.gz mv apache-maven{-3.5.0,}
実際にMavenを利用するユーザでPATHを通しておく。
cat << "EOF" >> ~/.bash_profile export JAVA_HOME=/usr/java/default/ export PATH=$PATH:/opt/apache-maven/bin EOF . ~/.bash_profile
コマンドを実行して、mavenが利用できることを確認する。
mvn --version
[root@BS-PUB-CENT7-01 ~]# mvn --version Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-04T04:39:06+09:00) Maven home: /opt/apache-maven Java version: 1.8.0_131, vendor: Oracle Corporation Java home: /usr/java/jdk1.8.0_131/jre Default locale: ja_JP, platform encoding: UTF-8 OS name: "linux", version: "3.10.0-514.2.2.el7.x86_64", arch: "amd64", family: "unix"
Apache Maven 3クックブック Javaソフトウェア開発のための特選レシピ集
だいぶ久しぶりにsftpの設定をすることがあったので、自分用にまとめておく。セオリーというか、一般的に行われている設定と同様にchrootをし、かつsftpのみ実行可能なユーザとする。わざわざsftpに制限するユーザを作るので、ログインは鍵認証のみに制限する。まず、以下のコマンドでユーザ(ここではsftpユーザ)の作成をしておく。
useradd sftp # -dでホームディレクトリを任意のディレクトリ mkdir ~sftp/.ssh # .sshディレクトリを作成
ログイン元の公開鍵が/tmp/publicとして置いてあると仮定して、以下のように公開鍵設定をする。
設定完了後、とりあえず今の時点で鍵認証でsshログインが行える事を確認すると良いだろう。
cat /tmp/public >> ~sftp/.ssh/authorized_keys chown -R sftp. ~sftp/.ssh chmod 700 ~sftp/.ssh chmod 600 ~sftp/.ssh/*
「/etc/ssh/sshd_config」を編集し、接続ユーザがsftpだった場合のみ、以下の条件の設定をする。
なお、Matchで設定できる条件はユーザの他グループや接続ネットワークなどを指定できるので、設定したい環境に応じて記述してやると良いだろう。
# 標準のsftpサーバからinternal-sftpに変更する #Subsystem sftp /usr/libexec/openssh/sftp-server Subsystem sftp internal-sftp # 接続ユーザがsftpだった場合、chrootの設定と実行プログラムとしてsftpの指定 Match User sftp ChrootDirectory ~ ForceCommand internal-sftp
なお、この時chrootを設定するディレクトリは、所有者・グループがroot:root、権限は755にする必要が有るので注意。
これができてないと、鍵認証で接続ができた直後に切断されてしまう。
設定完了後、sshdを再起動する。
再起動後、sftpで接続できること、sshでの接続ができないこと、Chrootがされていることを確認する。
blacknon@BS-PUB-DEVELOP:~$ ssh sftp@BS-PUB-CENT7-01 Could not chdir to home directory /home/sftp: No such file or directory This service allows sftp connections only. Connection to BS-PUB-CENT7-01 closed. blacknon@BS-PUB-DEVELOP:~$ sftp sftp@BS-PUB-CENT7-01 Connected to BS-PUB-CENT7-01. sftp> pwd Remote working directory: / sftp> ls -la drwxr-xr-x 3 0 0 90 May 29 22:33 . drwxr-xr-x 3 0 0 90 May 29 22:33 .. -rw------- 1 1000 1000 5 May 29 22:33 .bash_history -rw-r--r-- 1 1000 1000 18 Dec 6 23:19 .bash_logout -rw-r--r-- 1 1000 1000 193 Dec 6 23:19 .bash_profile -rw-r--r-- 1 1000 1000 231 Dec 6 23:19 .bashrc drwx------ 2 1000 1000 28 May 29 22:31 .ssh sftp>
OpenSSH[実践]入門 Software Design plus