我有以下情况:
我使用netcat
连接到端口23上运行telnet
服务器的主机,我使用提供的用户名和密码登录,发出一些命令,然后我需要对提供的输出进行相当复杂的分析。自然地,想到了expect
,它具有如下脚本:
spawn nc host 23
send "user\r"
send "pass\r"
send "command\r"
expect EOF
然后,它使用
expect example.scr >output.log
执行,因此可以解析输出文件。解析器是150多行bash
代码,它们在2秒内执行,并决定下一步应执行什么命令。因此,它将“command”替换为“command2”,并再次执行expect
脚本,如下所示:sed -i '/send "command\r"/send "command2\r"/' example.scr
expect example.scr >output.log
显然,不需要重新建立
telnet
连接并重新执行登录过程,只需在处理2秒后发出单个telnet
命令即可。可以得出结论,telnet
session 应作为后台进程保持 Activity 状态,因此可以在任何给定时间自由地与其对话。自然地,想到了使用named pipes
:mkfifo in
mkfifo output.log
cat in | nc host 23 >output.log &
echo -e "user\npass\ncommand\n" >in
cat output.log
写入文件后,
EOF
导致named pipe
关闭,从而终止telnet
session 。我在想可以将哪种永恒过程通过管道传递给netcat
,以便可以将其用作telnet
的中继。我提出了一个非常愚蠢的想法,但是它起作用了:nc -k -l 666 | nc host 23 >output.log &
echo -e "user\npass\ncommand\n" | nc localhost 666
cat output.log
netcat
服务器以k(保持 Activity 状态)启动,监听端口666,并且所有数据流都重定向到连接到主机的netcat
telnet
客户端,而整个 session 都转储到output.log。现在,可以将echo
telnet命令添加到nc localhost 666
,并从output.log中读取结果。请记住,仅通过生成
expect
或SSH
而不是serial console
,就可以轻松修改ssh
脚本以适应socat
甚至netcat
连接。我从不喜欢expect
,因为它会强制使用bash
中的另一种脚本语言,需要tcl
库,并且需要针对嵌入式平台进行编译,而netcat
是busybox
的一部分,并且随时随地都可以使用。因此,问题是-可以用更简单的方式做到这一点吗?我敢打赌,在console和
TCP socket
之间建立某种联系。任何建议表示赞赏。
最佳答案
像文件描述符一样使用呢?
exec 3<>/dev/tcp/host/port
while true; do
echo -e "user\npass\ncommand" >&3
read_response_generate_next_command <&3 >&3
# if no more commands, break;
done
exec 3>&-
关于bash - bash :保持连接活跃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28928916/