다음을 입력한 후 비밀번호를 묻는 메시지가 나타나면 su
:
user@debian:~$ su
Password:
키보드(동일 터미널)에서 send()를 할 수 없습니다 SIGSTOP
. 아무 일도 일어나지 않습니다. ctrl+Z
따라서 종료하는 유일한 방법은 일부(올바른 또는 잘못된) 비밀번호를 입력하는 것입니다. 왜 su
이렇게 일시 중지 할 수 없나요 ?
ctrl+Z
UPD: 대기열이 있는 것 같습니다 . 따라서 전송할 때 ctrl+Z
아무 일도 일어나지 않지만 Enter
입력 신호가 도착하고 su
중지된 후에는 발생합니다. 아직도 이 행동을 이해할 수 없습니다. 이 표준 동작은 모든 Unix 계열 시스템에 적용됩니까, 아니면 Linux에만 적용됩니까?
답변1
몇 가지 기본적인 오류를 명확히 해 보겠습니다.
- 신호아니요대기줄. 큐잉은 신호와 관련하여 특정한 일이며 이 특정 신호에서는 발생하지 않습니다. 신호는가면을 쓴.
- 이 특별한 신호아니요
SIGSTOP
. 이susp
문자를 사용하면 라인 규율이 전송됩니다SIGTSTP
.
login
1980년대 및 명령 관점과 모순되는 많은 것들과 마찬가지로 su
여기서 동작의 근본은 PAM입니다.
su
그런 목적으로 만들어진 것이 아닙니다 . 사용하는 것 외에도리눅스 PAM도서관. 예를 들어 OpenPAM 라이브러리를 사용하는 BSD에서는 이런 일이 발생하지 않습니다.
이를 수행하는 것이 Linux PAM에서 제공하는 PAM이라는 모듈입니다 pam_unix
. 더 구체적으로 말하면, 이 작업을 수행하는 코드 misc_conv()
내부에서 호출되는 라이브러리에서 제공하는 기본 "대화" 기능 입니다 . 메시지가 표시되면 입력 항목을 구체적으로 차단합니다.pam_unix
SIGTSTP
표면적으로는 도서관을 청소할 수 있도록. 그렇기 때문에 신호가 입력 전에 전달되지 않습니다.
OpenPAM은 pam_unix
PAM 모듈도 제공합니다. 이는 OpenPAM 라이브러리에서 제공하는 기본 "대화 상자" 기능을 호출합니다 openpam_ttyconv()
. 후자의신호 차단 없음. su
FreeBSD 등에서는 비밀번호 프롬프트에서 일시 중지가 가능하다는 사실을 아무도 눈치 채지 못한 것 같습니다 . 그리고 터미널은 에코를 끕니다. 이는 아마도 FreeBSD의 운영 체제에서 제공하는 명령줄 셸에는 모두 프롬프트 입력을 인계받아 자체 에코를 수행할 때 터미널 설정을 즉시 재조정하는 줄 편집 라이브러리가 있기 때문일 것입니다.
추가 읽기
- 조나단 데보인 폴라드(2014). “20년 전에 PAM이 모든 것을 바꿔 놓았습니다.”.사용자 권한을 제거하기 위해 su를 남용하지 마십시오.. 일반적인 답변.
- https://unix.stackexchange.com/a/561459/5132
- https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=243584