2017-09-08 7 views
0

こんにちは、私はphpファイルから実行する必要があるsedコマンドを持っていますが、コマンドはシェルでうまく動作しますが、PHPから問題があるというApacheエラーが出ますセミコロン、私はそれらすべてを脱出しようとした、私はまた、カーリーbraketsを脱出しようとした場合、Apacheのではエラ​​ーが、コマンド期待通りに行いませんが存在しない、ここでのコマンドは、PHPをしようとすると、二重引用符でシェルコマンドをエスケープしてPHPから実行する方法

$cmd = "sed -n -i '/ENDSNUMB/{x;d;};1h;1!{x;p;};${x;p;}' ./taggedfiles/$tagfile"; 
shell_exec($cmd); 
+2

は 'あなたが連結するか、文字通り渡したいん$ tagfile' PHP変数ですそれはあなたの命令ですか? –

+0

$ tagfileはsedの置き換えを行うファイルです –

答えて

2

ですインライン変数を文字列に解析します。あなたの$が問題です。

は、単一引用符を使用して試してみて、このようなあなたの文字列の中のものをエスケープ:

$cmd = 'sed -n -i \'/ENDSNUMB/{x;d;};1h;1!{x;p;};${x;p;}\' ./taggedfiles/' . $tagfile; 
shell_exec($cmd); 

はしかし、シェルコードに変数を解析して、十分に注意してください。正しく逃げなければ、Command Injection攻撃の脆弱性があるかもしれません。マニュアルから

+1

また、 'shell_exec()'関数ではなく 'exec()'関数を使うのが良いでしょう。 ) ' – Denniselite

+0

@IvarこれはApacheのエラーはありませんが、ファイルの変更はありません。 –

+0

@AndrésChandíaMagnusのコメントに対する答えの後に私の答えを更新しました。 – Ivar

1

あなたはすべての置換値のためにこれを行うためにescapeshellcmdを使用することができます... - http://php.net/manual/en/function.escapeshellcmd.php

<?php 
// We allow arbitrary number of arguments intentionally here. 
$command = './configure '.$_POST['configure_options']; 

$escaped_command = escapeshellcmd($command); 

shell_exec($escaped_command); 
?> 
+0

ありがとうございますが、違いはありません –