Como usar um programa em C para executar um comando no terminal?

10

Eu quero criar um programa em linguagem C que me permita executar um comando no terminal.

Eu fiz um programa em shell script que me dava o ip de qualquer website que estivesse aberto no meu navegador. Este script de shell é executado inserindo este comando no terminal:

sudo tcpdump -n dst port 80 -i eth

Meu professor me disse para criar um programa em linguagem C que abriria o terminal e digitaria esse comando e meu script de shell funcionaria.

Por favor, me diga como criar um programa desse tipo.

    
por Tehseen Malik 09.12.2012 / 15:01

3 respostas

8

você pode usar a função system () disponível em stdlib.h para executar comandos.

% bl0ck_qu0te%

Você pode ler mais sobre isso aqui link

    
por Mevin Babu 09.12.2012 / 15:10
4

Olá eu vou escrever para você um código de exemplo, explicar para você e realmente espero que isso ajude você. o protótipo da função é algo como:

int system (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). abrir um terminal e compilar o programa

2). execute-o (por exemplo, no Ubuntu) ./program_name nome_com - qualquer coisa - qualquer coisa

exemplo: ./a.out locale -a

este exemplo imprime todas as localidades suportadas pelo meu compilador, que é gcc.

mais informações:

p é um poniter para ponteiro para char (como argv é) p = & argv [2], aponta para -qualquer cadeia Eu cat tudo -anythings a minha corda cmd Eu saio do loop quando * p aponta para NULL olhe para isto: - > Eu vou usar este símbolo para dizer pontos para (não confunda com o operador de seleção de seta para a direita).

argv [0] - > nome_do_programa

argv [1] - > command_name (neste exemplo, o nome do comando será locale, mas insira o comando que você deseja verificar)

argv [2] - > qualquer coisa (neste exemplo -a, que é todas as localidades)

argv [3] - > NULL (neste exemplo, isso encerra o loop)

ok, é isso, eu acho.

    
por NEMKA 31.12.2013 / 17:37
0

Eu vou assumir que isso é sobre o uso de um binário setuid-root para substituir sudo, ao invés de apenas a execução de comandos arbitrários, então eu vou incluir as outras partes da solução.

Como uma questão de segurança, evitamos o sistema () porque ele pode ser seqüestrado.

Depois de compilar isso, instale o binário resultante como root setuid.

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

int main(int argc, char **argv) {
    if (argc > 2) { fputs("too many args\n", stderr); return EX_USAGE; }
    if (argc > 1 && argv[1][0] == '-') { fputs("no options allowed\n", stderr); return EX_USAGE; }
    if (geteuid() != 0) { fputs("not correctly installed as setuid-root\n",stderr); return EX_UNAVAILABLE; }
    if (setuid(0)  1) p[6] = argv[1];

    /* If all goes well, execv won't return
     * (because this program will have been replaced by tcpdump) */
    execv(p0, p);
    /* if we reach here then execv must have failed */

    perror(p0);
    return EX_OSFILE;
}

se você salvou isso como foo.c e quer que ele seja instalado como /usr/local/sbin/foo , execute:

make foo && install -o root -m 4511 foo /usr/local/sbin/foo
    
por Martin 30.04.2017 / 05:29