我有两个远程节点,我正在尝试将文件从一个节点发送到另一个节点。
scp remote1:~/testSCP [email protected]:~/
我已经~/ssh/config
在本地计算机中进行了设置,因此默认情况下使用端口2222
。
22
但在 ssh 配置中,remote1 的默认 ssh 端口设置为port ,而不是 port 2222
。因此,要通过 ssh 进行任何外部连接,它22
默认使用端口。
我尝试了以下方法但没有成功:
scp -P 2222 remote1:~/testSCP [email protected]:~/
还尝试了以下方法,也不起作用:
scp remote1:~/testSCP -P 2222 [email protected]:~/
对于这两个我都收到以下错误:
ssh: connect to host 10.0.1.10 port 22: Connection refused
lost connection
这是正确的,因为10.0.1.10
使用的是 port2222
而不是 port 22
。
2222
当尝试将文件发送到10.0.1.10
(remote2)时,如何指定remote1使用端口remote1
?
更新
尝试后
scp -3 remote1:~/testSCP [email protected]:~/
我的行为很奇怪。即使我的密码是正确的,它也会给我以下输出:
[email protected]'s password: [email protected]'s password:
Permission denied, please try again.
[email protected]'s password:
Permission denied, please try again.
[email protected]'s password:
我还没有启用无密钥身份验证。
新更新
在尝试了多种方法之后,我能够在脚本中通过 ssh 从本地主机登录到 Remote1,然后从 Remote1 登录到 Remote2,然后从 Remote1 登录到 Remote2。但是,这并不能回答我的问题。我打算直接从本地计算机执行此操作,然后在两个实例之间传输文件,我认为如果两个实例的 ssh 守护进程使用的端口与 ssh 连接的默认端口不同,则不支持此操作。
答案1
您无法使用简单的远程到远程 scp [1] 来做到这一点。
相反,请 ssh 到第一个远程主机并从那里运行带有端口参数的 scp :
ssh -p 2222 ruser1@rhost1 scp -P 2222 /rpath/1 ruser2@rhost2:/rpath/2
如果您想准确执行scp
正在执行的操作,您还可以将-n -x -oClearAllForwardings=yes
选项添加到ssh
,尽管通常不需要这样做。
[1]:较新版本scp
支持 uri 规范(包括端口)而不是host:path
,但仅在使用-3
选项(“通过本地主机”)时。
所以你可能可以使用
scp -3 -P 2222 ruser1@rhost1:/rpath/1 scp://ruser2@rhost2:2222//rpath/2
(请注意,/
后面的host[:port]
不是路径的一部分——将在的主目录中scp://user@host/file
引用)。./file
user
但通过本地主机复制速度较慢,而且根据我的经验,它会隐藏错误。例如,尽管无法创建任何/foo/bar/baz
文件,但不会打印任何错误消息:
scp -3 localhost:.bashrc localhost:/foo/bar/baz
我没有深入探讨这一点——只是避免了它;-)
如果有人不相信这一切,他们可以看看源代码:
void
toremote(char *targ, int argc, char **argv)
{
...
} else if (host) { /* standard remote to remote */
if (tport != -1 && tport != SSH_DEFAULT_PORT) {
/* This would require the remote support URIs */
fatal("target port not supported with two "
"remote hosts without the -3 option");
}
请注意,该tport
变量仅通过解析 uri 来设置scp://
,并且它根本不存在于 7.6p1(2017 年 10 月)之前的版本中。
答案2
一种有效的方法是在中设置别名~/.ssh/config
例如,
Host destination
Hostname 10.0.1.10
User remote2
Port 2222
现在,您可以只用作destination
“主机名”,从而不必在实际命令中指定主机名/用户/端口。