为什么在scp中添加本地IP和用户名返回公钥错误?

Cin*_*hty 4 linux ssh scp

我有两个远程服务器,它们具有相同的用户和 ID 密钥。我可以自由地从本地机器通过 SSH 连接到它们中的任何一个,或者从一个到另一个。我ssh-ed100.100.100.1并尝试运行:

scp -i ~/keyfile -r ognjen@100.100.100.1:/path/1/ ognjen@100.100.100.2:/path/2/
Run Code Online (Sandbox Code Playgroud)

它从目标远程返回公钥错误和丢失的连接。

我不小心意识到这有效:

scp -i ~/keyfile -r /path/1/ ognjen@100.100.100.2:/path/2/
Run Code Online (Sandbox Code Playgroud)

为什么第一个失败?

Kam*_*ski 8

重要提示:您称为“本地机器”的机器完全无关。真正的故事开始时,你已经在100.100.100.1。在scp此答案的上下文和上下文中,“本地”是scp您调用的机器。

为什么第一个 [command] 失败?

您尝试在两个(正式)远程主机之间进行复制。scp识别ognjen@100.100.100.1:/path/1/为非本地路径。没关系ognjen@100.100.100.1指向本地机器。该工具不会(也不应该)检查看起来远程的地址是否指向本地机器。仅仅通过引用源就好像它是远程的一样,您scp就将其视为远程。目的地也是偏远的。

可以使用或不使用-3选项在两个远程主机之间进行复制:

-3
两个远程主机之间的副本通过本地主机传输。如果没有此选项,数据将直接在两个远程主机之间复制。[…]

(强调我的,来源

粗体片段适用于您的情况(即使您scp不支持-3)。

如果您使用-v第一个命令

scp -v -i ~/keyfile -r ognjen@100.100.100.1:/path/1/ ognjen@100.100.100.2:/path/2/
Run Code Online (Sandbox Code Playgroud)

您将看到 scp使用指定的密钥从本地主机连接到源主机(“顺便说一下”是同一台主机)-i。(显然主机配置为接受此密钥,可能是因为其他服务器使用相同的密钥进行连接。)

然后你会看到scp在源主机上调用了另一个。命令是:

scp -v -r /path/1/ ognjen@100.100.100.2:/path/2/
Run Code Online (Sandbox Code Playgroud)

-v并且-r在那里是因为它们在您的本地命令中。源路径被转换为本地路径;目的地不变。如果此命令成功运行,数据将“直接在两个远程主机之间复制”。

注意没有-i. 应该-i ~/keyfile在吗?或者更确切地说-i /home/cindy/keyfile?(因为在本地scpshell 展开波浪号后本地得到了这样的东西)。

否。一般来说,远程源主机可能(并且通常是)与本地主机不同。对本地主机有效的路径可以指向远程主机上的任何内容或任何内容。如果scp在源主机上使用 调用-i,它会导致比它可以解决的更多的问题。-i不会传播到源主机上调用的命令是一件好事。但随后主机使用其默认密钥或其配置告诉它使用的任何内容连接到目标。

在您的情况下,似乎需要本地~/keyfile连接到目标主机。源主机保存了正确的文件(因为在这种特殊情况下,本地和源是同一台机器),但scp缺少实际连接到目标的命令-i(通常应该如此),因此不使用密钥。

您的第二个命令使用本地路径作为源,只有目标是远程的。在这种情况下,指定的密钥-i用于从本地主机连接到目标主机,完全按照您的计划。因此它起作用了。

请注意,如果您将本地计算机配置为自动用于~/keyfile连接到其他服务器 ( IdentityFilein ~/.ssh/config),则第一个命令将起作用。本地主机会不必要地连接到自己,只是告诉自己连接到目的地,但它仍然可以工作。第一个连接将使用~/keyfile因为-i,第二个连接将使用~/keyfile因为配置。