Насколько я понимаю, эта requiretty
опция не позволяет использовать sudo на PTY.
Мои виртуальные машины 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
.
Но я все еще могу sudo с паролем в сеансе SSH. Имеет ли эта requiretty
опция какое-либо отношение к SSH или PTY? Как я могу sudo в моем сеансе SSH?
решение1
Вы понимаете неправильно: псевдо-TTY считается полностью эквивалентным «настоящему» TTY.
Если tty
печатается, /dev/pts/0
это означает, что сеанс имеет действительный TTY.
Но если подключиться к виртуальной машине с настройками SSH по умолчанию и указать команду для запуска, ситуация будет иной:
$ ssh VM-user@VM-hostname "hostname; tty"
VM-hostname
not a tty
ичтоситуация, отвергнутая sudo
вариантом requiretty
.
Требование наличия 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
в таких контекстах, как:
- удаленные команды через SSH, если только вы не принудительно выделите TTY, т.е.
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), это рассматривается так же, как и сбой аутентификации пароля.