ChatGPT解决这个技术问题 Extra ChatGPT

使用 rsync 时是否可以指定不同的 ssh 端口?

我一直在尝试以下命令:

rsync -rvz --progress --remove-sent-files ./dir user@host:2222/path

SSH 在端口 2222 上运行,但 rsync 仍然尝试使用端口 22,然后抱怨找不到路径,因为它当然不存在。

我想知道是否可以 rsync 到非标准 ssh 端口上的远程主机。


P
Piotr Dąbrowski

您的命令行应如下所示:

rsync -rvz -e 'ssh -p 2222' --progress ./dir user@host:/path

这很好用——我一直使用它,不需要任何新的防火墙规则——只需注意 SSH 命令本身用引号引起来。


我想知道为什么会这样——这是一个如此明显的需求,但仍然很隐蔽,因为这实际上是为 ssh 二进制文件创建了一个别名。 (不过,它完美无缺)
适用于冒号 user@host:/path
该命令的关键部分是 -e 'ssh -p 2222' 因此您可以将其与不同的 rsync 参数一起使用
请注意,如果您需要指定 ssh 密钥,您可以像 -e 'ssh -i mykey -p 2222'
为什么--remove-sent-files?如果它对源数据有危险,最好提及它......
J
Joao Costa

另一种选择,在您运行 rsync 的主机中,在 ssh 配置文件中设置端口,即:

cat ~/.ssh/config
Host host
    Port 2222

然后 rsync over ssh 将与端口 2222 通信:

rsync -rvz --progress --remove-sent-files ./dir user@host:/path

尽管这不是最明显的答案,但它仍然是一个非常好的答案。对于您连接一次或两次以上的任何主机,都值得使用 SSH 配置,因为它可以为您节省大量的思考和打字。
确实,尽管公平地说,缺点是它变得不可见,即,一段时间后人们可能会忘记它在 ssh 配置文件中并且不了解它是如何工作的,或者您的一位同事可能会复制/粘贴命令并且不明白为什么它在他们的帐户中不起作用。不过,我个人更喜欢不必一直输入端口号。
这太可怕了。它与端口 NATing 完全不兼容。除非您想为同一个 IP 地址拥有多个 dns 名称,这是一个维护问题
@melfect 你在开玩笑吗?对于需要多次rsync到一个奇怪的端口但每次都散布到您忘记语法的地方的人来说,我不会称之为可怕的事情。
我更喜欢这个解决方案,因为我很懒,一遍又一遍地输入相同的东西。
T
Techie

当您需要通过特定的 SSH 端口发送文件时:

rsync -azP -e "ssh -p PORT_NUMBER" source destination

例子

rsync -azP -e "ssh -p 2121" /path/to/files/source user@remoteip:/path/to/files/destination

这究竟对现有答案增加了什么?
查看格式和示例。我在这里简化了一些事情。
好的,您删除了两个可选选项,但本质上您的答案与接受的答案完全相同......
它更加简化和格式化。对于新学习者来说更容易理解。顺便感谢您无缘无故地投票
S
Siwei

使用“rsh 选项”。例如:

rsync -avz --rsh='ssh -p3382' root@remote_server_name:/opt/backups

参考:http://www.linuxquestions.org/questions/linux-software-2/rsync-ssh-on-different-port-448112/


也为我工作!我不知道为什么投票最多的答案不起作用......
也为我工作!我需要关键字“--rsh”
K
Kevin

正确的语法是告诉 Rsync 使用自定义 SSH 命令(添加 -p 2222),该命令使用 SSH 创建到远程端的安全隧道,然后通过 localhost:873 连接

rsync -rvz --progress --remove-sent-files -e "ssh -p 2222" ./dir user@host/path

Rsync 在 TCP 端口 873 上作为守护进程运行,这是不安全的。

来自 Rsync 人:

推送:rsync [OPTION...] SRC... [USER@]HOST:DEST

这会误导人们尝试这样做:

rsync -rvz --progress --remove-sent-files ./dir user@host:2222/path

但是,这指示它连接到端口 2222 上的 Rsync 守护程序,而该端口不存在。


其他答案没有提到端口 873
问题是如何让它在 2222 端口上作为 ssh 运行; rsync 是否需要它是另一回事。
@DanSteingart我更新了答案,现在有帮助吗?
a
activedecay

我在 Mike Hike Hostetler's 网站上找到了这个非常适合我的解决方案。

# rsync -avz -e "ssh -p $portNumber" user@remoteip:/path/to/files/ /local/path/

这究竟对现有答案增加了什么?
显示在变量中使用端口号的正确引用,而不是对其进行硬编码。好的。
L
Luke

在java(可能还有其他语言)中调用rsync时,我发现设置

-e ssh -p 22

导致 rsync 抱怨它无法执行二进制文件:

ssh -p 22

因为该路径 ssh -p 22 不存在(-p 和 22 由于某种原因不再是参数,现在构成了二进制 rsync 应该调用的路径的一部分)。

为了解决这个问题,我可以使用这个环境变量:

export "RSYNC_RSH=ssh -p 2222"

(使用 env.put("RSYNC_RSH", "ssh -p " + port); 在 java 中以编程方式设置)


T
Tomas

有点离题,但可能会帮助某人。如果您需要传递密码和端口,我建议使用 sshpass 包。命令行命令如下所示:sshpass -p "password" rsync -avzh -e 'ssh -p PORT312' root@192.xx.xxx.xxx:/dir_on_host/


这不起作用,因为键盘交互会干扰数据流,从而破坏协议。
C
CalfCrusher

我的 2cents,在单个系统用户中,您也可以在 /etc/ssh/ssh_config 上设置端口,然后 rsync 将使用此处设置的端口


K
Ketema

我无法让 rsync 通过 ssh 在不同的端口进行连接,但我能够通过 iptables 将 ssh 连接重定向到我想要的计算机。这不是我正在寻找的解决方案,但它解决了我的问题。