Сигналы или собственность владельца не могут быть «волшебным образом» перенесены через сокет.
За AF_UNIX, вы можете отправить терминал дескриптор файла непосредственно ( с помощью sendmsg и recvmsg) и есть принимающая сторона использовать (а не сокет) в качестве подпроцесса стандартный вывод / STDERR. Это не может быть сделано с простым socat, но этот метод используется внутри, например, инструментом tmux.
С простым socat самое лучшее, что вы можете сделать, это заставить его отправлять буквальный байт 0x03 (^ C) при нажатии Ctrl + C (это то, что делают telnet и ssh). Вы можете проверить это, нажав Ctrl+VCtrl+Cодин раз, чтобы отправить его, или запустив stty raw
перед socat постоянный переход в «сырой режим».
Однако этого будет недостаточно, чтобы принимающая сторона действительно поняла нажатие клавиши. Самый простой способ - проверять каждый байт вручную - отправлять SIGINT, когда он видит 0x03; в противном случае запишите это в подпроцесс 'stdin.
Однако telnetd и sshd добавляют псевдо-tty между сокетом и подпроцессом - в Python вы можете создать его, используя os.openpty()
; сторона 'slave' должна быть указана как подпроцесс 'stdout / stderr, а ваш сценарий должен выполняться в цикле, копируя данные между сокетом и стороной' master '.
Это все еще не вполне достаточно - полнофункциональный терминал протокола Логин, такие как SSH или Telnet, также есть сообщения, чтобы обновить размеры в PTy, и реагировать на termios устанавливающих изменения (например, установка «локальное эхо» и другие видели в stty
).
Было бы полезно прочитать исходный код клиента telnet и сервера telnetd, например, из GNU inetutils, поскольку они делают именно это.