Eingabe Programm um Linux zu Administrieren



  • Hi Community,

    ich habe eine größere Frage an euch...
    Habe dieses Jahr meine Ausbildung angefangen und ich bin leider noch nicht so wirklich die Expertin in Sachen C++.

    Jetzt habe ich auch noch in der Berufschule ein Projekt aufs Auge gedrückt bekommen...
    Ich hoffe ihr könnt mir dabei Helfen.

    So sollte das Projekt (Ich glaube eher klein) aussehen:

    - Ich soll ein Programm (in C++) schreiben welches in /bin/ liegt und somit von überall aufgerufen werden kann.

    - Das Programm soll z.B. example heißen

    - Nun soll das Programm mit Startparametern gestartet werden ( ./example SET IP I0 10.0.0.1 255.0.0.0 1)

    - Nun soll es die Startparameter auslesen und wieder an Linux übergeben und ausfrühren ( ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up )

    Ich bin mir nicht sicher ob das Komplex ist oder eher einfach... 🙄

    Ich hoffe wirklich, dass ihr mir dabei helfen könnt.

    Ganz liebe Grüße
    Julia



  • Ob das komplex oder einfach ist, hängt davon ab wieviel Zeit du hast, und ob du dich schonmal mit Linux/Unix Programmierung auseinander gesetzt hast.

    Hier mal ein Tipp wie ich an die Sache rangehen würde:

    Mittels fork() kannst du ein Kindprozess starten, und diesen über die exec-Familie (z.B. execl()) die nötigen Aufgaben erledigen lassen...



  • Hallo!

    In welcher Sprache willst du das Programm schreiben?

    Falls du es in C lösen willst, würde ich mit getopt/getoptlong und exec arbeiten. Dann kann das Programm (zb zum setzen der IP und Netmask) so aufgerufen werden
    example --if eth0 --ip xxx.xxx.xxx.xxx --netmask yyy.yyy.yyy.yyy (unter zuhilfenahme von getoptlong)
    oder
    example -i xxx.xxx.xxx.xxx -n yyy.yyy.yyy.yyy (bei getopt)

    getopt dient zur Abfrage von übergebenen Optionen, auf die Argumente der Optionen kann mit optarg zugegriffen werden .

    MfG



  • Tobias W schrieb:

    Ob das komplex oder einfach ist, hängt davon ab wieviel Zeit du hast, und ob du dich schonmal mit Linux/Unix Programmierung auseinander gesetzt hast.

    Hier mal ein Tipp wie ich an die Sache rangehen würde:

    Mittels fork() kannst du ein Kindprozess starten, und diesen über die exec-Familie (z.B. execl()) die nötigen Aufgaben erledigen lassen...

    Hi Tobias,

    hast du vielleicht einen kurzen Quellcode um es auszuprobieren.
    Also ich habe schon etwas zeit... etwa 2 Wochen...

    killerkipferl schrieb:

    Hallo!

    In welcher Sprache willst du das Programm schreiben?

    Falls du es in C lösen willst, würde ich mit getopt/getoptlong und exec arbeiten. Dann kann das Programm (zb zum setzen der IP und Netmask) so aufgerufen werden
    example --if eth0 --ip xxx.xxx.xxx.xxx --netmask yyy.yyy.yyy.yyy (unter zuhilfenahme von getoptlong)
    oder
    example -i xxx.xxx.xxx.xxx -n yyy.yyy.yyy.yyy (bei getopt)

    getopt dient zur Abfrage von übergebenen Optionen, auf die Argumente der Optionen kann mit optarg zugegriffen werden .

    MfG

    Hallo killerkipferl,

    danke für deine schnelle Antwort.

    Das Lern-Projekt soll in C++ geschrieben werden.
    Bei C++ müsste das einlesen von Parametern ja so gehen:

    #include <iostream>
    #include <stdlib.h>
    using namespace std ;
    
    int main(int argc, char **argv)
    {
      if(argv[1])
      {
        cout << argv[1] << endl;
      }
    }
    

    Das funktioniert auch. Ist das so eine möglichkeit oder wie würdet ihr das machen?

    Liebe Grüße
    Julia



  • die getopt() und getopt_long() Funktionen von Linux erleichtern dir das parsen von den übergebenen Parameter. Wie du das machst funktioniert das schon, aber du musst dich selber drum kümmern die verschiedenen Parameter richtig auszulesen. Dabei helfen dir diese Funktionen.
    Ein Beispiel kannst du dir unter diesem Link anschauen.

    Ein Beispiel für fork() und exec() wäre folgendes:

    #include <unistd.h>
    #include <sys/types.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main () {
       pid_t pid;
    
       if((pid = fork()) < 0)
       {
          printf ("Fehler bei fork()\n");
       }else if(pid == 0)
       {
          // Kindprozess
          // hier führst du mit exec() das Kommando aus
       }else
       {
          // Elternprozess
          // hier können weitere Arbeiten erledigt werden
       }
       return EXIT_SUCCESS;
    }
    

    Hab jetzt kein exec Aufruf drin, da ich selber nochmal nachschlagen müsste wie ich die genau benutze. Das kannst du ja selber tun 😉

    Aber fork() kannst du natürlich weglassen, falls du keine weiteren Arbeiten im Elternprozess machen möchtest...



  • Julia83 schrieb:

    Das Lern-Projekt soll in C++ geschrieben werden.
    Bei C++ müsste das einlesen von Parametern ja so gehen:

    #include <iostream>
    #include <stdlib.h>
    using namespace std ;
    
    int main(int argc, char **argv)
    {
      if(argv[1])
      {
        cout << argv[1] << endl;
      }
    }
    

    Das funktioniert auch. Ist das so eine möglichkeit oder wie würdet ihr das machen?

    Normalerweise verwendet man eher argc als "if (argv[n])" für sowas. Natürlich _könntest_ Du das so programmieren, aber dann darfst Du auch wirklich nur ganz bestimmte Argumentreihenfolgen und -Anzahlen etc. haben. Wenn das für Dich kein Problem ist, dann lies einfach die Manpages zur exec-Funktionsfamilie und verwende argc+argv.

    Falls das ganze robuster sein soll, verwende am besten boost::progam_options oä.



  • Tobias W schrieb:

    Aber fork() kannst du natürlich weglassen, falls du keine weiteren Arbeiten im Elternprozess machen möchtest...

    Ja, würde ich machen, fork ist hier unnötig. ifconfig kehrt normalerweise recht flott wieder zurück, flott genug für so ein Adminprogramm allemal.



  • Stimmt, da gebe ich dir vollkommen recht. Ich schieß normalerweise auch nicht mit Kanonen auf Spatzen.

    @Julia:
    Die exec-Familie ist hier kurz und knapp erklärt. Das sollte dann problemlos umsetzbar sein...



  • Okay noch einen Punkt habe ich erstmal...

    Es wäre super wenn das Programm quasi eine Datenbank (in einem Array[]) an Befehlen hat wie z.B. "IP" "SET" "I0-X".

    Wenn man nun "./exampe IP" absetzt, dann soll es schauen gibt es "IP" wenn ja soll er weiter in dem zweig IP schauen ob es "SET" gibt... usw.
    Ganz am ende sollen dann die Parameter in der exec zusammengebaut werden und übergeben an linux.

    Habt ihr hierzu einen Ansatz für mich?
    Ich habe mir gedacht es wäre gut für jede Konfiguration eine Funktion zu machen:

    #include <iostream>
    #include <stdlib.h>
    using namespace std ;
    
    ip(char Interface, char Ip, char Subnet, int Status)
    {
     if(Interface == I0)
     {
      if(Ip =....)
      {
      }
      else
      {
       cout << "Falsche Eingabe" << endl;
      }
     }
     else
     {
      cout << "Falsche Eingabe" << endl;
     }
    }
    
    int main(int argc, char **argv)
    {   
      if(argv[1] = IP)
      {
        ip(argv[1], argv[2], argv[3], argv[4]);
      }
    }
    

    Könnte so etwas funktionieren?

    Wie ist das eigentlich - unter Linux gibt es ja die möglichkeit mit TAB Texte und argumente zu vervollständigen.
    Ist das hier auch möglich?

    Liebe Grüße
    Julia



  • Julia83 schrieb:

    #include <iostream>
    #include <stdlib.h>
    using namespace std ;
    
    ip(char Interface, char Ip, char Subnet, int Status)
    {
     if(Interface == I0)
     {
      if(Ip =....)
      {
      }
      else
      {
       cout << "Falsche Eingabe" << endl;
      }
     }
     else
     {
      cout << "Falsche Eingabe" << endl;
     }
    }
    
    int main(int argc, char **argv)
    {   
      if(argv[1] = IP)
      {
        ip(argv[1], argv[2], argv[3], argv[4]);
      }
    }
    

    Könnte so etwas funktionieren?

    Falls das Pseudocode ist ja.

    argv[0] ist immer der Programmname, dann kommen die restlichen Argumente

    char c;
    char *device, char *inetaddr, char *netmask;
    while((c = getopt(argc, argv, "d:i:n:h")) != EOF) {
      switch(c) {
        case 'd': strncpy(optarg, device, strlen(optarg));/*device*/
        case 'i': /*inet addr*/
        case 'n': /*netmask*/
        case 'h': /*help*/
        default: 
      }
    }
    
    exec("ifconfig", "/sbin/ifconfig", device, inetaddr, netmask, (char *)0); /*stimmt das so???*/
    

    Nicht hauen wenn da Syntaxmäßig irgendwas net passt 😛

    So in etwa wäre das wesentlich einfacher zu machen.


Anmelden zum Antworten