无法连接到正在运行的 ssh-agent

无法连接到正在运行的 ssh-agent

我连接到 Ubuntu 12.04 服务器上一个长期运行的屏幕会话,并将其用作我连接到的其他设备的跳转框。因此,我希望在该机器上有一个长期运行的 ssh 代理。为此,我在 .bashrc 中编写了以下内容:

pgrep -u pdickey ssh-agent > /dev/null || ssh-agent -a $HOME/.ssh-auth-sock
SSH_AUTH_SOCK=$HOME/.ssh-auth-sock
export SSH_AUTH_SOCK

只要我的屏幕会话永不断开,这就可以完美运行。我可以生成新的屏幕,它们都获得相同的代理。当我与具有原始 ssh 会话的机器断开连接时,就会出现问题。重新连接时,我得到以下信息:

$ ssh-add -l
Could not open a connection to your authentication agent.

我发现的有关此问题的一切似乎都表明这种情况发生在代理未运行时,但我可以验证它正在运行,并且 $SSH_AUTH_SOCK 变量已设置:

$ ps -fu pdickey | grep ssh-agent
pdickey    435     1  0 04:11 ?        00:00:00 ssh-agent -a /home/pdickey/.ssh-auth-sock
$ echo $SSH_AUTH_SOCK
/home/pdickey/.ssh-auth-sock

那么为什么它没有连接呢?我拥有这个插座:

$ ls -la .ssh-auth-sock 
srw------- 1 pdickey pdickey 0 Mar 10 04:33 .ssh-auth-sock=

我甚至对这个过程进行了跟踪,在筛选了所有的库加载之后,它提供了大部分无用的信息:

64962 connect(3, {sa_family=AF_FILE, path="/home/pdickey/.ssh-auth-sock"}, 110) = -1 ECONNREFUSED (Connection refused)

这是我现在对 linux / ubuntu / ssh 知识的极限。为什么我拥有的套接字(由我拥有的进程创建)会拒绝来自我拥有的另一个进程的连接?

答案1

事实证明,这是因为我决定加密我的主目录,并将 auth-sock 放在那里……这意味着当我完全脱离屏幕时,我正在运行的程序将无法访问我的主目录,这会破坏 ssh-agent。它不会像删除套接字通常那样终止 ssh-agent 进程,也不会删除套接字,因为它位于机器无法再访问的加密目录中。这还表现出其他奇怪的现象,例如,如果我未登录,我的 cron 守护程序就无法在我的主目录中运行脚本。

相关内容