Ssh
伺服器可以在沒有 SSH 反向隧道的情況下向客戶端發出信號以執行腳本嗎?
我正在嘗試為自己建立一個輕量級的自定義文件同步系統。我希望伺服器監視對給定文件夾(帶有
inotify -m
)的更改,並在檢測到任何更改時將它們傳播到連接到它的客戶端。我的第一個想法是讓客戶端電腦啟動一個 SSH 隧道(使用
ssh -R 2222:127.0.0.1:22
),然後讓伺服器在適當的時候將文件 scp 回客戶端。但是為了使這個過程自動化,我需要設置 SSH 密鑰,這意味著如果伺服器在我不知情的情況下被入侵,我的電腦將依次暴露。我知道有一些方法可以減輕這些風險,比如 chroot jail 或scponly,但是打開一個大洞來修補 99% 的方法似乎有點笨拙。我想到安全問題是由於允許伺服器推送到客戶端,而不是讓客戶端從伺服器拉取。那麼是否有任何其他程序或協議可用於打開隧道,以便隱藏在動態 IP 和家庭路由器後面的客戶端可以監視給定埠以獲取來自伺服器的信號,而無需打開它來操縱SSH隧道會嗎?
首先,請注意任何自製的“信號解決方案”可能具有不明顯的競爭條件。注意在處理最後一個信號時不要錯過任何一個信號!
一個簡單的想法可能是您的伺服器會將行附加到本地文件。所以每個 inotify 都會導致:
date +"%s" >> /path/to/sync-signals.log
在您的客戶端上通過 ssh/tail 觀看該文件,但在客戶端上呼叫任何拉動操作。
ssh server "tail -n1 -f /path/to/sync-signals.log" | while read -r sigdate; do pull from server done
請注意,此解決方案不應錯過任何“信號”,但可能會導致大量不必要的“拉動”,以防伺服器在短時間內附加太多信號。因此,無論是客戶端,while 循環還應該以某種方式將最後一個“sigdate”與目前日期進行比較。或者更好的是,伺服器會以某種方式延遲信號(如果幾秒鐘後沒有任何變化,則僅附加一行。)