続いて、netstatコマンドを使ってこれらのPID番号をネットワークソケットに関連づける。次のようにnetstatに-pオプションを指定すると、各ソケットが属するプログラムのPIDと名前が表示される。
netstat -p | grep 16258
tcp 0 0 192.168.100.250:netbios-ssn 192.168.100.32:1028 ESTABLISHED 16258/smbd
4番目のカラム(192.168.100.250:netbios-ssn)はサーバマシンを、5番目のカラム(168.100.32:1028)はクライアントマシンのIPアドレスおよびポート番号を示している。ここで必要なのは5番目のカラムの方である。
今度は、PIDをtmpファイルに記録する処理をすべて1つのスクリプトにまとめてみよう。
lsof | grep /usr/apps/payroll | gawk '{ print $2 }' | uniq > tmp
echo "PCs USING THE APPLICATION:"
while read row ; do
netstat -p | grep $row | gawk '{ print $5 }' | cut -d":" -f1
done < tmp
netstat -p | grep $row | gawk '{ print $5 }' | cut -d":" -f1という行は、まずnetstatを実行してから$rowに対するgrepを呼び出す。この変数$rowには、tmpファイルのそれぞれの行が順に入る。続いてgawkで5番目のカラムを抜き出した後、cutでデリミタ":"を除いた上でIPアドレスに当たる最初のフィールドを取り出す。
このスクリプトに名前をつけたら、chmod 700 script.shによって実行ファイルにする。スクリプトの実行結果は、次のようになるはずだ。
./script.sh
PCs USING THE APPLICATION
192.168.100.32
192.168.100.78
後はIPアドレスとユーザー名の関連づけを行うだけでよい。そのために、以下のような行を/etc/hostsに追記する。
192.168.100.32 Lindsay_Hayek
192.168.100.78 Salma_Lohan
192.168.100.145 Tom_Norton
192.168.100.193 Edward_Cruise
また、この/etc/hostsを参照するためのgrepを、先ほどのスクリプトのnetstatの行に加えて次のようにする。
grep `netstat -p | grep $row | gawk '{ print $5 }' | cut -d":" -f1` /etc/hosts
しかしこのままでは、/etc/hostsに記されていないIPアドレスが見つかった場合、このスクリプトはエラーを返し、単純にそのIPアドレスを表示してはくれない。この問題はif文を使えば解決できる。前記の命令が正しいものであれば(変数$?に0が返される)、スクリプトはtmpファイルの次の行に進む。しかし、0以外の値が返された場合は該当するIPアドレスが/etc/hostsに見つからなかったということなので、単純にそのIPアドレスを表示するようになっている。後でネットワーク管理者に訊けば、そのIPアドレスが誰のものか分かるかもしれない。ここで、最終的なスクリプトを以下に示す。
lsof | grep /usr/apps/payroll | gawk '{ print $2 }' | uniq > tmp
echo "PCs USING THE APPLICATION:"
while read row ; do
grep `netstat -p | grep $row | gawk '{ print $5 }' | cut -d":" -f1` /etc/hosts
if [ $? -ne 0 ]; then
netstat -p | grep $row | gawk '{ print $5 }' | cut -d":" -f1
end if
done < tmp
実行すると、次のような結果が得られる。
./script.sh
PCs USING THE APPLICATION
192.168.100.32 Lindsay_Hayek
192.168.100.78 Salma_Lohan
192.168.100.90
このスクリプトはさらに拡張することもできる。例えば、lsof | grep /usr/apps/payroll | gawk '{ print $2 }' | uniq > tmpの行でpayrollと指定してしまうと対象とするアプリケーションが変わるたびにその部分を編集しなければならなくなるので、次のようにするとよい。
lsof | grep /usr/apps/$1 | gawk '{ print $2 }' | uniq > tmp
echo "PCs USING THE APPLICATION: $1"
ここで$1はコマンドラインから渡す引数であり、次のようにして指定する。
./script.sh accounting
PCs USING THE APPLICATION accounting
192.168.100.145 Tom_Norton
192.168.100.178
192.168.100.193 Edward_Cruise
また、アプリケーションのメニューを作成したり、Zenityを使ってXウインドウ環境での対話型スクリプトにしたりすることも可能だろう。
Sergio Gonzalez DuranはLinux管理者やシステム開発者、またネットワークセキュリティのカウンセラーとして活動しながら、各種Linux講座での指導や、 Linuxおよびオープンハウス関連のスペイン語WebサイトLinuxtotal.com.mxの公開も手掛けている。
Copyright © 2010 OSDN Corporation, All Rights Reserved.