Ctrl+c 또는 Ctrl+z SSH를 통해 보내는 방법은 무엇입니까?

Ctrl+c 또는 Ctrl+z SSH를 통해 보내는 방법은 무엇입니까?

PuTTY 또는 OpenSSH에서 +를 누르면 CtrlSSH 호스트로 정확히 무엇이 전송되는지 알아내려고 합니다. c내가 원하는 것은 Ctrl사용자가 +를 누를 때 와 동일한 제어 코드를 프로그래밍 방식으로 보내는 것입니다 z. 지금까지는 보낼 때마다 또는 ^C그냥 인쇄됩니다. 터미널에 이스케이프되었음을 알리는 일종의 추가 정보가 있어야 합니까 ?\cc\003^C

SSH 호스트에 연결된 SSH 세션에 프로그래밍 방식으로 문자를 보내고 있습니다. OpenSSH 클라이언트를 열고 키보드에서 +를 누를 Ctrl때와 동일한 효과를 보고 싶습니다.c

답변1

만약에 Ctrl+ cSSH를 통해 전송되며 바이트입니다( ^C예: 16진수, 0x038진수 003, ASCII ETX).
만약에 Ctrl+ zSSH를 통해 전송되며 바이트입니다( ^Z예: 16진수, 0x1a8진수 032, ASCII SUB).

Ctrl클라이언트의 +가 c서버에 도달하는 바이트를 생성할 수도 있고 생성하지 않을 수도 있기 때문에 "if"를 썼습니다 . 서버 측에서 이 바이트는 SSH 서버가 시작한 프로그램에 도달할 수도 있고 그렇지 않을 수도 있습니다.

Windows의 PuTTY가 이 문제를 어떻게 처리하는지 정확히 모르지만 Linux(예: Linux 클라이언트 + Linux 서버)의 메커니즘은 알고 있습니다. 내 답변은 다른 여러 답변의 정보를 요약합니다.

ssh터미널 에뮬레이터로 실행 중이라고 가정하고 Ctrl+ 를 누르세요 c. 무슨 일이 일어나는가?

  1. 터미널 에뮬레이터 생성 ^C.

  2. 해당 바이트를 가로채서 신호로 "변환"할 수도 있고 그렇지 않을 수도 있는 tty 라인 규칙이 있습니다.

    • SIGINT를 트리거하도록 라인 규칙이 구성된 경우 ^C현재 포그라운드 프로세스 그룹에 SIGINT를 보냅니다. ssh포그라운드 프로세스 그룹에 있으면 신호를 받고 종료됩니다.

    • 라인 규칙이 ^C특별한 처리를 수행하지 않도록 구성된 경우 ^C"일반" 바이트(예: a또는 5) 처럼 전송되고 ssh읽혀 원격 엔드로 전송됩니다. 그런 다음…

  3. 원격 측에 tty가 할당될 수도 있고 그렇지 않을 수도 있습니다.

    • tty가 없으면 SSH 서버에서 시작된 프로그램은 ^C표준 입력을 수신합니다.

    • tty가 존재하는 경우 ^C특수 처리를 위해 구성되거나 구성되지 않을 수 있는 회선 규칙이 존재하는 것입니다. 로컬에서 발생하는 것과 유사하게 원격 회선 규칙은 SIGINT를 (원격) 전경 프로세스 그룹에 보내거나 ^C"일반" 바이트처럼 전달합니다.

ssh원격 측에 tty를 할당하거나 할당하지 않고 시작하며 로컬 터미널이 특수 처리를 중지하지 ssh … some_command않게 합니다 . 실제로 local +는 로컬 프로그램(즉, 자체)을 종료합니다. 그러나 로컬 연결 규칙을 우회하도록 파이프하는 경우 원격 측에서 임의의 데이터(바이트 포함)를 파이프 할 수 있으며 데이터를 손상시킬 수 있는 연결 규칙은 없습니다.ssh -T …^CCtrlcsshssh^Csome_command

ssh명령이 필요하지 않거나 명령으로 시작됨-t( -tt일부 경우 필수) 원격 측에 tty를 할당하고 로컬 터미널이 ^C특수 처리를 중지하도록 하십시오. 실제로 local Ctrl+는 c로컬 프로그램(즉, 자체)을 종료하지 않지만 원격 회선 규칙이 이를 처리하는 원격 측으로 ssh이동하므로 local +는 원격 프로그램을 종료할 수 있습니다. 원격 회선 규칙은 그것이 로컬 + 에서 오는지 또는 (예를 들어) 파이프에서 오는지 여부 를 알 수 없습니다 . tty가 원격 측에 할당되면 파이프를 통해 임의의 데이터를 안정적으로 보내고 받을 수 없습니다 . 원격 측의 연결 규칙으로 인해 데이터가 손상됩니다. 내 질문에서 몇 가지 추가 통찰력을 얻을 수 있습니다.^CCtrlc^CCtrlcprintf "\003"sshsshssh별도의 stdin, stdout, stderr 및 tty가 있습니다..

지금까지는 보낼 때마다 또는 ^C그냥 인쇄됩니다.\cc\003

가능성:

  • 원격 측에는 tty가 없으므로 ^CSIGINT로 "변환"하는 행 규칙이 없으며 프로그램은 실제로 볼 수 있는 형식(예: )으로 "인쇄합니다" 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 세션으로 전송됩니다.

관련 정보