当我尝试通过 php 的 exec/passthru/system 函数向 shell 执行命令时,它似乎会从命令中删除引号。
$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 shell。
PHP 安全模式已关闭
我已经尝试了以下报价
\'
\\'
\\\'
\\\\'
''
'''
''''
更新
我想在进一步测试时添加它。如果我创建一个 shell 脚本(run_ftp.sh)并通过 php 运行它,它也会从 run_ftp.sh 中删除引号。所以这让我认为它不是 php 导致问题。
SELinux 已关闭.. linux/bash 是否有任何其他可能导致此问题的安全措施?