PuTTY 또는 OpenSSH에서 +를 누르면 CtrlSSH 호스트로 정확히 무엇이 전송되는지 알아내려고 합니다. c내가 원하는 것은 Ctrl사용자가 +를 누를 때 와 동일한 제어 코드를 프로그래밍 방식으로 보내는 것입니다 z. 지금까지는 보낼 때마다 또는 ^C
그냥 인쇄됩니다. 터미널에 이스케이프되었음을 알리는 일종의 추가 정보가 있어야 합니까 ?\cc
\003
^C
SSH 호스트에 연결된 SSH 세션에 프로그래밍 방식으로 문자를 보내고 있습니다. OpenSSH 클라이언트를 열고 키보드에서 +를 누를 Ctrl때와 동일한 효과를 보고 싶습니다.c
답변1
만약에 Ctrl+ cSSH를 통해 전송되며 바이트입니다( ^C
예: 16진수, 0x03
8진수 003
, ASCII ETX).
만약에 Ctrl+ zSSH를 통해 전송되며 바이트입니다( ^Z
예: 16진수, 0x1a
8진수 032
, ASCII SUB).
Ctrl클라이언트의 +가 c서버에 도달하는 바이트를 생성할 수도 있고 생성하지 않을 수도 있기 때문에 "if"를 썼습니다 . 서버 측에서 이 바이트는 SSH 서버가 시작한 프로그램에 도달할 수도 있고 그렇지 않을 수도 있습니다.
Windows의 PuTTY가 이 문제를 어떻게 처리하는지 정확히 모르지만 Linux(예: Linux 클라이언트 + Linux 서버)의 메커니즘은 알고 있습니다. 내 답변은 다른 여러 답변의 정보를 요약합니다.
- 키보드 입력과 텍스트 출력은 어떻게 작동합니까?
- 각 PTY(의사 터미널) 구성 요소(소프트웨어, 마스터 측, 슬레이브 측)의 역할은 무엇입니까?
- "원시" 장치 드라이버와 "요리된" 장치 드라이버의 차이점은 무엇입니까?
- SSH 세션에서 Ctrl-C 처리
ssh
터미널 에뮬레이터로 실행 중이라고 가정하고 Ctrl+ 를 누르세요 c. 무슨 일이 일어나는가?
터미널 에뮬레이터 생성
^C
.해당 바이트를 가로채서 신호로 "변환"할 수도 있고 그렇지 않을 수도 있는 tty 라인 규칙이 있습니다.
SIGINT를 트리거하도록 라인 규칙이 구성된 경우
^C
현재 포그라운드 프로세스 그룹에 SIGINT를 보냅니다.ssh
포그라운드 프로세스 그룹에 있으면 신호를 받고 종료됩니다.라인 규칙이
^C
특별한 처리를 수행하지 않도록 구성된 경우^C
"일반" 바이트(예:a
또는5
) 처럼 전송되고ssh
읽혀 원격 엔드로 전송됩니다. 그런 다음…
원격 측에 tty가 할당될 수도 있고 그렇지 않을 수도 있습니다.
tty가 없으면 SSH 서버에서 시작된 프로그램은
^C
표준 입력을 수신합니다.tty가 존재하는 경우
^C
특수 처리를 위해 구성되거나 구성되지 않을 수 있는 회선 규칙이 존재하는 것입니다. 로컬에서 발생하는 것과 유사하게 원격 회선 규칙은 SIGINT를 (원격) 전경 프로세스 그룹에 보내거나^C
"일반" 바이트처럼 전달합니다.
ssh
원격 측에 tty를 할당하거나 할당하지 않고 시작하며 로컬 터미널이 특수 처리를 중지하지 ssh … some_command
않게 합니다 . 실제로 local +는 로컬 프로그램(즉, 자체)을 종료합니다. 그러나 로컬 연결 규칙을 우회하도록 파이프하는 경우 원격 측에서 임의의 데이터(바이트 포함)를 파이프 할 수 있으며 데이터를 손상시킬 수 있는 연결 규칙은 없습니다.ssh -T …
^C
Ctrlcssh
ssh
^C
some_command
ssh
명령이 필요하지 않거나 명령으로 시작됨-t
( -tt
일부 경우 필수) 원격 측에 tty를 할당하고 로컬 터미널이 ^C
특수 처리를 중지하도록 하십시오. 실제로 local Ctrl+는 c로컬 프로그램(즉, 자체)을 종료하지 않지만 원격 회선 규칙이 이를 처리하는 원격 측으로 ssh
이동하므로 local +는 원격 프로그램을 종료할 수 있습니다. 원격 회선 규칙은 그것이 로컬 + 에서 오는지 또는 (예를 들어) 파이프에서 오는지 여부 를 알 수 없습니다 . tty가 원격 측에 할당되면 파이프를 통해 임의의 데이터를 안정적으로 보내고 받을 수 없습니다 . 원격 측의 연결 규칙으로 인해 데이터가 손상됩니다. 내 질문에서 몇 가지 추가 통찰력을 얻을 수 있습니다.^C
Ctrlc^C
Ctrlcprintf "\003"
ssh
ssh
ssh
별도의 stdin, stdout, stderr 및 tty가 있습니다..
지금까지는 보낼 때마다 또는
^C
그냥 인쇄됩니다.\cc
\003
가능성:
원격 측에는 tty가 없으므로
^C
SIGINT로 "변환"하는 행 규칙이 없으며 프로그램은 실제로 볼 수 있는 형식(예: )으로 "인쇄합니다"cat -A
.또는 원격 끝에 tty가 있지만 라인 규칙은
^C
특별한 처리를 수행하지 않도록 구성되어 있습니다. 터미널 드라이버 XOR은 "인쇄"합니다(입력으로 얻는 내용을 (캐럿으로) 에코하도록 터미널 드라이버를 구성하는 것은 쉽습니다stty ctlecho
. )또는 원격 엔드에 tty가 있고 라인 규율이
^C
특별한 처리를 위해 구성되었지만 프로그램이 SIGINT를 포착하고 자체 종료하는 대신 "인쇄"합니다.
답변2
이 같은:
(echo ping google.com; sleep 3; printf "\003"; ) |
ssh -tt localhost
답변3
퍼티에서 CTRL-C를 누르거나 SSH를 열 때 SSH 호스트로 정확히 무엇이 전송되고 있는지 알아내려고 노력 중입니다.
나는 모른다.
내가 원하는 것은 사용자가 CTRL-Z를 누를 때 발생하는 것과 동일한 제어 코드를 실용적으로 보내는 것입니다.
프로그래밍 방식으로 Ctrl+C를 보내려면 SIGINT를 ssh로 보내세요. 예를 들면 다음과 같습니다.
killalll -s SIGINT ssh
ctrl+C
액세스할 수 있는 모든 SSH 세션을 누르는 것과 동일합니다 . 또한 Ctrl+Z의 경우 SIGTSTP를 사용합니다.
killall -s SIGTSTP ssh
모든 ssh 터미널에서 Ctrl+Z...를 누르고 특정 ssh 세션으로 보내고 해당 ssh PID를 가져와 kill을 사용합니다.
kill -s SIGTSTP PID
Ctrl+Z는 이 PID에 속한 SSH 세션으로 전송됩니다.