Mar*_*lli 11 login ssh openssh ssh-agent raspbian
这是我长期以来一直遇到的一个问题,但每次我试图弄清楚一些事情时,我都会迷失方向,所以我想我最好在这里问一下,也许更有经验的人可以帮助我。
我的 Raspberry Pi 正在运行 Raspbian Jessie,我经常使用 SSH 登录它并远程执行命令。在我的第一个 SSH 会话中,我注意到每次登录时都会在 RPi 上ssh-agent
生成一个进程,但在ing时从未被杀死:多次登录和注销导致生成一堆进程,只是挂在那里什么也不做。四处闲逛,到处阅读手册页和答案,我最近了解了. 此外,我注意到发出会导致产生另一个实例。我在相关的手册页上阅读exit
ssh-agent
ssh-agent
source ~/.bashrc
ssh-agent
SSH_AGENT_PID
应该定义环境变量,因为ssh-agent
程序应该在 an 中启动eval
以执行其输出并定义此类变量,然后其他与 SSH 相关的命令使用这些变量,包括ssh-agent -k
(杀死相对于当前会话的代理),所以我跑echo $SSH_AGENT_PID
和echo $SSH_AUTH_SOCK
,但它们都是空的。我突然意识到:可能该进程不会在注销时被杀死,因为它ssh-agent -k
试图从未设置的环境变量中读取其 PID。
由于ssh-agent
没有在注销时被杀死,并且这肯定会发生,因为所需的环境变量没有设置,它只能意味着一件事:调用ssh-agent
login 的人可能没有以正确的方式(这将是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
。
我创建了一个名为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
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
使用grep
in递归搜索/etc
并/lib
没有产生任何结果。
我没有安装桌面环境,但是我有一个/etc/X11
文件夹,里面有一些配置文件。我尝试将文件夹重命名为其他内容并重新启动以防万一,但该过程仍然会产生,因此显然这与此无关。
现在,为了尽可能简单,我只有两个问题:
ssh-agent
产生的,谁发出命令?我知道有几个可能的原因:
如果您使用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 代理。