使用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”),任何想法?
答案 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采用默认端口。