为什么ssh-copy-id需要私钥文件

ssh-copy-id对于将公钥发送到服务器非常有用。 但是如果你现在还没有私钥文件就会失败。

 $ ssh-copy-id -i my_friend_rsa.pub [email protected] /usr/bin/ssh-copy-id: ERROR: failed to open ID file 'my_friend_rsa': No such file 

我不明白这个行为。

对我来说有两种情况:

  1. 我发送我自己的公钥
  2. 我发同事的公钥。

第一起案件很less。 如果我可以连接到服务器,服务器已经有了我的公钥。 所以在这种情况下我不需要ssh-copy-id

第二种情况经常发生。 我授予访问其他用户。 但是我没有他和她的私钥。 所以这种行为使得ssh-copy-id在第二种情况下是无用的。

请解释一下为什么ssh-copy-id需要私钥文件?

由于这个程序的工作方式。 引用man ssh-copy-id

ssh-copy-id是一个使用ssh(1)login到远程机器的脚本(推测使用login密码,所以应该启用密码authentication,除非你已经聪明地使用了多个身份)。 它汇编了一个或多个指纹列表(如下所述),并尝试使用每个密钥login,以查看是否已经安装了任何指纹(当然,如果您不使用ssh-agent(1)这个可能会导致您重复提示input密码)。 然后组装一个列表,那些login失败,并使用SSH,使远程服务器上的这些键login。

我同意,有时候这太聪明了,但这不是问“为什么”的地方,因为我们不是开发者。

它需要私钥来validation,公钥安装正确(这基本上是一个健全的检查)。 但是…

您可以使用-f开关,这将允许您只复制公钥到服务器,并不会validation( 如果您已经安装了足够新的openssh )。

这是ssh-copy-id以前的工作方式。 另一种可能性是环境variablesSSH_COPY_ID_LEGACY ,它允许你恢复这个行为:

 $ SSH_COPY_ID_LEGACY=1 ssh-copy-id -i my_friend_rsa.pub [email protected] 

或者你可以select当前版本的ssh-copy-id从上游存储库中使用,它支持-f开关。

作为一个Windows用户,我可以说我们没有ssh-copy-id脚本,这是一个耻辱。 但如果你花一些时间研究它的内部,你可能会发现它可以很容易地被下面的命令replace:

 grep ^AuthorizedKeysFile /etc/ssh/sshd_config | awk '{print $2}' | xargs -I{} sh -c 'ssh-add -L >> {}; sort -u {} -o {}';echo "ForwardAgent yes" >~/.ssh/config 

只需在login后立即发出此命令,下次您可以通过密钥进行授权,就像那样简单。 如果由于某种原因,它不适合你,请在评论中描述你的系统。 请记住,您的ssh客户端必须configuration为使用代理,转发和密码才能使用此命令。 这里是腻子设置画面 。

PS如果你可能想知道,它也适用于Linux – > Linux也…