一些理论

一些理论

在 Linux 上存在一个工具 - 我相信它是 ssh-agent - 它可以自动解锁一个人的 ssh 密钥,这样当使用 git 从远程存储库获取时,它将自动使用解锁的私钥,而无需输入密码。

现在我正在使用切换到另一个用户,当我在该会话中su执行时,它每次都会要求我输入私钥的密码。我想知道是否有一种方法可以在我使用该命令切换到另一个用户时自动解锁私钥。git pullsusu

因此更改为我通常使用的用户su otheruser并输入该用户的密码。

更新: 我终于让它工作了。以下是更多信息,假设爱丽丝是我用来登录图形会话的用户,鲍勃是我输入的用户su-m不需要 su 选项。

alice@earth $ps aux|grep ssh-agent
# added backlash to emphasize line break
alice  29878  0.0  0.0  10616   316 ?        Ss   15:49   0:00 \
    /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session \
    /usr/bin/im-launch \
    /usr/local/bin/my-session

alice@earth $echo $SSH_AUTH_SOCK
/tmp/ssh-nFneWW1biI9Q/agent.29796

alice@earth $echo $SSH_AGENT_PID
29878

现在我加入 Bob

alice@earth $su bob
Password:

bob@earth $echo $SSH_AGENT_PID
29878

bob@earth $echo $SSH_AUTH_SOCK
/tmp/ssh-nFneWW1biI9Q/agent.29796

bob@earth $eval $(ssh-agent)
SSH_AUTH_SOCK=/tmp/ssh-unCratTnFl4M/agent.6144; export SSH_AUTH_SOCK;
SSH_AGENT_PID=6145; export SSH_AGENT_PID;
echo Agent pid 6145;


bob@earth $echo $SSH_AGENT_PID
6145

bob@earth $echo $SSH_AUTH_SOCK
/tmp/ssh-unCratTnFl4M/agent.6144

最后我打电话ssh-add

bob@earth $ssh-add ~/.ssh/id_rsa
Enter passphrase for /home/bob/.ssh/id_rsa:
Identity added: /home/bob/.ssh/id_rsa (/home/bob/.ssh/id_rsa)

此后,我运行时git pull不再需要输入密码。

答案1

一些理论

ssh-agent通过存储在名为 的环境变量中的套接字访问SSH_AUTH_SOCK。如果您使用,这可能会消失su(出于安全原因)。您可以使用-mswitch 来阻止此行为,如手册页所su(1)建议的那样:

-m, -p, --preserve-environment
    Preserve the current environment, except for:

但是(也出于安全原因),此套接字仅可供创建它的用户访问:

$ ll $SSH_AUTH_SOCK
srwxrwxr-x 1 jakuje jakuje 0 Sep  2 21:23 /run/user/1000/keyring/ssh

如果您想要与之共享此套接字的某个安全组,则可以调整此套接字的 ACL,但我不建议您将其设置为可全世界写入!

对于问题

更改用户后su,您将无法再访问原始套接字。您需要运行 newssh-agent并向其添加密钥(并手动解锁):

eval `ssh-agent`
ssh-add path/to/your_key

另一种可能性是使用gnome-keyring-daemon,它基本上可以做同样的事情,但可以将其隐藏在某些主密码(通常是登录密码)后面。但问题没有说明使用的工具,所以我只能猜测其意图是什么。

相关内容