使用本地可用密钥来授权远程计算机上的登录
命令语法格式
ssh-copy-id [-f] [-n] [-i [identity_file]] [-p port] [-o ssh_option] [user@]hostname
ssh-copy-id -h | -?
命令描述
命令ssh-copy-id是一个使用ssh(1)登录远程计算机的脚本(可能使用登录密码,因此应启用密码验证,除非您已经巧妙地使用了多个身份)。 它汇编了一个或多个指纹的列表(如下所述)并尝试使用每个密钥登录,以查看是否已安装任何指纹(当然,如果您不使用ssh-agent(1),这可能会导致 在你被反复提示通过短语)。 然后它汇总了那些无法登录的列表,并使用ssh启用了远程服务器上的这些密钥登录。 默认情况下,它通过将密钥附加到远程用户的~/.ssh/authorized_keys(如果需要,创建文件和目录)来添加密钥。它还能够检测远程系统是否是NetScreen,并使用其“set ssh pka-dsa key …”命令。
命令行选项
支持的命令行选项如下:
-i identity_file
仅使用identity_file中包含的密钥(而不是通过ssh-add(1)或default_ID_file查找身份)。如果文件名不以.pub结尾,则会添加。如果省略文件名,则使用default_ID_file文件。
请注意,这可以用于确保复制的密钥具有”应用的注释“和”应用的额外“选项,方法是确保密钥文件在尝试复制之前将这些设置为首选。
-f
强制模式:不检查远程服务器上是否存在密钥。 这意味着它不需要私钥。 当然,这可能导致远程系统上安装了多个密钥副本。
-n
做一个干跑。只需打印已安装的密钥,而不是在远程系统上安装密钥。
-p port, -o ssh_option
这两个选项简单地直接传递,以允许分别设置端口或其他ssh(1)选项。
相比将这些指定为命令行选项,在ssh(1)配置文件中使用(每个主机)设置通常更好:ssh_config(5)。
-h, -?
显示帮助信息。
注意事项
没有选项-i的默认行为是检查ssh-add -L是否提供任何输出,如果是,则使用这些密钥。 请注意,这会导致密钥的注释是当密钥的文件名,被加载到ssh-agent(1)时传给ssh-add(1),而不是该文件中包含的注释,这有点像丢人现眼。 否则,如果ssh-add(1)未提供任何密钥,则将使用default_ID_file的内容。
变量default_ID_file是最新匹配的文件:~/.ssh/id*.pub,(不包括匹配~/.ssh/*-cert.pub的文件)所以如果你创建的密钥不是你想要的密钥,要使用-copy-id,只需在首选密钥的.pub文件上使用touch(1)即可将其恢复为最新版本。
使用示例
如果您已经将一个系统上的密钥安装到许多远程主机上,然后在新客户端计算机上创建了一个新密钥,那么很难跟踪在哪台系统上安装了新密钥。 处理此问题的一种方法是将新密钥和旧密钥加载到ssh-agent(1)中。 首先加载新密钥,不使用-c选项,然后将一个或多个旧密钥加载到代理中,可能通过ssh到具有该旧密钥的客户端计算机,使用-A选项允许代理转发:
user@newclient$ ssh -A old.client
user@oldl$ ssh-add -c
… prompt for pass-phrase …
user@old$ logoff
user@newclient$ ssh someserver
现在,如果新密钥安装在服务器上,您将被允许自动启用,而如果您只启用了旧密钥,则会要求您进行确认,这是您退回登录的提示,运行
在这种情况下,您可能希望指定-i选项的原因是确保已安装密钥的注释是.pub文件中的注释,而不仅仅是加载到代理中的文件名。 它还确保只安装您想要的id,而不是ssh-agent(1)中的所有密钥。 当然,您可以指定另一个id,或者根据需要使用ssh-agent(1)的内容。
提到ssh-add(1)的-c选项后,你可以考虑在使用代理转发时使用它来避免你的密钥被劫持,但更好的是使用ssh(1)的ProxyCommand和-W选项, 通过远程服务器反弹,同时始终进行直接的端到端身份验证。 这样,中间跃点无法访问您的ssh-agent(1)。 对’ssh proxycommand nc’的网络搜索应该证明具有启发性(N.B.现代方法是使用-W选项,而不是nc(1))。
相关手册
ssh(1), ssh-agent(1), sshd(8)
参考文献
- man 1 ssh-copy-id, Version 17.4p1-10
更新日志
- 08/31/2017 创建文章