SSH 上的 Rsync 不存在 tty
我在 Debian 的 root 的 crontab 中使用以下命令。
rsync -vqrlHEAXogDtzhi --log-file=${LOG} --progress --rsync-path="sudo /usr/bin/rsync" --exclude-from=$CONFIG_DIR/excludes -e "ssh -i /home/backups/.ssh/id_rsa" backups@${HOSTNAME}:/ ${BACKUP_DIR}
我得到以下資訊:
sudo: no tty present and no askpass program specified
我嘗試將 -t 添加到 ssh 命令中,我得到:
Pseudo-terminal will not be allocated because stdin is not a terminal.
我嘗試將 -t -t 添加到 ssh 命令中,我得到:
protocol version mismatch -- is your shell clean?
我已向遠端框上的備份使用者添加了一個 .hushlogin,並確認我可以使用遠端框的密鑰將 ssh 作為備份,而不會顯示任何內容(登錄被靜音)。我仍然收到這些消息。
請注意,我可以使用密鑰成功地 ssh 作為遠端框的備份。
請注意,我的 sudo 沒有 -tt 選項。
請注意,在源和目標的 /etc/sudoers 文件中設置了以下內容:
backups ALL= NOPASSWD:/usr/bin/rsync
請注意,我的 /etc/sudoers 文件沒有任何參考:
Defaults requiretty
請注意,我不會在命令中回顯我的密碼。
我怎樣才能給這隻貓剝皮?:|
謝謝
有時你想太多事情。
遠端系統上未安裝 Rsync。
/掌臉
把這個放在這裡,這樣我就可以記住並分享這個技巧:
rsync -av -e "ssh -tt" --rsync-path="stty raw -echo; sudo /usr/bin/rsync" user@${HOSTNAME}:/ ${DEST_DIR}
這種方法似乎繞過了對某些系統預設
/etc/sudoers
文件的tty 的要求Defaults requiretty
。此資訊是在查看此 SO 問題和答案後製作的。在那個答案中,他們建議
Defaults requiretty
從/etc/sudoers
. 這是更簡單的方法。但是,如果您無法修改遠端主機/etc/sudoers
以刪除此配置選項,您可以嘗試強製本地rsync
使用ssh -tt
. 此選項ssh
在ssh
客戶端手冊頁中描述如下:強制偽終端分配。這可用於在遠端機器上執行任意基於螢幕的程序,這非常有用,例如在實現菜單服務時。多個 -t 選項強制分配 tty,即使 ssh 沒有本地 tty。
因此,我們強制 ssh 分配一個偽 tty 以避免錯誤:
Pseudo-terminal will not be allocated because stdin is not a terminal. stty: standard input: Inappropriate ioctl for device sudo: sorry, you must have a tty to run sudo
然後,
--rsync-path
用命令覆蓋 以執行以下操作:stty raw -echo; sudo /usr/bin/rsync
stty raw -echo
就是設置遠端終端的線路規則為直通。這有效地使其表現得像一個管道,而不是一個沒有-tt
.然後遠端 rsync 命令將是
sudo /usr/bin/rsync
,它現在有一個偽 tty 並且將通過requiretty
對sudo
.