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 中进行评估,例如 eval
ssh-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
我不确定这是否重要。
为了
$ eval `ssh-agent -s`
Run Code Online (Sandbox Code Playgroud)
构造在放入“启动脚本”时工作,您的会话以及最终您期望环境的终端必须是该脚本的后代(由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
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}于后者。
注意:我对此不满意!
您提到您的用户正在ssh登录,而不是本地登录。因此,这个use-ssh-agentin/etc/X11/Xsession.options是一个转移注意力的东西:它不会在 SSH 会话上执行,只有在本地登录到 X11 GUI 桌面(或使用某些虚拟 X11 会话,如通过 VNC 或 RDP)时才会执行。
相反,您应该检查是否libpam-ssh安装在任一系统上。可以将其配置为使用 SSH 私钥密码对用户进行身份验证,但这是可选的,您需要专门放置密钥才能~/.ssh/login-keys.d/实现该功能。
不过,它的另一个功能是在任何登录会话上自动启动 SSH 代理,并在密码与用户的登录密码相同的情况下自动将 SSH 私钥添加到代理中。我认为这可能是导致您的系统之间行为不同的原因。