터미널에서 stdout 및 stderr 난독화 활성화

터미널에서 stdout 및 stderr 난독화 활성화

부팅 시 다양한 프로그램이 실행되는 임베디드 Linux 시스템이 있습니다. 이러한 프로그램 중 일부는 printf()를 사용하여 stdout 및 stderr에 기록합니다.

SSH를 통해 처음 시스템에 로그인하면 터미널에 이러한 모든 메시지가 나타나는 것을 볼 수 있습니다.

그러나 이후 다른 SSH 세션을 열면 물론 프로세스는 계속 실행 중이지만 터미널에는 아무 것도 기록되지 않습니다. 이로 인해 stdout과 stderr이 실제로 어떻게 작동하는지 혼란스러워졌습니다. 나는 그들이 모든 열린 터미널에 쓸 것이라고 생각했습니까?

답변1

귀하의 의견에서 언급한 것처럼 첫 번째 SSH 로그인을 사용하여 "직렬 디버그 인터페이스"에 연결하는 경우 내장 장치는 단순히 직렬 포트를 콘솔 장치로 사용하는 것입니다. 이는 비디오 디스플레이 장치가 전혀 없는 Linux 시스템의 일반적인 솔루션이며 실제로는 클래식 Unix 컴퓨터가 작동하는 기본 방식입니다.

시작 시 시작 메시지가 로 출력되며 /dev/console, 시작된 일부 프로그램은 시작된 터미널 장치에서 완전히 분리되지 않고 계속해서 메시지를 보냅니다.

기술적으로 이는 응용 프로그램 메시지가 필요하지 않은 경우 응용 프로그램 부분의 "전체 데몬 실패"이거나 메시지가 유용하고 시스템 관리자가 시작 스크립트를 작성해야 하는 경우 "응용 프로그램 로깅 구현"입니다. 메시지를 로그 파일이나 기타 유용한 대상으로 보냅니다. 안타깝게도 이는 비교적 흔한 일입니다. 응용 프로그램 메시지는 콘솔 장치를 복잡하게 만들고 시스템 관리자가 콘솔을 사용하여 네트워크 연결 오류를 일으키는 문제를 해결하는 것을 어렵게 만들 수 있습니다.


(다음 섹션은 첫 번째 SSH 세션에 직렬 디버깅 인터페이스가 포함되었다는 사실을 언급하기 전에 작성되었습니다...)

표준 입력, 출력 및 오류 스트림은 일반적으로 하나의 터미널 장치에만 연결됩니다. 유일한 명백한 특수 사례는 /dev/console이것이 모든 물리적 콘솔 장치에서 출력되어야 한다는 것입니다... 그러나 의사 TTY는 아닙니다. 그리고 SSH 연결은 항상 의사 TTY(또는 TTY 전혀 사용하지 않음)를 사용하고 "실제" "TTY 장치는 사용하지 않습니다. .

"시작 시 실행되는 프로그램"이 실제로 처음 로그인할 때가 아니라 시작할 때 시작된다면 흥미로운 수수께끼입니다.

임베디드 시스템이 이전(BSD 스타일) 의사 TTY 장치를 사용하는 경우 이것이 어떻게 가능한지 알 것 같습니다. (즉, 시스템에 각각 /dev/pty??및라는 이름의 장치 노드 쌍이 있습니까, 아니면 및 /tty??등의 최신 Unix98 스타일 PTY 장치가 있습니까 ?)/dev/ptmx/dev/pts/<number>

시작 시 시작 프로세스를 관리하는 스크립트 또는 시스템은 모든 서비스의 stdout 및 오류를 첫 번째 의사 TTY에 할당할 가능성이 높습니다. 여기서 일부 시작 로깅 프로세스는 로깅을 위해 이를 캡처한 다음 실제 콘솔 TTY 장치에 전달합니다. 부팅 프로세스가 완료되면 부팅 로깅 프로세스가 종료되고 의사 TTY 마스터가 해제됩니다. 그러나 일부 실행 프로그램은 의사 TTY 측을 해제하지 않고 계속 출력을 보낼 수 있습니다.

첫 번째 SSH 세션이 설정되면 sshd데몬은 연결에 사용할 할당되지 않은 첫 번째 의사 TTY 마스터 장치를 가져오지만 BSD 스타일 의사 TTY 장치의 경우 시작 시 기록됩니다. 따라서 첫 번째 SSH 세션은 슬레이브에 개시자 프로그램이 연결된 의사 TTY 장치를 가져오므로 이러한 프로그램의 출력이 SSH 세션에 나타납니다. 다른 SSH 세션은 "깨끗한" 의사 TTY 장치를 가져오므로 문제가 없습니다.

최신 Unix98 스타일 의사 TTY 장치를 사용하면 PTY 장치의 새로운 사용자 각각이 보장된 고유한 PTY 장치 쌍을 얻게 되므로 이러한 종류의 일은 BSD 스타일 PTY 장치에서만 발생합니다.

관련 정보