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

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

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

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

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

在查看了可能导致该错误的各种因素之后,我发现了这个解决方案:

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

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

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

$ echo $SSH_AGENT_PID

$ echo $SSH_AUTH_SOCK

$ 

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

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

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

设置代理有两种主要方法:第一种是代理启动一个新的子命令,其中导出一些环境变量,例如
ssh-agent xterm &。第二个是代理打印所需的 shell 命令(可以生成 sh(1) 或 csh(1) 语法),这些命令可以在调用 shell 中进行评估,例如 eval `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  -- 命令在 fork 之后执行,但没有后续的 exec

我不确定这是否重要。

答案1

为了

$ eval `ssh-agent -s`

当放入“启动脚本”时,您的会话以及最终您期望环境所在的终端必须是该脚本的后代(由forkexec)。原因是 的输出ssh-agent -s在评估时设置了环境变量在 shell 中调用eval。它们可能从那里流传下来,也可能在途中丢失。

因此,如果ssh-agent在登录期间由脚本 A 运行,但启动 shell 脚本的终端 B 是不是后裔A 的环境,那么你就看不到 B 的环境。

如果您碰巧ssh-agentsystemd --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

在我的~/.profileI 有这条线

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

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

笔记:我对此不高兴!

答案2

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

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

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

答案3

你提到过

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

按预期工作。因此,您只需要在正确的时间在 .bash_profile 或 .xsession 中执行它们。添加调试语句以(date; env|sort) >> /tmp/log帮助您准确了解它们何时运行。

答案4

用于多用户 Jupyterhub Python 环境的 SSH-Keygen:

正在尝试设置SSH-注册机在一个多用户 Jupyter Python 环境事实证明这是一个重大挫折......这当然比 git 的纯文本 http 密码更可取。

我没有意识到运行 cmd 后并SSH_AUTH_SOCK没有转移到我的...ssh-addeval ssh-agent@斯特凡上面给出了非常好的描述,使这一切都得到了正确的看待!有关 ssh-add 手册页的更多有用信息这里还有...


您需要在单个 bash cmd 中运行所有内容!

以下是遵循 GitHub 说明的示例这里关于 ssh 密钥生成。

  • 请注意,我!在 python 单元中使用 (bang),因此它在 jupyter 中运行 bash 命令。更多信息这里
  • 另请注意将&& \我的 bash 命令包装在 jupyter python 笔记本单元中,因此它是命令:
!ssh-keygen -t ed25519 -C "[email protected]" -f $HOME/.ssh/id_ed25519 -N "" <<< y && \
eval "$(ssh-agent -s)" && \
ssh-add $HOME/.ssh/id_ed25519

确认您的 SSH 设置

继续将 SSH 密钥添加到 github。然后你应该能够确认您的 github 身份验证,这在运行以下命令时对我有用:

!ssh -o "StrictHostKeyChecking no" -T user@[email protected]
  • 请注意该标志-o "StrictHostKeyChecking no"不是考虑到可能存在中间人攻击,建议这样做。我不确定如何以编程方式接受这一点是的,或者您可以获取已知主机并手动添加到已知主机文件中。

相关内容