我有两个远程服务器,它们具有相同的用户和 ID 密钥。我可以从本地计算机自由地通过 SSH 连接到其中任何一个服务器,也可以从其中一个服务器连接到另一个服务器。我输入了ssh
-ed to100.100.100.1
并尝试运行:
scp -i ~/keyfile -r [email protected]:/path/1/ [email protected]:/path/2/
它返回来自目标远程的公钥错误和丢失的连接。
我无意中意识到这是可行的:
scp -i ~/keyfile -r /path/1/ [email protected]:/path/2/
为什么第一次会失败?
答案1
重要提示:您称为“本地机器”的机器完全无关紧要。真正的故事始于您已经处于 的100.100.100.1
状态。在此答案的上下文中,“本地”是您调用 的scp
机器。scp
为什么第一个[命令]失败了?
您尝试在两个(正式)远程主机之间进行复制。scp
识别[email protected]:/path/1/
为非本地路径。它[email protected]
指向本地计算机并不重要。该工具不会(也不应该)检查看似远程的地址是否指向本地计算机。只要将源视为远程,您就会将scp
其视为远程。目标也是远程的。
两个远程主机之间的复制可以使用或不使用以下选项-3
:
-3
两个远程主机之间的副本通过本地主机进行传输。若没有此选项,数据将直接在两个远程主机之间复制。[…]
(重点是我的,来源)
粗体片段适用于您的情况(即使您的scp
不支持-3
)。
如果你使用-v
第一个命令
scp -v -i ~/keyfile -r [email protected]:/path/1/ [email protected]:/path/2/
您将看到 scp
使用 指定的密钥从本地主机连接到源主机(“碰巧”是同一台主机)-i
。 (显然主机配置为接受此密钥,可能是因为另一台服务器使用相同的密钥进行连接。)
然后你会看到scp
在源主机上调用了另一个命令。命令是:
scp -v -r /path/1/ [email protected]:/path/2/
-v
并且-r
之所以存在,是因为它们位于您的本地命令中。源路径被转换为本地路径;目标保持不变。如果此命令成功运行,则数据将“直接在两个远程主机之间复制”。
请注意,没有-i
。 应该-i ~/keyfile
有吗?或者更确切地说是这样的?(因为本地 shell 扩展波浪号后,-i /home/cindy/keyfile
本地得到了类似的内容)。scp
不。通常,远程源主机可能(并且通常)不同于本地主机。对本地主机有效的路径可能指向远程主机上的任何内容,也可能不指向任何内容。如果scp
在源主机上使用 调用-i
,则会导致比它能解决的问题更多的问题。幸好-i
不会传播到在源主机上调用的命令。但随后主机会使用其默认密钥或其配置告诉它使用的任何密钥连接到目标。
在您的例子中,似乎需要本地~/keyfile
才能连接到目标主机。源主机保存正确的文件(因为在此特定情况下,本地和源是同一台机器),但scp
实际连接到目标的命令缺失-i
(通常应该如此),因此未使用密钥。
您的第二条命令使用本地路径作为源,只有目标是远程的。在这种情况下,指定的密钥-i
用于从本地主机连接到目标主机,正如您所计划的那样。因此它成功了。
注意,如果您将本地计算机配置为自动使用~/keyfile
连接到另一台服务器(IdentityFile
在 中~/.ssh/config
),则第一个命令将起作用。本地主机将不必要地连接到自身,只会告诉自己连接到目的地,但它仍将起作用。第一个连接将~/keyfile
因为 而使用-i
,第二个连接将~/keyfile
因为 配置而使用。
答案2
来自 scp 手册,-3 选项说明:两个远程主机之间的副本通过本地主机传输。如果没有此选项,数据将直接在两个远程主机之间复制。请注意,此选项会禁用进度表并为第二台主机选择批处理模式,因为 scp 无法要求两台主机都输入密码或密码短语。
根据描述,首先失败是因为 2 个远程服务器将直接通信(实际上 100.100.100.1 服务器将通过 ssh 与 100.100.100.2 服务器通信)因此您必须选择:
- 使用 -3 选项。
- 配置 2 个远程服务器以便能够使用密钥文件 ssh 密钥进行身份验证。如果您可以使用 ssh 密钥从 100.100.100.1 登录到 100.100.100.2 服务器,则您的原始命令将起作用。