我在 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`
当放入“启动脚本”时,您的会话以及最终您期望环境所在的终端必须是该脚本的后代(由fork
和exec
)。原因是 的输出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
I 有这条线
export SSH_AUTH_SOCK="${XDG_RUNTIME_DIR}/ssh-agent.socket"
请注意,%t
前者对应于${XDG_RUNTIME_DIR}
后者。
笔记:我对此不高兴!
答案2
您提到您的用户正在ssh
登录,而不是本地登录。因此,这个use-ssh-agent
in/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-add
eval 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"
是不是考虑到可能存在中间人攻击,建议这样做。我不确定如何以编程方式接受这一点是的,或者您可以获取已知主机并手动添加到已知主机文件中。