Debian

為什麼“requiretty”不起作用?

  • May 26, 2021

據我了解,該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!)

換句話說,使用requirettyset,您不能sudo在以下上下文中使用:

  • 除非您強制分配 TTY,否則通過 SSH 執行遠端命令,即ssh VM-user@VM-host sudo something會失敗,但ssh -tt VM-user@VM-host sudo something會成功。
  • crontab 命令,或通過 crontab 或atbatch命令執行的腳本
  • 通過執行的腳本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 時),則將其視為密碼驗證失敗。

引用自:https://unix.stackexchange.com/questions/651408