如何通过Shell实现多端口监听 解决CentOS升级后日志不写入问题
问题解决步骤
1. 适配新版本CentOS的nc命令参数
新版本CentOS默认将传统netcat替换为nmap-ncat,原有命令参数写法不兼容:
原错误写法:
nc -l xxx.yyy.zzz.qqq 12345 >>/home/jack/russel/12345.txt -w 10
修改为符合ncat规范的写法:
nc -l -s xxx.yyy.zzz.qqq -p 12345 -w 10 >> /home/jack/russel/12345.txt 2>&1
调整说明:
- 明确用
-s指定监听地址,-p指定监听端口 - 将输出重定向逻辑放到参数末尾,避免参数识别错误
- 加
2>&1将错误输出也写入文件,方便后续排查问题
2. 关闭输出缓冲避免数据滞留内存
后台运行的程序默认使用块缓冲,只有缓冲区存满后才会写入磁盘,导致看不到实时写入数据。可以用stdbuf工具关闭缓冲,修改nc命令为:
stdbuf -i0 -o0 -e0 nc -l -s xxx.yyy.zzz.qqq -p 12345 -w 10 >> /home/jack/russel/12345.txt 2>&1
参数说明:-i0/-o0/-e0分别关闭标准输入、标准输出、标准错误的缓冲。
3. 修复单端口监听脚本的循环逻辑
现有监听脚本的循环变量i没有自增逻辑,最多跑5次nc就会自动退出,修改startncX.sh的循环部分为无限循环,保证nc断开后自动重启:
#!/bin/bash while true do stdbuf -i0 -o0 -e0 nc -l -s xxx.yyy.zzz.qqq -p 12345 -w 10 >> /home/jack/russel/12345.txt 2>&1 # 可选加1秒延时,避免端口占用时疯狂重试消耗CPU sleep 1 done
4. 修复批量启动脚本的进程终止逻辑
killall "startnc${start}.sh"无法匹配到进程名,因为脚本启动后默认进程名是bash而非脚本名,改用pkill按脚本路径匹配更准确,修改startall.sh内容:
cd /home/jack/russel sudo close_port.sh # 终止所有运行中的监听脚本和nc进程 pkill -f "startnc.*\.sh" pkill -f "nc -l" # 等待2秒保证进程完全退出 sleep 2 for start in {1..30} do ./startnc${start}.sh & done sudo open_port.sh
5. 排查权限和安全限制
- 检查txt文件权限,确保运行脚本的用户有写入权限:
chmod 664 /home/jack/russel/*.txt - 临时关闭SELinux测试:
setenforce 0,如果恢复写入就配置SELinux规则允许对应端口监听和文件写入 - 手动测试端口连通性:用其他设备执行
nc xxx.yyy.zzz.qqq 对应端口发送测试数据,验证链路正常。
验证方法
修改完成后先手动运行单个监听脚本,发送测试数据确认对应txt文件有写入后,再用startall.sh批量启动所有监听进程。
内容的提问来源于stack exchange,提问作者Hrvoje
相关产品推荐
相关产品推荐

