Quantcast
Viewing all 99 articles
Browse latest View live

Linux/UNIXのコンソールで平均・中央値・最大・最小を求める

仕事で見積もりを作る際、ファイルサイズの統計(平均や中央値)が欲しかったので少し調べてみた。
で、いくつかの手法があることがわかったので、備忘として残しておく。

1.awkで計算する

まずは、一番準備が手軽なawkでの計算方法。
基本、どのUNIX系OSでも入ってるので、とりあえずはすぐ使えるだろう(Macとかの場合はgawkにしたほうが良いけど)。

以下、ざっと項目別に出すコマンドを書いてみる。

 

●平均

awk '{x++;sum+=$1}END {print sum/x}'
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" | awk '{x++;sum+=$1}END {print sum/x}'
2645.75

 

●中央値(ソートが必要)

awk '{v[i++]=$1;}END {x=int((i+1)/2); if(x<(i+1)/2) print (v[x-1]+v[x])/2; else print v[x-1];}'
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" |sort -n | awk '{v[i++]=$1;}END {x=int((i+1)/2); if(x<(i+1)/2) print (v[x-1]+v[x])/2; else print v[x-1];}'
352.5

 

●最頻値

awk '{col=$1}{{b[col]++}if(b[col]&amp;gt;hf){hf=b[col]}}END{for (i in b){if(b[i]==hf){(k=="")? (k=i):(k=k FS i)}{FS=","}}print&amp;nbsp;k}'
[root@BS-PUB-CENT7-01 ~]# find /root ! -size 0 -type f -printf "%s\n" | awk '{col=$1}{{b[col]++}if(b[col]>hf){hf=b[col]}}END{for (i in b){if(b[i]==hf){(k=="") ? (k=i):(k=k FS i)}{FS=","}}print  k}'
184

 

●最大・最小値

awk '{if(min==""){min=max=$1};if($1&amp;amp;amp;gt;max){max=$1};if($1&amp;amp;amp;lt; min){min=$1};} END {print min, max}'
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" | awk '{if(min==""){min=max=$1};if($1>max){max=$1};if($1< min){min=$1};} END {print "min:"min,"\nmax:" max}'
min:0
max:57828

 

2.stコマンドで取得する

以前、こちらでも紹介したstコマンドを用いた場合。
統計用のコマンドなので、awkよりは簡単に結果を求める事が出来る。

●基本

st ファイルPATH
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" | st
N       min     max     sum     mean    stddev
60      0       57828   158745  2645.75 8064.21

 

●平均

st --mean ファイルPATH
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" | st --mean
2645.75

 

●中央値

st --median ファイルPATH
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" | st --median
352.5

 

●最大・最小値

st --max --min ファイルPATH
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" | st --max --min
min     max
0       57828

3.R言語を用いる

統計用の言語であるR言語でターミナル上で処理を行う事で、統計情報を取得する。

●サマリー

コマンド | xargs Rscript -e 'summary(as.numeric(commandArgs(TRUE)))'
[root@BS-PUB-CENT7-01 ~]# find -type f -printf "%s\n" | xargs Rscript -e 'summary(as.numeric(commandArgs(TRUE)))'
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
    0.0   100.8   352.5  2879.0  1405.0 57830.0

 

●平均

コマンド | xargs Rscript -e 'mean(as.numeric(commandArgs(TRUE)))'
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" | xargs Rscript -e 'mean(as.numeric(commandArgs(TRUE)))'
[1] 2832.197

 

●中央値

コマンド | xargs Rscript -e 'median(as.numeric(commandArgs(TRUE)))'
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" | xargs Rscript -e 'median(as.numeric(commandArgs(TRUE)))'
[1] 342

 

●最頻値

コマンド | xargs Rscript -e 'names(which.max(table(as.numeric(commandArgs(TRUE)))))'
[root@BS-PUB-CENT7-01 ~]# find -type f ! -size 0 -printf "%s\n" | xargs Rscript -e 'names(which.max(table(as.numeric(commandArgs(TRUE)))))'
[1] "184"

 

●最大値

コマンド | xargs Rscript -e 'max(as.numeric(commandArgs(TRUE)))'
[root@BS-PUB-CENT7-01 ~]# find -type f ! -size 0 -printf "%s\n" | xargs Rscript -e 'max(as.numeric(commandArgs(TRUE)))'
[1] 57828

 

●最小値

コマンド | xargs Rscript -e 'min(as.numeric(commandArgs(TRUE)))'
[root@BS-PUB-CENT7-01 ~]# find -type f ! -size 0 -printf "%s\n" | xargs Rscript -e 'min(as.numeric(commandArgs(TRUE)))'
[1] 18

 

今後使うことがあるかわからないけど、とりあえずまた何かあったら役に立つだろう。

 

Image may be NSFW.
Clik here to view.
Think Bayes ―プログラマのためのベイズ統計入門
Think Bayes ―プログラマのためのベイズ統計入門

pingで成功・失敗時に任意の音で通知させる

仕事でpingを打ちっぱなしにしてた時、音で成功した祭は通知させられないかなぁ、と思ったので、やれないか調べてみた。
まぁ、そもそもビープ音でよければもう用意はされているのだけど、イヤホンで音楽聴いてたりしていると聞き逃すので、もうちょっと主張の激しい音で知らせて欲しい。

という訳で、pingで疎通に成功・失敗した際に任意の音で通知をさせるようにしてみよう。
前提として、ssh越しのサウンドのやり取りというのが設定とか面倒そうなので、この方法はssh接続先のサーバで実行するのではなく、あくまでも手元のMacやLinux上からとなる。

任意の文字列を読み上げさせる場合

pingの疎通成功・失敗時に任意の文字列を読み上げさせる場合は、Macであればsayコマンド、Linuxであればaplay+text2waveを用いると良いだろう。
以下の例では、疎通成功時は「OK」、疎通失敗時は「NG」と読み上げさせる。

●Macの場合

while true; do ping -c 1 対象ホスト > /dev/null && say "OK" || say "NG" ; sleep 1; done

 

●Linuxの場合

while true; do ping -c 1 対象ホスト > /dev/null && (echo "OK" | text2wave | aplay) || (echo "NG" | text2wave | aplay) ; sleep 1; done

任意のオーディオファイルを読み上げさせる場合

任意のオーディオファイルを読み上げさせる場合は、どちらもmplayerを使えば良いだろう。

while true; do ping -c 1 対象ホスト > /dev/null && mplayer オーディオファイルPATH || mplayer オーディオファイルPATH ; sleep 1; done

 

Image may be NSFW.
Clik here to view.
Linuxシステム[実践]入門 (Software Design plus)
Linuxシステム[実践]入門 (Software Design plus)

bashでcp/mvコマンドでファイルのバックアップ・移動をする際に便利な引数の指定方法

bashでcp/mvコマンドを使用してファイルのバックアップとか移動をする際、出来ればキー入力は少ない方がいいわけで。
長いファイル名とか、PATH名だととても面倒だったりする。

というわけで、個人的にキー入力を短縮するためにやっている指定方法について、記述しておく。

1.同一PATH内にバックアップ・移動(ファイル名変更)する場合

同一PATH内に、末尾に文字列を追加してバックアップ・移動をする場合は、以下のようにコマンドを実行することでキー入力を減らすことが出来る。

cp 対象PAHT{,文字列}
[root@BS-PUB-CENT7-01 ~]# ls -la /tmp/test*
-rw-r--r--. 1 root root 0  4月  1 08:40 /tmp/test
[root@BS-PUB-CENT7-01 ~]# cp /tmp/test{,.bk}
[root@BS-PUB-CENT7-01 ~]# ls -la /tmp/test*
-rw-r--r--. 1 root root 0  4月  1 08:40 /tmp/test
-rw-r--r--. 1 root root 0  4月  1 08:40 /tmp/test.bk

2.違うPATHにバックアップ・移動、ファイル名の一部をリネームする場合

違うPATHにバックアップ・移動したり、ファイル名の一部をリネームしてコピーしたりする場合は、2つ目の引数に「!#$」を指定し、それを加工して上げれば良い。
この「!#$」は、ひとつ前の引数の値を指定する事が出来るので、これを指定し、さらにbash変数として置換することで簡単に別PATHにコピー・移動させたりすることができる。

以下の例では、「/tmp/test」を「/opt/test」としてコピーしている。

cp /tmp/test !#$:s/tmp/opt
[root@BS-PUB-CENT7-01 ~]# ls -la {/opt,/tmp}/test
ls: /opt/test にアクセスできません: そのようなファイルやディレクトリはありません
-rw-r--r--. 1 root root 0  4月  1 08:40 /tmp/test
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# cp /tmp/test !#$:s/tmp/opt
cp /tmp/test /opt/test
[root@BS-PUB-CENT7-01 ~]# ls -la {/opt,/tmp}/test
-rw-r--r--. 1 root root 0  4月  1 08:45 /opt/test
-rw-r--r--. 1 root root 0  4月  1 08:40 /tmp/test

 

Image may be NSFW.
Clik here to view.
UNIXシェルスクリプトコマンドブック 第3版 (コマンドブックシリーズ)
UNIXシェルスクリプトコマンドブック 第3版 (コマンドブックシリーズ)

Linuxのdiffコマンドで覚えておきたい使い方9個

diffコマンドといえば、ファイルの差分を確認する際に良く利用するコマンドだ。
今回は、このdiffコマンドについて覚えておきたい使い方について紹介する。

1.基本的な使い方

基本的には、以下のようにコマンドを実行することで、ファイルの差異を確認する。

diff /tmp/test /tmp/test.nl
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test
aaaaa
v4vvv
ccccc
ddddd
ee2ee
fffff
ggggg

[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.nl
aaaaa
vvvvv
ccccc
ddddd
eeeee
fffff
ggggg

[root@BS-PUB-CENT7-01 ~]# diff /tmp/test /tmp/test.nl
2c2
< v4vvv --- > vvvvv
5c5
< ee2ee --- > eeeee

 

2.差異があるか・無いかを出力する

ファイルのどの行に差異があるのかは出力せず、ただ差異のある旨を知りたい場合は、「-q」オプションを、差異がない場合にその旨を出力させる場合は「-s」オプションを用いると良いだろう。

[root@BS-PUB-CENT7-01 ~]# cat /tmp/test
aaaaa
v4vvv
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.nl
aaaaa
vvvvv
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.bk
aaaaa
v4vvv
[root@BS-PUB-CENT7-01 ~]# diff -q /tmp/test /tmp/test.nl
ファイル /tmp/test と /tmp/test.nl は異なります
[root@BS-PUB-CENT7-01 ~]# diff -q /tmp/test /tmp/test.bk
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# diff -s /tmp/test /tmp/test.nl
2c2
< v4vvv --- > vvvvv
[root@BS-PUB-CENT7-01 ~]# diff -s /tmp/test /tmp/test.bk
ファイル /tmp/test と /tmp/test.bk は同一です

 

3.2列表示にする

出力を2列表示にしたい場合は、「-y」オプションを用いる。

diff -y ファイル1 ファイル2
[root@BS-PUB-CENT7-01 ~]# diff /tmp/test /tmp/test.nl
2c2
< v4vvv --- > vvvvv
[root@BS-PUB-CENT7-01 ~]# diff /tmp/test /tmp/test.bk
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# diff -y /tmp/test /tmp/test.nl
aaaaa                                                           aaaaa
v4vvv                                                         | vvvvv
[root@BS-PUB-CENT7-01 ~]# diff -y /tmp/test /tmp/test.bk
aaaaa                                                           aaaaa
v4vvv                                                           v4vvv

 

4.context/unified形式で出力する

context/unified形式で差分を出力したい場合は、「-c」オプション(context形式)、「-u」オプション(unified形式)を付与すると良いだろう。

[root@BS-PUB-CENT7-01 ~]# diff -c /tmp/test /tmp/test.nl
*** /tmp/test   2016-04-03 19:12:36.446000000 +0900
--- /tmp/test.nl        2016-04-03 19:12:45.302000000 +0900
***************
*** 1,2 ****
  aaaaa
! v4vvv
--- 1,2 ----
  aaaaa
! vvvvv
[root@BS-PUB-CENT7-01 ~]# diff -u /tmp/test /tmp/test.nl
--- /tmp/test   2016-04-03 19:12:36.446000000 +0900
+++ /tmp/test.nl        2016-04-03 19:12:45.302000000 +0900
@@ -1,2 +1,2 @@
 aaaaa
-v4vvv
+vvvvv

5.ディレクトリの差分を確認する

diffでは、ディレクトリを指定してその差分を確認する事も出来る。

[root@BS-PUB-CENT7-01 ~]# diff /tmp /tmp2
共通のサブディレクトリー: /tmp/.ICE-unix と /tmp2/.ICE-unix
共通のサブディレクトリー: /tmp/.Test-unix と /tmp2/.Test-unix
共通のサブディレクトリー: /tmp/.X11-unix と /tmp2/.X11-unix
共通のサブディレクトリー: /tmp/.XIM-unix と /tmp2/.XIM-unix
共通のサブディレクトリー: /tmp/.font-unix と /tmp2/.font-unix
/tmp のみに存在: abc
diff /tmp/test /tmp2/test
1c1
< aaaa3 --- > aaaaa
diff /tmp/test.bk /tmp2/test.bk
1c1
< aaaa3 --- > aaaaa

 

サブディレクトリ配下も再帰的に差分確認したい場合は、「-r」オプションを付与する。

[root@BS-PUB-CENT7-01 ~]# diff -r /tmp /tmp2
diff -r /tmp/.Test-unix/aaaa /tmp2/.Test-unix/aaaa
1c1
< aaa` --- > aaaaa
/tmp のみに存在: abc
diff -r /tmp/test /tmp2/test
1c1
< aaaa3 --- > aaaaa
diff -r /tmp/test.bk /tmp2/test.bk
1c1
< aaaa3 --- > aaaaa

 

6.ファイルの比較時に大文字・小文字の違いや行末スペースを無視する

ファイル比較時に、大文字・小文字の違いや行末スペースを無視したい場合は、以下のようなオプションを付与する。

  • -i … 大文字・小文字の差異を無視する
  • -E … タブ展開で発生する差異を無視する
  • -Z … 行末のスペースを無視する
  • -b … スペース数の違いを無視する
  • -w … 全てのスペースを無視する
  • -B … 空白行(^$)を無視する
  • -I=RE … REで指定(正規表現指定)した差異を無視する

 

[root@BS-PUB-CENT7-01 ~]# cat /tmp/test
aaaa3
v4vvv
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.bk
aaaa3

v4vvv
[root@BS-PUB-CENT7-01 ~]# diff /tmp/test /tmp/test.bk
1a2
>
[root@BS-PUB-CENT7-01 ~]# diff -B /tmp/test /tmp/test.bk
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test
aaaa3
v4vvv
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.bk2
aaaa3
123
v4vvv
[root@BS-PUB-CENT7-01 ~]# diff /tmp/test /tmp/test.bk2
1a2
> 123
[root@BS-PUB-CENT7-01 ~]# diff -I=*123* /tmp/test /tmp/test.bk2
[root@BS-PUB-CENT7-01 ~]#

 

7.色付きで表示させる

差分を色付きで表示させる場合、標準のdiffだとgroup-formatオプションを指定してあげる必要がある。
以下、例。(共通行:黄色、旧ファイル行:赤、新ファイル行:青)

diff --old-group-format=$'\e[0;31m%<\e[0m' \      --new-group-format=$'\e[0;36m%>\e[0m' \
     --unchanged-group-format=$'\e[0;33m%=\e[0m' \
     ファイル1 ファイル2

Image may be NSFW.
Clik here to view.
20160403_000005

 

そらで打つのは難しい(+面倒)だと思うので、基本的にはこちらでも紹介したcolordiffやdiffcを利用した方が良いだろう。

 

8.ssh越しにdiffを行う

ssh越しに、別のサーバ上にあるファイルとdiffを行う場合は、以下のように行う。

ssh ユーザ名@ホスト名 "cat リモート側のファイルパス" | diff - ローカル側のファイルパス

 

9.コマンドの出力結果でdiffを行う

任意のコマンドの出力結果でdiffを行う場合は、以下のようにする。

diff <(コマンド1) <(コマンド2)
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test123
123
456
789
1aa
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test123_
456
789
123
456
1ab
[root@BS-PUB-CENT7-01 ~]# diff /tmp/test123 /tmp/test123_
1d0
< 123
4c3,5
< 1aa --- > 123
> 456
> 1ab
[root@BS-PUB-CENT7-01 ~]# diff <(sort /tmp/test123) <(sort /tmp/test123_)
2c2,3
< 1aa --- > 1ab
> 456

 

Image may be NSFW.
Clik here to view.
新しいLinuxの教科書
新しいLinuxの教科書

shcでシェルスクリプトをバイナリ化する

シェルスクリプトの中身を見れないようにしようと思って調べていた所、shcというシェルスクリプトをバイナリ化するプログラムがあるようだったので使ってみる事にした。
前提として、利用にはmakeが必要なので、gccが必要。

1.インストール

まずはインストール。
こちらのページから、以下のコマンドでダウンロード、コンパイルを行う。

HTTP="http://www.datsi.fi.upm.es/~frosal/" && curl -s $HTTP | grep .tgz | awk -F\" '{print $2}' | sed 's/^.\///g' | xargs -I{} echo $HTTP{} | xargs wget
tar xzvf shc-*.tgz
cd shc-*
make
make install

 

これでインストールが完了した。

2.バイナリ化を行う

shcコマンドは、基本的に以下のようにコマンドを実行するだけで、「指定したシェルスクリプト名.x」というバイナリファイルを作成してくれる。

shc -f バイナリ化するシェルスクリプトPATH

 

実際に、以下のようなシェルスクリプトを作成し、バイナリ化してみる。

●test.sh

#!/bin/sh
echo test
echo $0
pwd
[root@BS-PUB-CENT7-01 ~]# pwd
/root
[root@BS-PUB-CENT7-01 ~]# ls -l test.sh*
-rw-r--r--. 1 root root 32  4月  6 00:35 test.sh
[root@BS-PUB-CENT7-01 ~]# cat test.sh
#!/bin/sh
echo test
echo $0
pwd
[root@BS-PUB-CENT7-01 ~]# sh test.sh
test
test.sh
/root
[root@BS-PUB-CENT7-01 ~]# shc -f test.sh
[root@BS-PUB-CENT7-01 ~]# ls -l test.sh*
-rw-r--r--. 1 root root    32  4月  6 00:35 test.sh
-rwx--x--x. 1 root root 11152  4月  6 00:37 test.sh.x
-rw-r--r--. 1 root root  9283  4月  6 00:37 test.sh.x.c
[root@BS-PUB-CENT7-01 ~]# file test.sh*
test.sh:     POSIX shell script, ASCII text executable
test.sh.x:   ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=e335100ddec4e55e908a1d62a53d2c24156f9de0, stripped
test.sh.x.c: C source, ASCII text
[root@BS-PUB-CENT7-01 ~]# ./test.sh.x
test
./test.sh.x
/root

 

確かに、シェルスクリプトをバイナリ化できた。
あまり使う機会は無いだろうけど、いつかは利用するかもしれない。

 

Image may be NSFW.
Clik here to view.
すべてのUNIXで20年動くプログラムはどう書くべきか デプロイ・保守に苦しむエンジニア達へ贈る[シェルスクリプトレシピ集]
すべてのUNIXで20年動くプログラムはどう書くべきか デプロイ・保守に苦しむエンジニア達へ贈る[シェルスクリプトレシピ集]

lessコマンドで覚えておきたい使い方9個

長い標準出力を見るときに重宝するlessコマンド。
LinuxやUNIXをある程度触っている人間であれば必ず触ってるであろう基本的なコマンドだが、今回はこのコマンドについての使い方をまとめてみることにする。

1.基本的な使い方

lessは、基本的に長い(大きな)テキストファイルや標準出力を見る際に用いられる。
基本的には、以下のようにコマンドを実行して利用する。

コマンド | less

例)/proc/meminfoの出力内容をlessで見る場合

cat /proc/meminfo | less

Image may be NSFW.
Clik here to view.
20160410_000000

 

この状態の時、上下キー(もしくは、jkキー)で表示範囲を移動する事ができる。
また、一番下に「:(コロン)」が見えていると思うが、ここでコマンドを入力したりすることで、viのように操作してファイル内の検索を行ったりすることができる。
以下、画面移動時に利用出来るキーを抜粋。

  • k(↑キー) … 1行上に移動する
  • XXk … XX行上に移動する
  • j(↓キー) … 1行下に移動する
  • XXj … XX行下に移動する
  • f(PageUpキー) … 1ページ上に移動する
  • b(PageDownキー) … 1ページ下に移動する
  • u … 半ページ上に移動する
  • d … 半ページ下に移動する
  • g … 先頭に移動する
  • G … 末尾に移動する

 

2.キーワードを検索する

「:」で特定のキーワードを指定し、そのキーワードがある場所に移動させる事ができる。
以下、指定方法

  • ?キーワード … 前にキーワードを検索する
  • /キーワード … 後ろにキーワードを検索する
  • n … 次にヒットした検索結果に移動する
  • N … 前にヒットした検索結果に移動する

 

3.less内でgrepする

less内で「&キーワード」とすることで、指定したキーワードを持つ行のみを表示させることが出来る。
例として、「nologin」というキーワードを指定すると…

Image may be NSFW.
Clik here to view.
20160412_000002

 

こんな感じに、キーワードがヒットする行だけを表示してくれる。

Image may be NSFW.
Clik here to view.
20160412_000003

 

4.現在の表示範囲を確認する

「Ctrl + G」キーを押下する事で、ターミナル画面下に現在の表示範囲を出力させることが出来る。

Image may be NSFW.
Clik here to view.
20160412_000004

 

5.色をつける

「-R」オプションを付与してあげることで、色付きで出力する事が出来る。
つまり、以下のようにvimcatで開いたファイルをlessしたりすることが出来る。

vimcat ソースファイル | less -R

Image may be NSFW.
Clik here to view.
20160412_000005

 

6.複数ファイルを開く

lessでは、以下のように複数のファイルを一度に指定することが出来る。

less ファイル1 ファイル2 ...

 

表示させるファイルを切り替える場合は、「:p」で前のファイル、「:n」で後ろのファイルに切り替える事が出来る。

7.「tail -F」相当の処理を行う

ファイル表示中に「Shift + Fキー」を入力することで、tail -Fと同様に書き込みを待ち受ける事が出来る。

Image may be NSFW.
Clik here to view.
20160412_000006

 

8.行番号を付与する

「–LINE-NUMBERS」オプションを付与することで、lessの出力に行番号を付与することが出来る。

less --LINE-NUMBERS ファイル

Image may be NSFW.
Clik here to view.
20160412_000007

 

9.エディタで編集する

lessで開いているファイルを編集したい場合は、「v」で定義されているデフォルトのエディタで編集を行う事が出来る。

 

Image may be NSFW.
Clik here to view.
Unix考古学 Truth of the Legend
Unix考古学 Truth of the Legend

シェルスクリプトをbase64 or gpgで難読化・暗号化する

シェルスクリプト単体で外部に漏れても、すぐには中身が見れないようにする方法をについて、バイナリ化の他に、難読化…というか、スクリプトの中身がスグには見えないようにする方法がないか調べてみた。
で、以下のようにbase64やgpgを利用する事で対応出来たので、備忘として残しておく。

まず、以下のようなスクリプトを用意しておく。

●test.sh

#!/bin/sh
echo "test"
mkdir ./test
touch ./test/test

 

1.base64で難読化する

base64で難読化するには、以下のようにコマンドを実行して難読化したファイルを生成する。

echo "echo $(base64 スクリプトファイルPATH" > 難読化したスクリプトPATH
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.sh
#!/bin/sh
echo "test"
mkdir ./test
touch ./test/test
[root@BS-PUB-CENT7-01 ~]# echo "echo $(base64 /tmp/test.sh)" > /tmp/test_obsf.sh
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test_obsf.sh
echo IyEvYmluL3NoCmVjaG8gInRlc3QiCm1rZGlyIC4vdGVzdAp0b3VjaCAuL3Rlc3QvdGVzdApscyAt
bGEgLi90ZXN0Cg==

 

で、この難読化させたスクリプトファイルを利用するには、以下のようにコマンドを実行すればよい。

sh 難読化したスクリプトPATH | base64 -d | sh
[root@BS-PUB-CENT7-01 ~]# sh /tmp/test_obsf.sh | base64 -d
#!/bin/sh
echo "test"
mkdir ./test
touch ./test/test
[root@BS-PUB-CENT7-01 ~]# sh /tmp/test_obsf.sh | base64 -d | sh
test
[root@BS-PUB-CENT7-01 ~]# ls -la test/test
-rw-r--r--. 1 root root 0  4月 10 20:50 test/test

 

ただ、base64で読み取りにくくさせているだけなので、この難読化したスクリプトを他のサーバに持って行っても、同じようにコマンドを実行することで読み取れてしまうし、「-」付きのスクリプトの場合はそこで途切れてしまう。「-」を含まない、非常に単純なスクリプトで無いと実用は難しいだろう。

2.gpgで暗号化する

スクリプトをgpgで暗号化しておき、実行時に復号化するようにしてみる。
今回の場合はパスワードでの暗号化・復号化を行う。

まず、以下のコマンドでスクリプトを暗号化する。

gpg --yes --batch --passphrase=パスワード-c -o 暗号化したスクリプトの出力PATH 暗号化するスクリプトのPATH
[root@BS-PUB-CENT7-01 ~]# gpg --yes --batch --passphrase=test1234 -c -o /tmp/test.sh.gpg /tmp/test.sh
[root@BS-PUB-CENT7-01 ~]# ls -la /tmp/test.sh.gpg
-rw-r--r--. 1 root root 85  4月 10 21:31 /tmp/test.sh.gpg
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.sh.gpg

?エキュT[ムモルD5Nキ・・ミ

         oUュロ]:|・fmfュ「ネPハ
;麭ノL#cu・

          ネ,>

 

で、この暗号化したスクリプトファイルを実行する場合は、以下のようにコマンドを実行すれば良い。

gpg --yes --batch --passphrase=パスワード -d -o - 暗号化したスクリプトのPATH 2>/dev/null | sh
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.sh
#!/bin/sh
echo "test"
mkdir ./test
touch ./test/test
[root@BS-PUB-CENT7-01 ~]# gpg --yes --batch --passphrase=test1234 -d -o - /tmp/test.sh.gpg 2>/dev/null
#!/bin/sh
echo "test"
mkdir ./test
touch ./test/test
[root@BS-PUB-CENT7-01 ~]# gpg --yes --batch --passphrase=test1234 -d -o - /tmp/test.sh.gpg 2>/dev/null | sh
test

 

う~ん、正直、こっちの方がセキュリティレベルは高いし扱いやすいかも…
実際に運用に組み込むなら、パスワードではなく鍵ファイルで対応した方がいいかも知れない。

 

Image may be NSFW.
Clik here to view.
実践サイバーセキュリティモニタリング
実践サイバーセキュリティモニタリング

psコマンドで覚えておきたい使い方5個

Linuxでプロセス状態を取得するコマンドといえばpsコマンドだが、今回はこのコマンドで個人的に覚えておきたいオプション等についてをまとめてみる事にする。

1.基本的な使い方(現在動作中のプロセスを全て出力する)

psコマンドは、基本的に現在動作中のプロセスを出力するためのコマンドだ。
で、現在システムで動作しているプロセスを全て出力する場合は、「-ef」で指定出来る。
以下、オプションの詳細。

  • -e … 全てのプロセスを出力する
  • -f … 完全なフォーマットで出力する

 

このオプションでpsコマンドを実行した場合、以下のような出力が得られる。

[root@test-node ~]# ps -ef | head -10
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0  2月20 ?      00:03:19 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root         2     0  0  2月20 ?      00:00:01 [kthreadd]
root         3     2  0  2月20 ?      00:00:28 [ksoftirqd/0]
root         7     2  0  2月20 ?      00:00:08 [migration/0]
…

 

各項目の意味を左から順に説明すると

  • UID … プロセスの実行ユーザ名
  • PID … プロセス番号
  • PPID … 親プロセスのプロセス番号
  • C … CPU使用率
  • STIME … プロセスの開始時間
  • TTY … プロセスが動作しているターミナル(?の場合はバックグラウンドプロセス)
  • CMD … プロセスのコマンド名

 

2.ユーザIDを指定する

以下のようにコマンドを実行し、ユーザIDを指定してやることで、そのユーザで実行されているプロセスのみを表示させる。
(-eの方が優先される)

ps -fu ユーザID
[root@test-node ~]# ps -fu dd-agent
UID        PID  PPID  C STIME TTY          TIME CMD
dd-agent 15208     1  0  2月21 ?      00:14:57 /opt/datadog-agent/embedded/bin/python /opt/datadog-agent/bin/super
dd-agent 15214 15208  0  2月21 ?      01:33:20 /opt/datadog-agent/embedded/bin/python /opt/datadog-agent/agent/dog
dd-agent 15215 15208  0  2月21 ?      02:45:40 /opt/datadog-agent/embedded/bin/python /opt/datadog-agent/agent/dda
dd-agent 15216 15208  0  2月21 ?      02:06:47 /opt/datadog-agent/embedded/bin/python /opt/datadog-agent/agent/age

 

3.実行コマンドを指定する

「-C」オプションで実行しているコマンドを指定することで、そのコマンドのプロセスのみを表示させる。
(部分一致での抽出は不可)

ps -fC コマンド名

 

ただ、以下の実行例のように、この機能だと漏れが発生することが多いようだ。
通常はgrepのキーワードの1文字を[]で囲むことで、対象のプロセスのみを取り出してやると良いだろう。

[root@test-node ~]# ps -fC python
UID        PID  PPID  C STIME TTY          TIME CMD
dd-agent 15214 15208  0  2月21 ?      01:33:21 /opt/datadog-agent/embedded/bin/python /opt/datadog-agent/agent/dog
dd-agent 15215 15208  0  2月21 ?      02:45:43 /opt/datadog-agent/embedded/bin/python /opt/datadog-agent/agent/dda
dd-agent 15216 15208  0  2月21 ?      02:06:49 /opt/datadog-agent/embedded/bin/python /opt/datadog-agent/agent/age
[root@test-node ~]# ps -ef | grep [p]ython
root      1201     1  0  2月20 ?      00:06:48 /usr/bin/python -Es /usr/sbin/tuned -l -P
dd-agent 15208     1  0  2月21 ?      00:14:57 /opt/datadog-agent/embedded/bin/python /opt/datadog-agent/bin/supervisord -c /etc/dd-agent/supervisor.conf
dd-agent 15214 15208  0  2月21 ?      01:33:21 /opt/datadog-agent/embedded/bin/python /opt/datadog-agent/agent/dogstatsd.py --use-local-forwarder
dd-agent 15215 15208  0  2月21 ?      02:45:43 /opt/datadog-agent/embedded/bin/python /opt/datadog-agent/agent/ddagent.py
dd-agent 15216 15208  0  2月21 ?      02:06:49 /opt/datadog-agent/embedded/bin/python /opt/datadog-agent/agent/agent.py foreground --use-local-forwarder

 

4.プロセスを親子関係でツリー表示する

プロセスの親子関係をツリー表示させる場合は、「f」(ハイフン無し)を付与する事で出力させることが出来る。

ps -ef f

Image may be NSFW.
Clik here to view.
Screenshot_from_2016-04-17 21:49:29

[root@test-node ~]# ps -fu dd-agent f
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
dd-agent 15208     1  0  2月21 ?      Ss    14:58 /opt/datadog-agent/embedded/bin/python /opt/datadog-agent/bin/supervisord -c /etc/dd-agent/
dd-agent 15214 15208  0  2月21 ?      Sl    93:23  \_ /opt/datadog-agent/embedded/bin/python /opt/datadog-agent/agent/dogstatsd.py --use-loca
dd-agent 15215 15208  0  2月21 ?      S    165:46  \_ /opt/datadog-agent/embedded/bin/python /opt/datadog-agent/agent/ddagent.py
dd-agent 15216 15208  0  2月21 ?      S    126:51  \_ /opt/datadog-agent/embedded/bin/python /opt/datadog-agent/agent/agent.py foreground --u

 

5.CPU/メモリ使用率を出力する

各プロセスのCPU/メモリ使用率を出力する場合は、「u」(ハイフン無し)を付与することで取得出来る。

ps au -C top
[root@localhost ~]# ps au -C top
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     15680  0.0  0.0 115380  2040 pts/0    Ss   16:42   0:00 -bash
root     15759  0.0  0.0 115380  2020 pts/1    Ss   17:27   0:00 -bash
root     15776  0.1  0.0 146136  1928 pts/1    S+   17:27   0:00 top
root     15787  0.0  0.0 139496  1572 pts/0    R+   17:27   0:00 ps au -C top
root     23173  0.0  0.0 110028   816 tty1     Ss+   1月04   0:00 /sbin/agetty --noclear tty1 linux

 

個人的によく利用するのはこんなものだろうか。
psコマンドは歴史が長く多機能なので、「-o」で出力フォーマットを直接指定できたり、項目ごとにソートさせたりといった事も出来るし、その他色々な機能があるが、個人的には上の5個以外だとあまり使うことが無い。

 

Image may be NSFW.
Clik here to view.
動くメカニズムを図解&実験! Linux超入門 (My Linuxシリーズ)
動くメカニズムを図解&実験! Linux超入門 (My Linuxシリーズ)

lsofコマンドで覚えておきたい使い方9個

ファイルやポート、プロセスの関連を確認する際に良く利用するlsofコマンドについて、個人的に覚えておきたいオプションや使い方をまとめてみる事にする。
なお、もしlsofコマンドがない環境の場合、ファイルとプロセスの紐付けを確認するだけであればfuserコマンドが入っていればそれで代用可能だ。

1.全プロセスを確認する

lsofコマンドは、オプションを付与しないで実行すると全てのプロセスについて出力してくれる。

lsof
[root@test-node ~]# lsof
COMMAND     PID   TID     USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1           root  cwd       DIR              253,0      4096        128 /
systemd       1           root  rtd       DIR              253,0      4096        128 /
systemd       1           root  txt       REG              253,0   1489960     196956 /usr/lib/systemd/systemd
systemd       1           root  mem       REG              253,0     20032  201382954 /usr/lib64/libuuid.so.1.3.0
systemd       1           root  mem       REG              253,0    252704  201609186 /usr/lib64/libblkid.so.1.1.0
systemd       1           root  mem       REG              253,0     90632  201382920 /usr/lib64/libz.so.1.2.7
systemd       1           root  mem       REG              253,0     19888  201524817 /usr/lib64/libattr.so.1.1.0
systemd       1           root  mem       REG              253,0     19520  201328490 /usr/lib64/libdl-2.17.so
systemd       1           root  mem       REG              253,0    153192  201328867 /usr/lib64/liblzma.so.5.0.99
systemd       1           root  mem       REG              253,0    398272  201328924 /usr/lib64/libpcre.so.1.2.0
systemd       1           root  mem       REG              253,0   2107816  201328483 /usr/lib64/libc-2.17.so
systemd       1           root  mem       REG              253,0    142304  201328516 /usr/lib64/libpthread-2.17.so
systemd       1           root  mem       REG              253,0     88720  201326729 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd       1           root  mem       REG              253,0     44096  201328521 /usr/lib64/librt-2.17.so
systemd       1           root  mem       REG              253,0    260784  201673504 /usr/lib64/libmount.so.1.1.0
systemd       1           root  mem       REG              253,0     91768  201566273 /usr/lib64/libkmod.so.2.2.10
systemd       1           root  mem       REG              253,0    118792  201382927 /usr/lib64/libaudit.so.1.0.0
systemd       1           root  mem       REG              253,0     61648  201649973 /usr/lib64/libpam.so.0.83.1
systemd       1           root  mem       REG              253,0     20024  201524821 /usr/lib64/libcap.so.2.22
systemd       1           root  mem       REG              253,0    147120  201382917 /usr/lib64/libselinux.so.1
systemd       1           root  mem       REG              253,0    164440  202444375 /usr/lib64/ld-2.17.so
systemd       1           root    0u      CHR                1,3       0t0       1028 /dev/null
systemd       1           root    1u      CHR                1,3       0t0       1028 /dev/null
…

 

出力されている情報について、左から順に

  • COMMAND … 実行されているコマンド
  • PID … プロセスID
  • TID … スレッドID
  • USER … 実行ユーザ
  • FD … ファイルディスクリプタ。主に見かけるものだけ抜粋。
    • cwd … カレントディレクトリ
    • txt … テキストファイル
    • mem … メモリマッピングファイル
    • mmap … メモリマッピングデバイス
    • ◯uなど … 実際のファイルディスクリプタを表す。数字以降のアルファベットの意味は、r→読み取り、w→書き込み、u→読み書き
  • TYPE … タイプ。主に見かけるものだけ抜粋。
    • REG … 通常ファイル
    • DIR … ディレクトリ
    • FIFO … FIFO
    • CHR … デバイスファイル
    • unix … UNIXドメインソケット
    • IPv4 … IPv4ソケット
    • IPv6 … IPv6ソケット
  • DEVICE … デバイス
  • SIZE/OFF … ファイルサイズ
  • NODE … プロトコル
  • NAME … ファイルまたはポート

 

2.対象のファイル(ディレクトリ)を指定する

以下のようにコマンドを実行することで、ファイルやディレクトリを指定して出力させる事ができる。

lsof ファイルPATH
[root@test-node ~]# lsof /var/lib/mysql/tc.log
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
mysqld  1203 mysql  mem    REG  253,0    24576 635783 /var/lib/mysql/tc.log
mysqld  1203 mysql   16u   REG  253,0    24576 635783 /var/lib/mysql/tc.log

 

ディレクトリ配下を再帰的に確認する場合は、「+D」を付与する。

lsof +D ディレクトリPATH
[root@test-node ~]# lsof +D /var/lib/mysql/
COMMAND  PID  USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
mysqld  1203 mysql  cwd    DIR              253,0     4096 635772 /var/lib/mysql
mysqld  1203 mysql  mem    REG              253,0    24576 635783 /var/lib/mysql/tc.log
mysqld  1203 mysql    3uW  REG              253,0       52 635785 /var/lib/mysql/aria_log_control
mysqld  1203 mysql    4r   DIR              253,0     4096 635772 /var/lib/mysql
mysqld  1203 mysql    5u   REG              253,0    16384 635787 /var/lib/mysql/aria_log.00000001
mysqld  1203 mysql    6uW  REG              253,0 12582912 635788 /var/lib/mysql/ibdata1
mysqld  1203 mysql   11uW  REG              253,0 50331648 635789 /var/lib/mysql/ib_logfile0
mysqld  1203 mysql   12uW  REG              253,0 50331648 635791 /var/lib/mysql/ib_logfile1
mysqld  1203 mysql   13uW  REG              253,0    98304 639741 /var/lib/mysql/mysql/innodb_index_stats.ibd
mysqld  1203 mysql   15uW  REG              253,0    98304 639739 /var/lib/mysql/mysql/innodb_table_stats.ibd
mysqld  1203 mysql   16u   REG              253,0    24576 635783 /var/lib/mysql/tc.log
mysqld  1203 mysql   17u   REG              253,0     1024 924937 /var/lib/mysql/mysql/servers.MYI
mysqld  1203 mysql   18u   REG              253,0        0 924938 /var/lib/mysql/mysql/servers.MYD
mysqld  1203 mysql   20u  unix 0xffff880035f80000      0t0  19543 /var/lib/mysql/mysql.sock
mysqld  1203 mysql   21u   REG              253,0     4096 924925 /var/lib/mysql/mysql/user.MYI
mysqld  1203 mysql   22u   REG              253,0      668 924926 /var/lib/mysql/mysql/user.MYD
mysqld  1203 mysql   23u   REG              253,0     9216 797673 /var/lib/mysql/mysql/db.MYI
mysqld  1203 mysql   24u   REG              253,0     1264 797674 /var/lib/mysql/mysql/db.MYD
mysqld  1203 mysql   25u   REG              253,0     2048 797677 /var/lib/mysql/mysql/host.MYI
mysqld  1203 mysql   26u   REG              253,0        0 797678 /var/lib/mysql/mysql/host.MYD
mysqld  1203 mysql   27u   REG              253,0    10240 639743 /var/lib/mysql/mysql/proxies_priv.MYI
mysqld  1203 mysql   28u   REG              253,0     2538 639744 /var/lib/mysql/mysql/proxies_priv.MYD
mysqld  1203 mysql   29u   REG              253,0     4096 924928 /var/lib/mysql/mysql/roles_mapping.MYI
mysqld  1203 mysql   30u   REG              253,0        0 924929 /var/lib/mysql/mysql/roles_mapping.MYD
mysqld  1203 mysql   31u   REG              253,0     4096 924940 /var/lib/mysql/mysql/tables_priv.MYI
mysqld  1203 mysql   32u   REG              253,0        0 924941 /var/lib/mysql/mysql/tables_priv.MYD
mysqld  1203 mysql   33u   REG              253,0     4096 924943 /var/lib/mysql/mysql/columns_priv.MYI
mysqld  1203 mysql   34u   REG              253,0        0 924944 /var/lib/mysql/mysql/columns_priv.MYD
mysqld  1203 mysql   35u   REG              253,0     4096 639727 /var/lib/mysql/mysql/procs_priv.MYI
mysqld  1203 mysql   36u   REG              253,0        0 639728 /var/lib/mysql/mysql/procs_priv.MYD
mysqld  1203 mysql   37u   REG              253,0     2048 639736 /var/lib/mysql/mysql/event.MYI
mysqld  1203 mysql   38u   REG              253,0        0 639737 /var/lib/mysql/mysql/event.MYD
mysqld  1203 mysql   39uW  REG              253,0    98304 639755 /var/lib/mysql/mysql/gtid_slave_pos.ibd
mysqld  1203 mysql   40u   REG              253,0        0 639764 /var/lib/mysql/multi-master.info

 

3.実行コマンドを指定する

「-c」で実行されているコマンドを指定して抽出することが出来る。

lsof -c コマンド名
[root@test-node ~]# lsof -c python
COMMAND   PID     USER   FD      TYPE             DEVICE SIZE/OFF      NODE NAME
python  15214 dd-agent  cwd       DIR              253,0     4096       128 /
python  15214 dd-agent  rtd       DIR              253,0     4096       128 /
python  15214 dd-agent  txt       REG              253,0  6091728   3871161 /opt/datadog-agent/embedded/bin/python2.7
python  15214 dd-agent  mem       REG              253,0    27076  70543951 /opt/datadog-agent/embedded/lib/python2.7/lib-dynload/resource.so
…

 

複数のコマンドを指定する場合は、そのコマンド数だけ「-c」を付与してやれば良い。
これは他の条件でも同様なので、そこでは説明しない。

lsof -c コマンド名 -c コマンド名 ...
[root@test-node ~]# lsof -c python -c mysqld
COMMAND   PID     USER   FD      TYPE             DEVICE  SIZE/OFF      NODE NAME
mysqld   1203    mysql  cwd       DIR              253,0      4096    635772 /var/lib/mysql
mysqld   1203    mysql  rtd       DIR              253,0      4096       128 /
python  15214 dd-agent  mem       REG              253,0     24988  70543941 /opt/datadog-agent/embedded/lib/python2.7/lib-dynload/grp.so
python  15214 dd-agent  mem       REG              253,0    247235 142547834 /opt/datadog-agent/embedded/lib/libtinfow.so.5.9
…

 

なお、コマンド以外でも同様の指定方法になるが、検索条件の頭に「^」を付与する事で”それ以外”を検索することが出来る。

lsof -c ^コマンド名

 

4.ユーザを指定する

プロセスの実行ユーザを指定して出力させる場合は、「-u」オプションを付与する。

lsof -u ユーザ名
[root@test-node ~]# lsof -u dd-agent
COMMAND     PID     USER   FD      TYPE             DEVICE  SIZE/OFF      NODE NAME
superviso 15208 dd-agent  cwd       DIR              253,0      4096       128 /
superviso 15208 dd-agent  rtd       DIR              253,0      4096       128 /
superviso 15208 dd-agent  txt       REG              253,0   6091728   3871161 /opt/datadog-agent/embedded/bin/python2.7
…

5.プロセス番号を指定する

対象のプロセス番号を指定して出力させる場合は、「-p」オプションを用いる。

lsof -p プロセス番号
[root@test-node ~]# lsof -p 15208
COMMAND     PID     USER   FD   TYPE             DEVICE  SIZE/OFF      NODE NAME
superviso 15208 dd-agent  cwd    DIR              253,0      4096       128 /
superviso 15208 dd-agent  rtd    DIR              253,0      4096       128 /
superviso 15208 dd-agent  txt    REG              253,0   6091728   3871161 /opt/datadog-agent/embedded/bin/python2.7
superviso 15208 dd-agent  mem    REG              253,0     25313  70543955 /opt/datadog-agent/embedded/lib/python2.7/lib-dynload/syslog.so
…

 

6.ネットワークコネクションを出力する

ネットワークコネクションを出力させる場合、「-i」でポート番号を指定する。

lsof -i
[root@test-node ~]# lsof -i
COMMAND     PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
mysqld     1203    mysql   19u  IPv6    19542      0t0  TCP *:mysql (LISTEN)
sshd       1204     root    3u  IPv4    17508      0t0  TCP *:ssh (LISTEN)
sshd       1204     root    4u  IPv6    17517      0t0  TCP *:ssh (LISTEN)
snmpd      1348     root    6u  IPv4  3264383      0t0  UDP *:snmp
…

 

ポート番号を指定する場合は、「-i:ポート番号」というふうに指定してやれば良い。
プロトコル名でもいける。

lsof -i:ポート番号
[root@test-node ~]# lsof -i:ssh
COMMAND  PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
sshd    1204 root    3u  IPv4    17508      0t0  TCP *:ssh (LISTEN)
sshd    1204 root    4u  IPv6    17517      0t0  TCP *:ssh (LISTEN)
sshd    6731 root    3u  IPv4 39065001      0t0  TCP 172.28.XXX.XXX:ssh->172.28.XXX.XXX:58041 (ESTABLISHED)
[root@test-node ~]# lsof -i:22
COMMAND  PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
sshd    1204 root    3u  IPv4    17508      0t0  TCP *:ssh (LISTEN)
sshd    1204 root    4u  IPv6    17517      0t0  TCP *:ssh (LISTEN)
sshd    6731 root    3u  IPv4 39065001      0t0  TCP 172.28.XXX.XXX:ssh->172.28.XXX.XXX:58041 (ESTABLISHED)

 

「-i」の後にtcp/udpと、プロトコルを指定することも出来る。

lsof -i tcp
lsof -i udp

 

7.プロセス番号のみを出力させる

出力時の情報としてプロセス番号のみが必要な場合は、「-t」オプションを付与する。

lsof -t
[root@test-node ~]# lsof -t -i:22
1204
6731

 

8.検索条件を「AND」にする

lsofでは、複数の検索条件を指定するとOR検索をしてくれる。

[root@test-node ~]# lsof +D /var/ -u root
COMMAND     PID     USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1     root  cwd       DIR              253,0      4096        128 /
systemd       1     root  rtd       DIR              253,0      4096        128 /
systemd       1     root  txt       REG              253,0   1489960     196956 /usr/lib/systemd/systemd
systemd       1     root  mem       REG              253,0     20032  201382954 /usr/lib64/libuuid.so.1.3.0
systemd       1     root  mem       REG              253,0    252704  201609186 /usr/lib64/libblkid.so.1.1.0
systemd       1     root  mem       REG              253,0     90632  201382920 /usr/lib64/libz.so.1.2.7
systemd       1     root  mem       REG              253,0     19888  201524817 /usr/lib64/libattr.so.1.1.0
systemd       1     root  mem       REG              253,0     19520  201328490 /usr/lib64/libdl-2.17.so
systemd       1     root  mem       REG              253,0    153192  201328867 /usr/lib64/liblzma.so.5.0.99
…

 

これをAND検索にするには、「-a」をオプションとして付与すればよい。

[root@test-node ~]# lsof +D /var/ -u root -a
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
auditd     593 root    4w   REG  253,0  2295993 202406271 /var/log/audit/audit.log
rsyslogd   623 root    3w   REG  253,0    27180  68261241 /var/log/cron
rsyslogd   623 root    4w   REG  253,0   969666  68261243 /var/log/messages
rsyslogd   623 root    7w   REG  253,0      653  68261244 /var/log/secure
wpa_suppl  817 root    3w   REG  253,0      240  67818767 /var/log/wpa_supplicant.log
tuned     1201 root    3w   REG  253,0     7501  67128544 /var/log/tuned/tuned.log
master    2870 root  cwd    DIR  253,0     4096  67587672 /var/spool/postfix
master    2870 root   10uW  REG  253,0       33 202183803 /var/spool/postfix/pid/master.pid
master    2870 root   11uW  REG  253,0       33      2017 /var/lib/postfix/master.lock

 

9.数秒ごとに繰り返し実行させる

「-r」オプションを付与することで、数秒ごとにlsofを再実行してくれる。秒数を指定する場合は、「-r秒」というふうに指定するとよい。
(デフォルトでは15秒)

[root@test-node ~]# lsof +D /var/ -u root -a -r1
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
auditd     593 root    4w   REG  253,0  2295993 202406271 /var/log/audit/audit.log
rsyslogd   623 root    3w   REG  253,0    27180  68261241 /var/log/cron
rsyslogd   623 root    4w   REG  253,0   971200  68261243 /var/log/messages
rsyslogd   623 root    7w   REG  253,0      653  68261244 /var/log/secure
wpa_suppl  817 root    3w   REG  253,0      240  67818767 /var/log/wpa_supplicant.log
tuned     1201 root    3w   REG  253,0     7501  67128544 /var/log/tuned/tuned.log
master    2870 root  cwd    DIR  253,0     4096  67587672 /var/spool/postfix
master    2870 root   10uW  REG  253,0       33 202183803 /var/spool/postfix/pid/master.pid
master    2870 root   11uW  REG  253,0       33      2017 /var/lib/postfix/master.lock
=======
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
auditd     593 root    4w   REG  253,0  2295993 202406271 /var/log/audit/audit.log
rsyslogd   623 root    3w   REG  253,0    27180  68261241 /var/log/cron
rsyslogd   623 root    4w   REG  253,0   971200  68261243 /var/log/messages
rsyslogd   623 root    7w   REG  253,0      653  68261244 /var/log/secure
wpa_suppl  817 root    3w   REG  253,0      240  67818767 /var/log/wpa_supplicant.log
tuned     1201 root    3w   REG  253,0     7501  67128544 /var/log/tuned/tuned.log
master    2870 root  cwd    DIR  253,0     4096  67587672 /var/spool/postfix
master    2870 root   10uW  REG  253,0       33 202183803 /var/spool/postfix/pid/master.pid
master    2870 root   11uW  REG  253,0       33      2017 /var/lib/postfix/master.lock
=======
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
auditd     593 root    4w   REG  253,0  2295993 202406271 /var/log/audit/audit.log
rsyslogd   623 root    3w   REG  253,0    27180  68261241 /var/log/cron
rsyslogd   623 root    4w   REG  253,0   971200  68261243 /var/log/messages
rsyslogd   623 root    7w   REG  253,0      653  68261244 /var/log/secure
wpa_suppl  817 root    3w   REG  253,0      240  67818767 /var/log/wpa_supplicant.log
tuned     1201 root    3w   REG  253,0     7501  67128544 /var/log/tuned/tuned.log
master    2870 root  cwd    DIR  253,0     4096  67587672 /var/spool/postfix
master    2870 root   10uW  REG  253,0       33 202183803 /var/spool/postfix/pid/master.pid
master    2870 root   11uW  REG  253,0       33      2017 /var/lib/postfix/master.lock
=======
…

 

Image may be NSFW.
Clik here to view.
インフラ/ネットワークエンジニアのためのネットワーク・デザインパターン
インフラ/ネットワークエンジニアのためのネットワーク・デザインパターン

awkで区切った列をさらに別の文字列で区切る(列を二重に区切る)

awkで、「-F」などで一度特定の文字で区切ったあと、特定の列だけ更に別の文字で区切りたい時がある。
そういった場合、以下のように「split」で対象の列を区切って値を配列に入れてやれば良い。

例)一度目は「,」で、二度目は「|」で文字列を区切る場合

awk -F ',' '{split($2, arr, "|); print $1 arr[2]}' sample.txt
[root@BS-PUB-CENT7-01 ~]# cat /tmp/sample.txt
2016/05/12|00:00:00,ls -la | grep aaa,245
2016/05/12|00:00:02,ls -la | grep bbb,222
2016/05/12|00:00:04,ls -la | grep ccc,112
2016/05/12|00:00:06,ls -la | grep ddd,192
[root@BS-PUB-CENT7-01 ~]# awk -F ',' '{split($2, arr, "|"); print $1","arr[2]}' /tmp/sample.txt
2016/05/12|00:00:00, grep aaa
2016/05/12|00:00:02, grep bbb
2016/05/12|00:00:04, grep ccc
2016/05/12|00:00:06, grep ddd

 

Image may be NSFW.
Clik here to view.
AWK実践入門 (Software Design plus)
AWK実践入門 (Software Design plus)

awkで特定の列を除外して出力する

awkで特定の列を除外して出力させる場合は、以下のように対象となる列を空白にしてやることで対応できる。

●例:2列目を除外して出力させる場合

awk '{$2="";print}' 対象ファイル
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test1.txt
id name prefecture value
1 aaa 1 123
2 bbb 2 544
3 ccc 1 65745
4 ddd 1 122
5 eee 2 222
6 fff 1 444
7 ggg 3 566
8 hhh 4 111
9 iii 3 12
10 bbb 2 1243
11 ddd 1 4423
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test1.txt | awk '{$2="";print}'
id  prefecture value
1  1 123
2  2 544
3  1 65745
4  1 122
5  2 222
6  1 444
7  3 566
8  4 111
9  3 12
10  2 1243
11  1 4423

どうやら複数列の指定をまとめて記述する方法は無いようなので、連続した列(2列目から4列目など)の場合はforで処理させる必要がありそうだ。

●例:2列目と3列目を除外する場合

awk '{for(i=2;i<=3;i++){$i=""};print}' 対象ファイル
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test1.txt
id name prefecture value
1 aaa 1 123
2 bbb 2 544
3 ccc 1 65745
4 ddd 1 122
5 eee 2 222
6 fff 1 444
7 ggg 3 566
8 hhh 4 111
9 iii 3 12
10 bbb 2 1243
11 ddd 1 4423
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test1.txt | awk '{for(i=2;i<=3;i++){$i=""};print}'
id   value
1   123
2   544
3   65745
4   122
5   222
6   444
7   566
8   111
9   12
10   1243
11   4423

 

Image may be NSFW.
Clik here to view.
AWK実践入門 (Software Design plus)
AWK実践入門 (Software Design plus)

BashでTCP/UDP通信を行う

時折、ポートなどの疎通確認のため、相手先のポートがちゃんと開いているかを確認したい時がある。
そんな時は、基本的にポートの疎通確認用のコマンドを利用するのだが、地味にBashからでも疎通確認を行うことができる。

exec 3<> /dev/tcp/相手先ホスト名/ポート番号 # TCP通信の場合
exec 3<> /dev/udp/相手先ホスト名/ポート番号 # UDP通信の場合

準備ができたら、以下のコマンドで対象のポートに通信を行える。

echo -e "メッセージ" >&3
cat <&3
root@BS-PHY-PROX-01:~# exec 3<> /dev/tcp/orebibou.com/80
root@BS-PHY-PROX-01:~# echo -e "GET $2 HTTP/1.0\n\n" >&3
root@BS-PHY-PROX-01:~# cat <&3
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body></html>

 

以上。
なお、もし”テスト用にポートを開きたい”といった場合は、ncコマンドを利用すると良いだろう。

 

Image may be NSFW.
Clik here to view.
イラスト図解式 この一冊で全部わかるネットワークの基本
イラスト図解式 この一冊で全部わかるネットワークの基本

 

Linuxでpasswdコマンドによるパスワード管理

Linuxでパスワード管理する際に利用するコマンドといえば、passwdコマンドだ。
会社の手順書なんかでこのコマンドが出てくる際、だいたいはパスワードを設定したりする際にばかり登場するが、結構いろいろな使い方がある。

1.パスワードの設定をする

必ず一度は実行したことがあるであろう、パスワードの設定。
この使い方は知らない人はいないのではなかろうか。

passwd # 自分自身のパスワードを設定する
passwd <username> # 指定したユーザのパスワードを設定する(rootのみ)
[root@BS-PUB-CENT7-01 ~]# passwd test
ユーザー test のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
[root@BS-PUB-CENT7-01 ~]# su - test
最終ログイン: 2016/05/17 (火) 08:48:56 JST日時 pts/0
[test@BS-PUB-CENT7-01 ~]$ passwd
ユーザー test のパスワードを変更。
test 用にパスワードを変更中
現在の UNIX パスワード:
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。

 

2.ユーザのパスワード設定状態を確認する

管理ユーザは、以下のようにコマンドを実行することで指定したユーザのパスワードの設定状態を確認することができる。

passwd -S ユーザID
[root@BS-PUB-CENT7-01 ~]# passwd -S test
test PS 2016-05-28 0 99999 7 -1 (パスワード設定済み、SHA512 暗号化。)

 

3.パスワードを削除する

管理ユーザは、以下のようにコマンドを実行することで指定したユーザのパスワードを削除することができる。

passwd -d ユーザID
[root@BS-PUB-CENT7-01 ~]# passwd -d test
ユーザー test のパスワードを削除。
passwd: 成功

 

4.パスワードをロックする

管理ユーザは、以下のようにコマンドを実行することで指定したユーザをロックすることができる。

passwd -l ユーザID
[root@BS-PUB-CENT7-01 ~]# passwd -l test
ユーザー test 用のパスワードをロック。
passwd: 成功
[root@BS-PUB-CENT7-01 ~]# passwd -S test
test LK 2016-05-28 0 99999 7 -1 (パスワードはロック済み。)

5.ロックを解除する

管理ユーザは、以下のようにコマンドを実行することで指定したユーザのロックを解除することができる。

passwd -u ユーザID
[root@BS-PUB-CENT7-01 ~]# passwd -S test
test LK 2016-05-28 0 99999 7 -1 (パスワードはロック済み。)
[root@BS-PUB-CENT7-01 ~]# passwd -u test
ユーザー test 用のパスワードをロック解除。
passwd: 成功
[root@BS-PUB-CENT7-01 ~]# passwd -S test
test PS 2016-05-28 0 99999 7 -1 (パスワード設定済み、SHA512 暗号化。)

 

6.パスワードの使用期限を設定する

管理ユーザは、以下のようにコマンドを実行することで指定したユーザのパスワードの試用期間を設定することができる。

passwd -i 日数 ユーザID
[root@BS-PUB-CENT7-01 ~]# passwd -S test
test PS 2016-05-28 0 99999 7 -1 (パスワード設定済み、SHA512 暗号化。)
[root@BS-PUB-CENT7-01 ~]# passwd -i 30 test
ユーザー test のエージングデータを調節。
passwd: 成功
[root@BS-PUB-CENT7-01 ~]# passwd -S test
test PS 2016-05-28 0 99999 7 30 (パスワード設定済み、SHA512 暗号化。)

 

7.パスワードの変更可能までの最小期間を設定する

管理ユーザは、以下のようにコマンドを実行することで指定したユーザがパスワードを変更できるようになるまでの最小期間を設定することができる。

passwd -n 日数 ユーザID
[root@BS-PUB-CENT7-01 ~]# passwd -S test
test PS 2016-05-28 0 99999 7 30 (パスワード設定済み、SHA512 暗号化。)
[root@BS-PUB-CENT7-01 ~]# passwd -n 7 test
ユーザー test のエージングデータを調節。
passwd: 成功
[root@BS-PUB-CENT7-01 ~]# passwd -S test
test PS 2016-05-28 7 99999 7 30 (パスワード設定済み、SHA512 暗号化。)

 

8.パスワード期限が切れる前に警告させる日数を設定する

管理ユーザは、以下のようにコマンドを実行することで指定したユーザのパスワードの有効期限が切れる何日前から警告を表示させるかを設定することができる。

passwd -w 日数 ユーザID
[root@BS-PUB-CENT7-01 ~]# passwd -w 7 test
ユーザー test のエージングデータを調節。
passwd: 成功

 

Image may be NSFW.
Clik here to view.
パスワード解析 完全版
パスワード解析 完全版

ipmitoolコマンドで覚えておきたい使い方8個

物理サーバを管理・運用する際、ベンダーによって呼称は異なると思うが、マネジメントポート(管理ポートとか)は便利に使うことも多いだろう。
ただ、台数が多いといちいちWebコンソールからアクセスしてるのは面倒臭い。コマンドでできる内容ならそちらから作業したほうがいいだろう。

そんなときに非常に役に立つのが、IPMI(システムボードを管理しているBMCという処理装置を操作するための規格)を扱うためのコマンド「ipmitool」コマンドだ。
これがあれば、マネジメントポートで行える操作の大半はコマンドから行える(さすがにリモートKVM機能でWindowsとかのGUI操作は無理だけど)。

今回は、このipmitoolで最低限覚えておきたい使い方を抜粋して記述する(機能が多すぎて全部はちょっと。。。そもそもそんなに機能使わないだろうし)。

1.ローカルの物理サーバへの操作を行う

ローカル(ipmitoolを実行しているOS自身が乗っている物理サーバ)のBMCを操作する場合は、普通にipmitoolをホストやID/PW無しで実行してやれば良い。

ipmitool サブコマンド ...

 

2.リモートの物理サーバへの操作を行う

リモートの物理サーバへ操作を行う(BMCに設定されているIPアドレス等を元に接続して操作する)場合は、対象のホストやIPMI操作用ユーザのID/PWを指定して接続する。

ipmitool -H IPアドレス -U ユーザ名 -P パスワード サブコマンド ...

 

3.電源を操作する

IPMI経由でサーバの電源をON/OFFしたり、起動しているかどうかを確認する場合は、サブコマンド「power」を用いると良いだろう。

電源の状態を確認する

ipmitool -H IPアドレス -U admin -P パスワード power status

電源をONにする

ipmitool -H IPアドレス -U admin -P パスワード power on

電源をOFFにする

ipmitool -H IPアドレス -U admin -P パスワード power off

電源をリセットする

ipmitool -H IPアドレス -U admin -P パスワード power reset

ACPI経由でソフトウェアレベルのシャットダウンを行う

ipmitool -H IPアドレス -U admin -P パスワード power soft

NMIをプロセッサに送信する

ipmitool -H IPアドレス -U admin -P パスワード power diag

1秒間隔を開けて電源オフ、オンを実行する

ipmitool -H IPアドレス -U admin -P パスワード power cycle

 

4.BMCのネットワーク情報の取得・設定

BMCのネットワーク情報を取得したり、IPアドレス等を設定することができる。
個人的には、IPアドレスを設定し忘れたからローカルから設定したり、IPアドレスを忘れたのでローカルから確認したりといった使い方が主だろうか。
channelは環境によって異なるが、だいたい2が使用されていることが多い気がする。

ネットワーク情報を取得する

ipmitool -H IPアドレス -U admin -P パスワード lan print <channel>
[root@BS-PUB-CENT7-01 ~]# ipmitool -H 172.XXX.XXX.XXX -U admin -P XXXXXX lan print 2
Set in Progress         : Set Complete
Auth Type Support       : NONE MD5 PASSWORD
Auth Type Enable        : Callback : NONE MD5 PASSWORD
                        : User     : NONE MD5 PASSWORD
                        : Operator : NONE MD5 PASSWORD
                        : Admin    : NONE MD5 PASSWORD
                        : OEM      : NONE MD5 PASSWORD
IP Address Source       : BIOS Assigned Address
IP Address              : 172.XXX.XXX.XXX
Subnet Mask             : 255.255.255.0
MAC Address             : 00:22:4d:37:78:6b
SNMP Community String   : public
IP Header               : TTL=0x40 Flags=0x40 Precedence=0x00 TOS=0x10
Default Gateway IP      : 172.XXX.XXX.1
802.1q VLAN ID          : Disabled
802.1q VLAN Priority    : 0
RMCP+ Cipher Suites     : 0,1,2,3
Cipher Suite Priv Max   : OOOOXXXXXXXXXXX
                        :     X=Cipher Suite Unused
                        :     c=CALLBACK
                        :     u=USER
                        :     o=OPERATOR
                        :     a=ADMIN
                        :     O=OEM

ネットワーク情報を設定する(DHCP)

ipmitool lan set <channel> ipsrc dhcp

ネットワーク情報を設定する(固定IP)

ipmitool lan set <channel> ipsrc static
ipmitool lan set <channel> ipaddr IPアドレス
ipmitool lan set <channel> netmask ネットマスク
ipmitool lan set <channel> defgw ipaddr デフォルトゲートウェイ

5.各種センサーの情報を取得する

IPMIでは、各種センサー(ファンや各コンポーネントの温度など)の情報を取得することもできる。

各種センサー情報を一覧で取得する

ipmitool -H IPアドレス -U admin -P パスワード sdr list
[root@BS-PUB-CENT7-01 ~]# ipmitool -H 172.XXX.XXX.XXX -U admin -P XXXXXX sdr list
Ambient          | 24.50 degrees C   | ok
Systemboard 1    | 31 degrees C      | ok
Systemboard 2    | 31 degrees C      | ok
Systemboard 3    | 44 degrees C      | ok
CPU              | no reading        | ns
DIMM-1A          | no reading        | ns
DIMM-2A          | no reading        | ns
DIMM-1B          | no reading        | ns
DIMM-2B          | no reading        | ns
Temp1 PSU        | no reading        | ns
Temp2 PSU        | no reading        | ns
Temp3 PSU        | no reading        | ns
BATT 3.0V        | no reading        | ns
STBY 5V          | 4.95 Volts        | ok
iRMC 3.3V STBY   | 3.30 Volts        | ok
iRMC 1.2V STBY   | 1.19 Volts        | ok
LAN 1.05V STBY   | 1.07 Volts        | ok
MAIN 12V         | no reading        | ns
MAIN 5V          | no reading        | ns
MAIN 3.3V        | no reading        | ns
PCH 1.05V        | no reading        | ns
MEM 1.5V         | no reading        | ns
SFR 1.8V         | no reading        | ns
FAN1 SYS         | no reading        | ns
FAN2 SYS         | no reading        | ns
FAN3 SYS         | no reading        | ns
FAN4 SYS         | no reading        | ns
FAN5 SYS         | no reading        | ns
FAN1 PSU         | no reading        | ns
FAN2 PSU         | no reading        | ns
Total Power      | 13.20 Watts       | ok
I2C1 error ratio | 0 percent         | ok
I2C2 error ratio | 0 percent         | ok
I2C3 error ratio | 0 percent         | ok
I2C4 error ratio | 0 percent         | ok
I2C5 error ratio | 0 percent         | ok
I2C6 error ratio | 0 percent         | ok
SEL Level        | 0 percent         | ok
Ambient          | 0x01              | ok
CPU              | 0x00              | ok
DIMM-1A          | 0x00              | ok
DIMM-1A          | 0x00              | ok
DIMM-2A          | 0x00              | ok
DIMM-2A          | 0x00              | ok
DIMM-1B          | 0x00              | ok
DIMM-1B          | 0x00              | ok
DIMM-2B          | 0x00              | ok
DIMM-2B          | 0x00              | ok
PSU              | Not Readable      | ns
PSU              | 0x02              | ok
Power Level      | 0x03              | ok
FAN1 SYS         | Not Readable      | ns
FAN2 SYS         | Not Readable      | ns
FAN3 SYS         | Not Readable      | ns
FAN4 SYS         | Not Readable      | ns
FAN5 SYS         | Not Readable      | ns
FAN1 PSU         | Not Readable      | ns
FAN2 PSU         | Not Readable      | ns
Watchdog         | 0x00              | ok
CPU detection    | 0x01              | ok
iRMC request     | 0x00              | ok
I2C1             | 0x00              | ok
I2C2             | 0x00              | ok
I2C3             | 0x00              | ok
I2C4             | 0x00              | ok
I2C5             | 0x00              | ok
I2C6             | 0x00              | ok
Config backup    | 0x00              | ok
Power Level      | 0x03              | ok
Total Power      | 0x00              | ok
System Mgmt SW   | Not Readable      | ns
Local Monitor    | 0x01              | ok
Pwr Btn override | 0x00              | ok
NMI              | 0x00              | ok
System BIOS      | Not Readable      | ns
iRMC             | Not Readable      | ns

温度やCPUのセンサー情報など、タイプを指定して値を取得する

ipmitool -H IPアドレス -U admin -P パスワード sdr type 'タイプ名'
[root@BS-PUB-CENT7-01 ~]# ipmitool -H 172.XXX.XXX.XXX -U admin -P XXXXXX sdr type
Sensor Types:
        Temperature               (0x01)   Voltage                   (0x02)
        Current                   (0x03)   Fan                       (0x04)
        Physical Security         (0x05)   Platform Security         (0x06)
        Processor                 (0x07)   Power Supply              (0x08)
        Power Unit                (0x09)   Cooling Device            (0x0a)
        Other                     (0x0b)   Memory                    (0x0c)
        Drive Slot / Bay          (0x0d)   POST Memory Resize        (0x0e)
        System Firmwares          (0x0f)   Event Logging Disabled    (0x10)
        Watchdog1                 (0x11)   System Event              (0x12)
        Critical Interrupt        (0x13)   Button                    (0x14)
        Module / Board            (0x15)   Microcontroller           (0x16)
        Add-in Card               (0x17)   Chassis                   (0x18)
        Chip Set                  (0x19)   Other FRU                 (0x1a)
        Cable / Interconnect      (0x1b)   Terminator                (0x1c)
        System Boot Initiated     (0x1d)   Boot Error                (0x1e)
        OS Boot                   (0x1f)   OS Critical Stop          (0x20)
        Slot / Connector          (0x21)   System ACPI Power State   (0x22)
        Watchdog2                 (0x23)   Platform Alert            (0x24)
        Entity Presence           (0x25)   Monitor ASIC              (0x26)
        LAN                       (0x27)   Management Subsys Health  (0x28)
        Battery                   (0x29)   Session Audit             (0x2a)
        Version Change            (0x2b)   FRU State                 (0x2c)
[root@BS-PUB-CENT7-01 ~]# ipmitool -H 172.XXX.XXX.XXX -U admin -P XXXXXX sdr type Processor
CPU              | 28h | ok  |  3.0 | Presence detected
[root@BS-PUB-CENT7-01 ~]# ipmitool -H 172.XXX.XXX.XXX -U admin -P XXXXXX sdr type Temperature
Ambient          | 01h | ok  | 39.0 | 24.50 degrees C
Systemboard 1    | 02h | ok  |  7.0 | 32 degrees C
Systemboard 2    | 03h | ok  |  7.1 | 31 degrees C
Systemboard 3    | 04h | ok  |  7.2 | 44 degrees C
CPU              | 05h | ns  |  3.0 | No Reading
DIMM-1A          | 06h | ns  | 32.0 | No Reading
DIMM-2A          | 07h | ns  | 32.1 | No Reading
DIMM-1B          | 08h | ns  | 32.2 | No Reading
DIMM-2B          | 09h | ns  | 32.3 | No Reading
Temp1 PSU        | 0Ah | ns  | 10.0 | No Reading
Temp2 PSU        | 0Bh | ns  | 10.1 | No Reading
Temp3 PSU        | 0Ch | ns  | 10.2 | No Reading
Ambient          | 27h | ok  | 39.0 | Device Present

 

6.各種ハードウェアの情報取得・操作をする

ipmitoolでは、ハードウェアベンダーの情報やメンテナンスLEDライトの点灯・消灯など、各種ハードウェアの情報を取得したり操作を行うことも可能となっている。
システムボードのシリアルナンバーなども取得できるので、Kickstartなどを利用したOSの自動インストール時において固定IPアドレスを割り振ったりする際に役に立つだろう。

シリアルナンバーや筐体のモデル名、ベンダーなどのハードウェア情報を取得する

ipmitool -H IPアドレス -U admin -P パスワード fru print
[root@BS-PUB-CENT7-01 ~]# ipmitool -H 172.XXX.XXX.XXX -U admin -P XXXXXX fru print
FRU Device Description : Builtin FRU Device (ID 0)
 Device not present (Requested sensor, data, or record not found)

FRU Device Description : Chassis (ID 2)
 Chassis Type          : Rack Mount Chassis
 Chassis Part Number   : 340781700003
 Chassis Serial        : SM024S14817
 Chassis Extra         : RX100S6R2
 Product Manufacturer  : FUJITSU
 Product Name          : PRIMERGY RX100 S6
 Product Part Number   : S26361-K1264-Vxxx
 Product Version       : GS05
 Product Serial        : MA1A004737
 Product Asset Tag     : 15
 Product Extra         : 56fc73
 Product Extra         : 0245

FRU Device Description : MainBoard (ID 3)
 Board Mfg Date        : Fri Jun 11 01:42:00 2010
 Board Mfg             : FUJITSU
 Board Product         : D2863
 Board Serial          : RM2E-P02BD4
 Board Part Number     : S26361-D2863-A10
 Board Extra           : WGS01 GS04
 Board Extra           : 02

FRU Device Description : PSU (ID 5)
 Board Mfg Date        : Wed Apr  7 18:42:00 2010
 Board Mfg             : DELTA
 Board Product         : DPS-350YB A
 Board Serial          : CLUD1014012688
 Board Part Number     : A3C40102750
 Board Extra           : 01F
 Board Extra           : 08

FRU Device Description : HDD-BP (ID 7)
 Device not present (Command response could not be provided)

現在のシステム状態(Power ON/OFFなど)を一括で取得する

ipmitool -H IPアドレス -U admin -P パスワード chassis status
[root@BS-PUB-CENT7-01 ~]# ipmitool -H 172.XXX.XXX.XXX -U admin -P XXXXXX chassis status
System Power         : off
Power Overload       : false
Power Interlock      : inactive
Main Power Fault     : false
Power Control Fault  : false
Power Restore Policy : previous
Last Power Event     :
Chassis Intrusion    : inactive
Front-Panel Lockout  : inactive
Drive Fault          : false
Cooling/Fan Fault    : false
Sleep Button Disable : allowed
Diag Button Disable  : allowed
Reset Button Disable : allowed
Power Button Disable : allowed
Sleep Button Disabled: false
Diag Button Disabled : false
Reset Button Disabled: false
Power Button Disabled: false

通電時間を取得する

ipmitool -H IPアドレス -U admin -P パスワード chassis poh
[root@BS-PUB-CENT7-01 ~]# ipmitool -H 172.20.100.17 -U admin -P admin chassis poh
POH Counter  : 1095 days, 1 hours, 40 minutes

識別用LEDライトを指定した秒数だけ点灯させる

ipmitool -H IPアドレス -U admin -P パスワード chassis identify <秒数(デフォルトは15秒)>

前回サーバが再起動された原因を確認する

ipmitool -H IPアドレス -U admin -P パスワード chassis restart_cause
[root@BS-PUB-CENT7-01 ~]# ipmitool -H 172.XXX.XXX.XXX -U admin -P XXXXXX chassis restart_cause
System restart cause: chassis power control command

通電が行われた際(停電から復旧した際)の電源ポリシーを設定する

ipmitool -H IPアドレス -U admin -P パスワード chassis policy <ポリシー>

設定できるポリシーは以下

  • always-on :電源復旧したら常に起動する
  • previous :電源復旧したら停電前の状態に戻す
  • always-off :電源復旧しても起動しない

次回再起動時のブートデバイスを指定する

ipmitool -H IPアドレス -U admin -P パスワード chassis bootdev <デバイス>
[root@BS-PUB-CENT7-01 ~]# ipmitool -H 172.XXX.XXX.XXX -U admin -P XXXXXX chassis bootdev
bootdev  [clear-cmos=yes|no]
bootdev  [options=help,...]
  none  : Do not change boot device order
  pxe   : Force PXE boot
  disk  : Force boot from default Hard-drive
  safe  : Force boot from default Hard-drive, request Safe Mode
  diag  : Force boot from Diagnostic Partition
  cdrom : Force boot from CD/DVD
  bios  : Force boot into BIOS Setup
  floppy: Force boot from Floppy/primary removable media

 

7.SOL(Serial Over LAN)を使ってシリアル接続を行う

SOL(Serial Over LAN)を使ってシリアル接続を行うことで、コンソールからBIOSの設定やシリアル接続対応しているOSの操作を行うことができる。

ipmitool -I lanplus -H IPアドレス -U admin -P パスワード sol activate

Image may be NSFW.
Clik here to view.
20160530_072424000000

 

8.ユーザを管理する

IPMIで利用するユーザを追加・削除したり、パスワードを変更したりする。

ユーザ一覧を取得する

ipmitool -I lanplus -H IPアドレス -U admin -P パスワード user list

ユーザ情報を取得する

ipmitool -I lanplus -H IPアドレス -U admin -P パスワード user summary

ユーザのパスワードを設定する

ipmitool -I lanplus -H IPアドレス -U admin -P パスワード user set password <ユーザID> [<パスワード>]

 

Image may be NSFW.
Clik here to view.
Supermicro IPMI 2.0 card / AOC
Supermicro IPMI 2.0 card / AOC

Linuxコンソール上で特定の文字数で行を区切る

テスト用にランダムなデータを作る際、行を特定の文字数で区切りたいことがあったので検索用の備忘として残しておく。
といっても大した処理ではなく、sedで以下のように置換すればよいだけだ。(「.(ピリオド)」は行を区切る文字数分入力すること。)

sed 's/.../& /g'
[root@BS-PUB-CENT7-01 ~]# cat /dev/urandom | tr -dc 'a-c' | fold -w 15 | head -n 8
caaaaacaaaccbab
bcbccaccbccbbbc
aabcbccbacabcba
cacbcbaabaccaac
ccabcacacacbbcb
aacbbcbaabcbaac
aaaaabcbabbbbac
bbaaaacbbbacbaa
[root@BS-PUB-CENT7-01 ~]# cat /dev/urandom | tr -dc 'a-c' | fold -w 15 | head -n 8 | sed 's/.../& /g'
bca acc ccb bbc cac
bac cbc cca bcc cca
bbc bbc ccb bac aab
bcc aba aba cac bac
cac bca baa bbc bcc
baa cbb cca cac bcc
acc caa ccb aba bcb
bcb aba bbb ccb acb

 

Image may be NSFW.
Clik here to view.
新しいLinuxの教科書
新しいLinuxの教科書
Image may be NSFW.
Clik here to view.
新しいLinuxの教科書
新しいLinuxの教科書

Linuxコンソール上でファイル内の特定のキーワードの数を数える

Linuxコンソール上で特定のキーワード数を数える必要があったので一応備忘として残しておく。
(単純に、grepとwcで数えるだけなんだけど。。。)

単純な話、以下のようなファイルから、キーワード「abc」を数えたいとする。

●/tmp/test4.txt

[root@BS-PUB-CENT7-01 ~]# cat /tmp/test4.txt
bbc cca ccb cca cbc aaa cab cca abc bcc
aaa cca bbb abb cbb abc bcc bab cbc aaa
aaa cbc ccc bba bba abc cbc baa cbc cca
abc caa aba aba aac bca bcc aba bca baa
abb ccc cab cac bba ccb aba aba bca abc
aac bbc bbc bab bcc aba abc cbb cac abc
cba bab ccc aba aaa bcc bab ccb cac abc
bbb bbb cab abc aaa abc bbc bcc cbc cbc
bba abb cca bba aba abc cac acb ccb acc
cbc aba baa bba acc aac abb cca abc acb
abc bbc cab bbc cbb cca acc cca ccc aca
baa bbb cba aac abc cca aac acc bcb cbb
cbc acc bcc aba abc bab abc bac ccb baa
bba aac cab bab aaa abc aba cab bcb bcc
abc bba ccb bcc abb aba baa cac aac bbc
bcb abb bbb bba abc bcc aab bbb cac bca
bbb abb cab cab aab caa cac bbb aca abc
abb cbb aba cac bac aca bab bac abc abb

同じ行に複数「abc」があるので、「grep -c」では数えられないなぁ、という状態。
なので、一度「grep -o」で「abc」ごとに行を分けてしまって、それをwcで数えればいい。

grep -o 'キーワード' /ファイルPATH | wc -l
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test4.txt
bbc cca ccb cca cbc aaa cab cca abc bcc
aaa cca bbb abb cbb abc bcc bab cbc aaa
aaa cbc ccc bba bba abc cbc baa cbc cca
abc caa aba aba aac bca bcc aba bca baa
abb ccc cab cac bba ccb aba aba bca abc
aac bbc bbc bab bcc aba abc cbb cac abc
cba bab ccc aba aaa bcc bab ccb cac abc
bbb bbb cab abc aaa abc bbc bcc cbc cbc
bba abb cca bba aba abc cac acb ccb acc
cbc aba baa bba acc aac abb cca abc acb
abc bbc cab bbc cbb cca acc cca ccc aca
baa bbb cba aac abc cca aac acc bcb cbb
cbc acc bcc aba abc bab abc bac ccb baa
bba aac cab bab aaa abc aba cab bcb bcc
abc bba ccb bcc abb aba baa cac aac bbc
bcb abb bbb bba abc bcc aab bbb cac bca
bbb abb cab cab aab caa cac bbb aca abc
abb cbb aba cac bac aca bab bac abc abb
[root@BS-PUB-CENT7-01 ~]# grep -o abc /tmp/test3.txt
abc
abc
abc
abc
abc
abc
abc
abc
abc
abc
abc
abc
abc
abc
abc
abc
abc
abc
abc
abc
abc
[root@BS-PUB-CENT7-01 ~]# grep -o abc /tmp/test3.txt | wc -l
21

 

なお、連続した文字列(例えば、「abc a」とか)が改行をまたいで存在していて、それをカウントしたい場合は一度改行を置換して、同様の処理を行えば良い。

[root@BS-PUB-CENT7-01 ~]# cat /tmp/test4.txt | tr -d '\n'
bbc cca ccb cca cbc aaa cab cca abc bccaaa cca bbb abb cbb abc bcc bab cbc aaaaaa cbc ccc bba bba abc cbc baa cbc ccaabc caa aba aba aac bca bcc aba bca baaabb ccc cab cac bba ccb aba aba bca abcaac bbc bbc bab bcc aba abc cbb cac abccba bab ccc aba aaa bcc bab ccb cac abcbbb bbb cab abc aaa abc bbc bcc cbc cbcbba abb cca bba aba abc cac acb ccb acccbc aba baa bba acc aac abb cca abc acbabc bbc cab bbc cbb cca acc cca ccc acabaa bbb cba aac abc cca aac acc bcb cbbcbc acc bcc aba abc bab abc bac ccb baabba aac cab bab aaa abc aba cab bcb bccabc bba ccb bcc abb aba baa cac aac bbcbcb abb bbb bba abc bcc aab bbb cac bcabbb abb cab cab aab caa cac bbb aca abcabb cbb aba cac bac aca bab bac abc abb
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test4.txt | tr -d '\n' | grep -o 'abc a'
abc a
abc a
abc a
abc a
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test4.txt | tr -d '\n' | grep -o 'abc a' | wc -l
4

 

Image may be NSFW.
Clik here to view.
動くメカニズムを図解&実験! Linux超入門 (My Linuxシリーズ)
動くメカニズムを図解&実験! Linux超入門 (My Linuxシリーズ)

awkで他のコマンドの実行結果に一行ごとにタイムスタンプを付与する

個人的によく利用するので、備忘として残しておく。
pingやvmstatなどでコマンドを定期実行した際に、いつ・どのような結果になったのか残しておきたいのに、タイムスタンプを残す機能がコマンドに備わってない場合に有効だ。

やり方は簡単で、以下のように対象のコマンドとawkをパイプでつなぐだけだ。

コマンド | awk '{print strftime("%F %T ") $0}'

Image may be NSFW.
Clik here to view.
20160601_084730000000

[root@BS-PUB-CENT7-01 ~]# ping 8.8.8.8 | awk '{print strftime("%F %T ") $0}'
2016-06-01 08:47:02 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
2016-06-01 08:47:02 64 bytes from 8.8.8.8: icmp_seq=1 ttl=53 time=4.34 ms
2016-06-01 08:47:03 64 bytes from 8.8.8.8: icmp_seq=2 ttl=53 time=4.60 ms
2016-06-01 08:47:04 64 bytes from 8.8.8.8: icmp_seq=3 ttl=53 time=4.67 ms
2016-06-01 08:47:05 64 bytes from 8.8.8.8: icmp_seq=4 ttl=53 time=4.43 ms
2016-06-01 08:47:06 64 bytes from 8.8.8.8: icmp_seq=5 ttl=53 time=4.74 ms
2016-06-01 08:47:07 64 bytes from 8.8.8.8: icmp_seq=6 ttl=53 time=4.54 ms
2016-06-01 08:47:08 64 bytes from 8.8.8.8: icmp_seq=7 ttl=53 time=4.74 ms
2016-06-01 08:47:09 64 bytes from 8.8.8.8: icmp_seq=8 ttl=53 time=4.31 ms
2016-06-01 08:47:10 64 bytes from 8.8.8.8: icmp_seq=9 ttl=53 time=4.24 ms

 

Image may be NSFW.
Clik here to view.
AWK実践入門 (Software Design plus)
AWK実践入門 (Software Design plus)
Image may be NSFW.
Clik here to view.
AWK実践入門 (Software Design plus)
AWK実践入門 (Software Design plus)

awkで重複行を排除してユニークな行をもとめる

awkだけで、「sort | uniq」をせずに重複した行をまとめることができるので、備忘として残しておく。
awkでは、以下のようにコマンドを実行することで、重複行を表示させないことが可能だ。

コマンド | awk '!a[$1]++'
[centos@test-centos7 ~]$ cat /tmp/test2.txt | sort | uniq
aaa
aab
aac
aba
abb
abc
aca
acb
acc
baa
bab
bac
bba
bbb
bbc
bca
bcb
bcc
caa
cab
cac
cba
cbb
cbc
cca
ccb
ccc
[centos@test-centos7 ~]$ cat /tmp/test2.txt | sort | uniq | wc -l
27
[centos@test-centos7 ~]$ cat /tmp/test2.txt | awk '!a[$1]++'
aba
abc
bbc
acc
aca
cbb
cbc
abb
ccb
bbb
cca
baa
aac
aaa
bca
aab
bcc
cba
acb
bba
cab
caa
bab
ccc
bcb
cac
bac
[centos@test-centos7 ~]$ cat /tmp/test2.txt | awk '!a[$1]++' | wc -l
27

 

普通に使うなら「sort | uniq」でやるだろうけど、まぁもしかしたら使うこともあるかも?

Image may be NSFW.
Clik here to view.
AWK実践入門 (Software Design plus)
AWK実践入門 (Software Design plus)

Linuxコンソール上でファイルの行と列を入れ替える

Linuxコンソール上で、Excelのように行と列を入れ替えたい時がある。
そんなときは、以下のようにawkなどを使うことで実現可能だ。

1.awkを使う

まずはawkを使う場合。
以下のようにすることで、行と列の入れ替えが可能だ。

awk '
{ for (i=1; i<=NF; i++)  { a[NR,i] = $i } } NF>p { p = NF }
END {
    for(j=1; j<=p; j++) { str=a[1,j]; for(i=2; i<=NR; i++){ str=str" "a[i,j]; }
        print str
    }
}' 対象ファイルPATH
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test1_1.txt
id      name    prefecture      value
1       aaa     1       123
2       bbb     2       544
3       ccc     1       65745
4       ddd     1       122
5       eee     2       222
6       fff     1       444
7       ggg     3       566
8       hhh     4       111
9       iii     3       12
10      bbb     2       1243
11      ddd     1       4423
[root@BS-PUB-CENT7-01 ~]# awk '
> { for (i=1; i<=NF; i++)  { a[NR,i] = $i } } > NF>p { p = NF }
> END {
>     for(j=1; j<=p; j++) { str=a[1,j]; for(i=2; i<=NR; i++){ str=str" "a[i,j]; } >         print str
>     }
> }' /tmp/test1_1.txt
id 1 2 3 4 5 6 7 8 9 10 11
name aaa bbb ccc ddd eee fff ggg hhh iii bbb ddd
prefecture 1 2 1 1 2 1 3 4 3 2 1
value 123 544 65745 122 222 444 566 111 12 1243 4423

 

2.perlを使う

perlのワンライナーで入れ替えを行うこともできる。

cat ファイルPATH | perl -anF'\t|\n' -e'$n=@F-1if!$n;for(0..$n){push@{$$m[$_]},$F[$_]}''END{print map{join"\t",@$_,"\n"}@$m}'
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test1_1.txt | perl -anF'\t|\n' -e'$n=@F-1if!$n;for(0..$n){push@{$$m[$_]},$F[$_]}''END{print map{join"\t",@$_,"\n"}@$m}'
id      1       2       3       4       5       6       7       8       9       10      11
name    aaa     bbb     ccc     ddd     eee     fff     ggg     hhh     iii     bbb     ddd
prefecture      1       2       1       1       2       1       3       4       3       2      1
value   123     544     65745   122     222     444     566     111     12      1243    4423

3.pythonを使う

pythonのワンライナーでも、行と列の入れ替えが行える。

cat ファイルPATH | python -c "import sys; print('\n'.join(' '.join(c) for c in zip(*(l.split() for l in sys.stdin.readlines() if l.strip()))))"
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test1_1.txt | python -c "import sys; print('\n'.join(' '.join(c) for c in zip(*(l.split() for l in sys.stdin.readlines() if l.strip()))))"
id 1 2 3 4 5 6 7 8 9 10 11
name aaa bbb ccc ddd eee fff ggg hhh iii bbb ddd
prefecture 1 2 1 1 2 1 3 4 3 2 1
value 123 544 65745 122 222 444 566 111 12 1243 4423

 

4.rubyを使う

rubyのワンライナーでも、表の行列入れ替えを行える。

cat /tmp/test1_1.txt | ruby -e'puts readlines.map(&:split).transpose.map{|x|x*" "}'
[root@BS-PUB-CENT7-01 src]# cat /tmp/test1_1.txt | ruby -e'puts readlines.map(&:split).transpose.map{|x|x*" "}'
id 1 2 3 4 5 6 7 8 9 10 11
name aaa bbb ccc ddd eee fff ggg hhh iii bbb ddd
prefecture 1 2 1 1 2 1 3 4 3 2 1
value 123 544 65745 122 222 444 566 111 12 1243 4423

 

5.datamashコマンドを使う

以前紹介したdatamashコマンドを使うことで、表の行列入れ替えが簡単に行える。
なお、区切り文字がデフォルトではタブになってる点は注意が必要。

datamash transpose < ファイルPATH
[root@BS-PUB-CENT7-01 ~]# cat /tmp/test1_1.txt | datamash transpose
id      1       2       3       4       5       6       7       8       9       10      11
name    aaa     bbb     ccc     ddd     eee     fff     ggg     hhh     iii     bbb     ddd
prefecture      1       2       1       1       2       1       3       4       3       2      1
value   123     544     65745   122     222     444     566     111     12      1243    4423

 

6.transposeコマンドを使う

transposeというコマンドを使うことでも、表の行列入れ替えを行える。
まず以下のコマンドでまずインストールをする。

wget http://downloads.sourceforge.net/project/transpose/transpose/transpose-2.0/2.0/transpose-2.0.zip
unzip transpose-2.0.zip
cd transpose-2.0/src
gcc transpose.c -o /usr/bin/transpose

 

で、行列の反転は以下。

transpose -t ファイルPATH
[root@BS-PUB-CENT7-01 src]# transpose -t /tmp/test1_1.txt
id      1       2       3       4       5       6       7       8       9       10      11
name    aaa     bbb     ccc     ddd     eee     fff     ggg     hhh     iii     bbb     ddd
prefecture      1       2       1       1       2       1       3       4       3       2      1
value   123     544     65745   122     222     444     566     111     12      1243    4423

 

いくつか方法はあるので、環境や状況に合わせて使い分けていきたい。

 

Image may be NSFW.
Clik here to view.
動くメカニズムを図解&実験! Linux超入門 (My Linuxシリーズ)
動くメカニズムを図解&実験! Linux超入門 (My Linuxシリーズ)

Linuxコンソール上でランダムなテキストデータを作成する

Linuxコンソール上でランダムなテキストデータを作成する場合、「/dev/random」を読みこませると良いだろう。
以下のようにコマンドを実行することで、各行が指定した文字数でランダムな文字列を生成させることができる。

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w <文字数> | head -<行数>
blacknon@BS-PUB-UBUNTU-01:~$ cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 20 | head -10
ZbCHUnpLykIrgc6dYmO1
QgUgrCYkfi9Blb0u0jO1
roiCw0cos1HEZuDUspby
kgdHqoEKmel4GUU50IDm
b27W6KN21mktPcMgSGEv
4pF8SZvylK33BGtmmyGd
5ASldEH7X4YvGqsqOBCv
WIoIwvOiW82ZN0UZZzbr
jYI3Otbt2h6jrf3ZxjdA
5u3eDAJwnOFOlEiEQvex
blacknon@BS-PUB-UBUNTU-01:~$ cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 20 | head -10
zT88WiuiSmDHEcUtEPz3
Oly72Kl988CDuxMxnnXt
HPrkXuSv6cesPhLLzvMn
U44ePkhydiZIbYNtEIQp
rizxqiqrWGc6A7N6FzDy
0imdFV2qIBqO80rXtZaV
uukWvYer209Z39EE4Mb0
bhWTZ9vGM6jBP6rqvN4h
UE7JFtQws5ky99KWzoxC
LyrKTIjTpa1nmJvtq3fQ

 

もし数字無しで出力させたい場合は、以下のように「a-zA-Z」を指定すればよいだろう。

cat /dev/urandom | tr -dc 'a-zA-Z' | fold -w <文字数> | head -<行数>
blacknon@BS-PUB-UBUNTU-01:~$ cat /dev/urandom | tr -dc 'a-zA-Z' | fold -w 30 | head -10
ezlWZjewfWmKGEiAjDyYeZnXqzELKo
EfXjgxkoJMGRFtJDFOKSaTqHbBYyeY
qBamVSMPXhlHELkhLhJvzhgoNYINPd
ujOqjtzsgRulPDOaLoHwyGaZdDySYi
tFKtyjJlxMjeGclBvBWjgbIJQfuhvN
chpyFyCtzuIOSzOMiFWkWBhDVkKZkj
QkgEonqYcpVSBPwqeLUZKngUTMuukm
qlCKNnAjFiwHXufqzAFQZwBLWkAFYd
lsySQGwJFvLXXSjPvZObiqookkrRRv
hBtETEOhqZrYsImBGhrKkHSyADLtEe
blacknon@BS-PUB-UBUNTU-01:~$ cat /dev/urandom | tr -dc 'a-zA-Z' | fold -w 30 | head -10
pYnbNkyNsGPMvZgIUnwTLzJyuZFjYM
zNdPWnfwufKRMICcqQmqWfTLDbKRfp
PdtBrFbCpzcaliOruQolSQgTBfOykO
xepHVwUCBESLkTMfqqaszxYaSjuQXT
PVSCveSKHhosnXEaKdCTetruziNcBQ
TLNfruOPiSvLgayMijfGLuRFtWaqZU
AaLBKUUboQSKQQmnvUJgIInORwTFCD
awEOpiQCuIRczuzNTsgwMZdKZqbCoc
ezveTFSazWMckVIfMiSRinPygYdFRq
YBItqqigIPIVbHsZRAckORqMGWXNPX

CSVのようなデータをサンプルとして作成したい場合は、ちょっと強引だけどもpasteコマンドと組み合わせることで作成できるだろう。
例えばID,ユーザ名,パスワードといったサンプルCSVを作成する場合なら、ユーザ名の元となるリストさえあればランダムでそれを読み込ませ、パスワードはこの方法で作成させればいい。

blacknon@BS-PUB-UBUNTU-01:~$ paste -d, <(echo {1..10000}| sed 's/ /\n/g') <(shuf -n 10 /tmp/name.list) <(cat /dev/urandom | tr -dc '[:alnum:]' | fold -w 20) | head -10
1,Teressa Laub,VXRizatB1eRgCoJJixbD
2,Edith Klaus,wrK8NEx6rDPQvAEA3iJQ
3,Vi Fogle,vSqKOuDdusbNK8MmLKFb
4,Brett Kirkley,Bns5UWOJdG0SqsA7BbJI
5,Irina Tai,8XUV0CMAnTVMUU91zdju
6,Eddy Spade,EtrJCs52vljRxjnF2svI
7,Ronni Doney,tFaIo3sGYQ4fuuXSlrSf
8,Thao Curnutt,VgnUuAVDamFrQpAqaqPI
9,Sean Hagler,ZqUChvxcMIV7Xl2sjZjC
10,Milissa Wile,XZ3IGU0GXeJWhnkJo8xq
blacknon@BS-PUB-UBUNTU-01:~$ paste -d, <(echo {1..10000}| sed 's/ /\n/g') <(shuf -n 10 /tmp/name.list) <(cat /dev/urandom | tr -dc '[:alnum:]' | fold -w 20) | head -10
1,Josue Laskey,IEEoXUuNfDTZiRsYVCsa
2,Tana Pratt,QyabqgchqE4XuxVhbe09
3,Rosario Dixion,2Q2pgTW8nHfEK0s2uBE9
4,Gretta Ellingson,eZByXjVBCu5htYJCkgKb
5,Pearlene Coyne,Nr8jEvlfGE1NaqbB9pbV
6,Rosemary Luque,NXDz04BqWBpkrYghaQDY
7,Yer Staudt,49wcuZq9BebEpwEGDA9f
8,Keisha Green,GoPwUC7FNO1RQy1CkLKP
9,Joelle Kotek,CeNl06RPt4OgmMP6v2ff
10,Teressa Laub,fvKzXy3hrU2OQU6EUCcH

 

Image may be NSFW.
Clik here to view.
Unreal Engine 4で極めるゲーム開発:サンプルデータと動画で学ぶUE4ゲーム制作プロジェクト
Unreal Engine 4で極めるゲーム開発:サンプルデータと動画で学ぶUE4ゲーム制作プロジェクト
Viewing all 99 articles
Browse latest View live