- ベストアンサー
外部コマンドに変数を使うにはどうしたらよいのでしょうか
perlで書いたCGIでアクセスしてきたマシンのIPを取得 $user_ip = $ENV{'SERVER_ADDR}; 外部コマンドでiptableの設定を行うようにしたいのですが、以下のようにコマンドに変数($user_ip)を指定することができません。 system ("iptables -t nat -A PREROUTING -d $user_ip -i eth0 -j DNAT --to 192.168.0.10") どなたか解決策をお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Programming Perlによれば $user_ip=$ENV{'SERVER_ADDR}; のあとで、 強引に汚染を取り除いたことにするには if ($user_ip =~ /(.+)/){ $user_ip = $1; } とします。 本当に取り除くには if ($user_ip =~ /^([-\@\w.]+)/){ $user_ip = $1; }else{ 汚染されたデータの為、以降の処理停止 } とします。 実際にやったことはないので、自信なしです。
その他の回答 (1)
- tatsu99
- ベストアンサー率52% (391/751)
$cmd = "iptables -t nat -A PREROUTING -d $user_ip -i eth0 -j DNAT --to 192.168.0.10"; system($cmd); として下さい。
お礼
すばやいレスいただきまして、ありがとうございます。今現在、実行環境がありませんので、2,3日中に改めてお礼を書かせていただきます。
補足
実行してみたのですが、「Insecure dependency in system while running setuid at /usr/local/apache2.0.52/cgi-bin/test.cgi」とエラーが出てしまいます。(エラーではsystem($cmd)が書かれた行番号が表示される) おそらく$cmd = "iptabels ~ "; で指定した$user_ipが汚染データと判断され、エラーが出ているのではないかと思います。 汚染データと判断されないために回避する方法はあるのでしょうか。よろしくお願いします。 ------------------------------------------------- 汚染検出用モードで動かし #!/usr/bin/perl -T 環境変数PATH設定はしています $ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin'; $ENV{'IFS'} = '' if $ENV{'IFS'} ne ''; $path = $ENV{'PATH'}; delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; $user_ip = $ENV{'HTTP_HOST'}; 環境変数を$user_ipに入れる前または後でエラー回避の ためにやることはあるのでしょうか
お礼
無事に実行できましたありがとうございました