Mit ssh zu Server verbinden und authentifizieren
-
Ich will in meinem Programm ssh starten, zu einem server verbinden und mich dort authentifizieren.
int main() { FILE *fp; char line[1024]; fp=popen("ssh -l root 127.0.0.1", "w"); while(fgets( line, sizeof line, fp)) printf("%s", line); fputs("MEINPASSWORT\n", fp); while(fgets( line, sizeof line, fp)) printf("%s", line); pclose(fp); }
Das klappt nur leider nicht so, wie ich will. Wie kann ich mein oben angegebenes Problem loesen?
-
fehlerbeschreibung?!?
-
Als erstes stoert mich das hier:
UniX:~/Desktop/h4$ ./a.out Pseudo-terminal will not be allocated because stdin is not a terminal.
-
solltest du die methode noch nicht kennen, erklaer ich sie dir jetzt.
eine simple debuggingmethode ist, das programm soweit zu reduzieren, bis es fehlerfrei funktioniert.
danach gibt man winzige stueckchen an code dazu und stellt sicher, dass sich alles wie erwartet verhaelt.das machst du jetzt und danach weisst du, woran es liegt.
-
Dass popen schuld ist, ist mir klar.
Aber ich weiss nicht, warum. Ich arbyte normalerweise nur in C++.
-
Ich weiss auch, dass der zweite Parameter von popen, naemlich "w" schuld ist.(mit "r" funktionierts).
Es hilft mir jedenfalls nicht weiter, wenn du versuchst mich auf die Spur zu bringen, wo der Fehler liegt, anstatt durch was er verursacht wird.
Lies dir meinen Anfangspost durch um zu sehen, was ich eigentlich machen will und sag mir bitte, wie ich das am besten realisiere.
Bin ich mit popen() ueberhaupt auf dem richtigen Weg?
Falls ja, wie kann ich mein Passwort dem Prompt uebergeben, der nach dem Kommando "ssh -l root localhost" erscheint?Danke
-
erstmal hab ich keine grosse ahnung von popen(). probier mal, ob du die pipe fuer lesen und schreiben gleichzeitig bekommst (r+).
-
"rw" klappt nicht
-
ich sagte r+
-
r+ klappt erst recht nicht, da die funktion entweder nur "w", oder nur "r" annimmt.
http://cermics.enpc.fr/~ts/C/FUNCTIONS/popen.html
-
unter freebsd gehts...
http://www.freebsd.org/cgi/man.cgi?query=popen&apropos=0&sektion=0&manpath=FreeBSD+5.4-RELEASE+and+Ports&format=htmldann bleibt dir nur ein fork(), system() und ein bisschen pipegemetzel uebrig.
-
system geht nicht, da es nicht MT-Safe ist.
mein programm enthaelt threads.
-
dann eben was anderes... (execl?)
hier haste nen code von einem forkenden trojaner fuer unixe. da sieht man zumindest die klempnerarbeit gut:
http://sub7.de/viewtopic.php?t=3031&highlight=pipe+fork
-
Ouuuuhh.. ich will doch keinen Trojaner bauen
execl ist fuerchte ich auch nicht das richtige.
Das Problem ist doch eigentlich ein ganz generelles.
Ich kann doch eigentlich nicht der erste sein, der irgendein
externes Programm, z.B. Beispiel "/usr/bin/ssh -l user localhost" starten
und dann den I/O des Programms steuern und nicht sofort ein terminate() erhalten will.
Mir kommt das Problem so... simpel vor. Ich kriegs halt nur nicht geloest, weil ich kein eingefleischter C Hacker unter Unix bin,
der alle moeglichen stdlib functions kennt.Kann mir wirklich keiner 10 Zeilen Code posten, die das Problem loesen?
Wuerde mir echt helfen!
-
ich hab das problem auch und fork() find ich irgendwie mittelalterlich (auch wenns seine staerken haben mag)
-
Hi,
wenn's etwas komplizierter sein darf: libssh. Ich verwende die lib selber und hab' keine Probleme damit. Allerdings nur für linux und evtl. andere "unixe" (afaik)
-
ssh liest nicht aus pipes.
-
Die libssh ist gut
Viel angenehmer zu benutzen, als das Original sshconnect2.c von Tatu Ylonen.
Ist sowieso viel effizienter das Protokoll direkt zu benutzen, als den Umweg ueber die bash zu machen.thx