• ベストアンサー
  • すぐに回答を!

外部コマンドに変数を使うにはどうしたらよいのでしょうか

  • 質問No.1220410
  • 閲覧数344
  • ありがとう数4
  • 回答数2

お礼率 50% (5/10)

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

どなたか解決策をお願いします。

質問者が選んだベストアンサー

  • 回答No.2
  • ベストアンサー

ベストアンサー率 52% (391/751)

Programming Perlによれば
$user_ip=$ENV{'SERVER_ADDR};
のあとで、
強引に汚染を取り除いたことにするには
if ($user_ip =~ /(.+)/){
$user_ip = $1;
}
とします。
本当に取り除くには
if ($user_ip =~ /^([-\@\w.]+)/){
$user_ip = $1;
}else{
汚染されたデータの為、以降の処理停止
}
とします。
実際にやったことはないので、自信なしです。
お礼コメント
bob33

お礼率 50% (5/10)

無事に実行できましたありがとうございました
投稿日時:2005/02/18 12:29

その他の回答 (全1件)

  • 回答No.1

ベストアンサー率 52% (391/751)

$cmd = "iptables -t nat -A PREROUTING -d $user_ip -i eth0 -j DNAT --to 192.168.0.10";
system($cmd);
として下さい。
補足コメント
bob33

お礼率 50% (5/10)

実行してみたのですが、「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に入れる前または後でエラー回避の
ためにやることはあるのでしょうか
投稿日時:2005/02/17 13:48
お礼コメント
bob33

お礼率 50% (5/10)

すばやいレスいただきまして、ありがとうございます。今現在、実行環境がありませんので、2,3日中に改めてお礼を書かせていただきます。
投稿日時:2005/02/16 00:53
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ページ先頭へ