情境

情境

情境

我想設定rsync伺服器的備份,所以我執行以下命令

rsync -r -e ssh --rsync-path="sudo rsync" [email protected]:/ /backup/

理想情況下,該命令會詢問我的私人 ssh 金鑰密碼,然後連接,然後詢問 rsyncuser 的 sudo 密碼,然後在伺服器上執行 rsync。但我遇到了臭名昭著的錯誤:

sudo: no tty present and no askpass program specified

所以我必須將其添加到/etc/sudoers(using sudo visudo) 中,這基本上為用戶提供了對系統的無密碼完全讀寫訪問權限rsyncuser,這不符合我的口味:

rsyncuser ALL= NOPASSWD:/usr/bin/rsync

問題

我怎麼能告訴 sudo 從另一個 TTY 讀取其密碼?

這樣,我可以rsync在本地電腦上的一個終端機視窗中運行,並使用另一個終端機視窗打開到伺服器的(可能是單獨的)ssh 連接,並在那裡提供 sudo 密碼。

我想到做類似事情的唯一方法是使用expectsudo 周圍的腳本,它從命名管道讀取密碼,然後我將從另一個終端寫入該管道。

注意:這更多的是為了實驗和學習,而不是任何實際目的,我並不是想找出如何將 sudo 與 rsync 一起使用,我已經閱讀了我能找到的所有相關內容。

答案1

sudoSUDO_ASKPASS如果沒有從終端運行(如您的情況)或設定了 -A ,將讀取環境變數 。它使用它作為運行命令來獲取密碼。例如:

echo -e '#!/bin/sh\nhead -n 1' > ~/bin/reader
chmod a+x ~/bin/reader
export SUDO_ASKPASS="$HOME/bin/reader"
sudo -A echo "I'm root\!"

將提示您在標準輸入上輸入密碼,並且不需要終端。

然而,在您嘗試執行的特定情況下,最好允許 root SSH 登錄,但只能使用 SSH 金鑰且命令僅限於 rsync。這方面有一個很好的資源這裡

答案2

嘗試:

ssh userfoo@host "sudo -S p'enter pw: ' [command] "

這將發出密碼提示(“ enter pw:”),該提示將顯示在您的本機主機/終端機上。這樣做的缺點是您的密碼在終​​端機視窗上清晰顯示,並且存在安全風險。它不會保存在您的本地.bash_history,但它是終端視窗回滾歷史記錄。因此,如果您使用 Konsole,請使用Ctrl+ Shift+K來清除它。

相關內容