未设置ssh代理(未设置SSH_AUTH_SOCK,SSH_AGENT_PID env vars)


13

我在Kubuntu 12.04上为朋友设置了一个新的用户帐户。当他使用时ssh,会出现以下错误:

无法打开与身份验证代理的连接

我们正在ssh一些bash脚本中运行。

在研究了可能导致该错误的各种因素之后,我想到了以下解决方案:

$ eval `ssh-agent -s`
$ ssh-add ~/.ssh/some_id_rsa

然后,他可以ssh按预期运行命令(和bash脚本)。

在运行这两个命令之前,不会在终端中设置env变量:

$ echo $SSH_AGENT_PID

$ echo $SSH_AUTH_SOCK

$ 

运行命令后,env变量将按预期设置。但是,它们不会保持设置状态(例如,在其他外壳中或在重新启动后)。

我想知道如何设置他的计算机,这样他就不必运行这两个命令来设置env变量。我不需要在计算机上运行它们。到目前为止,我还没有看到我们的机器之间有什么不同。

我在手册页中看到了此信息,但是它并没有告诉我Ubuntu通常是如何自动设置代理的,或者我朋友的计算机上正在发生什么,从而对他不起作用。

设置代理的方法主要有两种:第一种方法是,代理启动一个新的子命令,将某些环境变量导出到该子命令中,例如ssh-agent xterm&。第二个问题是,代理会打印所需的shell命令(可以生成sh(1)或csh(1)语法),这些命令可以在调用shell中进行评估,例如,ssh-agent -s对于bourne 类型的shell(例如sh(1)或ksh(1)和eval ssh-agent -c用于csh(1)及其派生类。

安装acct并重新启动后,这是输出lastcomm

ssh-agent         F    newuser __         0.12 secs Wed Aug  7 11:02
ssh-agent         F    newuser __         0.00 secs Wed Aug  7 20:34
ssh-agent         F    newuser __         0.02 secs Wed Aug  7 20:02
ssh-agent         F    newuser __         0.01 secs Thu Aug  8 12:39
ssh-agent         F    newuser __         0.02 secs Thu Aug  8 07:45

从手册页:

F-在派生后执行但没有后续exec的命令

我不确定这是否很重要。


2
在Ubuntu下,ssh-agent通常从开始/etc/X11/Xsession.d/90x11-common_ssh-agent。可以通过use-ssh-agent从中删除来抑制这种情况/etc/X11/Xsession。这些文件正确吗?代理是否已启动然后被杀死或从未启动?(登录后安装acct并运行lastcomm以查看启动了哪些程序。)
Gilles'SO-别邪恶了'

@吉尔斯,谢谢你。这两个文件在我的机器和他的机器上是相同的。我们都有X11/Xsession.options:use-ssh-agentX11/Xsession.d/90x11-common_ssh-agent:SSHAGENT=/usr/bin/ssh-agent。我会尝试acctlastcomm下一步。谢谢
MountainX

更新的问题
MountainX

仍在寻找解决方案...
MountainX

请发布lastcomm完整会话的输出,而不仅仅是ssh-agent过程。关键是要看各种程序以什么顺序启动。
吉尔(Gilles)'所以

Answers:


0

您提到您的用户正在ssh登录,而不是本地登录。因此,use-ssh-agent/etc/X11/Xsession.options一个红色的鲱鱼:它不会在SSH会话登录,只有当为X11 GUI桌面本地(或使用像在VNC或RDP一些虚拟的X11会议)执行。

相反,您应该检查libpam-ssh两个系统上是否都已安装。可以将其配置为使用SSH私钥密码短语对用户进行身份验证,但这是可选的,您需要为此功能专门放置密钥~/.ssh/login-keys.d/

但是,它的另一个功能是在任何登录会话中自动启动SSH代理,如果SSH私钥的密码短语与用户的登录密码相同,则自动将SSH私钥添加到代理。我认为这可能是系统之间行为不同的原因。


3

为了

$ eval `ssh-agent -s`

当放置在“启动脚本”中时,您的会话必须是该脚本的后代(由forkexec),才能正常工作。原因是ssh-agent -s,在评估输出时,将在shell调用中eval设置环境变量。从那里开始,它们可能会被流放下来,也可能在途中丢失。

因此,如果ssh-agent在登录期间某处由脚本A运行,但是在其中启动Shell脚本的终端B 不是 A 的后代,那么您将看不到B中的环境。

如果您恰好是ssh-agent作为systemd --user服务启动的,则可能不得不改用约定:不要让ssh-agent 变量指定,而是在启动代理和启动会话时使用常识。例如,我的 ~/.config/systemd/user/ssh-agent.service样子是这样的:

[Unit]
Description=SSH agent

[Service]
Type=simple
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -D -a $SSH_AUTH_SOCK

[Install]
WantedBy=default.target

而在我的~/.profile我也行

export SSH_AUTH_SOCK="${XDG_RUNTIME_DIR}/ssh-agent.socket"

注意,%t前者对应${XDG_RUNTIME_DIR}于后者。

注意:对此我不满意!


1

我在这里找到了答案:

http://www.bernatchez.net/userauth.html

在ubuntu上,ssh-add实用程序无法加载证书文件。当代理是通过gnome-keyring实现的代理时,就会发生这种情况。解决方法是停止使用gnome-keyring的ssh组件。由于初始化过程实际上是启动了一个真正的ssh-agent,然后启动了gnome-keyring-ssh.desktop,该文件掩盖了AUTH_SOCKET来接管它,因此我们可以通过禁用gnome-keyring-ssh.desktop来恢复到原始的ssh-agent。

禁用gnome-keyring-ssh.desktop:

cd /etc/xdg/autostart/
sudo emacs gnome-keyring-ssh.desktop

将以下行添加到桌面文件并保存,然后重新启动:

X-GNOME-Autostart-enabled=false

0

你提到过

$ eval `ssh-agent -s`
$ ssh-add ~/.ssh/some_id_rsa

根据需要工作。因此,您只需要在.bash_profile或.xsession中在适当的时间执行它们即可。添加调试语句,例如,(date; env|sort) >> /tmp/log以帮助您准确了解它们的运行时间。

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.