如何设置 SSH 以便在连接主机时不必输入密码?
答案1
生成 SSH 密钥(如果您没有)
如果你碰巧使用 GNOME,海马应用程序(“密码和加密密钥”)可以为您完成此操作:文件->新的->安全外壳密钥。
如果您更喜欢终端,请运行以生成密钥对。有效的密钥对类型为:ssh-keygen -t <type>
- rsa:默认
- dsa:大致相同,但密钥限制为 1024 位
- ecdsa:具有相同的安全性,但密钥较小,但在 SSH 软件中相对较新且比较少见。
- ed25519:安全性高(更能抵抗侧信道攻击和弱随机数生成器)。签名生成速度非常快。非常新。仅在OpenSSH >= 6.5。
该程序将要求您提供密码以及保存新密钥的位置。建议使用建议的默认路径,因为所有其他工具都会在那里查找它。
将公钥上传到远程服务器
再次,海马可以经常为你做到这一点我的个人钥匙,右键单击您的 SSH 密钥并选择配置安全外壳的密钥。
或者,ssh-copy-id -i ~/.ssh/id_rsa.pub remote-user@remote-host
在终端。
或者,完全手动逐步进行:
.ssh
在远程主机上,创建一个以远程用户的主目录命名的目录(如果该目录尚不存在) 。authorized_keys
在该目录中,创建一个名为(如果它尚不存在)的文件。- 如果您的远程
umask
比平常更自由,请使该文件不可组写:chmod go-w ~/.ssh ~/.ssh/authorized_keys
。 - 最后,以某种方式复制(附加)本地的内容公钥(
~/.ssh/id_rsa.pub
)进入远程~/.ssh/authorized_keys
文件。
将密钥加载到 ssh 代理中
如果你将私钥加载到 ssh代理人,它将把解密的密钥保存在内存中。我们希望这样可以避免每次进入服务器时都重新输入密码。
首先,必须启动代理或将已启动的通信套接字的路径加载到变量中。运行ssh 代理在终端上将生成用于分配和设置代理变量的命令。这些命令可以保存在文件中以供在不同终端中使用。或者,可以运行这些命令,而不必在另一个终端中重复使用同一个代理。例如:eval $(ssh-agent)
。
加载密钥很简单,只需执行ssh-add
并输入密码即可。
如果你正在使用 GNOME,gnome-keyring-守护进程通常提供与 ssh-agent 相同的 SSH 代理功能,因此您不需要启动任何东西。GNOME 也会在登录时自动加载和解锁密钥。
无需密码即可进入远程服务器
如果所有操作都正确,使用将不会提示您输入密码。如果代理有问题而不是密钥有问题,您将被要求输入密钥的密码,而不是用户帐户的密码。ssh user@server
只要在代理中加载了正确的密钥,使用 ssh 进行通信的任何程序都可以工作,而无需输入用户帐户密码。以下程序SCP,安全FTP和同步利用这个。
笔记:
- 您只需要一个 SSHv2 密钥,因为 SSHv1 非常不安全并且现在已不再使用。
- 您也只需要一种类型的密钥 - RSA 或 DSA 就足够了。(ed25519 和 ECDSA 都是最新的,因此并非所有地方都支持)。
- 对于 RSA 和 DSA 密钥,所有这些步骤都是相同的。如果您使用 DSA,请使用
id_dsa
而不是id_rsa
,ECDSA 将具有id_ecdsa
。 - 使用的 OpenSSH 服务器版本早于 3.0
authorized_keys2
- 但您不太可能发现正在使用的 5.0 之前的版本。 - 这些说明仅适用于 OpenSSH 3.0 及更新版本。
lsh
本ssh.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 代理 > ~/.ssh/跨终端代理 .~/.ssh/跨终端代理
答案2
您没有指定您使用的是哪种 Unix、您正在连接到哪种 Unix、您正在使用哪种 shell、您正在使用哪种 SSH 变体等等。因此,其中一些可能需要稍作调整;这是基于相当新的 OpenSSH 版本,它在许多 unix 变体上使用。
这一切都来自您的本地桌面系统。
ssh-keygen
确保使用默认的键名。我建议你做在该密钥上设置密码,否则会出现安全问题。“-t rsa”不是一个坏主意,但可能不需要。
ssh-copy-id username@server
它将要求您输入用于登录的密码,并为您设置authorized_keys。(无需手动执行)
然后,这个:
`ssh-agent`
或者可能是这样:
exec ssh-agent sh
或者:
exec ssh-agent bash
这将启动一个可以保存密钥的 SSH 代理。在许多现代 Unix 变体中,如果您以图形方式登录,则此操作已完成。第一个变体(带反引号)将 ssh-agent 放入后台并设置环境变量以与其通信。后两个变体让代理为您运行 shell,这样当您退出 shell 时,代理也会退出。
许多现代 Unix 变体已经为您运行了代理,特别是如果您以图形方式登录。您可以尝试“ ps aux | grep ssh-agent
”或“ ps -ef | grep ssh-agent
”;如果某个代理已在运行,请使用它。
最后:
ssh-add
它会要求输入密码;输入您提供给 ssh-keygen 的密码。还有方法让它以图形方式询问。您可以将 ssh-agent 和 ssh-add 内容放入登录脚本(设置因您使用的 shell 而异)以自动执行此操作,但某些 Unix 变体(例如当前的 Ubuntu Linux)会自动执行大部分操作,因此您真正需要做的就是创建一个密钥并使用 ssh-copy-id 在远程主机上进行设置。
现在,“ ssh username@server
” 应该可以正常工作,无需任何身份验证。在后台,它使用 ssh-agent 持有的密钥,并要求代理为其执行神奇的签名技巧。
答案3
可以在油灰在 Windows 上也是如此。
设置好公钥/私钥对后(如此处其他答案所示),运行 PuttyGen。在其中,加载已设置的现有私钥,然后将其保存为 PuTTY 私钥 (ppk)。
然后在 PuTTY 中,只需单击要自动登录的已保存会话,然后单击“加载”。从这里进入左侧窗格中的“连接”->“数据”,然后在“自动登录用户名”中输入该远程服务器的用户名:
之后进入连接 -> SSH -> Auth,并浏览您在 PuttyGen 中制作的 ppk:
然后返回会话页面并保存您之前加载的会话。
答案4
来自一个非常相似的问题服务器故障,我建议使用ssh-复制-id,它将为您完成设置身份验证密钥所涉及的所有步骤:
ssh-copy-id 是一个使用 ssh 登录远程机器的脚本(大概使用登录密码,因此应该启用密码验证,除非你巧妙地使用了多重身份)
它还会更改远程用户的主目录、~/.ssh 和 ~/.ssh/authorized_keys 的权限以删除组可写性(如果远程 sshd 在其配置中设置了 StrictModes,则会阻止您登录)。
如果给出了 -i 选项,则使用身份文件(默认为 ~/.ssh/identity.pub),不管您的 ssh-agent 中是否有任何密钥。
您需要做的只是这样做:
ssh-copy-id user@host
输入一次密码,就可以开始了!