这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
我不明白这种行为。
对我来说有两种情况:
- 我发送自己的公钥
- 我发送同事的公钥。
第一种情况很少见。如果我可以连接到服务器,则服务器已经拥有我的公钥。所以在这种情况下我不需要ssh-copy-id
。
第二种情况很常见。我授予其他用户访问权限。但我既没有他的私钥,也没有她的私钥。因此,在第二种情况下,这种行为会使 ssh-copy-id 变得毫无用处。
请解释一下为什么ssh-copy-id
需要私钥文件?
答案1
因为这个程序的工作方式。引用man ssh-copy-id
:
ssh-copy-id 是一个使用 ssh(1) 登录远程计算机的脚本(可能使用登录密码,因此除非您巧妙地使用了多个身份,否则应启用密码验证)。它会收集一个或多个指纹列表(如下所述),并尝试使用每个密钥登录,以查看其中是否已安装任何指纹(当然,如果您不使用 ssh-agent(1),这可能会导致您被反复提示输入密码)。然后,它会收集登录失败的用户列表,并使用 ssh 在远程服务器上启用使用这些密钥的登录。
我同意有时候这可能太聪明了,但这里不是问“为什么”的地方,因为我们不是开发人员。
答案2
它需要私钥来验证公钥是否已正确安装(这基本上是一个健全性检查)。但是...
您可以使用-f
开关,它将允许您仅将公钥复制到服务器,并且不会验证(如果你安装了足够新的 openssh)。
ssh-copy-id
这是以前的工作方式。另一种可能性是环境变量SSH_COPY_ID_LEGACY
,它允许您恢复此行为:
$ SSH_COPY_ID_LEGACY=1 ssh-copy-id -i my_friend_rsa.pub [email protected]
或者你也可以选择当前版本ssh-copy-id
来使用上游存储库,支持-f
切换。
答案3
作为 Windows 用户,我可以说我们没有这个ssh-copy-id
脚本真是太遗憾了。但如果你花点时间研究一下它的内部原理,你可能会发现它可以轻松地用以下命令替换:
grep ^AuthorizedKeysFile /etc/ssh/sshd_config | awk '{print $2}' | xargs -I{} sh -c 'ssh-add -L >> {}; sort -u {} -o {}';echo "ForwardAgent yes" >~/.ssh/config
只需在登录后立即发出此命令,下次您就可以使用密钥授权,就这么简单。如果出于某种原因它对您不起作用,请在评论中描述一下您的系统。请记住,必须将 ssh 客户端配置为使用代理、转发和密码才能使此命令起作用。这里是Putty 设置屏幕。
PS 您可能想知道,它也可以在 linux -> linux 上运行...