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


9

这是我很长一段时间以来一直遇到的问题,但是每次我尝试弄清某些东西时,我都会迷路,所以我想最好在这里问一个也许更有经验的人可以帮助我。

背景

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

问题

由于ssh-agent未在注销时被杀死,并且这肯定是由于未设置所需的环境变量而发生的,因此只能表示一件事:调用ssh-agent登录的任何人都可能无法以正确的方式进行操作(应该如此eval "$(ssh-agent -s)"。所以我想:那是什么问题?我将发现执行了哪个配置文件,服务或登录脚本以启动代理并手动对其进行修复!到底在哪里?

我尝试过的

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

~/.bashrc
~/.profile
/etc/bash.bashrc
/etc/profile
/etc/profile.d/ (every file in this folder)
/etc/environment

还有其他文件可以参与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

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

-bash
-bash

关于发生的事情没有一个线索。

更多细节

我要添加更多详细信息,我不知道它们是否会有所帮助,但您知道...比对不起更安全。

  • 这是我的.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
    

    不知道为什么,但是套接字文件名上的数字始终是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
    
  • 已安装的软件包匹配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]
    
  • 搜索ssh-agent -s递归地使用grep/etc/lib产量没有结果。

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


结论

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

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

我确实想知道你~/.bashrc那时有什么。
ilkkachu

@ilkkachu好了,您去 ...
Marco Bonelli,

Answers:


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代理。


1
感谢您的建议,但不幸的是,这些选项都不适用于我。我没有libpam-ssh; 两个SSH_AGENT_PIDSSH_AUTH_SOCK是未设置(插座当然本无论如何的); 我不使用gpg-agent,也没有在PuTTY上启用代理转发。我真的迷路了:\
Marco Bonelli,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.