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

11

Quero criar um programa na linguagem C que permita executar um comando no terminal.

Eu criei um programa em shell script que me daria o ip de qualquer site aberto no meu navegador. Este script de shell é executado digitando este comando no terminal:

sudo tcpdump -n dst port 80 -i eth

Meu professor me disse para criar um programa em linguagem C que abrisse o terminal e digite esse comando e, em seguida, meu script shell funcionaria.

Por favor, diga-me como criar esse programa.

Tehseen Malik
fonte

Respostas:

8

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

DESCRIÇÃO

system () executa um comando especificado na string chamando / bin / sh -c string e retorna após a conclusão do comando. Durante a execução do comando, SIGCHLD será bloqueado e SIGINT e SIGQUIT serão ignorados.

Você pode ler mais sobre isso aqui http://linux.about.com/library/cmd/blcmdl3_system.htm

Mevin Babu
fonte
Esta é certamente uma maneira, mas você provavelmente não deseja executar comandos do programa ac; em vez disso, a maioria dos programas Linux possui uma lib que pode apenas o código dos programas diretamente. Por exemplo, o ssh pode usar libssh . Geralmente, há uma razão MUITO limitada para executar comandos do sistema a partir do código. Se você está indo muito, quase certamente está fazendo algo errado.
coteyr
Eu fiz um programa em C assim
Tehseen Malik 10/12/12
4

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

sistema 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) abra um terminal e compile o programa

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

exemplo: ./a.out locale -a

este exemplo imprime todos os locais suportados pelo meu compilador, que é o gcc.

mais informações:

p é um ponteiro para apontar para char (como argv é) p = & argv [2], aponta para -qualquer string que eu gato em tudo -qualquer coisa para minha cmd-string deixo o loop quando * p aponta para NULL veja isso: -> usarei 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 digite o comando que você deseja verificar)

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

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

ok é isso, eu acho.

NEMKA
fonte
Certifique-se de não usar isso como um executável setuid, porque ele possui uma exploração óbvia de estouro de buffer.
Martin
0

Eu vou assumir que se trata de usar um binário setuid-root para substituir o sudo, em vez de apenas executar arbitrariamente os comandos, por isso vou incluir as outras partes da solução.

Por uma questão de segurança, evitamos o system () porque ele pode ser invadido.

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

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

int main (int argc, char ** argv) {
    if (argc> 2) {fputs ("muitos argumentos \ n", stderr); retornar EX_USAGE; }
    if (argc> 1 && argv [1] [0] == '-') {fputs ("nenhuma opção permitida \ n", stderr); retornar EX_USAGE; }
    if (geteuid ()! = 0) {fputs ("não está instalado corretamente como setuid-root \ n", stderr); retornar EX_UNAVAILABLE; }
    if (setuid (0) 1) p [6] = argv [1];

    / * Se tudo correr bem, o execv não retornará
     * (porque este programa será substituído pelo tcpdump) * /
    execv (p0, p);
    / * se chegarmos aqui, o execv deve ter falhado * /

    perror (p0);
    retornar EX_OSFILE;
}

Se você salvou isso como foo.ce deseja instalá-lo como /usr/local/sbin/foo, execute:

make foo && install -o root -m 4511 foo / usr / local / sbin / foo
Martin
fonte