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";