我有以下情况:
我使用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
会话应作为后台进程保持活跃,因此可以在任何给定时间自由地与它交谈。当然,想到使用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
会话。我在想什么样的永恒过程可以传递到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(eep alive)启动,侦听端口666,任何数据流都被重定向到连接到主机的netcat
telnet
客户端,而整个会话被转储到output.log。现在可以echo
telnet命令到nc localhost 666
,并从output.log读取结果。
应该记住,expect
脚本可以轻松修改,以适应SSH
甚至serial console
连接,只需生成ssh
或socat
即可而不是netcat
。我从不喜欢expect
,因为它强制在bash
中使用其他脚本语言,需要tcl
库,并且需要针对嵌入式平台进行编译,而netcat
是busybox
的一部分,随处可见。
所以,问题是 - 这可以用更简单的方式完成吗?我打赌我在控制台和TCP socket
之间建立某种联系。任何建议都表示赞赏。
答案 0 :(得分:1)
如何像文件描述符一样使用?
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>&-