/ dev / pts 파일에 무엇이 저장되어 있으며 열 수 있습니까?


73

내 지식에 따르면 /dev/pts파일은 ssh 또는 telnet 세션을 위해 생성됩니다.


6
echo Hello > /dev/pts/1... 무슨 일이 일어나는지, 그것이 당신의 터미널입니다.
Sepahrad Salour


1
@SepahradSalour는 pts 번호를 컨텍스트에 맞게 조정해야합니다. 내 sshd가 내 세션에 / dev / pts / 30을 사용했습니다.
Gab 是 好人

2
@Gab 是 好人 현재 터미널의 위치를 ​​알려면 명령을 사용할 수 있습니다 tty.
JeromeJ

답변:


110

에 저장된 것이 없습니다 /dev/pts. 이 파일 시스템은 순전히 메모리에 존재합니다.

의 항목 /dev/pts의사 터미널입니다 (짧게는 pty). 유닉스 커널에는 일반적인 터미널 개념이 있다 . 터미널은 응용 프로그램이 터미널 장치를 통해 출력을 표시하고 입력을받는 방법을 제공합니다 . 프로세스에는 제어 터미널 이있을 수 있습니다. 텍스트 모드 응용 프로그램의 경우 사용자와 상호 작용하는 방식입니다.

터미널은 하드웨어 터미널 ( "tty", "teletype"의 약자) 또는 유사 터미널 ( "pty") 일 수 있습니다. 하드웨어 단자는 직렬 포트 ( ttyS0,…) 또는 USB ( ttyUSB0,…) 와 같은 일부 인터페이스 또는 PC 화면 및 키보드 ( tty1,…)를 통해 연결됩니다. 의사 터미널은 응용 프로그램 인 터미널 에뮬레이터에 의해 제공됩니다. 의사 터미널의 일부 유형은 다음과 같습니다.

  • xterm, gnome-terminal, konsole과 같은 GUI 응용 프로그램은 키보드 및 마우스 이벤트를 텍스트 입력으로 변환하고 출력을 일부 글꼴로 그래픽으로 표시합니다.
  • 실제 터미널에서 텍스트 모드 응용 프로그램을 분리하기 위해 화면 및 tmux 릴레이 입력과 같은 멀티플렉서 응용 프로그램을 다른 터미널과주고받습니다.
  • sshd, telnetd, rlogind와 같은 원격 셸 응용 프로그램은 클라이언트의 원격 터미널과 서버의 pty간에 입력 및 출력을 릴레이합니다.

프로그램이 쓰기 위해 터미널을 열면 해당 프로그램의 출력이 터미널에 나타납니다. 여러 프로그램을 동시에 터미널에 출력하는 것이 일반적이지만 출력의 어느 부분이 어떤 프로그램에서 왔는지 알 수있는 방법이 없기 때문에 때때로 혼동 될 수 있습니다. 제어 터미널에 쓰려고하는 백그라운드 프로세스 는 SIGTTOU 신호에 의해 자동으로 중단 될 수 있습니다 .

프로그램이 읽기 위해 터미널을 열면 사용자의 입력이 해당 프로그램으로 전달됩니다. 동일한 터미널에서 여러 프로그램을 읽는 경우 각 문자는 프로그램 중 하나로 독립적으로 라우팅됩니다. 권장하지 않습니다. 일반적으로 주어진 시간에 터미널에서 능동적으로 읽는 단일 프로그램 만 있습니다. 그들이에없는 동안 자신의 제어 터미널에서 읽으려고 프로그램 전경이 되어 자동으로 SIGTTIN 신호에 의해 중단 .

실험하려면 tty터미널에서 실행 하여 터미널 장치가 무엇인지 확인하십시오. 그것이라고 가정 해 봅시다 /dev/pts/42. 다른 터미널의 쉘에서 다음을 실행 echo hello >/dev/pts/42하십시오. 문자열 hello이 다른 터미널에 표시됩니다. 이제 cat /dev/pts/42다른 터미널을 실행 하고 입력하십시오. 해당 cat명령 을 종료하려면 (다른 터미널을 사용하기 어렵게 함) Ctrl+를 누르십시오 C.

다른 터미널에 쓰는 것이 때때로 알림을 표시하는 데 유용합니다. 예를 들어 write명령이 그렇게합니다. 다른 터미널에서 읽기는 일반적으로 수행되지 않습니다.


내가 말하려는 내용을 잘못 이해했거나 정보가 꺼져 있습니다. 터미널에 쓰는 백그라운드 프로세스는 SIGTTIN을 생성하지 않습니다. 터미널에서 여러 프로그램을 동시에 읽을 수도 없습니다 ( "각 문자가 독립적으로 라우팅된다"는 설명). 한 번에 하나의 프로그램 만 터미널에서 읽을 수 있으며 백그라운드 프로그램이 해당 터미널에서 읽으려고하면 SIGTTIN이 발생합니다. SIGTTIN이 자동으로 전송되는 유일한 경우입니다.
Patrick

또한 다른 터미널에서도 읽을 수 없습니다. 그렇게하는 것은 데이터를 가로 챌 수있는 중대한 보안 취약점이됩니다. strace프로그램은 입력을 읽을 수 있지만 그게 다입니다.
Patrick

4
@Patrick 백그라운드 터미널에 쓰는 프로세스는 SIGTTOU를 얻습니다. 오타였습니다. 여러 프로그램 이 동시에 터미널에서 읽을 수 있습니다 (다음 단락에서 설명하는 방식으로 시도하십시오. 제어 터미널이 해당 터미널이 아닌 프로세스에서 수행해야 함). 그렇습니다. 다른 터미널이 자신에게 속한 한 다른 터미널에서 읽을 수 있습니다. 왜 이것이 불가능하다고 생각하십니까?
Gilles

tostoptty 플래그가 설정된 경우 터미널에 쓰는 백그라운드 프로세스 만 SIGTTOU를 얻습니다 . 이 플래그는 기본적으로 설정되어 있지 않습니다. 그리고 나는 주석 TTY에서 읽은 내용을 수정했습니다. 나는 그것을 시도했지만 작동하지만 문자 기준이 아닌 읽기 기준입니다 (쉘 프롬프트에 앉아있을 때 쉘이 한 번에 1 문자를 읽는 것과 동일합니다). 이 점을 분명히 밝히는 것이 좋을 것입니다. 이제는 귀하의 답변을 해석했습니다.
Patrick

2
@Patrick 물론, read호출은 연속 문자 (또는 바이트 수) 만 반환하지만 응용 프로그램은 read호출이 반환 하는 바이트 수를 제어 할 수 없으므로 더 좋지 않습니다.
Gilles

18

파일 /dev/pts은 "의사 -ttys"입니다. 그것들은 어느 정도 명명 된 파이프와 같지만 VT-100과 같은 오래된 직렬 연결 터미널을 모방합니다. Pseudo-ttys는 키보드에서 프로그램으로, 프로그램에서 출력 장치로 바이트를 전송하는 작업을 수행합니다. 그러나 그것은 당신의 명백한 질문에 대답합니다 : 커널은 /dev/pts/0예를 들어 아무것도 저장하지 않습니다 . pseudo-tty에 연결된 프로그램의 stdout에서 바이트 스트림 만 들어오고 stdin이 동일한 pseudo-tty에 연결된 프로그램은 해당 바이트를 읽습니다.

Pseudo-ttys는 이러한 바이트 스트림에 간접 계층을 넣습니다. 커널은 "Control-C"또는 "Control-D"또는 "Control-U"(모두 구성 가능, 참조 man stty)와 같은 특수 값에 대한 바이트를 검사 하고 SIGINT를 보내거나 stdin에 파일 끝을 설정하거나 지울 수 있습니다. 입력 라인. 거기 어딘가에 버퍼링 기능이 있기 때문에, 나의 "아무것도 저장하지 않는다"는 다소 틀리지 만 몇 킬로바이트 만 있습니다.

커널은 출력에서 ​​바이트 값을 검사하고 개행 (ASCII 줄 바꿈, LF 또는 "\n")을 2 바이트, 캐리지 리턴 및 줄 바꿈 (CRLF 또는 "\r\n") 또는 직렬 터미널 하드웨어에 필요한 바이트로 변환하는 것과 같은 작업을 수행 할 수 있습니다 . 의사 tty의 간접적 인 지시는 하드웨어로부터 독립성을 허용합니다.

의사 -tty는 또한 모든 "설정된 전송 속도", "설정된 패리티"등의 ioctl()시스템 호출을 허용하며 아무 것도 수행하지 않습니다. 이를 통해 VT-100, ADM-3 및 Wyse 시대에 다시 작성된 프로그램은 오류없이 계속 작동합니다. 의사 -ttys 장치 드라이버 인 소프트웨어는 하드웨어처럼 작동합니다.

의사 tty는 sshdand telnet에 의해 사용될 수 있지만 터미널 에뮬레이터 (예 : xterm또는 rxvt)와 일반적으로 xterm 내부에서 실행되는 쉘 사이에도 사용 됩니다.

리눅스와 많은 유닉스에는 의사가 있습니다. 계획 9는 그렇지 않습니다. Pseudo-tty는 직렬 케이블로 연결된 하드웨어 터미널 시절에 남겨진 약간의 유물입니다.


13

/dev/장치 파일의 특수 디렉토리입니다. 이들은 추상화이며 디스크의 실제 파일이 아닙니다. 디렉토리는 부팅시 채워지며 기존 장치 인터페이스를 반영하여 변경 될 수 있습니다. 기존 장치 인터페이스는 커널 및 사용자 공간 데몬에 의해 생성 및 파괴됩니다 udevd.

이렇게 표현 된 많은 장치는 가상입니다. 여기에는 /dev/pts콘솔 장치 인의 항목이 포함 됩니다. 이것이 원격 세션을 위해 생성 된 이유입니다. 로컬 GUI 터미널을 열 때도 생성됩니다.

그다지 쓸모는 없지만 파일로 열 수 있습니다. /dev/pts쉘이 연결된 노드 를 얻으려면 다음을 사용하십시오 tty.

> tty
/dev/pts/4

이제 다른 콘솔로 전환하고 다음을 시도하십시오.

> echo "duck!" > /dev/pts/4

영리한. 이제 시도하십시오 :

> cat /dev/pts/4

그런 다음 / dev / pts / 4에서 쉘을 사용하십시오. 당신이 종료 할 때까지이 붙어있어 cat반대편에 있지만,이 점 / 4에 입력 한 내용의 대부분이 통과한다 (예를 들면 시도에 "Hello World"나는 함께 종료 hl점에 / 4와 ello word상의 cat콘솔).

내 생각에 장치는 셸에서 입력을 받아 시스템을 통해 출력합니다. 이것은 화면에서 물건이 끝나는 방식입니다. 쉘은 하드웨어를 다루지 않고 시스템은 처리합니다. 시도하십시오 strace bash(그리고 man strace그것이 무엇인지 모르면 살펴 보십시오 ). 배쉬가 시작될 때 예비 전화를받습니다. 이제 키를 누르십시오.

read(0, "h", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "e", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "y", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0

입력 된 모든 문자에 대해 표준 입력에서 읽기 및 표준 출력으로 쓰기가 있습니다. 그러나 쉘의 표준은 무엇에 연결되어 있습니까? 이제 straceGUI 터미널에서 시도 하십시오. 예를 들어 KDE와 같은 이름을 모르면 konsole그놈 이름을 알아야합니다 gnome-terminal. 그의 출력은 strace아마 더 비밀입니다 - 광산을 많이 가지고 poll()recvfrom(). 글이 보이지 않지만 cat다른 터미널 에서 트릭을 가져 와서 입력 할 때 고양이가 읽는 키 스트로크는 strace 출력에서 ​​전혀 응답하지 않습니다. 터미널은 ' 수신하지 마십시오. 따라서 GUI 터미널 앱과 cat은 쉘이 출력하는 동일한 장치에서 읽기 위해 경쟁하고 있습니다.


우리가 붙어있을 때 'cat / dev / pts / 4'의 사용은 무엇 이며이 명령을 실행하는 동안 멈추는 이유는 무엇입니까?
user2720323

나는 이것을 시도하고 설명하기 위해 몇 개의 단락을 추가했습니다.
goldilocks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.