用php exec更改rsync端口

时间:2017-08-24 22:01:43

标签: php ssh rsync

使用PHP,我正在尝试连接到远程服务器并执行rsync命令:

$rsync_cmd = 'rsync -P -azv -e "ssh -p 1234" /dir/file.jpg root@remoteserver2:/dir/file.jpg';

exec('sudo ssh -tt root@remoteserver1 '.$rsync_cmd.' 2>&1', $output);

远程连接工作正常但是当我包含我的rsync命令时出现端口错误“ssh:连接到主机remoteserver2端口22:连接被拒绝”

正确使用的端口是1234,这个命令在终端(shell)上工作正常,但是php“exec”函数不想接受它(“ssh -p 1234”),任何想法?

2 个答案:

答案 0 :(得分:1)

你是否在终端中通过ssh在remoteserver1中测试它,然后执行rsync命令,或者执行整个ssh - 到 - rsync命令一条线?因为我很确定通过两个步骤完成它会起作用,但是一步不会。这是因为当它作为一个步骤完成时,命令字符串由本地shell解析(包括执行引用和转义解释和删除),然后将ssh传递给远程shell(然后执行另一个引用传递)逃脱解释和删除)。 "ssh -p 1234"中的那些双引号被本地shell解析和删除,因此它们没有被远程shell解析和应用的预期效果。

如果我对这个问题是正确的,解决方案很简单:逃避双引号。这样本地shell将解析并删除转义,并通过unmolested传递双引号,以便远程shell可以查看并应用它们:

$rsync_cmd = 'rsync -P -azv -e \"ssh -p 1234\" /dir/file.jpg root@remoteserver2:/dir/file.jpg';

exec('sudo ssh -tt root@remoteserver1 '.$rsync_cmd.' 2>&1', $output);

答案 1 :(得分:0)

解决方案非常简单,请尝试从命令中跳过-P标志。

$rsync_cmd = 'rsync -azv -e \"ssh -p 1234\" /dir/file.jpg root@remoteserver2:/dir/file.jpg';

exec('sudo ssh -tt root@remoteserver1 '.$rsync_cmd.' 2>&1', $output);

它可以正常使用-P标志,它为rsync采用默认端口。