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
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.
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
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.
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
Tags command-line scripts