Samba共有ファイルを使用中のマシンが分かるスクリプトLeverage OSS(2/2 ページ)

» 2007年10月15日 10時52分 公開
[Sergio-Gonzalez-Duran,Open Tech Press]
SourceForge.JP Magazine
前のページへ 1|2       

 続いて、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の公開も手掛けている。


関連キーワード

Leverage OSS | Samba | コマンドライン | 便利


前のページへ 1|2       

Copyright © 2010 OSDN Corporation, All Rights Reserved.

注目のテーマ