나는 이 명령에 대해 배웠습니다.
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
출력을 표준 출력에 씁니다. 이것은 파일 설명자 1입니다.
의 경우 구현 echo -e '\a'
에 따라 BEL 문자(ASCII의 0x7 바이트 값)가 기록되고 그 뒤에 LF 또는 BEL 및 LF에 의해 LF(일명 개행 문자)가 기록됩니다.echo
-e \a
-e
BEL 문자만 쓰려면 printf '\a'
.
어쨌든 이는 문제의 핵심에 큰 영향을 미치지 않습니다. printf
, echo
표준 출력에 무엇을 써야 하는지를 쓰는 것과 같습니다.
리디렉션 없이 대화형 쉘의 프롬프트에서 이 명령을 입력하면 stdout이 쉘에서 상속됩니다. 쉘이 터미널 에뮬레이터(예: or)에 의해 xterm
시작된 경우 screen
파일 설명자 1은 장치 파일 xterm
에서 열립니다 /dev/pt<something>
(Or on Linux 참조) . 이는 의사 터미널 쌍의 슬레이브 끝이 됩니다.lsof -ad1 -p "$$"
readlink -f /proc/self/fd/1
여기서 이해해야 할 유일한 것은 이것이 일종의 의사소통 채널이라는 것입니다. 사용자 상호 작용을 돕기 위해 더 많은 종소리와 휘파람 소리가 있다는 점을 제외하면 파이프와 비슷합니다.
따라서 printf
BEL이 장치 파일에 기록되면 상대방으로 전송됩니다. 이 xterm
경우에는 터미널 에뮬레이터 자체입니다. BEL 문자는 터미널과 터미널 에뮬레이터가 특정 방식( \a
경고용)으로 사용자에게 경고하도록 하는 제어 문자입니다. 이는 경고음, 차임벨, 화면의 시각적 깜박임 또는 둘 다일 수 있습니다. xterm
일반적으로 X11 API 호출을 사용 XBell()
하거나 시각적 벨소리를 사용하도록 구성된 경우 해당 창을 깜박입니다. screen
그 자체는 단순히 BEL을 다음으로 전달합니다.주인연결된 단말기 및 화면창이 활성화된 위치 또는 단말기가 발급된 위치플래시제어 순서 또는 "Wuff, Wuff!!"(sic) 메시지는 구성 방법에 따라 다릅니다(참조 info screen vbell
).
그래픽 세션 외부에서 Linux를 실행하는 PC에 로그인한 경우 fd 1은 이미 장치 getty
에 열려 있습니다 . /dev/tty<1-...>
여기서 커널은 터미널 에뮬레이터를 구현하고 출력용 모니터와 입력용 키보드를 사용합니다. 같은 원리로 printf
커널은 BEL이 기록될 때 PC 스피커에서 경고음을 발생시킵니다.
대화형 쉘의 프롬프트에서 이 명령을 실행하면 ssh
fd 1도 의사 터미널 장치( )가 되며 /dev/pt<something>
, 이번에는 원격 시스템에서 원격 사용자의 로그인 쉘을 시작하는 SSH 서버에 의해 시작됩니다. 의사 터미널 쌍의 다른 쪽 끝은 SSH 서버입니다. BEL(또는 그 밖의 다른 것)이 수신되면 ssh 서버는 이를 암호화된 연결을 통해 ssh 클라이언트로 보냅니다. 그런 다음 이를 표준 출력에 쓰고 결국 현재 있는 터미널 창으로 보냅니다.
존재하다
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
, 해당 사용자가 이러한 알림을 비활성화하지 않은 경우(사용하여 ) write
한 명의 사용자(단말 장치 한 대)에게만 메시지를 쓸 수도 있습니다.mesg n