Linux

SSH 上的 Rsync 不存在 tty

  • June 8, 2020

我在 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. 此選項sshssh客戶端手冊頁中描述如下:

強制偽終端分配。這可用於在遠端機器上執行任意基於螢幕的程序,這非常有用,例如在實現菜單服務時。多個 -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 並且將通過requirettysudo.

引用自:https://serverfault.com/questions/534683