如何使用 C 程序在终端上运行命令?

如何使用 C 程序在终端上运行命令?

我想用 C 语言创建一个程序,以便让我在终端中运行命令。

我用 shell 脚本编写了一个程序,它可以返回我在浏览器中打开的任何网站的 IP。通过在终端中输入以下命令来执行此 shell 脚本:

sudo tcpdump -n dst port 80 -i eth

我的教授告诉我用 C 语言创建一个程序,它将打开终端并输入此命令,然后我的 shell 脚本就可以运行了。

请告诉我如何创建这样的程序。

答案1

你可以使用系统()函数可用标准库运行命令。

描述

system() 通过调用 /bin/sh -c string 来执行 string 中指定的命令,并在命令完成后返回。在命令执行期间,SIGCHLD 将被阻塞,SIGINT 和 SIGQUIT 将被忽略。

您可以在此处阅读更多相关信息http://linux.about.com/library/cmd/blcmdl3_system.htm

答案2

您好,我将为您编写一个示例代码,向您解释它,并真心希望这对您有所帮助。该函数的原型如下:

int系统(const char* cmd);

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_CMN_LEN 100

int main(int argc, char *argv[])
{
    char cmd[MAX_CMN_LEN] = "", **p;

    if (argc < 2) /*no command specified*/
    {
        fprintf(stderr, "Usage: ./program_name terminal_command ...");
        exit(EXIT_FAILURE);
    }
    else
    {
        strcat(cmd, argv[1]);
        for (p = &argv[2]; *p; p++)
        {
            strcat(cmd, " ");
            strcat(cmd, *p);
        }
        system(cmd);
    }

    return 0;
}

1). 打开终端并编译程序

2). 运行它(例如在 Ubuntu 中) ./program_name comman_name -anything - anything

例如: ./a.out locale -a

此示例打印了我的编译器 gcc 支持的所有语言环境。

更多信息:

p 是指向字符的指针(就像 argv 一样)p = &argv[2],指向 - 任何字符串 i cat 所有 - 任何内容到我的 cmd 字符串我退出循环当 *p 指向 NULL 看看这个:-> 我将使用这个符号来表示指向(不要将它与右箭头选择运算符混淆)。

argv[0] -> 程序名称

argv[1] -> command_name (在此示例中,命令名称将是语言环境,但请输入您要检查的命令)

argv[2] -> -anything (在这个例子中是 -a,代表所有语言环境)

argv[3] -> NULL (在此示例中,退出循环)

好的,我想就是这样。

答案3

我假设这是关于使用 setuid-root 二进制文件来替换 sudo,而不仅仅是任意命令执行,所以我将包括解决方案的其他部分。

出于安全考虑,我们避免使用 system(),因为它可能被劫持。

编译完成后,将生成的二进制文件安装为 setuid-root。

#包括 <unistd.h>
#包括 <stdio.h>
#包括 <sysexits.h>

int main(int argc,char **argv) {
    if (argc > 2) { fputs("太多参数\n", stderr); 返回 EX_USAGE; }
    if (argc > 1 && argv[1][0] == '-') { fputs("不允许使用选项\n", stderr); 返回 EX_USAGE; }
    if (geteuid() != 0) { fputs("未正确安装为 setuid-root\n",stderr); 返回 EX_UNAVAILABLE; }
    如果 (setuid(0) 1) p[6] = argv[1];

    /* 如果一切顺利,execv 将不会返回
     *(因为这个程序将被 tcpdump 替换)*/
    execv(p0,p);
    /* 如果我们到达这里那么 execv 一定失败了 */

    p错误(p0);
    返回 EX_OSFILE;
}

如果您已将其保存为foo.c,并希望将其安装为/usr/local/sbin/foo,请运行:

制作 foo && 安装 -o root -m 4511 foo /usr/local/sbin/foo

相关内容