将 ssh 密钥复制到另一台机器的最简单方法?

Jor*_*tro 421 ssh

我在家里很懒,对我的家用机器使用密码认证。我已准备好转向基于密钥的身份验证。网络上有很多关于如何执行此操作的选项,包括 catting 然后 ssh the key over,直接 scping key over 等。

我正在寻找复制密钥的最简单和推荐的方法,希望 Ubuntu ssh 包中的某处有一个方便的包装器?

我已经知道如何关闭密码登录

Mar*_*erg 570

ssh-copy-id命令(在openssh-client包中并默认安装)正是这样做的:

ssh-copy-id user@hostname.example.com
Run Code Online (Sandbox Code Playgroud)

将您的默认身份(-i identity_file用于其他身份)的公钥复制到远程主机。

默认身份是您的“标准”ssh 密钥。它由在两个文件(公钥和私钥)~/.ssh的目录,通常命名为identityid_rsaid_dsaid_ecdsaid_ed25519(和相同的带.pub),这取决于密钥类型。如果您没有创建多个 ssh 密钥,则不必担心指定身份,ssh-copy-id 会自动选择它。

如果您没有身份,可以使用工具生成一个ssh-keygen

此外,如果服务器使用的端口与默认端口 ( 22)不同,则应以这种方式使用引号 ( source ):

ssh-copy-id "user@hostname.example.com -p <port-number>"
Run Code Online (Sandbox Code Playgroud)

  • 对于不同的端口使用这个:`ssh-copy-id "user@host -p 6842"` (18认同)
  • 在 Mac 上,您可以执行 `brew install ssh-copy-id` 然后运行命令。 (10认同)
  • 如果您复制到的远程服务器不允许密码提示并且基本上被锁定以供 SSH 访问,该怎么办? (9认同)
  • @MarcelStimberg 请更新答案以包含 -i profile ;人们可能有不止 1 个键并把它们全部按下,或者必须在注释中寻找 -i 选项 (2认同)

Huy*_*ens 161

我喜欢马塞尔的回答。我不知道这个命令。我一直在使用我在Oracle 网站上找到的内容:

cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> .ssh/authorized_keys && echo "Key copied"'
Run Code Online (Sandbox Code Playgroud)

我想在这里仍然发布它,因为它是一个什么样可以实现很好的例证shell代码用的功率ssh。但是使用ssh-copy-id绝对是一种更安全的正确方式!

请注意,如果该文件夹.ssh尚不存在,则上述命令将失败。此外,在创建文件时设置最小可能的权限可能会更好(基本上只对所有者进行读写)。这是一个更高级的命令:

cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'umask 0077; mkdir -p .ssh; cat >> .ssh/authorized_keys && echo "Key copied"'
Run Code Online (Sandbox Code Playgroud)

  • 这个确切的命令也适用于 Mac (2认同)
  • `cat` 不是必需的 - 普通的输入重定向就足够了,例如 `&lt; ~/.ssh/id_rsa.pub | ssh ...` (2认同)
  • 我更喜欢这种方式,因为它可以让您使用冗长的 ssh,这有助于找出问题的原因。sshcopyid 只是冻结并且从未工作过,这很完美。 (2认同)

ænd*_*rük 32

图解法

  1. 打开应用程序密码和密钥我的个人钥匙
  2. 选择您的密钥,然后单击远程为 Secure Shell 配置密钥

为 SSH 连接设置计算机

  • 这个程序是“海马”。 (4认同)

Lek*_*eyn 20

在 Ubuntu 上,您可以从 Launchpad 获取您的密钥:

ssh-import-id [launchpad account name]
Run Code Online (Sandbox Code Playgroud)

详情

  1. 您需要一个 Launchpad 帐户,以便登录或创建一个帐户
  2. 登录后,单击SSH 密钥旁边的按钮
  3. 将公钥文件的内容粘贴到该字段中(包括评论)。这样的键看起来像:

    ssh-rsa AAAAB3Nza .... UyDOFDqJp lekensteyn
    
    Run Code Online (Sandbox Code Playgroud)

    此处,ssh-rsa表示密钥是 RSA 密钥,AAAAB3Nza .... UyDOFDqJp是实际密钥,lekensteyn是注释。

  4. 导入公钥保存密钥
  5. 如果一切顺利,您的密钥现在应该列在SSH 密钥下:

该软件包ssh-import-id需要安装在需要从远程访问的机器上。此包与openssh-server包一起安装,因为它是openssh-server. 确保ssh-import-id已安装在客户端计算机上后,运行:

ssh-import-id [launchpad account name]
Run Code Online (Sandbox Code Playgroud)

这将通过 HTTPS 从 Launchpad 服务器下载公钥,从而保护您免受 MITM 攻击。

在 Ubuntu Lucid 及之前,您可以通过以下方式完成相同的操作:

wget https://launchpad.net/~[lp acount name]/+sshkeys -O - >> ~/.ssh/authorized_keys && echo >> ~/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

echo命令需要在带有 SSH 密钥的行之后获得一个额外的换行符。


Oma*_* S. 15

自定义端口

ssh-copy-id -i "user@hostname.example.com -p2222"
Run Code Online (Sandbox Code Playgroud)

-i 开关默认为 ~/.ssh/id_rsa.pub,如果你想要另一个密钥,把密钥的路径放在 -i 之后

警告:如果你没有写 -i 它会复制你在 ~/.ssh 中找到的所有密钥


Vic*_*tii 11

解决方法很简单:

移动~/.ssh到新机器并运行ssh-add。完毕!

长答案:

  1. 在旧机器中,将文件夹带~/.ssh到 USB 驱动器或您喜欢的任何其他存储设备。
  2. 在新机器上,将文件夹放在~aka下/home/$USER
  3. 运行ssh-add,在新机器上完成。

PS做了很多次。我对互联网上过于复杂的解决方案感到惊讶,这些解决方案通常不起作用。

  • 重要添加,确保恢复文件权限, sudo chmod 600 ~/.ssh/id_rsa sudo chmod 600 ~/.ssh/id_rsa.pub sudo chmod 644 ~/.ssh/known_hosts 和文件夹,如果整个文件夹被复制须藤 chmod 755 ~/.ssh (2认同)
  • 请更新您的帖子 - 您的解决方案可以很好地为另一台工作机器复制 ssh 密钥(例如从台式机到笔记本电脑),但为活动主机\服务器复制 ssh 密钥是个坏主意(这就是其他答案“过于复杂”的原因)。感谢您的回答 - 它也对我有用。 (2认同)

isa*_*pir 5

ssh-copy-id正是这样做的。我不确定为什么这里的其他一些答案添加了不准确的信息。帮助显示如下:

~$ ssh-copy-id -h
Usage: /usr/bin/ssh-copy-id [-h|-?|-f|-n] [-i [identity_file]] [-p port] [[-o <ssh -o options>] ...] [user@]hostname
    -f: force mode -- copy keys without trying to check if they are already installed
    -n: dry run    -- no keys are actually copied
    -h|-?: print this help
Run Code Online (Sandbox Code Playgroud)

我刚刚在 Ubuntu 18.04 客户端和 CentOS 7.6 服务器上尝试了以下操作,效果非常好。该示例显示使用 的自定义端口2222,并在以下位置指定公钥~/.ssh/path-to-rsa.pub

$ ssh-copy-id -i ~/.ssh/path-to-rsa.pub -p 2222 myusername@hostname.tld
Run Code Online (Sandbox Code Playgroud)

在运行该命令之前,我实际上使用了-n最后的开关进行了一次试运行,以确认该命令将按预期工作。一旦我确认了这一点,我就按照上面的方式再次运行命令,没有-n开关。