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
我不明白这个行为。
对我来说有两种情况:
第一起案件很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也…