system() call und Auswirkungen



  • Hallo Gemeinde,

    ich habe ein kleines Problem mit einem system() call. Was ich machen möchte ist den ssh-agent starten, damit ich mein SSH-Key eintragen kann und so bequem mit rsync arbeiten kann. Ein SSH-Key ohne Passwort ist hier leider keine Option für mich. Eine Option den ssh-agent zu starten ist es ein paar umgebungs Variablen zu setzten.

    eval $(ssh-agent -s)
    

    Das Problem was ich habe ist, das system() call einen neuen sh prozess startet und die Variablen dort setzt, somit sind diese in meiner laufenden "session" nicht gültig.

    Docu Auszug:

    Linux (debian 6.0.2) claims - system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed.

    Meine Recherchen haben ergeben, das ich den Prozess meiner Applikation auch irgendwie "Forken" muss und in eine Pipe schreiben kann... so richtig habe ich das nicht ganz verstanden. Ich verstehe das Problem, jedoch finde ich keinen Lösungsansatz.

    Hat einer von euch eine Idee?

    so long
    jd



  • So ich habe nun mal einen neuen Ansatz versucht.
    Der Befehl

    ssh-agent -s
    

    Startet den SSH-Agent und gibt mir die Umgebungsvariablen zurück die Benötigt werden um den Agent zu nutzen.

    SSH_AUTH_SOCK=/tmp/ssh-YgRDVd8889/agent.8889; export SSH_AUTH_SOCK;
    SSH_AGENT_PID=8890; export SSH_AGENT_PID;
    

    Nun habe ich die Idee gehabt einfach die Rückgabe von ssh-agent -s zu parsen und die ENVs selber aus meine Applikation heraus zu setzten.

    Es scheint recht gut zu funktionieren, problematisch ist, das der ssh-agent Prozess nicht mehr beendet wird. Sprich wenn ich meine Applikation 3 nutze habe ich 3 SSH-Agent Prozesse. Ich weiß leider nicht wie man die beenden kann, oder einen vorhanden nutzen kann 😞

    Hier ist mal mein C++ Code:

    FILE* pipe = popen("ssh-agent -s", "r");
        io::stream<io::file_descriptor_source> stream(fileno(pipe), io::close_handle);
        std::string line;
    
        while (stream)
        {
            std::getline(stream, line);
            if (boost::regex_search(line, what, expr))
            {
                    std::string env = line;
                    std::string value = line;
                    setenv(env.c_str(), value.c_str(), 1);
                }
            }
        }
    
        stream.close();
        int status = system("ssh-add");
    

    Der Code ist etwas gekürzt und nicht 100% richtig nur ist die String Zerlegung etwas wirr, darum die kürzung 🙂

    Meine Frage ist auch, ist das eigentlich richtig was ich hier mache?
    system() call läuft ja in einem eigenen Sub-Prozess, wie kann es sein das, dass was ich mit setenv() gesetzt habe, in einem anderen Sub-Prozess gültig ist.
    Wenn mein Programm beendet ist, ist das was ich über setenv() gesetzt habe nicht mehr gültig.

    Ich kapier das irgendwie nicht, mir fehlen da eindeutig die tieferen Kenntnisse. Hat da einer eine Erklärung parat?

    so long
    jd


  • Mod

    Könntest du nicht gucken, ob ein ssh-agent läuft? Wenn ja, benutzt du diesen, wenn nein, dann startest du deinen eigenen.


Log in to reply