php の exec/passthru/system 関数を介してシェルに対してコマンドを実行しようとすると、コマンドから引用符が削除されるようです。
$str_file = '1323988284_700.csv';
exec("/usr/bin/lftp -e 'set ftp:passive-mode true; set ftp:ssl-protect-data yes; put /web/files/{$str_file}; bye;' -u user,pass ftp://ftp.site.com/uploaddir/");
プロセスのチェックからの出力は次のとおりです
ps faxxx | grep lftp
4486 ? S 0:00 | \_ /usr/bin/lftp -e set ftp:passive-mode true; set ftp:ssl-protect-data yes; put /web/files/1323988284_700.csv; bye; -u user,pass ftp://ftp.site.com/uploaddir/
ご覧のとおり、一重引用符なしで実行されているプロセスを示しています。これにより、lftp でエラーが発生します。
これは、プロセスリストに表示されているものをコマンドに入力すると、エラーが発生してlftpシェルに残るためだと思います。
PHPセーフモードはオフです
見積もりのために次のことを試しました
\'
\\'
\\\'
\\\\'
''
'''
''''
アップデート
さらにテストしたときにそれを追加したいと思います..シェルスクリプト(run_ftp.sh)を作成し、それをphp経由で実行すると、run_ftp.shから引用符も削除されます..問題。
SELinux はオフです。Linux/Bash がこれを引き起こす可能性のある他のセキュリティ対策はありますか?