Bagaimana cara menggunakan program C untuk menjalankan perintah pada terminal?

11

Saya ingin membuat program dalam bahasa C yang memungkinkan saya menjalankan perintah di terminal.

Saya telah membuat program dalam skrip shell yang akan memberi saya ip situs web apa pun yang dibuka di browser saya. Script shell ini dijalankan dengan memasukkan perintah ini di terminal:

sudo tcpdump -n dst port 80 -i eth

Profesor saya mengatakan kepada saya untuk membuat program dalam bahasa C yang akan membuka terminal dan memasukkan perintah ini dan kemudian skrip shell saya akan bekerja.

Tolong beritahu saya cara membuat program seperti itu.

Tehseen Malik
sumber

Jawaban:

8

Anda bisa menggunakan fungsi system () yang tersedia di stdlib.h untuk menjalankan perintah.

DESKRIPSI

system () mengeksekusi perintah yang ditentukan dalam string dengan memanggil / bin / sh -c string, dan kembali setelah perintah selesai. Selama pelaksanaan perintah, SIGCHLD akan diblokir, dan SIGINT dan SIGQUIT akan diabaikan.

Anda dapat membaca lebih lanjut tentang ini di sini http://linux.about.com/library/cmd/blcmdl3_system.htm

Mevin Babu
sumber
Ini tentu saja salah satu cara, tetapi Anda mungkin tidak ingin menjalankan perintah dari program ac, sebagai gantinya, sebagian besar program Linux memiliki lib yang hanya dapat kode program secara langsung. Misalnya ssh bisa menggunakan libssh . Biasanya ada alasan yang SANGAT terbatas untuk menjalankan perintah sistem dari kode. Jika Anda sering melakukannya, hampir pasti Anda melakukan sesuatu yang salah.
coteyr
Saya membuat program dalam bahasa C seperti ini
Tehseen Malik
4

Halo saya akan menulis untuk Anda contoh kode, jelaskan kepada Anda dan sangat berharap ini membantu Anda. prototipe fungsi adalah sesuatu seperti:

sistem 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). buka terminal dan kompilasi program

2). jalankan (misalnya di Ubuntu) ./program_name comman_name -anything - anything

contoh: ./a.out lokal -a

contoh ini mencetak semua lokal yang didukung oleh kompiler saya yang gcc.

Info lebih lanjut:

p adalah poniter untuk penunjuk ke char (seperti argv adalah) p = & argv [2], menunjuk ke-apapun string i cat all -apapun ke string cmd saya saya keluar dari loop ketika * p menunjuk ke NULL lihat ini: -> saya akan menggunakan simbol ini untuk mengatakan poin ke (jangan bingung dengan operator pemilihan panah kanan).

argv [0] -> program_name

argv [1] -> command_name (dalam contoh ini nama perintah akan menjadi lokal, tetapi masukkan perintah yang ingin Anda periksa)

argv [2] ->-apapun (dalam contoh ini -a, yang semuanya lokal)

argv [3] -> NULL (dalam contoh ini, ini keluar dari loop)

ok itu saja, saya kira.

NEMKA
sumber
Pastikan Anda tidak menggunakan ini sebagai setuid yang dapat dieksekusi, karena ia memiliki exploit buffer-overflow yang jelas.
Martin
0

Saya akan berasumsi bahwa ini adalah tentang menggunakan biner setuid-root untuk menggantikan sudo, bukan hanya eksekusi perintah sewenang-wenang, jadi saya akan memasukkan bagian lain dari solusi.

Sebagai masalah keamanan, kami menghindari sistem () karena dapat dibajak.

Setelah mengkompilasi ini, instal biner yang dihasilkan sebagai setuid-root.

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

int main (int argc, char ** argv) {
    if (argc> 2) {fputs ("terlalu banyak args \ n", stderr); kembalikan EX_USAGE; }
    if (argc> 1 && argv [1] [0] == '-') {fputs ("tidak ada opsi yang diizinkan \ n", stderr); kembalikan EX_USAGE; }
    if (geteuid ()! = 0) {fputs ("tidak diinstal dengan benar sebagai setuid-root \ n", stderr); return EX_UNAVAILABLE; }
    if (setuid (0) 1) p [6] = argv [1];

    / * Jika semuanya berjalan dengan baik, execv tidak akan kembali
     * (karena program ini akan diganti oleh tcpdump) * /
    execv (p0, p);
    / * jika kita sampai di sini maka execv pasti gagal * /

    perror (p0);
    kembalikan EX_OSFILE;
}

jika Anda telah menyimpan ini sebagai foo.c, dan ingin diinstal sebagai /usr/local/sbin/foo, jalankan:

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