В рамках более крупного плана (перепрыгнуть через кучу переходов, а затем создать порт-туннель для mongodb в настройке, в которой PortForwarding отключен), я попытался создать сценарий tcl/expect, чтобы проверить, можно ли ретранслировать подготовленный поток. по tcl/ожидать.
Вот мой эксперимент:
# terminal 1 [listen to 2000]
nc -l 2000
# terminal 2 [listen to 200 then connect it to 2000 using expect]
socat tcp-l:200 system:'./nc-test.exp'
# terminal 3 [connect to 200]
nc localhost 200
и мой простой скрипт tcl/expect (nc-test.exp
):
#!/usr/local/bin/expect
log_user 0
spawn nc localhost 2000
stty raw -echo
interact -o -nobuffer
Теперь проблема в том, что все, что я пишу terminal 3
, возвращается ко мне самому. Как ни странно, этого не происходит, когда я подключаюсь socat
напрямую к nc localhost 2000
или когда я напрямую запускаю скрипт tcl/expect. Не могли бы вы помочь мне понять
Команда stty
в сценарии expect
воздействует на /dev/tty
, который, вероятно, является tty в терминале 2. Однако spawn
создает еще один pty для взаимодействия с запускаемой им командой. Этот tty будет унаследован от текущего tty, то есть терминала 2, поэтому эхо будет включено. Может быть достаточно просто переместить строку stty raw -echo
перед спауном, или, более явно, вы можете установить параметр stty, который будет использоваться spawn
с помощью такой команды, как
set stty_init "raw -echo"
перед spawn
.