Недавно я начал использовать monit для отслеживания статуса sshd на моем сервере CentOS 5.4. Это нормально работает, но время от времени monit сообщает, что sshd больше не работает. Это неправда - я все еще могу войти на сервер через ssh, однако отмечу следующее:
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
Завершение процесса с помощью этого PID, как было предложено @Henry, а затем запуск 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 ниже, поэтому, возможно, я больше не вижу того же самого. Попробую еще раз, если проблема возникнет снова после следующей перезагрузки.
Обновление - 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?
У меня та же проблема. Я исправил это, по крайней мере временно, убив процесс 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 тоже доволен. :)
Из того, что вы описываете, похоже, что другой процесс захватывает порт 22 и вместо этого отвечает на ваши SSH-запросы. Получение сообщения о том, что порт уже используется при перезапуске службы, не является нормальным. Похоже, что настоящая служба sshd убита в пользу этого другого «фантомного» процесса. Возможно, вы установили opensshd дважды, не меняя порт, который он использует, или (и не паникуйте, это всего лишь возможность) ваш сервер был взломан, и хакер заменил sshd другим своим собственным демоном.
Чтобы узнать, какой процесс использует ваш порт, попробуйте следующее:
netstat -lptun
Затем найдите любую строку, показывающую локальный адрес, заканчивающийся на: 22, и посмотрите на последний столбец (PID / Имя программы). Запишите любой PID, использующий порт 22.
Затем, чтобы узнать полную команду, запущенную для этого 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.
Во-первых, можете ли вы опубликовать свой monit.conf
или файл конфигурации Monit? Имеет смысл посмотреть, попадаете ли вы в файл PID записи и параметры процесса. Моя статья Monit для мониторинга SSH в CentOS 5.x:
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
Это предоставит информацию о PID и порте запущенного в данный момент sshd.