这是我很长一段时间以来一直遇到的问题,但是每次我尝试弄清某些东西时,我都会迷路,所以我想最好在这里问一个也许更有经验的人可以帮助我。
背景
我的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_PID
和echo $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
。我创建了一个名为
dummy
using 的新用户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
包含一些配置文件的文件夹。我尝试将文件夹重命名为其他名称并重新启动,以防万一,但是仍然会产生该过程,因此显然与此无关。
结论
现在,为了使其尽可能简单,我只有两个问题:
- 这是在哪里
ssh-agent
产生的,由谁发出命令? - 为什么不以正确的方式调用它,而没有设置所需的环境变量,从而使进程无限期地挂在那里?
~/.bashrc
那时有什么。