linuxコマンドをperlから実行!

サーバーで公開しているサービスをほとんど使えないようにして、あるプログラムが動くか、という検証をしたときのメモ。


まず、サーバーで公開しているポート番号を調べるには以下。

netstat -p -l

これでtcpやudpのポート番号が調べられます。nmapコマンドでも大丈夫かも。

次にポート番号にアクセスできないようにする。
ただし、そのサーバーは他の部署の人たちも使っているので、サービスを落とす、なんてことはできない。テスターの端末からのみアクセスできないようにしたい。それを行うにはiptablesコマンド。

iptables -A INPUT -p tcp --dport 8480 -s 10.26.33.33 -j DROP

こんな感じ。意味は、tcpプロトコルを使った8480ポートへのアクセスのうち、10.10.33.33という端末からの要求は破棄するというルールを追加するってところです。

これを、netstatで調べたtcpポートに対して行うんですが、多すぎて面倒くさい。
手で打ってもいいけど、こういうのこそプログラムで解決したい。そこで作ってみました。不慣れなperlで。
こんな感じです。

#!/usr/bin/perl

@tcp = ("8480", "9793", "32838", "5005", "5006", "ftp");
for(@tcp) {
  $cmd = `/sbin/iptables -A INPUT -p tcp --dport $_ -s 10.10.33.33 -j DROP`;
  print "$cmd\n";
}

ミソはperlからlinuxコマンドを実行しているところ。
printで実行するかどうかはかなり怪しいけど、一応それでいけました。

なお、次のようにするとルールが確認できます。

iptables -L


以下のように使うと、画面にlsコマンドの実行結果が出ます。こうやる時にはprint文を使う意味があると思うんですけどね。

#!/usr/bin/perl

$cmd = `/bin/ls -hl`;
print "$cmd";