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


11

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

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

sudo tcpdump -n dst port 80 -i eth

我的教授告诉我用C语言创建一个程序,该程序将打开终端并输入此命令,然后我的Shell脚本将起作用。

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

Answers:


8

您可以使用stdlib.h中提供的system()函数来运行命令。

描述

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

您可以在这里http://linux.about.com/library/cmd/blcmdl3_system.htm阅读更多有关它的信息。


当然,这是一种方法,但是您可能不想运行来自ac程序的命令,相反,大多数Linux程序都有一个lib,它只能直接存储程序的代码。例如ssh可以使用libssh。通常非常有限的原因可以从代码运行系统命令。如果您经常尝试,那几乎可以肯定是做错了什么。
coteyr 2012年

我用这样的C语言
编写

4

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

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-任何

示例:./ a.out语言环境-a

这个例子显示了我的编译器gcc支持的所有语言环境。

更多信息:

p是指向char的指针的指针(类似于argv是p =&argv [2]),指向-anything字符串,我将所有内容都保留了-指向我的cmd字符串的所有内容,当* p指向NULL时,我退出了循环:->我将使用此符号说出指向(不要将其与右箭头选择运算符混淆)。

argv [0]-> program_name

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

argv [2]-> -anything(在此示例中-a,它是所有语言环境)

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

好吧,我想。


确保不要将其用作setuid可执行文件,因为它具有明显的缓冲区溢出漏洞。
马丁

0

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

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

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

#include <unistd.h>
#include <stdio.h>
#include <sysexits.h>

int main(int argc,char ** argv){
    如果(argc> 2){fputs(“太多的args \ n”,stderr); 返回EX_USAGE; }
    如果(argc> 1 && argv [1] [0] =='-'){fputs(“ no options allowed \ n”,stderr); 返回EX_USAGE; }
    如果(geteuid()!= 0){fputs(“未正确安装为setuid-root \ n”,stderr); 返回EX_UNAVAILABLE; }
    if(setuid(0)1)p [6] = argv [1];

    / *如果一切顺利,execv将不会返回
     *(因为该程序将被tcpdump替换)* /
    execv(p0,p);
    / *如果到达此处,则execv必须失败* /

    perror(p0);
    返回EX_OSFILE;
}

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

使foo && install -o root -m 4511 foo / usr / local / sbin / foo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.