bash - bash :保持连接活跃

标签 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 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中读取结果。

请记住,仅通过生成expectSSH而不是serial console,就可以轻松修改ssh脚本以适应socat甚至netcat连接。我从不喜欢expect,因为它会强制使用bash中的另一种脚本语言,需要tcl库,并且需要针对嵌入式平台进行编译,而netcatbusybox的一部分,并且随时随地都可以使用。

因此,问题是-可以用更简单的方式做到这一点吗?我敢打赌,在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/

相关文章:

c - 无法理解 read() 系统调用

java - 本地PC无法读取同一网络中其他PC的套接字

iOS 客户端,C++ 服务器?

python - 直接调用与 Python 子进程时 GOPATH 的解释不同

java - 我应该将 JAVA_HOME 路径设置为哪个文件路径?

linux - Linux 文件中缺少 EOL 字符

linux - echo 不会输出多行

linux - 将源代码与包含 sudo 命令的脚本一起使用

PHP脚本修改Ubuntu用户密码

python - 从子进程更改父 shell 的环境