pty 없이 직렬 터미널(RS-232)을 설정할 수 있나요?

pty 없이 직렬 터미널(RS-232)을 설정할 수 있나요?

/dev/ttyS0RS-232 포트가 있고 널 모뎀을 통해 서로 연결된 두 대의 컴퓨터가 있습니다 .

나는 과거에 외부 터미널이 어떻게 작동했는지, 그리고 이것이 오늘날 Linux가 작동하는 방식과 어떻게 관련되는지 조금씩 이해하려고 노력하고 있습니다.

나는 다음과 같이 작동하도록했습니다 :

메인 컴퓨터:

$ sudo socat /dev/ttyS0,raw,echo=0 exec:"/bin/bash -i",pty,stderr,setsid,sigint,sane

단말기:

picocom -b 9600 /dev/ttyS0

그러나 pty터미널에서 이것을 얻는 이유는 다음과 같습니다.

# tty
/dev/pts/11

실제 실제 tty가 있다면 의사 tty가 필요하지 않을 것입니다. 그렇죠? 내 말은, 가짜를 만들기 전에 터미널에 배선을 연결했다는 거죠, 그렇죠?

그래서 나는 pty 없이 만들기 위해 socat 옵션을 혼합하고 일치시키려고 노력했지만 운이 없었습니다. 내 터미널 시스템에 어떤 것이 나타나면 캐리지 리턴이나 작업 제어가 없으며 tty"tty가 아님"이라고 표시됩니다.

나는 socat 구문(또는 터미널 설정)을 이해하지 못한다는 점을 인정해야 합니다. 정답을 보고 거기에서 구문을 이해하고 싶습니다.

누군가 pty 없이 원격 터미널을 만드는 방법을 알려주거나 이것이 불가능하다는 것을 받아들이도록 도와줄 수 있습니까?

답변1

명령줄에서 실행하는 경우 getty루트로 실행하고 루프로 래핑해야 할 수도 있습니다.

while true; do getty -8 9600 ttyS0; done

통화는 getty한 번의 세션, 즉 일반적으로 3번의 로그인 시도 집합을 제공하거나 직렬 포트가 끊기 신호를 수신할 때까지만 제공합니다. picocom직렬 회선을 재설정하기 위해 처음에 끊김이 전송 되면 이로 인해 첫 번째 회선이 getty종료됩니다.

직렬 포트 정지 신호로 인해 프로세스가 조기에 종료되지 않으면 gettyTTY 장치를 설정하고 컨텐츠를 /etc/issue터미널로 전송하며 로그인 프롬프트를 표시합니다. 유효한 사용자 이름을 입력한 경우 ( getty참고 exec():아니요 fork()첫째) /bin/login이는 일반적으로 PAM 라이브러리를 호출하여 비밀번호 프롬프트와 나머지 사용자 세션 설정을 처리합니다. 해당 프로세스의 일부로 프로세스의 ID가 로그인된 사용자로 전환되고, getty시작된 프로세스는 로그인 된 사용자의 셸을 login다시 호출합니다 . exec()프로세스가 종료된 경우어떤 이유로, 사용자의 세션이 종료되고 getty새 로그인을 위한 새 프로세스가 시작됩니다.

루프에서 수동으로 실행하는 것은 getty발생해야 하는 일을 "시각화"하는 좋은 방법일 수 있지만 장기간 사용하기 위한 올바른 접근 방식은 아닙니다.

모든 프로세스는 실제로 생명을 시작한 프로세스 (로그인 성공 시 사용자의 셸로 변환)가 종료될 getty때 시작되고 다시 시작되도록 되어 있습니다 . 따라서 직렬 포트에서 터미널로 실행을 최신 Linux 배포판사용하는initgettysystemdgetty

systemctl start [email protected]

재부팅 후에도 지속되도록 하려면 다음 사항도 필요합니다.

systemctl enable [email protected]

클래식 SysVinit를 사용하는 경우 파일에 주석 처리된 예제 라인이 있어야 합니다 /etc/inittab. 해당 라인의 주석 처리를 해제하고 실행하여 telinit qSysVinit가 해당 구성을 다시 읽도록 하면 터미널 프로세스가 init즉시 시작되고 getty필요에 따라 다음과 같이 다시 시작해야 합니다.

관련 정보