"sudo"는 "agetty ttyS0 9600"("직렬" 터미널 아님)을 시작하는 터미널에서 비밀번호를 묻는 메시지를 표시합니다.

"sudo"는 "agetty ttyS0 9600"("직렬" 터미널 아님)을 시작하는 터미널에서 비밀번호를 묻는 메시지를 표시합니다.

더 넓은 맥락에서 저는 QEMU+KVM을 사용하여 다음과 같이 우분투 머신을 가상화합니다.

qemu-system-x86_64 \
    -enable-kvm \
    -m 2048 \
    -nic none \
    -vnc :5 \
    -hda test-vm.raw \
    -device vfio-pci,host=01:00.0 \
    -serial unix:/tmp/console.sock,server,nowait

/tmp/console.sock"직렬"을 통해 VM에 로그인하는 데 사용하는 것 :

socat stdin,raw,echo=0,escape=0x11 "unix-connect:/tmp/console.sock"

이것은 큰 문제 없이 잘 작동합니다.

그러나 비밀번호를 입력하면 sudo su프로세스가 시작된 agetty터미널(직렬 콘솔 아님)에 비밀번호를 묻는 메시지가 나타납니다 .

agetty터미널에서 부팅하는 것이 일반적인 부팅 방법이 아니라는 것을 알고 있습니다 .

agetty그런데 어떻게 이런 일이 일어나는지, 터미널 없이 터미널에서 시작하는 방법이 궁금합니다.어느연결( sudo시작된 터미널에서 비밀번호를 요청하면 비밀번호 agetty가 있다고 믿게 됩니다.일부 연결)을 시작한 터미널에 연결합니다.

난 노력 했어:

$ nohup agetty ttyS0 9600 &
$ disown <pid>

성공하지 못했습니다.

여기서 작동하는 기본 메커니즘과 이 문제를 어떻게 해결할 수 있는지 알고 싶습니다*.

agetty*앞서 말씀드린 것처럼 일반 터미널에서 시작하는 것은 이 프로그램을 사용하는 방식이 아닌 것으로 알고 있습니다 . 저는 이런 일이 어떻게 발생하는지, 그리고 agetty이러한 행동을 방지하는 방법에 여전히 관심이 있습니다 .

답변1

터미널에서 실행하면 agetty새 세션의 세션 리더가 되고 이를 호출한 제어 터미널을 상속받습니다. 따라서 가상 머신에서 실행되는 모든 명령은 제어 터미널을 상속하여 sudo와 같은 유틸리티의 동작에 영향을 미칩니다. agetty가 시작되는 터미널은 제어 터미널로 사용되므로 sudo에서 비밀번호를 묻는 메시지가 표시됩니다.

터미널 세션은 일반적으로 세션에서 실행 중인 각 프로세스가 속한 세션 ID(SID)와 연결됩니다. SID를 설정하는 프로세스를 세션 리더라고 합니다. agetty가 시작되면 새 세션의 세션 리더가 되고 제어 터미널을 상속받습니다. 따라서 sudo가상 머신에서 실행하면 agetty 프로세스가 시작되는 터미널에서 비밀번호를 입력하라는 메시지가 표시됩니다.

agetty와 터미널 사이의 연결을 끊으려면 setid 명령을 사용할 수 있습니다.

setsid agetty ttyS0 9600

setsid명령은 새 세션을 생성하고 호출된 명령을 새 세션의 세션 리더로 설정합니다. 또한 이 작업은 명령에 제어 터미널이 없도록 설정하여 새 세션(예: sudo)에서 생성된 프로세스가 원래 제어 터미널을 상속하지 않도록 합니다. ~에서POSIX 사양setsid:

호출 프로세스가 프로세스 그룹 리더가 아닌 경우 setid() 함수는 새 세션을 만듭니다. 반환 시 호출 프로세스는 이 새 세션의 세션 리더가 되어야 하며 새 프로세스 그룹의 프로세스 그룹 리더여야 하며 제어 터미널이 없어야 합니다. 호출 프로세스의 프로세스 그룹 ID는 호출 프로세스의 프로세스 ID와 동일하게 설정되어야 합니다. 호출 프로세스는 새 프로세스 그룹의 유일한 프로세스여야 하며 새 세션의 유일한 프로세스여야 합니다.

sudo처음에 이 제어 터미널에 관심을 갖는 이유가 무엇인지 물을 수도 있습니다 . 이 sudo명령은 stdout 또는 stderr에 쓰는 것과 달리 중개자를 거치지 않고 호출하는 사용자와 직접 상호 작용하기 위해 최선을 다합니다. stdout 또는 stderr에 기록하면 민감한 정보가 노출될 위험이 있거나 다른 프로세스가 이 데이터를 도청할 수 있습니다.

제어 터미널은 사용자의 직통 회선에 더 가까운 것으로 간주되어 비밀번호 입력과 같은 사용자에 민감한 작업을 위한 보다 안전한 채널이 됩니다. sudo가 호출되면 일반적으로 stdout 또는 stderr을 우회하여 비밀번호 프롬프트를 터미널에 직접 기록합니다. 이는 비밀번호 프롬프트가 사용자에게 표시되고 실수로 리디렉션되거나 기록되거나 캡처되는 일이 없도록 하기 위한 것입니다.

관련 정보