使用 tcl/expect 准备隧道
Using tcl/expect to prepare a tunnel
作为更大计划的一部分(跳过一堆跃点,然后在禁用 PortForwarding 的设置中创建到 mongodb 的端口隧道)我试图创建一个 tcl/expect 脚本验证是否可以中继由 tcl/expect.
准备的流
这是我的实验:
# 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 脚本时,这不会发生。你能帮我算一下吗
- 什么导致了不需要的回声?
- 我更大的计划可行吗? (我主要担心的是保持原始流)
expect
脚本中的stty
命令作用于/dev/tty
,这可能是终端2中的tty。但是,spawn
创建了另一个pty来交谈使用它启动的命令。该 tty 将从当前 tty 继承,即终端 2,因此将有回显。只需将 stty raw -echo
行移动到生成之前就足够了,或者更明确地说,您可以通过
之类的命令将 stty 设置设置为 spawn
使用
set stty_init "raw -echo"
在 spawn
.
之前
作为更大计划的一部分(跳过一堆跃点,然后在禁用 PortForwarding 的设置中创建到 mongodb 的端口隧道)我试图创建一个 tcl/expect 脚本验证是否可以中继由 tcl/expect.
准备的流这是我的实验:
# 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 脚本时,这不会发生。你能帮我算一下吗
- 什么导致了不需要的回声?
- 我更大的计划可行吗? (我主要担心的是保持原始流)
expect
脚本中的stty
命令作用于/dev/tty
,这可能是终端2中的tty。但是,spawn
创建了另一个pty来交谈使用它启动的命令。该 tty 将从当前 tty 继承,即终端 2,因此将有回显。只需将 stty raw -echo
行移动到生成之前就足够了,或者更明确地说,您可以通过
spawn
使用
set stty_init "raw -echo"
在 spawn
.