명령을 실행하면 임의의 쓰레기 바이너리 데이터가 표시되지만, 이를 수신한 후에도 dd if=/dev/random count=1 bs=32
프로세스가 종료된 후에도 일부 문자가 여전히 남아 있습니다(항상 보듯이).1;2c
dd
[amirreza@localhost ~]$ dd if=/dev/random count=1 bs=32
¾¿܄ÌYLÔAëEÔr/f&-È<>ýø1+0 records in
1+0 records out
32 bytes copied, 3.5878e-05 s, 892 kB/s
^[[?1;2c[amirreza@localhost ~]$ 1;2c
이 캐릭터는 무엇이며 종료 후 왜 던져지나요 dd
?
답변1
이 상황은 Linux/Unix GUI 터미널 창이 실제로 하나의 통합된 것이 아니라 어느 정도 함께 작동하는 세 가지임을 나타냅니다.
- 터미널 에뮬레이터(실제 GUI 터미널 애플리케이션 또는 Linux 텍스트 콘솔의 내장 터미널 에뮬레이터)
- 운영 체제의 TTY 또는 PTY(의사 TTY) 장치 드라이버
- 쉘 또는 당시 TTY 입력을 처리하는 모든 프로그램.
0x1b 0x63
무작위 가비지에는 () 또는 () 바이트 시퀀스 중 정확히 하나가 포함됩니다 .ESC c
0x1b 0x30 0x63
ESC0 c
이러한 시퀀스는 클래식 VT100 터미널과 호환되는 모든 터미널 또는 터미널 에뮬레이터에 대해 특별한 의미를 갖습니다. 이는 터미널의 기본 속성을 설명하는 코드로 응답하도록 터미널(/emulator)에 요청합니다.
ESC[?1:2c
터미널은 "이 터미널은 고급 비디오 옵션이 있는 VT100입니다"를 의미하는 문자열로 응답했습니다 . (이것은 xterm
다른 많은 호환 가능한 터미널 에뮬레이터가 일반적으로 보내는 응답입니다 .)
문자열은 사용자가 입력한 것처럼 전송되지만 dd
명령에는 키보드가 필요하지 않으므로 PTY 드라이버는 처음에 ^[[?1;2c
프롬프트 시작 부분에서 볼 수 있듯이 문자열을 다시 에코합니다. ( 제어 문자를 ^[
나타내는 일반적인 방법입니다.)ESC
그런 다음 dd
명령이 종료되고 쉘이 프롬프트를 표시하고 PTY 드라이버의 입력 버퍼에서 대기 중인 일부 입력을 보고 이를 읽고 해석하려고 시도합니다.
- ESC
[
bash
기본 메타 키 입력 중 하나 가 아닌 Meta-[로 해석되므로 아무 작업도 수행하지 않습니다. ?
어떤 이유에서인지 지금은 알 수 없어 필터링도 되어 있습니다. (아신다면 이 답변에 자유롭게 댓글을 달거나 편집해 주세요.)- 나머지는 이전 명령이 완전히 완료되기 전에 입력을 시작한 명령의 시작인 경우를 대비해 프롬프트 다음에 쉘에 의해 다시 표시됩니다.
터미널 에뮬레이터에 영향을 줄 수 있는 다른 제어 시퀀스도 있습니다. Xterm 및 호환 가능한 터미널 에뮬레이터가 이해하는 제어 시퀀스 목록은 다음과 같습니다.https://www.xfree86.org/current/ctlseqs.html
실수로 임의의 쓰레기를 터미널 창에 넣어서 터미널 표시가 더 나빠지는 경우(예를 들어 임의의 데이터에 "문자 집합 변경" 코드가 포함되어 문자를 인식할 수 없게 되는 경우) 변환 방법을 알고 싶을 수도 있습니다. 엉망이 된 터미널 창이 다시 정상 상태로 재설정됩니다. 몇 가지 전략이 있습니다:
- GUI 터미널 창을 사용하는 경우 "터미널 재설정" 메뉴 옵션이 포함될 수 있습니다.
- "기본 문자 집합으로 돌아가기"에 대한 제어 코드는 단순한 Control+
o
(숫자가 아닌 문자 O)이므로 이를 입력하고 Enter를 눌러 다음 프롬프트가 더 좋아 보이는지 확인할 수 있습니다. - 명령 프롬프트에 있는 것처럼 보이지만 문자가 인식되지 않으면 단순한 디스플레이 문제라고 가정하고 맹목적으로 명령을 입력
reset
하고 Enter 키를 누르십시오. - 전체 화면 텍스트 기반 프로그램(=사용된 모든 프로그램)의 경우 +를 눌러 혼란을 방지하기 위해 디스플레이의 전체 새로 고침을 요청할
(n)curses
수 있습니다 .ControlL