使用 php exec 更改 rsync 端口

Change rsync port with php exec

使用 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: connect to host remoteserver2 port 22: Connection refused"

正确使用的端口是 1234,此命令在终端上运行良好 (shell) 但 php "exec" 函数不想使用它 ("ssh -p 1234"), 有什么想法吗?

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

如果我对这个问题的看法是正确的,那么解决方案非常简单:转义双引号。这样本地 shell 将解析并删除转义符,并通过不受干扰的双引号传递,以便远程 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);

解决方案非常简单,尝试从命令中跳过 -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);

使用 rsync 默认端口的 -P 标志可以正常工作。