如何设置 SSH 以便我不必输入密码?

Ric*_*ins 165 ssh unix

如何设置 SSH,以便在连接到主机时不必输入密码?

use*_*686 185

生成一个 SSH 密钥(如果你没有)

如果您碰巧使用 GNOME,seahorse应用程序(“密码和加密密钥”)可以为您完成:File -> New -> Secure Shell Key

如果您更喜欢终端,请运行以生成密钥对。有效的密钥对类型是:ssh-keygen -t <type>

  • rsa:默认
  • dsa:或多或少等效,但仅限于 1024 位密钥
  • ecdsa:使用较小的密钥具有相同的安全性,但相对较新,并且在 SSH 软件中很少见。
  • ed25519:高安全性(更能抵抗侧信道攻击和弱随机数生成器)。非常快的签名生成。很新。仅在OpenSSH >= 6.5 中可用。

该程序将要求您输入密码和保存新密钥的位置。建议使用建议的默认路径,因为所有其他工具都会在那里寻找它。

将公钥上传到远程服务器

同样,seahorse通常可以为您执行此操作 - 在我的个人密钥中,右键单击您的 SSH 密钥并选择为安全外壳配置密钥

或者,ssh-copy-id -i ~/.ssh/id_rsa.pub remote-user@remote-host在终端中。

或者,完全手动逐步:

  1. .ssh在远程主机上的远程用户的主目录中创建一个目录(如果它不存在)。
  2. 在该目录中,创建一个名为authorized_keys(如果它不存在)的文件。
  3. 如果您的遥控器umask比平时更自由,请将文件设为不可组写:chmod go-w ~/.ssh ~/.ssh/authorized_keys.
  4. 最后,以某种方式将本地公钥( ~/.ssh/id_rsa.pub)的内容复制(附加)到远程~/.ssh/authorized_keys文件中。

将密钥加载到 ssh 代理中

如果您将私钥加载到 ssh代理中,它将在内存中保存解密的密钥。我们希望这样可以避免在我们 shell 进入服务器时重新输入密码。

首先,必须启动代理或将启动的通信套接字的路径加载到变量中。在终端上运行ssh-agent将生成用于分配和设置代理变量的命令。这些命令可以保存在一个文件中,以便在不同的终端中使用。或者,可以运行这些命令而忘记在另一个终端中重新使用相同的代理。例如:eval $(ssh-agent)

加载密钥很简单,只需执行ssh-add并提供密码短语即可。

如果您使用 GNOME,gnome-keyring-daemon通常提供与 ssh-agent 相同的 SSH 代理功能,因此您不需要启动任何东西。GNOME 也会在登录时自动加载和解锁密钥。

无需密码即可进入远程服务器

如果一切都正确完成,使用不会提示您输入密码。如果代理有问题而不是密钥有问题,您将被要求输入密钥的密码短语,而不是用户帐户的密码。ssh user@server

当在代理中加载正确的密钥时,任何使用 ssh 进行通信的内容都可以在不输入用户帐户密码的情况下工作。scpsftprsync等程序利用了这一点。


笔记:

  • 您只需要一个 SSHv2 密钥,因为 SSHv1 非常不安全并且现在未使用。
  • 您还只需要一种类型的密钥 - RSA 或 DSA 就足够了。(ed25519 和 ECDSA 都是最新的,因此并非所有地方都支持)。
  • 所有这些步骤对于 RSA 和 DSA 密钥都是相同的。如果您使用 DSA,请使用id_dsa代替id_rsa,ECDSA 将有id_ecdsa.
  • 使用了早于 3.0 的 OpenSSH 服务器authorized_keys2- 但你真的不太可能找到任何早于 5.0 的服务器正在使用中。
  • 这些说明仅适用于 OpenSSH 3.0 及更新版本。lshssh.com和其他(Unix 和非 Unix)SSH 服务器不包括在本教程中。

例子:

  • 将公钥复制到远程主机:

    ssh-copy-id -i ~/.ssh/id_rsa.pub myaccount@remotehost # 这个
    
    cat ~/.ssh/id_rsa.pub | ssh myaccount@remotehost \
          'mkdir -p ~/.ssh ; cat >> ~/.ssh/authorized_keys' # 或者这个
    
  • 保存代理变量以供重用(详细示例)
    ssh-agent > ~/.ssh/cross-terminal-agent
    . ~/.ssh/cross-terminal-agent
    

  • 啊,你必须说“ssh-add {path-to-private-key-file}”然后它会问你密码。请在您的帖子中更明确地说明这一点。您还应该添加“第四,运行ssh”。与这些内容有关的文档的部分问题在于,它掩盖了看似明显的步骤,对于不知道正在发生什么以及这些程序如何协同工作的流程新手来说,这些步骤并不明显。 (7认同)
  • 有一个命令 `ssh-copy-id` 将公钥复制到目标主机并自动设置权限。 (4认同)
  • 值得一提的是,一旦您设置了 SSH 密钥,您应该考虑通过在 `/etc/sshd_config` 中设置 `PasswordAuthentication no` 来禁用 SSH 上的密码身份验证。 (2认同)

fre*_*eit 23

你没有指定你在什么 Unix 上,你连接到什么 Unix,你正在使用什么 shell,你正在使用什么 SSH 变体等等。所以其中一些可能需要稍微调整;这是基于相当新的 OpenSSH 版本,它用于许多 unix 变体。

这一切都来自您的本地桌面系统。

ssh-keygen
Run Code Online (Sandbox Code Playgroud)

确保使用默认键名。我建议你不要设置在该键的密码,否则这是一个安全问题。“-t rsa”不是一个坏主意,但可能不需要。

ssh-copy-id username@server
Run Code Online (Sandbox Code Playgroud)

这将询问您用于登录的密码,并为您设置authorized_keys 内容。(无需手动完成)

然后,这个:

`ssh-agent`
Run Code Online (Sandbox Code Playgroud)

或者这个:

exec ssh-agent sh
Run Code Online (Sandbox Code Playgroud)

或者:

exec ssh-agent bash
Run Code Online (Sandbox Code Playgroud)

这将启动一个可以保存您的密钥的 SSH 代理。在许多现代 Unix 变体上,如果您以图形方式登录,这已经发生了。第一个变体(带反引号)将 ssh-agent 置于后台并设置环境变量以与之对话。后两个让代理为您运行一个 shell,这样当您退出 shell 时,代理就会退出。

许多现代 Unix 变体已经为您运行了一个代理,特别是如果您以图形方式登录。你可以试试“ ps aux | grep ssh-agent”或“ ps -ef | grep ssh-agent”;如果某些东西已经在运行,请使用它。

然后,最后:

ssh-add
Run Code Online (Sandbox Code Playgroud)

它会要求输入密码;给它你给 ssh-keygen 的那个。还有一些方法可以让它以图形方式询问。您可以将 ssh-agent 和 ssh-add 内容放入您的登录脚本(设置因您使用的外壳而异)以自动执行此操作,但某些 Unix 变体(例如当前的 Ubuntu Linux)会自动执行大部分操作,因此您真正需要做的就是创建一个密钥并使用 ssh-copy-id 在远程主机上设置它。

现在,“ ssh username@server”应该可以在不要求任何身份验证的情况下工作。在幕后,它使用 ssh-agent 持有的密钥,并要求代理为它执行魔术签名技巧。


スーパ*_*ミコン 13

也可以在 Windows上的PuTTY 中执行此操作。

一旦您设置好公钥/私钥对(如此处的其他答案所示),运行 PuttyGen。在那里,加载您已经设置的现有私钥,然后将其保存为 PuTTY 私钥 (ppk)。

然后在 PuTTY 中,只需单击要自动登录的已保存会话并单击加载。从这里进入左侧窗格中的连接 -> 数据,然后在“自动登录用户名”中输入该远程服务器的用户名:

PuTTY 用户名条目

之后进入 Connection -> SSH -> Auth,并浏览你在 PuttyGen 中创建的 ppk:

PuTTY 私钥输入

然后返回会话页面并保存您之前加载的会话。

  • PuTTY 包括它自己的 ssh-agent 版本;它被称为选美。它在系统托盘中运行并为您保存密钥。您不需要运行 ssh-agent,只需在 Auth 部分下的 PuTTY 选项中选中“允许代理转发”,Pageant 的连接将被转发到远程端,以使您的密钥代理可用。 (2认同)

sce*_*aux 6

除了已经介绍的如何设置 ssh 密钥之外,我还建议使用Keychain作为ssh 代理控制台前端,它允许您为每个系统进程而不是每次登录处理一个密钥。

我知道已经有 GNOME 和 KDE 工具可以做同样的事情,但是如果您是控制台迷,那么这很棒(并且可以在大多数 Unix 系统上使用)。

要使用它,只需将以下内容附加到您的~/.bashrc(与其他 shell 类似):

if type keychain >/dev/null 2>/dev/null; then
  keychain --nogui -q <all your SSH/PGP keys>
  [ -f ~/.keychain/${HOSTNAME}-sh ] && . ~/.keychain/${HOSTNAME}-sh
  [ -f ~/.keychain/${HOSTNAME}-sh-gpg ] && . ~/.keychain/${HOSTNAME}-sh-gpg
fi
Run Code Online (Sandbox Code Playgroud)


Chr*_*nch 5

根据ServerFault上的一个非常类似的问题,我建议使用ssh-copy-id,它会执行为您设置身份验证密钥所涉及的所有步骤:

ssh-copy-id 是一个使用 ssh 登录远程计算机的脚本(大概使用登录密码,因此应该启用密码身份验证,除非您巧妙地使用了多个身份)

它还会更改远程用户的 home、~/.ssh 和 ~/.ssh/authorized_keys 的权限,以删除组可写性(如果远程 sshd 在其配置中设置了 StrictModes,这将阻止您登录)。

如果给出 -i 选项,则使用身份文件(默认为 ~/.ssh/identity.pub),无论 ssh-agent 中是否有任何密钥。

您需要做的只是这样:

ssh-copy-id user@host
Run Code Online (Sandbox Code Playgroud)

输入一次密码,就可以开始了!