Shell_execメソッドを使用してPHPからtest.shを呼び出しています。
$my_url="http://www.somesite.com/";
$my_refer="http://www.somesite.com/";
$page = Shell_exec('/tmp/my_script.php $my_url $my_refer');
ただし、コマンドラインスクリプトは、引数を1つしか受け取らないと言っています:/tmp/my_script.php
通話を次のように変更すると:
コード:
$page = Shell_exec('/tmp/my_script.php {$my_url} {$my_refer}');
3つの引数を受け取りましたが、argv [1]とargv [2]は空です。
通話を次のように変更すると:
コード:
$page = Shell_exec('/tmp/my_script.php "http://www.somesite.com/" "http://www.somesite.com/"');
スクリプトは、最終的に3つの引数すべてを意図したとおりに受け取ります。
常に引用符で囲まれたテキストをスクリプトで送信する必要があり、$ varのような変数を送信することは許可されていませんか?または、$ varを送信する必要がある特別な方法はありますか?
引数をクォータで送信する必要があるため、次のように使用する必要があります。
$page = Shell_exec("/tmp/my_script.php '".$my_url."' '".$my_refer."'");
変化する
$page = Shell_exec('/tmp/my_script.php $my_url $my_refer');
に
$page = Shell_exec("/tmp/my_script.php $my_url $my_refer");
OR
$page = Shell_exec('/tmp/my_script.php "'.$my_url.'" "'.$my_refer.'"');
また、両方の値で escapeshellarg
を使用してください。
例:
$my_url=escapeshellarg($my_url);
$my_refer=escapeshellarg($my_refer);
変数は、単一引用符で囲まれた文字列内に補間されません。また、引数が適切にエスケープされていることを確認する必要があります。
$page = Shell_exec('/tmp/myscript.php '.escapeshellarg($my_url).' '.escapeshellarg($my_refer));
ここで sprintf
が役立つ場合があります。
$my_url="http://www.somesite.com/";
$my_refer="http://www.somesite.com/";
$page = Shell_exec(sprintf('/tmp/my_script.php "%s" "%s"', $my_url, $my_refer));
あなたが入力を提供する人でない場合は、他の回答で推奨されているように、間違いなく escapeshellarg
を使用する必要があります。
変化する
$page = Shell_exec('/tmp/my_script.php $my_url $my_refer');
に
$page = Shell_exec('/tmp/my_script.php "'.$my_url.'" "'.$my_refer.'"');
次に、コードはファイル名のスペースを許容します。
これに苦労したので、コードスニペットを共有すると思いました。
前
$output = Shell_exec("/var/www/sites/blah/html/blahscript.sh 2>&1 $Host $command");
後
$output = Shell_exec("/var/www/sites/blah/html/blahscript.sh 2>&1 $Host {$command}");
{}
角かっこを追加することで、それが修正されました。
また、escapeshellarg
も確認する必要があります。
$Host=escapeshellarg($Host);
$command=escapeshellarg($command);
スクリプトも必要な場合を除き:
set Host [lindex $argv 0]
set command [lindex $argv 1]