我最近开始使用 monit 来监控我的 CentOS 5.4 服务器上 sshd 的状态。这工作正常,但 monit 时不时会报告 sshd 不再运行。事实并非如此 - 我仍然能够通过 ssh 登录到服务器,但我注意到以下情况:
- /var/run/sshd.pid 不再有任何 PID 文件 - 重启后此文件仍然存在。一旦它消失,通过重新启动 sshd
service sshd restart
不会创建 PID 文件。 sudo service sshd status
报告openssh-daemon is stopped
- 再次,重新启动 sshd 不会改变这一点,但重新启动会改变这一点。sudo service sshd stop
报告failed
,大概是因为缺少 PID 文件。
知道发生什么事了吗?
更新
sudo netstat -lptun
给出与端口 22 相关的以下输出
tcp 0 0 :::22 :::* LISTEN 20735/sshd
按照@Henry的建议,终止具有此 PID 的进程,然后通过服务启动 sshd,这样就可以service sshd status
再次通过 PID 识别该进程。仍然希望更好地理解这一点。
一些回答者建议的 RPM 验证显示了这一点:
sudo rpm -vV openssh openssh-server openssh-clients | grep 'S\.5'
S.5....T c /etc/pam.d/sshd
S.5....T c /etc/ssh/sshd_config
/etc/pam.d/sshd
包含以下内容:
#%PAM-1.0
auth include system-auth
account required pam_nologin.so
account include system-auth
password include system-auth
session optional pam_keyinit.so force revoke
session include system-auth
#session required pam_loginuid.so
最后一行应该被注释掉吗?
更新 以下是@YannickGirouard 脚本的输出:
$ sudo ./sshd_test
Searching for the process listening on port 22...
Found the following PID: 21330
Command line for PID 21330: /usr/sbin/sshd
Listing process(es) relating to PID 21330:
UID PID PPID C STIME TTY TIME CMD
root 21330 1 0 14:04 ? 00:00:00 /usr/sbin/sshd
Listing RPM information about openssh packages:
Name : openssh Relocations: (not relocatable)
Version : 4.3p2 Vendor: CentOS
Release : 72.el5_7.5 Build Date: Tue 30 Aug 2011 12:34:14 AM BST
Install Date: Sun 06 Nov 2011 12:50:57 AM GMT Build Host: builder10.centos.org
Group : Applications/Internet Source RPM: openssh-4.3p2-72.el5_7.5.src.rpm
Size : 745390 License: BSD
Signature : DSA/SHA1, Fri 02 Sep 2011 01:13:01 AM BST, Key ID a8a447dce8562897
URL : http://www.openssh.com/portable.html
Summary : The OpenSSH implementation of SSH protocol versions 1 and 2
------------------------------------------------------
Name : openssh-clients Relocations: (not relocatable)
Version : 4.3p2 Vendor: CentOS
Release : 72.el5_7.5 Build Date: Tue 30 Aug 2011 12:34:14 AM BST
Install Date: Sun 06 Nov 2011 12:51:04 AM GMT Build Host: builder10.centos.org
Group : Applications/Internet Source RPM: openssh-4.3p2-72.el5_7.5.src.rpm
Size : 871132 License: BSD
Signature : DSA/SHA1, Fri 02 Sep 2011 01:13:01 AM BST, Key ID a8a447dce8562897
URL : http://www.openssh.com/portable.html
Summary : The OpenSSH client applications
------------------------------------------------------
Name : openssh-server Relocations: (not relocatable)
Version : 4.3p2 Vendor: CentOS
Release : 72.el5_7.5 Build Date: Tue 30 Aug 2011 12:34:14 AM BST
Install Date: Sun 06 Nov 2011 12:51:04 AM GMT Build Host: builder10.centos.org
Group : System Environment/Daemons Source RPM: openssh-4.3p2-72.el5_7.5.src.rpm
Size : 492478 License: BSD
Signature : DSA/SHA1, Fri 02 Sep 2011 01:13:01 AM BST, Key ID a8a447dce8562897
URL : http://www.openssh.com/portable.html
Summary : The OpenSSH server daemon
------------------------------------------------------
但是,我已经按照下面 @Henry 的建议,通过终止进程并重新启动来解决问题,所以也许我不再看到同样的事情了。如果下次重启后再次看到此问题,我会再试一次。
更新 - 3 月 14 日 Monit 提醒我 sshd 消失了,我又能通过 ssh 连接到服务器了。现在我可以运行脚本了
$ sudo ./sshd_test
Searching for the process listening on port 22...
Found the following PID: 2208
Command line for PID 2208: /usr/sbin/sshd
Listing process(es) relating to PID 2208:
UID PID PPID C STIME TTY TIME CMD
root 2208 1 0 Mar13 ? 00:00:00 /usr/sbin/sshd
root 1885 2208 0 21:50 ? 00:00:00 sshd: dunx [priv]
Listing RPM information about openssh packages:
Name : openssh Relocations: (not relocatable)
Version : 4.3p2 Vendor: CentOS
Release : 72.el5_7.5 Build Date: Tue 30 Aug 2011 12:34:14 AM BST
Install Date: Sun 06 Nov 2011 12:50:57 AM GMT Build Host: builder10.centos.org
Group : Applications/Internet Source RPM: openssh-4.3p2-72.el5_7.5.src.rpm
Size : 745390 License: BSD
Signature : DSA/SHA1, Fri 02 Sep 2011 01:13:01 AM BST, Key ID a8a447dce8562897
URL : http://www.openssh.com/portable.html
Summary : The OpenSSH implementation of SSH protocol versions 1 and 2
------------------------------------------------------
Name : openssh-clients Relocations: (not relocatable)
Version : 4.3p2 Vendor: CentOS
Release : 72.el5_7.5 Build Date: Tue 30 Aug 2011 12:34:14 AM BST
Install Date: Sun 06 Nov 2011 12:51:04 AM GMT Build Host: builder10.centos.org
Group : Applications/Internet Source RPM: openssh-4.3p2-72.el5_7.5.src.rpm
Size : 871132 License: BSD
Signature : DSA/SHA1, Fri 02 Sep 2011 01:13:01 AM BST, Key ID a8a447dce8562897
URL : http://www.openssh.com/portable.html
Summary : The OpenSSH client applications
------------------------------------------------------
Name : openssh-server Relocations: (not relocatable)
Version : 4.3p2 Vendor: CentOS
Release : 72.el5_7.5 Build Date: Tue 30 Aug 2011 12:34:14 AM BST
Install Date: Sun 06 Nov 2011 12:51:04 AM GMT Build Host: builder10.centos.org
Group : System Environment/Daemons Source RPM: openssh-4.3p2-72.el5_7.5.src.rpm
Size : 492478 License: BSD
Signature : DSA/SHA1, Fri 02 Sep 2011 01:13:01 AM BST, Key ID a8a447dce8562897
URL : http://www.openssh.com/portable.html
Summary : The OpenSSH server daemon
------------------------------------------------------
再次,当我寻找时,/var/run/sshd.pid
我没有找到它。
$ cat /var/run/sshd.pid
cat: /var/run/sshd.pid: No such file or directory
$ sudo netstat -anp | grep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2208/sshd
$ sudo kill 2208
$ sudo service sshd start
Starting sshd: [ OK ]
$ cat /var/run/sshd.pid
3794
$ sudo service sshd status
openssh-daemon (pid 3794) is running...
sshd 是否可能由于某种原因重新启动并且没有创建 pidfile?
答案1
我有同样的问题。我通过终止 sshd 进程然后启动它,至少暂时解决了这个问题。
service sshd status
openssh-daemon is stopped
(尽管我是通过 ssh 登录的)
rpm -vV openssh openssh-server openssh-clients | grep 'S\.5'
S.5....T c /etc/ssh/sshd_config
netstat -anp | grep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 17501/sshd
kill 17501
service sshd start
service sshd status
openssh-daemon (pid 3157) is running...
现在 monit 也很高兴。:)
答案2
从您的描述来看,这几乎像是另一个进程接管了端口 22 并代替您响应 SSH 请求。重新启动服务时收到一条消息说端口已在使用中是不正常的。看起来实际的 sshd 服务已被终止,以支持另一个“幻影”进程。可能是您安装了 opensshd 两次而没有更改它正在使用的端口,或者(不要惊慌,这只是一种可能性)您的服务器已被黑客入侵,黑客用他自己的另一个守护进程替换了 sshd。
要查看哪个进程正在使用您的端口,请尝试以下操作:
netstat -lptun
然后查找显示以 :22 结尾的本地地址的任何行,并查看最后一列(PID/程序名称)。记下使用端口 22 的任何 PID。
然后,要找出为该 PID 启动的完整命令,请执行以下操作:
cat /proc/PID/cmdline
(其中 PID = 进程的 PID)
如果它不是 /usr/sbin/sshd(或者任何 opensshd 二进制文件),那您就有问题了!
您可以安全运行以下脚本来转储一些有用的信息:
#! /bin/bash
echo -e "Searching for the process listening on port 22...\n"
PORT22_PID=$(netstat -lptun | grep -E ":22\s" | awk '{print $7}' | awk -F/ '{print $1}' | uniq)
if [ ! -n "$PORT22_PID" ]; then
echo "Error: Was not able to find any process listening on port 22"
exit 1
fi
echo -e "Found the following PID: $PORT22_PID\n"
echo -e "Command line for PID $PORT22_PID: $(cat /proc/$PORT22_PID/cmdline)\n"
echo -e "Listing process(es) relating to PID $PORT22_PID:\n"
echo "UID PID PPID C STIME TTY TIME CMD"
ps -ef | grep -E "\s$PORT22_PID\s"
echo
echo -e "Listing RPM information about openssh packages:\n"
RPMS=$(rpm -qa | grep openssh)
for r in $RPMS; do
rpm -qi $r | sed -n '/^Name/,/^Summary/p'
echo -e "\n------------------------------------------------------\n"
done
只需将输出粘贴到您的原始问题中,它就会有所帮助。我已经在自己的 Centos 服务器上彻底测试了这个脚本。
答案3
首先,您可以发布您的monit.conf
Monit 配置文件吗?查看您是否正在写入 PID 文件和进程参数是有意义的。我在 CentOS 5.x 上用于 SSH 监控的 Monit 节是:
check process ssh
with pidfile "/var/run/sshd.pid"
start program = "/sbin/service sshd start"
stop program = "/sbin/service sshd stop"
在深入了解之前,我会仔细检查 SSH 守护进程的健康状况。
运行rpm -vV openssh openssh-server openssh-clients | grep 'S\.5'
这将检查 SSH 二进制文件的一致性,并根据原始 RPM 中安装的内容进行验证。
[root@freaky ~]# rpm -vV openssh openssh-server openssh-clients | grep 'S\.5'
S.5....T c /etc/ssh/sshd_config
S.5....T c /etc/ssh/ssh_config
在上面的例子中,唯一被修改的文件是 SSH 配置文件。如果输出中出现类似/usr/sbin/sshd
或 的可执行文件之一,则表示您的系统已被入侵。您可以选择重新下载和软件包并强制安装它们以覆盖潜在的恶意二进制文件……但这是一个更大的话题。/usr/bin/ssh
openssh
openssh-server
openssh-clients
还要检查您的 netstat 信息。
[root@freaky ~]# netstat -anp | grep sshd
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 :::22 :::* LISTEN 4278/sshd
这将提供当前运行的 sshd 的 PID 和端口信息。