sshd 正在运行但没有 PID 文件

sshd 正在运行但没有 PID 文件

我最近开始使用 monit 来监控我的 CentOS 5.4 服务器上 sshd 的状态。这工作正常,但 monit 时不时会报告 sshd 不再运行。事实并非如此 - 我仍然能够通过 ssh 登录到服务器,但我注意到以下情况:

  • /var/run/sshd.pid 不再有任何 PID 文件 - 重启后此文件仍然存在。一旦它消失,通过重新启动 sshdservice 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.confMonit 配置文件吗?查看您是否正在写入 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/sshopenssh openssh-serveropenssh-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 和端口信息。

相关内容