¿Cómo usar un programa en C para ejecutar un comando en la terminal?

11

Quiero crear un programa en lenguaje C que me permita ejecutar un comando en la terminal.

He creado un programa en script de shell que me daría la ip de cualquier sitio web que se abra en mi navegador. Este script de shell se ejecuta ingresando este comando en la terminal:

sudo tcpdump -n dst port 80 -i eth

Mi profesor me dijo que creara un programa en lenguaje C que abriera la terminal e ingresara este comando y luego mi script de shell funcionaría.

Por favor, dime cómo crear un programa de este tipo.

Tehseen Malik
fuente

Respuestas:

8

puede usar la función system () disponible en stdlib.h para ejecutar comandos.

DESCRIPCIÓN

system () ejecuta un comando especificado en una cadena llamando a / bin / sh -c string, y regresa después de que se haya completado el comando. Durante la ejecución del comando, SIGCHLD será bloqueado, y SIGINT y SIGQUIT serán ignorados.

Puede leer más sobre esto aquí http://linux.about.com/library/cmd/blcmdl3_system.htm

Mevin Babu
fuente
Esta es ciertamente una forma, pero probablemente no desee ejecutar comandos desde el programa de CA, en cambio, la mayoría de los programas de Linux tienen una biblioteca que solo puede codificar el programa directamente. Por ejemplo, ssh puede usar libssh . Por lo general, hay una razón MUY limitada para ejecutar comandos del sistema desde el código. Si vas mucho, es casi seguro que estás haciendo algo mal.
coteyr
Hice un programa en C como este
Tehseen Malik,
4

Hola, te escribiré un código de ejemplo, te lo explicaré y realmente espero que esto te ayude. El prototipo de la función es algo así 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) abrir una terminal y compilar el programa

2) ejecútelo (por ejemplo en Ubuntu) ./program_name comman_name -anything - cualquier cosa

ejemplo: ./a.out locale -a

Este ejemplo imprime todas las configuraciones regionales compatibles con mi compilador que es gcc.

más información:

p es un indicador para apuntar a char (como argv is) p = & argv [2], apunta a -cualquier cadena que gato todo -cualquier cosa a mi cadena de cmd salgo del ciclo cuando * p apunta a NULL mira esto: -> Usaré este símbolo para decir puntos (no lo confunda con el operador de selección de flecha derecha).

argv [0] -> nombre_programa

argv [1] -> command_name (en este ejemplo, el nombre del comando será locale, pero ingrese el comando que desea verificar en su lugar)

argv [2] -> -anything (en este ejemplo -a, que son todas las configuraciones regionales)

argv [3] -> NULL (en este ejemplo, esto cierra el ciclo)

ok eso es todo, creo.

NEMKA
fuente
Asegúrate de no usar esto como un ejecutable setuid, porque tiene una evidente vulnerabilidad de desbordamiento de búfer.
Martin
0

Voy a suponer que se trata de usar un binario setuid-root para reemplazar sudo, en lugar de solo la ejecución arbitraria de comandos, por lo que voy a incluir las otras partes de la solución.

Como cuestión de seguridad, evitamos system () porque puede ser secuestrado.

Después de compilar esto, instale el binario resultante como setuid-root.

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

int main (int argc, char ** argv) {
    if (argc> 2) {fputs ("demasiados argumentos \ n", stderr); volver EX_USAGE; }
    if (argc> 1 && argv [1] [0] == '-') {fputs ("no se permiten opciones \ n", stderr); volver EX_USAGE; }
    if (geteuid ()! = 0) {fputs ("no está instalado correctamente como setuid-root \ n", stderr); return EX_UNAVAILABLE; }
    if (setuid (0) 1) p [6] = argv [1];

    / * Si todo va bien, execv no volverá
     * (porque este programa habrá sido reemplazado por tcpdump) * /
    execv (p0, p);
    / * si llegamos aquí, entonces execv debe haber fallado * /

    perror (p0);
    volver EX_OSFILE;
}

si ha guardado esto como foo.cy desea instalarlo como /usr/local/sbin/foo, ejecute:

make foo && install -o root -m 4511 foo / usr / local / sbin / foo
Martín
fuente