"/dev/random"에서 읽을 때 커서 뒤에 "1;2c" 문자가 배치되는 이유는 무엇입니까? [복사]

"/dev/random"에서 읽을 때 커서 뒤에 "1;2c" 문자가 배치되는 이유는 무엇입니까? [복사]

명령을 실행하면 임의의 쓰레기 바이너리 데이터가 표시되지만, 이를 수신한 후에도 dd if=/dev/random count=1 bs=32프로세스가 종료된 후에도 일부 문자가 여전히 남아 있습니다(항상 보듯이).1;2cdd

[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 c0x1b 0x30 0x63ESC0 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

관련 정보