是否可以在 sftp 上使用 rsync(沒有 ssh shell)?
Rsync over ssh,每次都很好用。
但是,嘗試 rsync 到只允許 sftp 登錄但不允許 ssh 登錄的主機會提供以下錯誤:
rsync -av /source ssh user@remotehost:/target/
協議版本不匹配——你的外殼乾淨嗎?(有關說明,請參見 rsync 手冊頁) rsync 錯誤:compat.c(171) 處的協議不兼容(程式碼 2)
$$ sender=3.0.6 $$
這是 rsync 手冊頁中的相關部分:
此消息通常是由您的啟動腳本或遠端 shell 工具在 rsync 用於傳輸的流上產生不需要的垃圾引起的。診斷此問題的方法是像這樣執行遠端 shell:
ssh remotehost /bin/true > out.dat
然後查看out.dat。如果一切正常,那麼 out.dat 應該是一個零長度文件。如果您從 rsync 收到上述錯誤,那麼您可能會發現 out.dat 包含一些文本或數據。查看內容並嘗試找出產生它的內容。最常見的原因是錯誤配置的 shell 啟動腳本(例如 .cshrc 或 .profile)包含非互動式登錄的輸出語句。
在我的系統上嘗試這個在 out.dat 中產生了以下結果:
ssh-dummy-shell:命令不允許。
正如我所想,主機不允許 ssh 登錄。
以下連結顯示可以使用帶有 sshfs 的 fuse 來完成此任務 - 但是它非常慢,不適合生產使用。
有沒有機會讓 rsync sftp 工作?
不幸的是,不是直接的。
rsync
需要一個帶有 shell 的干淨連結,以允許它在以rsync
這種方式執行時啟動 的遠端副本。如果您有某種方式在主機上執行長期監聽程序,您可以嘗試手動啟動 rsync 以監聽非特權埠上的連接,但大多數實現此目的的技術也需要通過 SSH 進行適當的 shell 訪問,並且它依賴於主機防火牆安排允許在您選擇的埠上進行連接(以及首先安裝 rsync 的主機)。不過,通常不建議將 rsync 作為可公開定址的服務(而不是通過 SSH 或類似服務間接)執行。
如果您的主機允許使用 PHP 或類似的腳本編寫腳本並且沒有將其鎖定,因此
exec
使用者腳本無法編輯額外的程序,那麼您可以嘗試以這種方式在偵聽模式下啟動 rsync。如果您的終端是可連接的(您正在執行外部世界可訪問的 SSH),您可以反向嘗試 - 讓腳本在伺服器上執行 rsync 但不是監聽傳入連接,而是聯繫您的本地服務並以這種方式同步。這仍然依賴於 rsync 實際安裝在不是給定的主機上,或者您可以上傳工作副本,但不具有以可公開定址的方式執行 rsync 守護程序並通過未加密的方式與其通信的安全隱患渠道。不過,如上所述的亂搞可能違反了主機政策,即使它完全有效,並且可能會讓你被踢掉。您最好詢問是否可以為該帳戶啟用完整的 shell,或者放棄該主機的 rsync 或放棄該主機並轉移到其他地方,如果他們不這樣做的話。