webdevqa.jp.net

複数のPHP変数をShell_exec()に渡しますか?

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を送信する必要がある特別な方法はありますか?

19
user2314387

引数をクォータで送信する必要があるため、次のように使用する必要があります。

$page = Shell_exec("/tmp/my_script.php '".$my_url."' '".$my_refer."'");
15
Code Lღver

変化する

$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);
22
David Chen

変数は、単一引用符で囲まれた文字列内に補間されません。また、引数が適切にエスケープされていることを確認する必要があります。

 $page = Shell_exec('/tmp/myscript.php '.escapeshellarg($my_url).' '.escapeshellarg($my_refer));
9
Orangepill

ここで 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 を使用する必要があります。

2
DaoWen

変化する

$page = Shell_exec('/tmp/my_script.php $my_url $my_refer');

$page = Shell_exec('/tmp/my_script.php "'.$my_url.'" "'.$my_refer.'"');

次に、コードはファイル名のスペースを許容します。

2
David Jashi

これに苦労したので、コードスニペットを共有すると思いました。

$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]
2
bluenapalm