BASH:保持连接活着

时间:2015-03-08 16:31:41

标签: bash shell sockets telnet netcat

我有以下情况:

我使用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连接,只需生成sshsocat即可而不是netcat。我从不喜欢expect,因为它强制在bash中使用其他脚本语言,需要tcl库,并且需要针对嵌入式平台进行编译,而netcatbusybox的一部分,随处可见。

所以,问题是 - 这可以用更简单的方式完成吗?我打赌我在控制台和TCP socket之间建立某种联系。任何建议都表示赞赏。

1 个答案:

答案 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>&-