Debian
為什麼“requiretty”不起作用?
據我了解,該
requiretty
選項不允許在 PTY 上使用 sudo。我的虛擬機
sudoers
:# # This file MUST be edited with the 'visudo' command as root. # # Please consider adding local content in /etc/sudoers.d/ instead of # directly modifying this file. # # See the man page for details on how to write a sudoers file. # Defaults env_reset Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin" Defaults passwd_tries=3 Defaults badpass_message="WRONG PASSWORD T_T" Defaults log_input, log_output, iolog_dir="/var/log/sudo" Defaults requiretty # Host alias specification # User alias specification # Cmnd alias specification # User privilege specification root ALL=(ALL:ALL) ALL # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL # See sudoers(5) for more information on "#include" directives: #includedir /etc/sudoers.d`
使用 SSH 連接到該系統後,
tty
程序輸出/dev/pts/0
.但是我仍然可以在 SSH 會話中使用密碼 sudo。此
requiretty
選項與 SSH 或 PTY 無關嗎?如何在我的 SSH 會話中使用 sudo?
您的理解不正確:偽 TTY 被認為完全等同於“真實”TTY。
tty
列印時/dev/pts/0
意味著會話具有有效的 TTY。但是如果你使用 SSH 預設設置連接到 VM 並指定要執行的命令,情況會有所不同:
$ ssh VM-user@VM-hostname "hostname; tty" VM-hostname not a tty
這
sudo
就是’srequiretty
選項拒絕的情況。對 TTY 的要求允許 SSH 通過標準輸入拒絕對密碼提示的響應中的管道嘗試,就像許多其他 Unix 程序在請求密碼時所做的那樣。
它還允許您執行以下操作:
sudo -u some-user data_producing_command 2> error-log-file | data_consuming_command
沒有密碼提示,既不會混入通過管道傳輸的數據
data_consuming_command
,也不會混入error-log-file
. (注意data_consuming_command
這裡是作為你自己執行,而不是作為some-user
!)換句話說,使用
requiretty
set,您不能sudo
在以下上下文中使用:
- 除非您強制分配 TTY,否則通過 SSH 執行遠端命令,即
ssh VM-user@VM-host sudo something
會失敗,但ssh -tt VM-user@VM-host sudo something
會成功。- crontab 命令,或通過 crontab 或
at
或batch
命令執行的腳本- 通過執行的腳本
nohup
cgi-bin
通過與使用者會話無關的任何其他守護程序執行的腳本當
requiretty
設置並sudo
請求密碼時,它以與此腳本片段在概念上大致相似的方式執行此操作:printf "[sudo] password for $USER: " > /dev/tty # display prompt TTYSETTINGS=$(stty -F /dev/tty --save) # save current TTY settings stty -F /dev/tty -echo -echoe # prevent displaying the password read PASSWORD < /dev/tty stty -F /dev/tty $TTYSETTINGS # restore TTY settings # now check if $PASSWORD is correct...
/dev/tty
是一個“魔法”設備,如果會話具有 TTY,它將始終充當會話的實際 TTY 設備的別名。它正是為了這樣的事情而存在的:允許任何腳本或程序“逃避”管道或其他輸入/輸出重定向,並在必要時直接與使用者互動。如果
requiretty
已設置/dev/tty
且不可用(即當程序沒有與之關聯的真實 TTY 時),則將其視為密碼驗證失敗。