最近的 Upstart 有這些新的類似 systemd 的新功能,可以透過套接字橋接傳入連線啟動作業。我想在第一次連接到連接埠 22 時啟動 sshd。
我現在有:
start on socket PROTO=inet PORT=22
在我的 ssh.conf 中,我有 upstart-socket-bridge 和 upstart-udev-bridge 作業正在運行。
當我連接到連接埠 22 上的盒子時,ssh 作業啟動正常,但 sshd 不與我對話。就好像沒有收到一樣,無法接受。重試連線不會有幫助,即使 sshd 現在正在運作並且應該正常接受連線。暴發戶還在搞事情!
套接字事件手冊頁說:
當偵測到傳入連線時,表示套接字的檔案描述符將傳遞給相關作業以允許其接受(2)連線。此外,環境變數 UPSTART_JOB 將包含事件的名稱(「套接字」),環境變數 UPSTART_FDS 將包含與偵聽套接字相對應的檔案描述符的編號。
這是否意味著要利用這一點,ssh 需要特定支援來傳遞套接字 FD?如果是這樣的話,那就有點破壞所有的樂趣了:/
答案1
使用套接字橋需要一個已修補的守護進程,該進程可以處理給定的套接字。
從man socket-event
:
當偵測到傳入連線時,表示套接字的檔案描述符將傳遞給相關作業以允許其接受(2)連線。此外,環境變數 UPSTART_JOB 將包含事件的名稱(「套接字」),環境變數 UPSTART_FDS 將包含與偵聽套接字相對應的檔案描述符的編號。
雖然通常 sshd 會簡單地建立一個套接字並執行listen(),然後在其上執行accept(),但sshd只需要讀取 UPSTART_FDS 環境變數並對其進行accept()。
答案2
我強烈建議將 sshd 作為普通服務運行,而不是按需啟動。除了最極端的情況外,sshd 完全有能力自行管理連線。
如果您絕對必須按需啟動 sshd,以下命令有助於排除故障:
ps auxw | grep ssh
, grep for ssh 在正在執行的進程清單中。netstat -tlp
,給出服務目前正在偵聽的 TCP 連接埠的清單。此處應列出 SSH,如果沒有,則表示 sshd 未正確配置。ssh -vvv
(從客戶端運行),ssh 會話的詳細偵錯輸出有助於找出故障點。nmap <hostname>
(從客戶端運行 - 需要安裝 nmap 軟體包),列出主機上的開放連接埠。如果此處未列出 SSH,但在netstat
輸出中列出,則可能存在防火牆問題。