requiretty
이 옵션은 PTY에서 sudo를 허용하지 않는다는 것을 알고 있습니다 .
내 VM 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 기본 설정을 사용하여 VM에 연결하고 실행할 명령을 지정하면 상황이 달라집니다.
$ 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
- 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가 없는 경우) 비밀번호 인증 실패와 동일하게 처리됩니다.