通过Netcat发送命令并保存输出至文件的问题求助
解决Netcat发送命令后输出保存文件出现大量NUL字符的问题
我之前也碰到过类似的糟心情况,用Netcat捕获远程命令输出时文件全是NUL字符,大概率是这几个原因:要么是命令没正确触发远程执行,要么是远程输出带了终端控制字符/二进制空值,要么是Netcat的缓冲机制导致输出没正常写入。给你几个亲测有效的解决办法:
方法1:发送命令时带换行符并过滤NUL字符
远程会话通常需要换行符来确认执行命令,而且NUL字符可以用tr命令直接过滤掉:
echo -e "showHistory userx\n" | nc [远程主机IP/域名] [端口] | tr -d '\0' > out.txt
-e参数让echo解析转义字符,\n就是给远程端发送换行,确保命令被执行tr -d '\0'会把输出里的所有NUL字符删除,只保留有效文本
方法2:用命名管道(mkfifo)处理双向会话
如果远程需要多步交互(比如执行完命令还要退出),命名管道是更可靠的方式,之前你可能没处理好会话关闭的问题:
# 创建命名管道 mkfifo nc_pipe # 后台启动Netcat,从管道读命令,输出写入out.txt cat nc_pipe | nc [远程主机IP/域名] [端口] > out.txt & # 发送目标命令 echo "showHistory userx" > nc_pipe # 发送退出命令,让Netcat正常结束并flush输出 echo "exit" > nc_pipe # 清理管道 rm nc_pipe
这样Netcat会在收到exit后正常关闭,确保所有输出都写入文件,不会因为会话挂起导致输出截断。
方法3:换用socat替代Netcat(兼容性更好)
不同系统的Netcat(GNU/BSD版本)行为差异很大,socat是更稳定的网络工具,能避免很多奇怪的缓冲问题:
echo -e "showHistory userx\n" | socat - TCP:[远程主机IP/域名]:[端口] | tr -d '\0' > out.txt
额外处理:清除终端控制字符
如果远程输出带了颜色、光标移动等ANSI终端代码,也会导致文件出现乱码或特殊字符,可以再加一步过滤:
echo -e "showHistory userx\n" | nc [远程主机IP/域名] [端口] | tr -d '\0' | sed 's/\x1b\[[0-9;]*m//g' > out.txt
sed命令会去掉所有ANSI转义序列,只保留纯文本内容。
内容的提问来源于stack exchange,提问作者th3pirat3
相关产品推荐
相关产品推荐

