netcat监听模式使用-c选项时如何正常打印内容到stdout
根本原因
加-c参数后netcat不输出请求头是默认行为:-c会让netcat把网络socket的读写流直接和指定命令(这里是uname)的stdin/stdout打通,netcat自身不再处理流量的终端输出,所有收到的网络数据直接传给目标命令,命令输出直接回传给客户端,不会流向netcat进程的stdout,自然看不到打印内容。
可行实现方案
方案1:用-o选项对接stdout文件描述符(你提到的思路完全可行)
-o选项的作用是dump全量双向流量到指定文件,不需要把流量落到实体磁盘文件,直接把输出目标指向当前终端的标准输出设备即可:
netcat -l -p 80 -c uname -o /dev/stdout
注意:部分分支版本的netcat(比如nmap附带的ncat)用-o输出的是带偏移的十六进制转储格式,不是纯明文请求头,如果需要纯明文可以用下面的方案。
如果你的运行环境不支持直接写/dev/stdout,可以用命名管道做中转:
# 创建临时管道 mkfifo /tmp/nc_traffic # 后台读管道把内容打到终端 cat /tmp/nc_traffic & # 启动netcat把流量dump到管道 netcat -l -p 80 -c uname -o /tmp/nc_traffic # 用完删除临时管道 rm /tmp/nc_traffic
方案2:包装-c后的执行命令,主动打印输入流
因为-c指定的命令能拿到所有来自网络的输入,直接在命令逻辑里把输入流拷贝一份到终端即可,这个方法兼容所有版本的netcat,输出纯明文:
netcat -l -p 80 -c 'tee /dev/stderr | uname'
逻辑很简单:网络流入的请求内容先通过tee复制一份输出到stderr(直接在终端显示,不会混进返回给客户端的响应内容),再把流量传给uname执行,uname的输出正常返回给访问的浏览器,终端能看到完整的HTTP请求头。
方案3:系统调用跟踪临时调试(不推荐长期用)
如果不想调整netcat的启动参数,可以用strace跟踪netcat的read操作,直接打印从socket读到的内容:
strace -e trace=read -s 65535 netcat -l -p 80 -c uname
这个方法会打印netcat进程所有read调用拿到的数据,手动筛选就能看到HTTP请求头,适合临时排错用。
内容的提问来源于stack exchange,提问作者user19264607
相关产品推荐
相关产品推荐

