ssh無法啟動 (code=exited, status=255)


ssh無法啟動 (code=exited, status=255)

服務器運行了一些腳本后,突然發現無法ssh了。

root@X61T:/home/liang# service sshd restart
Job for ssh.service failed because the control process exited with error code.
See "systemctl status ssh.service" and "journalctl -xe" for details.

使用systemctl檢查狀態

Systemd是一個系統管理守護進程、工具和庫的集合,用於取代System V初始進程。Systemd的功能是用於集中管理和配置類UNIX系統。在Linux生態系統中,Systemd被部署到了大多數的標准Linux發行版中,只有為數不多的幾個發行版尚未部署。

常用的systemctl命令:

systemctl list-unit-files                               列出所有可用的單元
systemctl list-units                                     列出所有運行中單元
systemctl --failed                                        列出所有失敗單元
systemctl status firewalld.service           檢查某個單元或服務是否運行
systemctl list-unit-files --type=service    列出所有服務(啟用和禁用)
systemctl start httpd.service                    啟動
systemctl restart httpd.service                 重啟
systemctl stop httpd.service                     停止
systemctl reload httpd.service                 重載服務
systemctl status httpd.service                  檢查狀態

檢查一下ssh.service的狀態

root@X61T:/home/liang# systemctl status ssh.service

發現

Process: 3448 ExecStart=/usr/sbin/sshd -D $SSHD_OPTS (code=exited, status=255)
Process: 3445 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
......
Jan 30 08:18:03 X61T systemd[1]: Starting OpenBSD Secure Shell server...
Jan 30 08:18:03 X61T systemd[1]: ssh.service: Main process exited, code=exited, status=255/n/a
Jan 30 08:18:03 X61T systemd[1]: Failed to start OpenBSD Secure Shell server.
Jan 30 08:18:03 X61T systemd[1]: ssh.service: Unit entered failed state.
Jan 30 08:18:03 X61T systemd[1]: ssh.service: Failed with result 'exit-code'.
使用journalctl訪問內部的數據
root@X61T:/home/liang# journalctl -u ssh.service

Jan 30 08:18:03 X61T systemd[1]: Starting OpenBSD Secure Shell server...
Jan 30 08:18:03 X61T systemd[1]: ssh.service: Main process exited, code=exited,
Jan 30 08:18:03 X61T systemd[1]: Failed to start OpenBSD Secure Shell server.
Jan 30 08:18:03 X61T systemd[1]: ssh.service: Unit entered failed state.
Jan 30 08:18:03 X61T systemd[1]: ssh.service: Failed with result 'exit-code'.

systemd嘗試提供一套集中化管理方案,從而統一打理全部內核及用戶級進程的日志信息。這套系統能夠收集並管理日志內容,而這也就是journal。journal的實現歸功於journald守護進程,其負責處理由內核、initrd以及服務等產生的信息。

對比一下 init.d 和 systemd :

service daemon-----------------------> rsyslog -----------------------------------> /var/log

systemd ----------> systemd-journald ---> ram DB ----> rsyslog ----> /var/log

     當 systemd 啟動后,systemd-journald 也會立即啟動。將日志存入RAM中,當rsyslog 啟動后會讀取該RAM並完成篩選分類寫入目錄 /var/log 。內核啟動過程將消息寫入到結構化的事件日志中(數據庫),默認情況下重啟后刪除syslog 的信息也可以由 systemd-journald 轉發到 rsyslog 中進一步處理默認情況下,systemd 的日志保存在 /run/log/journal 中,系統重啟就會清除,這是RHEL7的新特性。通過新建 /var/log/journal 目錄,日志會自動記錄到這個目錄中,並永久存儲。rsyslog 服務隨后根據優先級排列日志信息,將它們寫入到 /var/log目錄中永久保存常規操作systemd提供了自己的日志系統(logging system),稱為 journal。使用 systemd 日志,無需額外安裝日志服務(syslog)。

讀取日志的命令:

# journalctl

重要:顯示所有的日志信息,notice或warning以粗體顯示,紅色顯示error級別以上的信息

顯示最后行數的日志:

# journalctl -n

顯示最詳細信息:

# journalctl -f

提示:其實它很像tailf命令,默認顯示十行。隨着匹配日志的增長而持續輸出。只顯示錯誤、沖突和重要告警信息

# journalctl -p err..alert

提示:也可以使用數字表示喲。
顯示指定單元的所有消息:

# journalctl -u netcfg

重要:一般 -u 參數是 systemctl status 調用的參數之一(journalctl -l 可查看所有)提示:如果希望顯示 kernel 的信息需要使用 journalctl -k 進行內核環緩存消息查詢。

顯示從某個時間 ( 例如 20分鍾前 ) 的消息:

# journalctl --since "20 min ago"

# journalctl --since today

# journalctl --until YYYY-MM-DD

顯示本次啟動后的所有日志:

# journalctl -b

不過,一般大家更關心的不是本次啟動后的日志,而是上次啟動時的(例如,剛剛系統崩潰了)。可以使用 -b 參數:

journalctl -b -0 顯示本次啟動的信息

journalctl -b -1 顯示上次啟動的信息

journalctl -b -2 顯示上上次啟動的信息

journalctl -b -2 只顯示錯誤、沖突和重要告警信息

顯示特定進程的所有消息:

# journalctl _PID=1

1. \_COMM 顯示特定程序的所有消息,例如:``journalctl /usr/lib/systemd/systemd``
2. \_EXE 進程的可執行文件的路徑
3. \_PID 進程的PID
4. \_UID 運行該進程用戶的UID
5. _SYSTEMD_UNIT 啟動該進程的 `systemd` 單元
提示:以上篩選條件可組合使用,例如:journalctl _SYSTEMD_UNIT=sshd.service _PID=1182

顯示更多輸出方案:

# journalctl -o short|short-iso|short-percise|short-monotonic|verbose|export|json|json-pretty|json-sse|cat

進入ssh debug模式

root@X61T:/etc/init.d# /usr/sbin/sshd -d

debug1: sshd version OpenSSH_7.4, OpenSSL 1.0.2l  25 May 2017
debug1: private host key #0: ssh-rsa SHA256:yXduj8mTB9Lte+8TNQZPaqHtphuCgTcR18BY9jhY7sY
debug1: private host key #1: ecdsa-sha2-nistp256 SHA256:kzdqml9P9ocCIKrNalil5lKOZtY9Eshrn6ntfFKEkFk
debug1: private host key #2: ssh-ed25519 SHA256:nAcGxV9POMZeJxyqOWVsWu1s/WrvQSyhNDj0sQa90KY
debug1: rexec_argv[0]='/usr/sbin/sshd'
debug1: rexec_argv[1]='-d'
debug1: Set /proc/self/oom_score_adj from 0 to -1000
debug1: Bind to port 22 on 0.0.0.0.
Bind to port 22 on 0.0.0.0 failed: Address already in use.
debug1: Bind to port 22 on ::.
Bind to port 22 on :: failed: Address already in use.
Cannot bind any address.

發現居然22端口被占用了
用netstat查出是誰在占用。
root@X61T:/etc/init.d# netstat -apn

列出所有端口 (包括監聽和未監聽的)
netstat -a                   列出所有端口
netstat -at                   列出所有tcp端口
netstat -au                  列出所有udp端口
列出所有處於監聽狀態的 Sockets
netstat -l              只顯示監聽端口
netstat -lt                  只列出所有監聽 tcp 端口
netstat -lu                  只列出所有監聽 udp 端口
netstat -lx              只列出所有監聽 UNIX 端口
顯示每個協議的統計信息
netstat -s                  顯示所有端口的統計信息
netstat -st                  顯示TCP端口的統計信息
netstat -su                  顯示UDP端口的統計信息
在netstat輸出中顯示 PID 和進程名稱
netstat –pt
命令如下:
netstat -pan | grep 5623
#其中5623位端口號
netstat 中參數選項
-a或--all:顯示所有連線中的Socket;
-A<網絡類型>或--<網絡類型>:列出該網絡類型連線中的相關地址;
-c或--continuous:持續列出網絡狀態;
-C或--cache:顯示路由器配置的快取信息;
-e或--extend:顯示網絡其他相關信息;
-F或--fib:顯示FIB;
-g或--groups:顯示多重廣播功能群組組員名單;
-h或--help:在線幫助;
-i或--interfaces:顯示網絡界面信息表單;
-l或--listening:顯示監控中的服務器的Socket;
-M或--masquerade:顯示偽裝的網絡連線;
-n或--numeric:直接使用ip地址,而不通過域名服務器;
-N或--netlink或--symbolic:顯示網絡硬件外圍設備的符號連接名稱;
-o或--timers:顯示計時器;
-p或--programs:顯示正在使用Socket的程序識別碼和程序名稱;
-r或--route:顯示Routing Table;
-s或--statistice:顯示網絡工作信息統計表;
-t或--tcp:顯示TCP傳輸協議的連線狀況;
-u或--udp:顯示UDP傳輸協議的連線狀況;
-v或--verbose:顯示指令執行過程;
-V或--version:顯示版本信息;
-w或--raw:顯示RAW傳輸協議的連線狀況;
-x或--unix:此參數的效果和指定"-A unix"參數相同;
--ip或--inet:此參數的效果和指定"-A inet"參數相同。

root@X61T:/etc/init.d# service rsync stop

root@X61T:/etc/init.d# /usr/sbin/sshd -d

debug1: sshd version OpenSSH_7.4, OpenSSL 1.0.2l  25 May 2017
debug1: private host key #0: ssh-rsa SHA256:yXduj8mTB9Lte+8TNQZPaqHtphuCgTcR18BY9jhY7sY
debug1: private host key #1: ecdsa-sha2-nistp256 SHA256:kzdqml9P9ocCIKrNalil5lKOZtY9Eshrn6ntfFKEkFk
debug1: private host key #2: ssh-ed25519 SHA256:nAcGxV9POMZeJxyqOWVsWu1s/WrvQSyhNDj0sQa90KY
debug1: rexec_argv[0]='/usr/sbin/sshd'
debug1: rexec_argv[1]='-d'
debug1: Set /proc/self/oom_score_adj from 0 to -1000
debug1: Bind to port 22 on 0.0.0.0.
Server listening on 0.0.0.0 port 22.
debug1: Bind to port 22 on ::.
Server listening on :: port 22.

root@X61T:/etc/init.d# service rsync stop

root@X61T:/etc/init.d# service ssh start

root@X61T:/etc/init.d# service rsync start

root@X61T:/home/liang# journalctl -u ssh.service

Jan 30 09:21:38 X61T systemd[1]: Starting OpenBSD Secure Shell server...
Jan 30 09:21:38 X61T sshd[6526]: Server listening on 0.0.0.0 port 22.
Jan 30 09:21:38 X61T sshd[6526]: Server listening on :: port 22.
Jan 30 09:21:38 X61T systemd[1]: Started OpenBSD Secure Shell server.

搞定。

下面的資料是為什么Rsync會占用22端口

留下來參考

https://mike-hostetler.com/rsync-non-standard-ssh-port/

https://www.kaijia.me/2012/10/rsync-use-non-standard-ssh-port-solved/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM