我想在 python 腳本中使用 rsync 。我使用模組呼叫它,並使用儲存在遠端電腦上的檔案subprocess
中的公鑰進行身份驗證。authorized_key
唯一的問題是,當我使用錯誤的遠端使用者名稱使用 rsync 時,系統會提示我輸入密碼,這顯然會永遠停止備份腳本。
rsync
如果無法驗證,我可以強制錯誤退出,而不是提示輸入密碼嗎?
烏迪
答案1
假設您將 rsync 與 SSH 遠端 shell 一起使用(而不是 - 例如 - 使用 rsync 伺服器),那麼您可以讓 rsync 以永遠不會要求密碼的方式執行 SSH。例如,一次可以使用這個呼叫:
rsync -e 'ssh -o "NumberOfPasswordPrompts 0"' source user@target:/path
這將強制 rsync 使用 SSH 進行 0 次可能的密碼嘗試 - 如果它無法使用其他身份驗證方法(如公鑰或 GSSAPI)獲得存取權限,那麼它將失敗並出現錯誤。請注意,當發生這種情況時,rsync 不會喜歡你,並且會向 STDERR 大聲抱怨並以退出代碼 255 中斷。
答案2
以下是我用來保持安靜的 ssh 命令列選項。
ssh -o stricthostkeychecking=no -o userknownhostsfile=/dev/null -o batchmode=yes -o passwordauthentication=no
如果您不維護known_hosts 檔案並且擔心收到 MitM 警告,則只需要主機金鑰內容。我必須明確限制密碼身份驗證,而不是按照 James F 的建議指定身份驗證類型。不過,我用它來攻擊數百台具有幾個不同作業系統版本的主機,因此它可能只是不相容。
答案3
回覆:詹姆斯的建議(不給它 tty),對於子進程,嘗試將 stdin=None 作為 Popen 的參數。
答案4
根據您啟動 rsync 的方式,不給它 TTY 或 PTY 可能會有所幫助。
許多程式在決定提示使用者輸入之前會檢查它們是否有控制 TTY。 system() 和類似呼叫的預設行為是為子程式提供 tty,但您可以停用它。
如果您控制兩個系統並且希望在解決此問題時擺脫密碼身份驗證以獲得安全優勢,也可以在遠端完全停用密碼身份驗證。
如果您透過 SSH 進行 rsync,則可以將下列內容新增至相關主機的 ssh_config 檔案中,或透過 -o 命令列開關新增:
PreferredAuthentications publickey
在快速測試(僅 ssh,而不是 rsync)中,當我的公鑰未被接受且不提示我輸入密碼時,導致 SSH 立即退出。