ssh-agent 未设置(SSH_AUTH_SOCK、SSH_AGENT_PID 环境变量未设置)

Mou*_*inX 16 bash ssh ssh-agent kubuntu

我在 Kubuntu 12.04 上为朋友设置了一个新用户帐户。当他使用时,ssh他收到此错误:

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

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

在查看了可能导致该错误的各种各样的事情之后,我遇到了这个解决方案:

$ eval `ssh-agent -s`
$ ssh-add ~/.ssh/some_id_rsa
Run Code Online (Sandbox Code Playgroud)

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

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

$ echo $SSH_AGENT_PID

$ echo $SSH_AUTH_SOCK

$ 
Run Code Online (Sandbox Code Playgroud)

运行命令后,环境变量按预期设置。但是,它们不会保持设置(例如,在不同的外壳中或重新启动后)。

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

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

设置代理有两种主要方法:第一种是代理启动一个新的子命令,一些环境变量被导出到其中,例如 ssh-agent xterm &。第二个是代理打印所需的 shell 命令(可以生成 sh(1) 或 csh(1) 语法),这些命令可以在调用 shell 中进行评估,例如 evalssh-agent -s用于 Bourne 类型的 shell,例如 sh(1) 或ksh(1) 和 evalssh-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
Run Code Online (Sandbox Code Playgroud)

从手册页:

F - 在 fork 之后执行的命令但没有后续的 exec

我不确定这是否重要。

ste*_*fan 5

为了

$ eval `ssh-agent -s`
Run Code Online (Sandbox Code Playgroud)

构造在放入“启动脚本”时工作,您的会话以及最终您期望环境的终端必须是该脚本的后代(由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
Run Code Online (Sandbox Code Playgroud)

在我~/.profile我有这条线

export SSH_AUTH_SOCK="${XDG_RUNTIME_DIR}/ssh-agent.socket"
Run Code Online (Sandbox Code Playgroud)

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

注意:我对此不满意!


tel*_*coM 2

您提到您的用户正在ssh登录,而不是本地登录。因此,这个use-ssh-agentin/etc/X11/Xsession.options是一个转移注意力的东西:它不会在 SSH 会话上执行,只有在本地登录到 X11 GUI 桌面(或使用某些虚拟 X11 会话,如通过 VNC 或 RDP)时才会执行。

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

不过,它的另一个功能是在任何登录会话上自动启动 SSH 代理,并在密码与用户的登录密码相同的情况下自动将 SSH 私钥添加到代理中。我认为这可能是导致您的系统之间行为不同的原因。