如何在Shell脚本中启动Netcat监听并本地执行命令且不中断连接
实现Netcat监听器:收到连接执行本地命令且保持连接
当然可行!你要的这种「收到Netcat连接后执行本地命令,同时保持连接不中断」的需求,完全可以通过shell脚本结合Netcat的管道/子进程特性实现,甚至比原生的-e选项更灵活。下面给你几个实用的实现方案:
方案1:连接建立时自动执行预设本地命令,随后保持交互
这个脚本会在第一个连接进来时,先执行你指定的本地命令,然后进入交互式shell,让远程端可以继续发送命令执行,全程不中断连接:
#!/bin/bash # 监听端口4444,可自行修改 LISTEN_PORT=4444 # 启动Netcat监听器,通过管道处理输入输出 nc -lvp $LISTEN_PORT | while read -r input_line; do # 标记是否已执行初始化命令,避免重复执行 if [ -z "$INIT_CMD_RUN" ]; then echo "=== 本地初始化命令执行结果 ===" # 替换成你需要执行的本地命令,比如查看系统信息、启动服务等 uname -a && df -h echo "=============================" export INIT_CMD_RUN=1 fi # 将收到的命令传递给本地shell执行,返回结果给远程端 eval "$input_line" 2>&1 done
原理说明
- Netcat的输出通过管道传递给
while read循环,我们可以在循环开头判断是否是首次连接,执行预设本地命令。 - 后续远程端发送的每一行命令,都会通过
eval执行,结果会回传给Netcat,再发送给远程连接端,保持交互状态。
方案2:用Netcat的-c选项直接绑定复合shell命令
如果你的Netcat支持-c选项(大部分主流版本都支持),可以用更简洁的写法:
#!/bin/bash nc -lvp 4444 -c 'bash -c "echo \"欢迎连接!本地当前时间:$(date)\"; exec bash"'
原理说明
-c选项让Netcat在收到连接时启动指定的shell命令:- 先执行
echo \"欢迎连接!本地当前时间:$(date)\"输出本地命令结果; - 然后用
exec bash替换当前的shell进程,启动交互式bash,这样Netcat的连接会一直绑定到这个bash进程,不会中断。
- 先执行
关于你疑问的解答
你担心的「Shell进程派生Netcat子进程后,能否与nc的输出交互并在Netcat退出前执行其他命令」是完全没问题的:
- 通过管道(
|)或者子shell(()),我们可以把Netcat的输入输出导向自定义的处理逻辑,既可以在连接建立时触发本地命令,也可以在交互过程中监听特定输入来执行命令(比如判断输入是run_local_cmd时执行某个脚本)。 - 只要不主动关闭Netcat进程或连接,整个会话会一直保持,远程端可以持续发送命令交互。
注意事项
- 安全风险:这种开放的监听器会暴露本地shell权限,务必限制访问(比如用防火墙只允许特定IP连接),不要在公网环境随意使用。
- Netcat版本差异:部分系统的Netcat是
ncat(比如CentOS),选项可能略有不同,可以用nc -h或ncat -h查看参数。 - 后台运行:如果需要让监听器在后台运行,可以在命令末尾加
&,或者用nohup、systemd等工具管理。
内容的提问来源于stack exchange,提问作者user3759159
相关产品推荐
相关产品推荐

