我们已经设置了一个 CentOS 6.4 机器,可以使用无密码 SSH 连接到多个其他系统。当在 CentOS 计算机上以正确的用户身份直接使用终端时,这可以正常工作。但是,如果我以另一个系统中的相同用户之一身份登录 CentOS 机器,系统会提示我输入 RSA 密钥密码。当我以正确的用户身份登录时,为什么需要这样做?
因此,如果我们有三台机器(A、B 和 C)。A 已设置为无需密码即可通过 SSH 连接到机器 B。这样就没问题了。但是,如果我们从机器 C 通过 SSH 连接到 A,然后从该远程 SSH 终端尝试通过 SSH 连接到 B,则需要输入密码。
机器 A 上有访问其他几台机器的脚本(无需密码)。我们需要能够从机器 C 远程登录机器 A,然后启动访问机器 B 的脚本。
答案1
您的问题有些不清楚。看起来您正在使用 SSH 密钥,但 SSH 密钥受密码保护。但实际上,当您直接登录时,它也应该要求您输入该密码。
我会做什么:
- 在机器 A 上创建一个特殊用户(我们称之为“runscripts”),用于运行脚本。
- 为此用户创建一个未通过密码加密的 SSH 密钥。
- 配置 sudo 以允许机器 A 上的“普通”用户以用户“runscripts”的用户权限执行这些脚本,而无需输入密码。
以下是如何进行设置的完整示例:
创建一个无法登录的新用户(在我的系统上,这还将创建一个同名的新组,我将在下面使用它):
# adduser --disabled-password runscripts
成为此用户并创建 ssh 密钥。不要在密钥上设置密码,只需在密码提示符下按 Enter 即可。
# su runscripts
$ ssh-keygen
将公钥(在 ~/.ssh/id_rsa.pub 中)添加到目标机器(示例中为机器 B)上的 authorized_keys,然后短暂尝试通过 SSH 密钥登录(这也会将远程公钥添加到 known_hosts,以便它稍后不会再次提示)。
$ ssh [email protected]
回到机器 A:将普通用户帐户添加到组:
# adduser kju runscripts
创建一些使用 SSH 密钥的脚本并在 B 上执行某些操作:
# cat > /usr/local/bin/script1
#!/bin/sh
echo -n "Running as "
whoami
ssh remoteuser@machineB whoami
^D
# chmod +x /usr/local/bin/script1
最后允许 runscripts 组中的用户以用户 runscript 身份执行此脚本,无需密码。这是 /etc/sudoers 中的行:
%runscripts ALL=(runscripts) NOPASSWD:/usr/local/bin/script1
现在,作为 runscripts 组中的一个用户尝试运行该脚本:
$ sudo -u runscripts /user/local/bin/script1
Running as user runscripts
remoteuser
$
从此输出中可以看出,脚本以用户 runscripts 的身份执行。然后,它以用户“remoteuser”的身份登录到计算机 B,并执行“whoami”命令(然后当然返回“remoteuser”)。
这样做的好处是没有人能够窃取(未受保护的) SSH 密钥,因为它只能作为用户运行脚本访问,但人们只能使用此用户权限运行预定的脚本。
答案2
如果要避免这种情况,您需要生成没有密码的密钥并使用公钥身份验证。请执行以下操作:
a@A:~> ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/a/.ssh/id_rsa):
Created directory '/home/a/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/a/.ssh/id_rsa.
Your public key has been saved in /home/a/.ssh/id_rsa.pub.
The key fingerprint is:
3e:4f:05:79:3a:9f:96:7c:3b:ad:e9:58:37:bc:37:e4 a@A
换句话说,当系统提示你输入Enter passphrase (empty for no passphrase):
https://hkn.eecs.berkeley.edu/~dhsu/ssh_public_key_howto.html
答案3
你说,
作为之一那些相同的用户
所以我认为我们谈论的是多个用户。
如果我是对的,那么我认为可能发生的情况如下:
- 您以用户 A 身份登录
foo
- 机器B上的用户
bar
拥有B:/home/bar/.ssh/authorized_keys
的公钥foo
,其身份为A:/home/foo/.ssh/identity.rsa
。 - 所以当然
foo
可以从 A 发出ssh bar@B
并让它工作无密码。
现在如果bar
来自机器 C 的用户登录到机器 A就像他自己一样(“那些相同的用户之一”),即作为bar
,他成为bar@A
;而不是foo@A
。当他尝试以 身份登录时, 检索到的用于执行登录bar@B
的身份密钥是 ;它不是 A:/home/ssh
bar
富/.ssh/identity.rsa,但是 A:/home/酒吧/.ssh/identity.rsa 。也许那文件是被密码锁定。
所以:检查您的用户以及他们正在使用的身份。
答案4
要么生成没有密码的密钥,要么创建一个特殊的脚本,该脚本将使用变量从当前终端读取密码SSH_ASKPASS
。这在从相关脚本调用 ssh-add 时特别有用。例如:
install -vm700 <(echo "echo 'my_passphrase'") $HOME/.ps
cat /path/id_rsa | ssh-add DISPLAY= SSH_ASKPASS=$HOME/.ps -
笔记:
- 创建
.ps
脚本只是一次性的工作,其余的可以添加到你的rc文件。 ssh
如果有关联终端或DISPLAY
已设置终端,它将不起作用。- 如果您的 ssh-agent 没有运行,请运行:
eval "$(ssh-agent -s)"