원격 경고음(echo-command)에 ">/dev/console"이 필요한 이유

원격 경고음(echo-command)에 ">/dev/console"이 필요한 이유

나는 이 명령이 다음과 같다는 것을 배웠습니다.

echo -e "\a"

로컬 시스템에서 경고음을 발생시키는 반면, 이 명령은 다음과 같습니다.

echo -e "\a" >/dev/console

원격 시스템에서 경고음을 발생시킵니다.

왜 이런거야? 어떤 >/dev/console역할을 하는 부분인가요?

echo -e "\a"원격 컴퓨터에서 실행하면 원격이 아닌 로컬에서 경고음이 울리는 이유는 무엇입니까 ?

"echo" - 명령이 sudo를 좋아하지 않는 이유는 무엇입니까?

OSI 계층과 유사한 체계가 있습니까? 외부 문서를 좀 제공해 주세요.

나는 stdout/stderr을 파일로 리디렉션하는 것에 대한 기본적인 이해만 갖고 있지만 질문은 리디렉션을 요구하기 위해 "Gnu/Linux/Kernel"이 어떻게 설계되었는지에 대해 더 많이 설명합니다.

" > /dev/console"을 선택하면 원격 경고음이 울립니다.

리모컨에 echo "Hello World"/dev/console 로의 리디렉션이 필요합니까?

답변1

echo출력을 stdout에 씁니다. 이것이 파일 설명자 1입니다.

를 사용하면 구현 echo -e '\a'에 따라 echoBEL 문자(ASCII의 0x7 바이트 값) 뒤에 LF(개행 문자라고도 함) 또는 -e \aLF가 뒤따르거나 -e BEL 및 LF가 뒤따릅니다.

BEL 문자만 쓰려면 printf '\a'.

어쨌든 그것은 이 질문의 핵심에 큰 차이를 만들지 않습니다. printf, like는 echo표준 출력에 써야 할 내용을 씁니다.

리디렉션 없이 대화형 셸의 프롬프트에서 해당 명령을 입력하면 stdout이 셸에서 상속됩니다. 쉘이 xterm또는 같은 터미널 에뮬레이터에 의해 시작된 경우 파일 설명자 1은 장치 파일 에서 screen(에 의해) 열렸습니다 ( Linux에서는 또는 참조 ). 이는 의사 터미널 쌍의 슬레이브 측이 됩니다.xterm/dev/pt<something>lsof -ad1 -p "$$"readlink -f /proc/self/fd/1

여기서 알아야 할 중요한 점은 이것이 일종의 의사소통 채널이라는 것입니다. 사용자 상호 작용에 도움이 되는 몇 가지 추가 기능이 있다는 점을 제외하면 파이프와 약간 비슷합니다.

따라서 printf해당 장치 파일에 BEL을 쓰면 다른 쪽 끝으로 전송되는 일이 발생합니다. 이 xterm경우에는 터미널 에뮬레이터 자체입니다. BEL 문자는 터미널 및 터미널 에뮬레이터가 어떤 방식으로든 사용자에게 경고하도록 하는 제어 문자입니다( \a경고용). 이는 삐 소리, 차임벨, 화면의 시각적 깜박임 또는 둘 다일 수 있습니다. xterm일반적으로 X11 API 호출을 사용 XBell()하거나 시각적 벨을 사용하도록 구성된 경우 창을 깜박입니다. screen자체는 단순히 BEL을 다음으로 전달합니다.주인터미널이 연결되어 있고 해당 화면 창이 활성화되어 있거나 터미널을 실행하는 경우플래시제어 순서 또는 "Wuff, Wuff!!" (원문) 메시지는 구성된 방식에 따라 다릅니다(참조 info screen vbell).

getty그래픽 세션 외부에서 Linux를 실행하는 PC에 로그인하면 fd 1이 장치 에 대해 (에 의해) 열리게 됩니다 /dev/tty<1-...>. 여기서는 터미널 에뮬레이터를 구현하고 출력용 모니터와 입력용 키보드를 사용하는 커널입니다. 같은 원리로 printf거기에 BEL을 쓰면 커널은 PC 스피커에서 경고음을 울립니다.

를 통해 대화형 셸 프롬프트에서 해당 명령을 실행하면 sshfd 1도 의사 터미널 장치( )가 되며 /dev/pt<something>, 이번에는 원격 시스템에서 원격 사용자의 로그인 셸을 시작한 SSH 서버에 의해 시작됩니다. 의사 터미널 쌍의 다른 쪽 끝에는 SSH 서버가 있습니다. 해당 BEL(또는 그 밖의 중요한 것)을 수신하면 ssh 서버는 이를 암호화된 연결을 통해 ssh 클라이언트로 보내고 ssh 클라이언트는 이를 stdout에 기록하여 결국 사용자가 앉아 있는 터미널 창에 표시됩니다. 에.

~ 안에

printf '\a' > /dev/console

쉘은 를 /dev/console실행하기 전에 파일 설명자 1(stdout)에서 파일을 엽니다 printf.

이제 /dev/console적어도 Linux에서는 시스템 메시지를 수신하기 위한 tty 장치 파일입니다. /dev/console일반적으로 다른 tty 장치로 리디렉션됩니다. PC에서는 기본적으로 /dev/tty0현재 활성화된 가상 터미널을 가리키지만 부팅 시 console=/dev/anything커널 매개변수를 사용하여 변경할 수 있으며(예를 들어 console=/dev/ttyS0첫 번째 직렬 장치로 만들기 위해) 변경할 수도 있습니다(출력의 경우). 부분) 나중에 TIOCCONS ioctl()( 참조 xterm -C)를 사용합니다.

어쨌든 그것은 일반적으로 기계 자체에 부착되는 터미널이 될 것입니다. 따라서 BEL을 출력하는 것은 사용자에게 시스템 메시지를 보내는 데 사용되는 채널을 사용하고 있으므로 해당 시스템의 관리자에게 경고하기 위한 것입니다.

로그인한 모든 사용자에게 메시지를 쓰려면 해당 사용자가 해당 알림을 비활성화하지 않은 경우 해당 wall애플리케이션을 한 명의 사용자(단일 단말기 장치)에게만 사용할 수도 있습니다( ) .writemesg n

관련 정보