谁在启动我的 ssh-agent,为什么它不能正常终止?

Mar*_*lli 11 login ssh openssh ssh-agent raspbian

这是我长期以来一直遇到的一个问题,但每次我试图弄清楚一些事情时,我都会迷失方向,所以我想我最好在这里问一下,也许更有经验的人可以帮助我。

背景

我的 Raspberry Pi 正在运行 Raspbian Jessie,我经常使用 SSH 登录它并远程执行命令。在我的第一个 SSH 会话中,我注意到每次登录时都会在 RPi 上ssh-agent生成一个进程,但在ing时从未被杀死:多次登录和注销导致生成一堆进程,只是挂在那里什么也不做。四处闲逛,到处阅读手册页和答案,我最近了解了. 此外,我注意到发出会导致产生另一个实例。我在相关的手册页上阅读exitssh-agentssh-agentsource ~/.bashrcssh-agentSSH_AGENT_PID应该定义环境变量,因为ssh-agent程序应该在 an 中启动eval以执行其输出并定义此类变量,然后其他与 SSH 相关的命令使用这些变量,包括ssh-agent -k(杀死相对于当前会话的代理),所以我跑echo $SSH_AGENT_PIDecho $SSH_AUTH_SOCK,但它们都是空的。我突然意识到:可能该进程不会在注销时被杀死,因为它ssh-agent -k试图从未设置的环境变量中读取其 PID。

问题

由于ssh-agent没有在注销时被杀死,并且这肯定会发生,因为所需的环境变量没有设置,它只能意味着一件事:调用ssh-agentlogin 的人可能没有以正确的方式(这将是eval "$(ssh-agent -s)"。所以我想:嗯,有什么问题吗?我会找到执行哪个配置文件、服务或登录脚本来启动代理并手动修复它!它到底在哪里?

我试过的

由于我注意到ssh-agent每次调用时都会生成an source ~/.bashrc,这是我检查的第一个文件,但那里甚至没有远程引用与 SSH 相关的任何内容。我一直在使用以下所有文件中vi的字符串搜索ssh,但一无所获

~/.bashrc
~/.profile
/etc/bash.bashrc
/etc/profile
/etc/profile.d/ (every file in this folder)
/etc/environment
Run Code Online (Sandbox Code Playgroud)

是否有更多文件可能涉及source ~/.bashrc?我真的不知道。

然后我搜索了相关systemd服务,但只找到了ssh.service,即WantedBy=multi-user.target,因此不在登录时运行(当然,这很明显,因为这是 SSH 服务器守护进程)。

我还尝试将文件/home/pi夹中的每个文件移动到一个临时文件夹并注销并重新登录,但ssh-agent仍然生成。

最终,我还发射了我在房间里的最后一枪:我find / -name 'ssh-agent'以 root 身份运行,它只打印/usr/bin/ssh-agent一个可执行文件,所以我创建了一个伪造的可执行文件,它基本上只记录了父命令

#! /bin/bash
ps -o args= $PPID        > /home/pi/LOG
cat /proc/$PPID/cmdline >> /home/pi/LOG
Run Code Online (Sandbox Code Playgroud)

我重命名了真实的/usr/bin/ssh-agent并将其替换为设置正确的权限/用户/组的假的,source ~/.bashrc再次运行,然后打印LOG文件:

-bash
-bash
Run Code Online (Sandbox Code Playgroud)

没有任何关于正在发生的事情的线索。

更多细节

我正在添加更多细节,我不知道它们是否有帮助,但你知道……安全总比抱歉好。

  • 这是我的.bashrc

  • 我创建了一个名为dummyusing的新用户useradd -m dummy,并且登录后没有任何启动ssh-agent(我觉得这可能意味着什么)。这些diff /home/pi/.bashrc /home/dummy/.bashrc节目基本上什么都没有(只是我发表的评论),对于diff /home/pi/.profile /home/dummy/.profile.

  • 即使SSH_AUTH_SOCK未设置,也可以毫无问题地创建代理套接字:

    pi:~$ ls -lAh /tmp/ssh-vQRTAyj7DJry/
    total 0
    srw------- 1 pi pi 0 Jan 28 03:12 agent.1328
    
    Run Code Online (Sandbox Code Playgroud)

    不知道为什么,但套接字文件名上的数字始终是ssh-agent进程PID 之前的数字。

  • 片段来自htop

     PID  USER  PRI  NI  VIRT   RES   SHR  S  Command
       1  root   20   0  5472  3900  2728  S  /sbin/init
    1329  pi     20   0  3696   224    16  S  ?? ssh-agent -s
    
    Run Code Online (Sandbox Code Playgroud)
  • 已安装的软件包匹配ssh

    pi:~$ apt list --installed | grep ssh
    libpam-chksshpwd/oldstable,now 1.1.8-3.1+deb8u2+rpi3 armhf [installed]
    libssh-gcrypt-4/oldstable,now 0.6.3-4+deb8u2 armhf [installed,automatic]
    libssh2-1/oldstable,now 1.4.3-4.1+deb8u1 armhf [installed,automatic]
    openssh-client/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic]
    openssh-server/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic]
    openssh-sftp-server/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic]
    ssh/oldstable,now 1:6.7p1-5+deb8u4 all [installed]
    sshpass/oldstable,now 1.05-1 armhf [installed]
    
    Run Code Online (Sandbox Code Playgroud)
  • ssh-agent -s使用grepin递归搜索/etc/lib没有产生任何结果。

  • 我没有安装桌面环境,但是我有一个/etc/X11文件夹,里面有一些配置文件。我尝试将文件夹重命名为其他内容并重新启动以防万一,但该过程仍然会产生,因此显然这与此无关。


结论

现在,为了尽可能简单,我只有两个问题:

  1. 这是在哪里以及如何ssh-agent产生的,谁发出命令?
  2. 为什么不以正确的方式调用它,而不设置所需的环境变量,从而使进程无限期地挂在那里?

tel*_*coM 1

我知道有几个可能的原因:

  • 如果您使用libpam-ssh,它可以在会话启动过程中自动为您启动 SSH 代理,甚至可以自动加载您的密钥(如果它们没有密码或密码与您的登录密码相同)。

  • 如果您正在使用gpg-agent,它也可以选择执行 的任务ssh-agent。它的关闭处理方式不同,因此只有SSH_AUTH_SOCK环境变量,而不是SSH_AGENT_PID

  • 如果您的工作站上运行 SSH 代理(例如 PuTTY 的 Pageant),并在启用代理转发的情况下建立 SSH 连接(并且远程sshd允许),则在远程主机上您将再次看到只有SSH_AUTH_SOCK没有SSH_AGENT_PID... 因为代理套接字转到sshd哪个隧道将其返回到本地工作站的 SSH 代理。