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

评论

有人可能会争辩说,使用此类密钥是否不需要密码。为避免任何人抓住您的私钥实际上会滥用它,可以通过自己的密码来保护密钥。当然,可以将该密码留为空白,但是在很多情况下不建议这样做。

在具有最新SSH的最新Cygwin上,由于需要更改〜/ .ssh / config(现在需要此更改),我被重新提示

#1 楼

生成SSH密钥(如果您没有SSH密钥)

如果您恰巧使用GNOME,则海马应用程序(“密码和加密密钥”)可以为您完成:文件->新建- >安全外壳密钥。

如果您更喜欢终端,请运行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

或者完全手动地逐步进行操作:


创建
在远程主机上远程用户的主目录中名为.ssh的目录(如果尚不存在)。
在该目录中,创建一个名为authorized_keys的文件(如果尚不存在)。 br />如果您的远程umask比平常更为自由,请使该文件不可组写入:chmod go-w ~/.ssh ~/.ssh/authorized_keys
最后,以某种方式将本地公共密钥(~/.ssh/id_rsa.pub)的内容复制(附加)到远程~/.ssh/authorized_keys文件中。

将密钥加载到ssh代理中

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

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

加载密钥是执行ssh-add并为其指定密码的简单问题。 SSH代理功能与ssh-agent相同,因此您无需启动任何程序。 GNOME也会在登录时自动加载和解锁密钥。

无需密码即可将Shell装入远程服务器中。密码。如果代理而不是密钥有问题,则将要求您键入密钥的密码短语,而不是用户帐户的密码。

使用ssh进行通讯的任何操作都会在代理中加载正确密钥后,无需输入用户帐户密码即可工作。诸如scp,sftp和rsync之类的程序都使用此功能。


注意:不安全且现在不使用。
您还只需要一种密钥-RSA或DSA就足够了。 (ed25519和ECDSA都是最新的,因此到处都不支持)。
对于RSA和DSA密钥,所有这些步骤都是相同的。如果使用DSA,请使用ssh user@server而不是id_dsa,而ECDSA将具有id_rsa
3.0之前的OpenSSH服务器使用的是id_ecdsa-但实际上不可能发现使用5.0之前的任何东西。本教程不包括authorized_keys2lsh和其他(Unix和非SSH)SSH服务器。


示例:将公钥复制到远程主机:

ssh-copy-id -i ~/.ssh/id_rsa.pub myaccount@remotehost       # this

cat ~/.ssh/id_rsa.pub | ssh myaccount@remotehost \
      'mkdir -p ~/.ssh ; cat >> ~/.ssh/authorized_keys'     # or this


保存代理变量以供重用(详细示例)


评论


嗯,您必须说“ ssh-add {path-to-private-key-file}”,然后它将要求您输入密码。请在您的帖子中对此进行更明确的说明。您还应该添加“第四,运行ssh”。这些东西的文档的部分问题在于,它掩盖了看似显而易见的步骤,这些步骤对于那些不知道正在发生什么以及这些程序如何协同工作的新手来说并不明显。

–Jason S
09年7月18日在18:47

杰森:ssh-add -l用于检查代理是否正在运行。不带参数的ssh-add将从默认位置(〜/ .ssh / id_rsa)添加密钥。无论如何,已更新。

–user1686
09年7月18日在19:05

有一个命令ssh-copy-id可以将公钥复制到目标主机并自动设置权限。

–hasen
09年7月25日在4:54

好答案!关于密钥文件的文件权限,它缺少一些信息-我今天遇到了一个问题。我只能访问私钥文件,而我只能写公共密钥文件。

–ripper234
2010-10-28 8:42

值得一提的是,一旦设置了SSH密钥,您应该考虑通过在/ etc / sshd_config中设置PasswordAuthentication no来禁用SSH上的密码认证。

– dimo414
2015年5月19日在7:15

#2 楼

您没有指定正在使用的Unix,正在连接的Unix,正在使用的shell,正在使用的SSH变体等等。这是基于相当合理的最新版本的OpenSSH,该版本已在许多unix变体中使用。
确保使用默认名称作为键名。我建议您在该密钥上设置一个密码短语,否则是安全问题。 “ -t rsa”并不是一个坏主意,但可能不是必需的。并为您设置authorized_keys内容。 (无需手动操作)

然后,这个:

ssh-keygen


或者也许是这个:
ssh-copy-id username@server


或:

`ssh-agent`


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

许多现代Unix变体已经为您运行了代理程序,尤其是如果您登录后图形化。您可以尝试“ ps aux | grep ssh-agent”或“ ps -ef | grep ssh-agent”;

然后,最后:

exec ssh-agent sh


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

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

#3 楼

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

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

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



之后进入“连接”->“ SSH”->“身份验证”,然后浏览您在PuttyGen中创建的ppk: 。

评论


第一个图像链接“ PuTTY用户名条目”似乎已损坏。

– Peter Mortensen
09年8月20日在22:24

PuTTY包含自己的ssh-agent版本;它叫做选美。它在系统托盘中运行,并为您保留密钥。您不需要运行ssh-agent,只需在“身份验证”部分下的PuTTY选项中选中“允许代理转发”,然后Pageant的连接将转发到远程端,以使您的关键代理可用。

–凯文·潘科(Kevin Panko)
09年8月20日在22:48

#4 楼

从ServerFault的一个非常类似的问题开始,我建议使用ssh-copy-id,该步骤将为您设置身份验证密钥,包括所有步骤:
是一个使用ssh
登录到远程计算机的脚本
(大概使用登录密码,因此应该启用
密码认证,除非您已经做过一些
/>巧妙使用多个身份)

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

如果-给出i选项,然后使用
身份文件(默认为
〜/ .ssh / identity.pub),无论您的ssh-中是否有任何
键,
agent。


您需要做的只是这个:

您的密码一次,就可以了!

评论


我必须输入ssh-keygen -t rsa才能使它工作。

–Shmidt
20年7月27日在18:20

#5 楼

除了已被告知如何设置ssh密钥外,我还建议将Keychain作为ssh-agent控制台前端使用,它允许您仅在每个系统进程而不是每个登录名中处理一个。已经具有GNOME和KDE工具的功能,但是如果您是控制台迷类型的话,这很好(可以在大多数Unix系统上使用)。 (与其他外壳类似):

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


#6 楼

http://linuxproblem.org/art_9.html

您的目标
您想使用Linux和OpenSSH来自动执行任务。因此,您需要从主机A /用户a自动登录到主机B /用户b。您不想输入任何密码,因为您想在shell脚本中从中调用ssh。


评论


拒绝投票不是我的,但如果有人注意到其他人在不久前发布了几乎类似的回复,我也不会介意人们删除他们的答案。

– Arjan
09年7月18日在18:31

Arjan:我在很大程度上同意您的意见,但是当职位仅间隔几秒钟时,我不一定认为惩罚第二名的人是公平的。我并不是说您必须通过投票来奖励他们,但降低投票给人的印象是答案是错误的,而不是不及时

–TheTXI
09年7月18日在19:05

#7 楼

我对真正的长篇教程感到非常沮丧之后写了这篇非常简短的教程,因为它是如此简单:)

#8 楼

Putty具有-pw选项,可让您在桌面上创建快捷方式,如下所示:

"C:\Program Files\PuTTY\putty.exe" -ssh user@192.168.2.2 -pw your_password


#9 楼


在连接主机上,运行ssh-keygen。 (如果它告诉您必须指定一种类型,请执行ssh-keygen -t rsa。)当它询问您文件的位置时,请使用默认值。当它要求您输入密码短语时,请按Enter键以不输入密码短语。不同);将输出复制到剪贴板。
以您要连接的帐户正常登录到目标主机。编辑文件cat ~/.ssh/id_rsa.pub(如果ssh-keygen不存在,则将ssh复制到某个位置;这是使用正确的权限创建文件的简单方法。)将剪贴板(包含来自其他主机的~/.ssh/authorized_keys)粘贴到此文件中。


评论


-1,表示不添加密码。没有密码,读取文件的任何人现在都可以冒充合法用户。

– Bortzmeyer
09年7月18日在17:30

首先,他要求不必输入密码;我真的不认为必须输入密码短语而不是密码会有所改善。其次,你错了。这就是为什么有公共密钥和私有密钥,因此公共密钥可以在世界范围内发布的原因。

–混乱
09年7月18日在17:34

有问题的密码是在密钥生成期间输入的,而不是每次连接时输入。正确?

–理查德·霍斯金斯(Richard Hoskins)
09年7月18日在19:42

不能。使用密码短语生成的密钥要求每次使用密钥时都输入密码短语。

–混乱
09年7月18日在20:58

错误。使用ssh-agent(请参见接受的答案),每个会话仅键入一次密码。

– Bortzmeyer
09年7月18日在21:29

#10 楼

如果要在Linux终端中完成所有操作:
在主机上

cd〜/ .ssh /
ssh-keygen -t {rsa | dsa} -b {1024 | 2048 | 4096} -C“如果需要,请添加一些注释文本” -f id_ArbitraryName

{}中的选项是选项,请使用rsa或dsa并选择位数(更大的则是更多)安全)
,那么您需要将权限添加到authorized_keys和authorized_keys2文件中。
然后将id_AribtraryName文件下载到要ssh从的框中。如果接线盒是基于Unix的,则可能需要一个配置文件(在腻子中,上面提到的一个人)。
在接线盒上
在您的配置文件中-vim〜/ .ssh / config

主机example.host.com#或您的计算机名称
用户名
IdentityFile〜/ .ssh / id_ArbitraryName

配置文件需要600的权限。
SSh文件夹需要700。
希望对遇到很多遗漏的配置问题有所帮助。