如何设置SSH,而不必键入密码?


153

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


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

在具有最新SSH的最新Cygwin上,我被提示,因为我需要对~/.ssh/config现在需要的内容 进行更改PubkeyAcceptedKeyTypes ssh-rsa*,ssh-dss*
HDave 2015年

Answers:


164

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

如果您碰巧使用了GNOME,则海马应用程序(“密码和加密密钥”)可以为您完成此操作: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 代理中,它将把解密后的密钥保存在内存中。我们希望这样可以避免在每次装入服务器时都重新输入密码。

首先,必须启动代理或将已启动的通信套接字的路径加载到变量中。在终端上运行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#此
    
    猫〜/ .ssh / id_rsa.pub | ssh myaccount @ remotehost \
          'mkdir -p〜/ .ssh; cat >>〜/ .ssh / authorized_keys'#或这个
    
  • 保存代理变量以供重用(详细示例)
    ssh代理>〜/ .ssh / cross-terminal-agent
    。〜/ .ssh /跨终端代理
    

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

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

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

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

1
一个衬里:(ssh-keygen -f ~/.ssh/id_rsa -N "";ssh-copy-id -i ~/.ssh/id_rsa username@server-ip-or-address只需更换username@server-ip-or-address)。
totymedli

22

您没有指定正在使用的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置于后台,并设置环境变量与之对话。后两个使代理为您运行外壳程序,因此当您退出外壳程序时,代理程序将退出。

许多现代的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持有的密钥,并要求该代理为其执行魔术签名技巧。


11

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

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

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

PuTTY用户名条目

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

腻子私钥输入

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


第一个图像链接“ PuTTY用户名条目”似乎已损坏。
彼得·莫滕森

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

3

ServerFault的一个非常类似的问题开始,我建议使用ssh-copy-id,它可以为您设置身份验证密钥,包括所有步骤:

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

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

如果指定了-i选项,则将使用身份文件(默认为〜/ .ssh / identity.pub),而不管ssh-agent中是否有任何密钥。

您需要做的只是这个:

ssh-copy-id user@host

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


3

除了已被告知如何设置ssh密钥外,我还建议将Keychain作为ssh-agent控制台前端使用,它允许您仅在每个系统进程而不是每次登录时处理一个。

我知道已经有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

2

http://linuxproblem.org/art_9.html

你的目标

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


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

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

2

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

test -f ~/.ssh/id_rsa.pub || ssh-keygen -t rsa #press enter twice if given prompts, then "ssh-add"

scp ~/.ssh/id_rsa.pub destID@destMachine:/tmp/ #type password

ssh destID@destMachine #type password

cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

rm /tmp/id_rsa.pub

2

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

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

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

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

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

有问题的密码是在密钥生成期间输入的,而不是每次连接时输入。正确?
理查德·霍斯金斯

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

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

0

如果要在Linux的终端中完成所有操作:

在主机上

cd〜/ .ssh /

ssh-keygen -t {rsa | dsa} -b {1024 | 2048 | 4096} -C“一些注释文本,如果需要的话” -f id_ArbitraryName

{}中的项目是选项,请使用rsa或dsa并选择位数(越大越安全)

然后,您需要将权限添加到authorized_keys和authorized_keys2文件。

猫id_ArbitraryName.pub >> authorized_keys

猫id_AribtraryName.pub >> authorized_keys2

然后,将id_AribtraryName文件下载到要从中进行ssh的框中。如果接线盒是基于Unix的,则可能需要一个配置文件(在腻子中,上面提到的那个人)。

在接线盒上

在您的配置文件中-vim〜/ .ssh / config

主机example.host.com#或您的计算机名称

用户名

IdentityFile〜/ .ssh / id_ArbitraryName

配置文件需要600的权限。SSh文件夹需要700。

如果您遇到了很多被忽略的配置问题,希望对您有所帮助。

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.