如何将公钥复制到ssh服务器?


33

这是我尝试过的,但出现错误:

$ cat /home/tim/.ssh/id_rsa.pub | ssh tim@just.some.other.server 'cat >> .ssh/authorized_keys'
Password: 
cat: >>: No such file or directory
cat: .ssh/authorized_keys: No such file or directory

为什么不分两个步骤呢?将其复制,然后追加?
Faheem Mitha 2012年

@FaheemMitha:可行,谢谢!我实际上可能意识到麻烦的原因。请看我的新帖子
蒂姆(Tim)

使用-f参数,您不需要私钥,因此只需使用某人的公钥即可将密钥传递给他们!
喀什(Kzqai)

Answers:


67

OpenSSH附带有执行此操作的命令ssh-copy-id。您只需为其提供远程地址,它会将您的公钥添加到authorized_keys远程计算机上的文件中:

$ ssh-copy-id tim@just.some.other.server

您可能需要使用该-i标志在本地计算机上找到您的公钥:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub tim@just.some.other.server

1
谢谢!为什么我的命令不起作用?
蒂姆(Tim)2012年

@Tim 这个答案解释了它;>>由您的Shell处理,并且您是通过SSH(而不是通过Shell)运行命令的。他使用SSH运行外壳程序然后运行您的命令的解决方法应该可以工作
Michael Mrozek

谢谢!(1)ssh-copy-id也不起作用。我手动将文件复制到远程并附加其内容,然后它可以工作。我不知道为什么呢?我发现服务器上的默认外壳是某些脚本,我将其更新为原始文章,这可能是原因。请看一看。(2)我想知道ssh-copy-id是否只是将公钥复制到远程,它不会创建私钥和公钥,对吗?
蒂姆(Tim)

1
假设SSH服务器配置为仅接受公钥身份验证作为身份验证机制。在这种情况下,使用ssh-copy-id将不起作用,对吗?
阿卜杜勒

1
@Abdull除非您在该计算机上已经有其他密钥可以连接,否则不会。它只是通过SSH连接
Michael Mrozek

31

您总是可以做这样的事情:

scp ~/.ssh/id_rsa.pub user@remote.example.com:/tmp/id_rsa.pub
ssh user@remote.example.com 
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

我不确定是否可以cat从本地计算机进入ssh会话。只需按照建议将其移动到/ tmp。

编辑:这正是ssh-copy-id。就像迈克尔说的那样。


谢谢!我想知道ssh-copy-id是否只是将公钥复制到远程服务器。它不会创建私钥和公钥,对吗?
蒂姆(Tim)

不,它不会创建它。只需添加即可。
猴子先生2012年

@ Mr.Monkey是的,您可以将数据通过管道传输到ssh会话中(从cat或以其他方式)。您所描述的是老式的方式;ssh-copy-id推荐这样做是因为这样会减少输入错误或给文件错误权限的风险。
吉尔斯(Gilles)'“ SO-不要邪恶”

@Gilles,您不一定总是可以通过服务器访问客户端,尤其是在为运行计算机进行准备时,因此,此方法比使用ssh-cpy-id更好,因为您无需携带设备或设置之前请连接到网络。
e-info128 '16

1
或者你可以直接用管道到达目的地cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> ~/.ssh/authorized_keys'
Pablo A

7

该答案描述了如何使问题中显示的预期方式起作用。

您可以在远程计算机上执行外壳程序以解释>>重定向运算符的特殊含义:

ssh tim@just.some.other.server sh -c "'cat >> .ssh/authorized_keys'" < /home/tim/.ssh/id_rsa.pub

重定向运算符 >>通常由外壳程序解释。

当您执行时ssh host 'command >> file',则不能保证command >> file将由Shell解释。在您的情况下,它command >> file是在没有特殊解释的情况下代替外壳程序执行的,并>>作为参数提供给命令-与command '>>' file在外壳程序中运行的方式相同。

某些版本的SSH(OpenSSH_5.9)将在检测到要由Shell ; > >>等解释的令牌时自动在远程服务器上调用Shell并将命令传递给它。


3

openssh确实提供了ssh-copy-id。顺序为:

  • 生成一个不错的4k密钥

    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa4k
    
  • 启动您的ssh-agent并吸收诸如SSH_AGENT_PID等的信息。

    ssh-agent -s > ~/mysshagent
    source ~/mysshagent
    rm ~/mysshagent
    
  • 现在开始将密钥加载到您的SSH代理中

    ssh-add ~/.ssh/id_rsa4k
    
  • 检查它是否已加载

    ssh-add -l
    ssh-add -L
    

    这将向您显示ssh-agent中的内容

  • 现在实际上是SSH到远程系统

    ssh username@remotehost.network
    
  • 现在,您可以不带任何参数运行ssh-copy-id:

    ssh-copy-id
    

    这将创建~/.ssh/authorized_keys并填写ssh-agent所需的基本信息。


顺便说一句,我在github.com/centic9/generate-and-send-ssh-key上创建了一个小脚本,该脚本一口气运行了大多数这些步骤,并另外确保了文件/目录权限,这通常
会让

当禁用密码登录时,这是一种很棒的方法。它允许在使用先前密钥进行身份验证时添加新密钥。
MountainX

1

当选择另一个端口而不是22时,我在ssh-copy-id上遇到了麻烦...因此,这是我的oneliner具有不同的ssh-port(例如7572):

ssh yourServer.dom -p7572 "mkdir .ssh; chmod 700 .ssh; umask 177; sh -c 'cat >> .ssh/authorized_keys'" < .ssh/id_rsa.pub

0

实际上,the ssh-copy-id命令确实做到了这一点(来自openssh-client软件包):

ssh-copy-id user@host

注意:
host表示IP地址


我还想添加一些额外的信息,

1)我们可以在目标服务器上为SSH 指定其他端口

ssh-copy-id "-p 8127 user@host"

注:
端口必须在前面user@host,否则将无法解决。

资源

2)我们可以指定一个带有公钥的文件

ssh-copy-id -i ~/.ssh/id_rsa.pub user@host

注:
-i选项允许我们使用包含公钥的文件来指示名称的适当位置。

有时它会派上用场,特别是如果我们将其存储在非标准位置,或者计算机上有多个公共密钥,并且我们想指向一个特定的密钥。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.