使用linux 指令实现网络助手的功能
网络助手发送 16进制字符串, 接收ASCII 返回
对应的py 代码:
import socket
s = socket.socket()
s.connect(("192.168.5.150", 18204))
s.send(bytes.fromhex("0231303031353030303003"))
print(s.recv(1024).decode("ascii"))
s.close()
解决无返回值数据的问题
您提到方法1和方法2没有显示返回值数据,而原始命令有返回值,这通常是因为连接保持时间的问题。以下是几种解决方案:
方案1:添加等待时间(推荐)
echo "0231303031353030303003" | xxd -r -p | nc -w 3 192.168.5.150 18204 | hexdump -C
关键点:
-w 3
设置超时时间为3秒,等待服务器响应- 适用于大多数情况,是最简单的解决方案
方案2:使用socat替代nc(更可靠)
echo "0231303031353030303003" | xxd -r -p | socat -t 3 - TCP:192.168.5.150:18204 | hexdump -C
优点:
socat
比nc
更稳定可靠-t 3
设置超时时间
方案3:保持连接打开(交互式)
(echo "0231303031353030303003" | xxd -r -p; sleep 3) | nc 192.168.5.150 18204 | hexdump -C
原理:
- 使用子shell发送数据后等待3秒
- 保持连接开放以接收响应
方案4:使用expect脚本(复杂场景)
#!/usr/bin/expect -f
spawn nc 192.168.5.150 18204
send "\x02\x31\x30\x30\x31\x35\x30\x30\x30\x30\x03"
expect -re ".+"
puts [hexdump [expect_out(buffer)]]
验证方法
要确认服务器确实有返回数据,可以先使用原始命令:
echo -n -e "\x02\x31\x30\x30\x31\x35\x30\x30\x30\x30\x03" | nc -v 192.168.5.150 18204 | hexdump -C
添加 -v
参数可以看到连接详细信息,帮助诊断问题。
选择哪种方案取决于您的具体环境和需求,方案1通常是最简单有效的解决方案。