(저는 Ubuntu를 사용하고 있습니다.) 제가 이해한 바에 따르면 tty는 단지 포트일 뿐입니다. 뭔가를 입력하면 뭔가가 출력되어야 합니다. 터미널(에뮬레이터)은 이러한 입력과 출력을 처리하는 소프트웨어입니다. 말 그대로 터미널은 연결할 포트를 선택할 수 있습니다.
/dev 아래에 많은 tty 파일이 있고 /dev/pts/ 아래에 많은 pts 파일이 있는 것을 보았습니다. 왜 그렇게 많은지 모르겠습니다. 다 중고인가요?
그렇지 않은 경우 지정된 pty로 터미널을 시작할 수 있습니까?
예를 들어gnome-terminal /dev/pts/47
고쳐 쓰다
내가 이렇게 하는 이유는 원격 터미널을 원하기 때문이다. 적절한 방법은 ssh 또는 telnet을 사용하는 것입니다.
그러나 일시적인 방문에는 그다지 편리하지 않습니다. socat을 사용하여 tty 또는 pty를 클라이언트에 전달하고 싶습니다. 그런 다음 클라이언트는 해당 pty 또는 tty를 사용하여 터미널을 시작할 수 있습니다.
아래 코드는 잘 작동합니다. 클라이언트 측에서 실행되고 서버 측에서는 "hello"가 표시됩니다.
echo "hello" > /home/myhomefoler/pty_created_by_socat
답변1
UNIX에서는 tty(다른 많은 항목과 마찬가지로)가 파일로 나타납니다. tty 장치에 쓴 데이터는 터미널로 전송되고, 터미널의 데이터는 tty에서 읽을 수 있습니다.
tty가 하드웨어 직렬 포트인 경우 여기에 기록된 데이터는 라인을 통해 전송되고 라인의 데이터는 tty에 나타납니다.
tty가 시스템의 비디오 콘솔인 경우 여기에 기록된 데이터가 화면에 나타나고 키보드의 데이터가 tty에 나타납니다.
tty가 X 터미널 에뮬레이터에 연결된 의사 tty(가상 터미널)인 경우 gnome-terminal
여기에 쓰여진 데이터는 가상 터미널의 읽기로 전송됩니다. 소프트웨어는 의사 터미널의 "기본" 측에 연결된다고 합니다. 실제 터미널에는 소프트웨어로 구현된 가상 장치가 아닌 실제 장치(예: 직렬 포트)가 있기 때문에 "마스터" 측이 없습니다.
/dev/ttyS0
따라서 Linux의 실제 직렬 포트와 같은 임의의 tty 장치에서 X 터미널 에뮬레이터를 실행하도록 요구하는 것이 의미가 없다는 것을 이미 알 수 있습니다. 의사 tty여야 합니다.
그러나 터미널 에뮬레이터는 자신이 사용하는 의사 터미널 장치의 숫자 ID를 선택할 수 있습니까? 원칙적으로 커널은 이를 허용할 수 있지만 실제로는 새로운 의사 터미널을 할당하기 위한 커널 인터페이스가 이를 지원하지 않습니다. 즉, 커널이 스스로 선택합니다. (SysV 모델에서는 이라는 특수 장치를 열어 의사 터미널이 생성되며, /dev/ptmx
사용 가능한 가장 낮은 번호의 의사 터미널 장치가 자동으로 할당됩니다.)
하지만 할당된 의사 단말 장치의 번호를 선택해야 하는 이유는 무엇입니까? 커널은 사용 가능이 보장된 미사용 커널을 선택합니다. 다른 것을 선택하고 싶은 이유가 있나요?
다른 질문은 다음과 같습니다.
/dev 아래에 많은 tty 파일이 있고 /dev/pts/ 아래에 많은 pts 파일이 있는 것을 보았습니다. 왜 그렇게 많은지 모르겠습니다. 다 중고인가요?
시스템에 따라 다릅니다. 일부 시스템에서는 사용 여부에 관계없이 가능한 모든 의사 터미널 장치가 /dev/pts
또는 에 미리 생성되어 있습니다 . /dev
다른 장치에서는 장치 노드가 의사 터미널을 사용할 때만 존재합니다. 우분투를 사용하신다고 하셨는데 후자인 리눅스입니다. 그렇습니다. 표시되는 모든 장치 노드는 /dev/pts
현재 사용 중입니다.
하지만 임시 방문에는 그다지 편리하지 않습니다. socat을 사용하여 tty 또는 pty를 클라이언트에 전달하고 싶습니다. 그런 다음 클라이언트는 해당 pty 또는 tty를 사용하여 터미널을 시작할 수 있습니다.
의사 터미널의 기본 측면에 연결하기를 원하는 socat
다른 소프트웨어가 있는 경우 이를 특별히 지원하는 소프트웨어가 필요합니다. 하지만 당신은 운이 좋다. 왜냐하면 socat
그렇기 때문이다. 예를 들어, 다음을 실행하면:
socat PTY,link=/tmp/socat.pty TCP-LISTEN:2222 &
sleep 1 && ( setsid bash ) </tmp/socat.pty >/tmp/socat.pty 2>&1
다른 곳에서 포트 2222에 연결하면 쉘을 얻을 수 있습니다.안전 측면에서 매우 위험합니다!