You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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命令:
    1. 先执行echo \"欢迎连接!本地当前时间:$(date)\"输出本地命令结果;
    2. 然后用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:39:17