Linux脚本:解析telnet消息并退出

9

我正在连接到一个Telnet监听器。Telnet服务器每秒发送“1234”。我想读取消息“1234”并关闭Telnet会话。下面是我的代码,但它不起作用。

#!/bin/bash
telnet 192.168.10.24 1234
read $RESPONSE
echo "Response is"$RESPONSE
echo "quit"

如何自动读取Telnet消息?

4个回答

10

下面给出最简单、最易于的方法。

sleep <n> | telnet <server> <port>

n - 自动退出之前的等待时间(以秒为单位)。它可以是小数,如0.5。请注意,某些所需的输出可能不会在指定的等待时间内返回。因此,我们可能需要相应地增加。

server - 目标服务器的IP地址或主机名。

port - 目标服务端口号。

您也可以像这样将输出重定向到文件中:

sleep 1 | telnet <server> <port> > output.log

更新1#: 如果远程主机不接受或拒绝连接请求,则上述方法可能无法正常工作。在这些情况下,以下方法有效:


RESPONSE=$(timeout 5 telnet 192.168.10.24 1234)

管道睡眠。天才。这是最好的答案。 - Carson Ip
这对我有用,因为我正在使用proxychains。你今天教了我一些新东西。 - rubynorails

6
您可以使用内部TCP机制:
#!/bin/bash

exec 3<>/dev/tcp/127.0.0.1/80
# echo -en "eventualy send something to the server\n" >&3
RESPONSE="`cat <&3`"
echo "Response is: $RESPONSE"

您可以使用nc(netcat)工具,但请不要使用telnet!


谢谢!它起作用了!但是"3<>"和"cat <&3"是用来将STDIN重定向到RESPONSE吗? - user1336117
2
您可以查看bash手册中的REDIRECTION段落,了解/dev/tcp、exec和<>的工作原理。实质上,您正在请求bash在同一shell上打开文件描述符#3以进行读写,并将其附加到127.0.0.1端口80上的TCP流。 - dAm2K

1

已经有答案了,但是这里提供另一个观点,使用curl非常有用,可以进行快速检查(例如服务是否活动)。我必须努力避免使用“脚本”和“expect”解决方案。

这只是一个可能的POP3检查桩:

echo "quit" | curl telnet://localhost:110 > /tmp/telnet_session.txt
if grep "POP3 ready" /tmp/telnet_session.txt; then
        echo "POP3 OK"
else
        echo "POP3 KO"
fi

1
将输出重定向到文件并从文件中读取。
telnet [ip-address] > /tmp/tempfile.txt

它可以工作,但我得到了一些不必要的字符串,比如“尝试192.168.10.24...”。我认为我不能使用telnet在设备之间进行以太网通信。我认为我必须实现自己的套接字程序。你有什么建议吗? - user1336117
只需尝试剥离您不需要的行。像grep -v "unwanted line" <filename>这样的命令可以解决问题,而套接字程序可能比此更昂贵。但再次强调,这完全取决于您的要求。 - siva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接