Chcę stworzyć program w języku C, który pozwoliłby mi uruchomić polecenie w terminalu.
Zrobiłem program w skrypcie powłoki, który dałby mi ip każdej strony internetowej, która jest otwarta w mojej przeglądarce. Ten skrypt powłoki jest wykonywany przez wpisanie tego polecenia w terminalu:
sudo tcpdump -n dst port 80 -i eth
Mój profesor kazał mi stworzyć program w języku C, który otworzyłby terminal i wprowadził to polecenie, a następnie działałby mój skrypt powłoki.
Powiedz mi, jak stworzyć taki program.
źródło
Witaj, napiszę dla ciebie przykładowy kod, wyjaśnię go i mam nadzieję, że to ci pomoże. prototyp funkcji jest podobny do:
int system (const char * cmd);
1). otwórz terminal i skompiluj program
2). uruchom go (na przykład w Ubuntu) ./nazwa_programu nazwa_programu -wszystko - cokolwiek
przykład: ./a.out locale -a
ten przykład wyświetla wszystkie ustawienia narodowe obsługiwane przez mój kompilator, którym jest gcc.
więcej informacji:
p to poniter do wskaźnika na char (jak argv jest) p = & argv [2], wskazuje na dowolny ciąg i cat wszystko-wszystko na mój ciąg cmd wychodzę z pętli, gdy * p wskazuje na NULL spójrz na to: -> użyję tego symbolu, aby powiedzieć punkty (nie mylić go z operatorem wyboru prawej strzałki).
argv [0] -> nazwa_programu
argv [1] -> nazwa_ polecenia (w tym przykładzie nazwa polecenia będzie ustawieniem regionalnym, ale zamiast tego wprowadź polecenie, które chcesz sprawdzić)
argv [2] -> -anything (w tym przykładzie -a, czyli wszystkie ustawienia narodowe)
argv [3] -> NULL (w tym przykładzie powoduje to zamknięcie pętli)
ok, to wszystko, tak myślę.
źródło
Zakładam, że chodzi tu o użycie pliku binarnego z setuid-root do zastąpienia sudo, a nie tylko o wykonanie dowolnego polecenia, więc dołączę inne części rozwiązania.
Ze względów bezpieczeństwa unikamy system (), ponieważ można go przejąć.
Po kompilacji zainstaluj wynikowy plik binarny jako setuid-root.
jeśli zapisałeś to jako
foo.c
i chcesz zainstalować jako/usr/local/sbin/foo
, uruchom:źródło