当我尝试通过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 Safemode关闭
我试过下面的引文
\'
\\'
\\\'
\\\\'
''
'''
''''更新
我想在进一步测试的时候再加一句。如果我创建一个shell脚本(run_ftp.sh)并通过php运行该脚本,它也会从run_ftp.sh中删除引号。所以这让我觉得不是php造成了这个问题。
SELinux关机了。linux/bash是否有其他安全措施可以导致这种情况?
发布于 2012-07-11 22:44:11
有人看过lftp手册页吗?
它在“选项”项下说:
-e命令
-c命令执行给定的命令和出口
所以您的lftp挂起是因为您使用的是-e而不是-c。
它与PHP无关,也与去掉引号的shell无关。外壳总是这样做的,这就是它的工作原理。来自PS的输出并不意味着可以复制和粘贴。
发布于 2013-03-13 22:07:51
我找到了一个使用打开函数的解决方案。更复杂,但对我来说很好。
$command = "lftp -u $USER,$PASSWORD -e 'get /tmp/backup-2012-08-15.zip; bye' sftp://$HOST";
$io = array();
$p = proc_open($command,
array(1 => array('pipe', 'w'),
2 => array('pipe', 'w')), $io);
/* Read output sent to stdout. */
while (!feof($io[1])) {
echo "STDOUT: ".fgets($io[1]);
}
/* Read output sent to stderr. */
while (!feof($io[2])) {
echo "STDERR: ".fgets($io[2]);
}
fclose($io[1]);
fclose($io[2]);
proc_close($p);这段代码的灵感来源于PHP外壳工具。PDT:抱歉,我的英语
发布于 2011-12-15 23:09:38
有一个自我解释的UNIX SHELL Quote教程,试试看!
https://stackoverflow.com/questions/8527817
复制相似问题