내가 아는 한, 이 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를 사용하는 방법은 무엇입니까?
답변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
즉, set의 경우 다음과 같은 맥락에서는 사용할 requiretty
수 없습니다 .sudo
ssh VM-user@VM-host sudo something
TTY 할당을 강제하지 않으면 실패하는 SSH를 통한 원격 명령은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가 없는 경우) 비밀번호 인증 실패로 처리됩니다.