stdio von einem per system() gestartetem Prozess
Hi,
ich versuche gerade in einem c programm ein externes Programm via system zu
starten. Leider moechte dieses dann zweimal ein Passwort erhalten.
So funktioniert es leider nicht:
sprintf(command, "prog -username %s <
On Fri, 2002-08-16 at 15:31, Peter Wiersig wrote:
Volker Kroll wrote:
sprintf(command, "prog -username %s <
Fuer sowas sind die popen/pclose Befehle.
Habe gerade mal in die manpage gesehen. Das scheint genau das zu sein, was ich gesucht habe. Vielen Dank V. -- Volker Kroll 4mino AG Chief System Developer Chausseestr. 52 b volker.kroll@4mino.de D-10115 Berlin Tel.: +49-30-2888490-0 Fax.: +49-30-2888490-99
On Fri, 2002-08-16 at 15:31, Peter Wiersig wrote:
Volker Kroll wrote:
sprintf(command, "prog -username %s <
Das Programm fragt dann immer noch auf der shell nach...
Fuer sowas sind die popen/pclose Befehle.
Ich habe es jetzt so gemacht. Nach meinem Verstaendnis muesste das korrekt sein. Leider scheint das Schreiben nicht zu funktionieren. int cachePW() { FILE * commandin; char c[124]; char * command = c; sprintf(c, "prog -username %se >out 2>&1",uid); commandin = popen(command, "w"); fputs(pw, commandin); fputs(pw, commandin); return 0; } Keine Ahnung was ich falsch machen. Spannenderweise kommt die Aufforderung "Password: " auch immer noch auf dem Terminal an und nicht in der Datei out. V. -- Volker Kroll 4mino AG Chief System Developer Chausseestr. 52 b volker.kroll@4mino.de D-10115 Berlin Tel.: +49-30-2888490-0 Fax.: +49-30-2888490-99
Hi, On 16 Aug 2002, Volker Kroll wrote:
Ich habe es jetzt so gemacht. Nach meinem Verstaendnis muesste das korrekt sein. Leider scheint das Schreiben nicht zu funktionieren.
int cachePW() { FILE * commandin; char c[124]; char * command = c; sprintf(c, "prog -username %se >out 2>&1",uid); commandin = popen(command, "w"); fputs(pw, commandin); fputs(pw, commandin);
return 0; }
Keine Ahnung was ich falsch machen. Spannenderweise kommt die Aufforderung "Password: " auch immer noch auf dem Terminal an und nicht in der Datei out.
Das bedeutet dann mit grosser Wahrscheinlichkeit, dass das Programm direkt /dev/tty abfragt, und nicht stdin (z.B. um echoing auszuschalten). Die getpass() Funktion macht das z.B. von Haus aus. Wenn du sowas machen willst (also direkt ans Terminal schreiben), musst du selber ein pseudo-tty erstellen und mit stdin verbinden. expect(1) tut sowas (schau dir die Funktion send_tty an), und IIRC gibt es auch perl-Module, die das koennen. Es selber in C zu programmieren ist hoechst untrivial. Ciao, Micha.
On Fri, 2002-08-16 at 17:42, Michael Matz wrote:
Das bedeutet dann mit grosser Wahrscheinlichkeit, dass das Programm direkt /dev/tty abfragt, und nicht stdin (z.B. um echoing auszuschalten). Die getpass() Funktion macht das z.B. von Haus aus. Wenn du sowas machen willst (also direkt ans Terminal schreiben), musst du selber ein pseudo-tty erstellen und mit stdin verbinden. expect(1) tut sowas (schau dir die Funktion send_tty an)
Du meinst vermutlich in den Sourcen von expect?
, und IIRC gibt es auch perl-Module, die das koennen. Es selber in C zu programmieren ist hoechst untrivial.
:-)) Schöne Formulierung Wie würde man denn theoretisch vorgehen, wenn man es doch machen wollte? Muß ich dafür erst analysieren, was das Programm macht? lsof zeigt mir an, daß /dev/tty als CHR offen ist. Muß ich jetzt ein umgebogenes stdin und stdout an /dev/tty binden? Vielen Dank Volker -- Volker Kroll 4mino AG Chief System Developer Chausseestr. 52 b volker.kroll@4mino.de D-10115 Berlin Tel.: +49-30-2888490-0 Fax.: +49-30-2888490-99
Hi, On 22 Aug 2002, Volker Kroll wrote:
getpass() Funktion macht das z.B. von Haus aus. Wenn du sowas machen willst (also direkt ans Terminal schreiben), musst du selber ein pseudo-tty erstellen und mit stdin verbinden. expect(1) tut sowas (schau dir die Funktion send_tty an)
Du meinst vermutlich in den Sourcen von expect?
Nicht direkt, nein. expect verarbeitet Skripte (in TCL), und eines der builtins, die man in diesen benutzen kann, heisst send_tty. Siehe expect(1).
, und IIRC gibt es auch perl-Module, die das koennen. Es selber in C zu programmieren ist hoechst untrivial.
:-)) Schöne Formulierung Wie würde man denn theoretisch vorgehen, wenn man es doch machen wollte?
Wenn man linux-Spezifisch bleibt (Ok, eigentlich BSD derived), dann schaue man sich openpty(3) oder, wenn man gleich Subprozesse oeffnen will, forkpty(3) an. Unten ist ein kleines Testprogramm, was ein pty Paar oeffnet, forkt, das Slave-Pty mit den std{in,out,err} des Childs verbindet, getpass() aufruft, und ein Passwort vom Parent zum Child uebergibt. Das Programm unten funktioniert manchmal nicht richtig (es sind Synchronisationsprobleme, also timing abhaengig, so dass manchmal in dem Child das Passwort zu frueh da ist, getpass() es nicht mehr mitbekommt, und deshalb einfach wartet). Da muesste man also eigentlich was tun. Wenn man generisch bleiben will, also nicht glibc2 (oder BSD) spezifisch, dann schaue man sich intensiv z.B. sshpty.c von OpenSSH an, das auf ca. 500 Zeilen C aubreitet, wie man Pseudo-TTY's behandelt, Rechte darauf korrekt setzt, und sowas. Oder einfach in ein beliebiges X-Terminal, der das gleiche tun muss.
Muß ich dafür erst analysieren, was das Programm macht? lsof zeigt mir an, daß /dev/tty als CHR offen ist. Muß ich jetzt ein umgebogenes stdin und stdout an /dev/tty binden?
Nee, /dev/tty hat damit erstmal nichts zu tun. Es ist implizit das
controlling terminal des Prozesses. Um dieses aber zu aendern, muss man
ein pseudo-tty Paar oeffnen, und ein TIOCSCTTY ioctl drauf tun.
Ciao,
Micha.
--
#include
On Thu, 2002-08-22 at 14:53, Michael Matz wrote:
Wenn man linux-Spezifisch bleibt (Ok, eigentlich BSD derived), dann schaue man sich openpty(3) oder, wenn man gleich Subprozesse oeffnen will, forkpty(3) an. Unten ist ein kleines Testprogramm, was ein pty Paar oeffnet, forkt, das Slave-Pty mit den std{in,out,err} des Childs verbindet, getpass() aufruft, und ein Passwort vom Parent zum Child uebergibt.
Genau an so etwas bin ich gerade dran. Lese gerade das entsprechende Kapitel in Stevens "Advanced Programming in an Unix-Environment" Danke für das Programm, das werde ich mal genau durchsehen, kann ich bestimmt was dran lernen. V. -- Volker Kroll 4mino AG Chief System Developer Chausseestr. 52 b volker.kroll@4mino.de D-10115 Berlin Tel.: +49-30-2888490-0 Fax.: +49-30-2888490-99
On Thu, 2002-08-22 at 14:53, Michael Matz wrote:
Wenn man linux-Spezifisch bleibt (Ok, eigentlich BSD derived), dann schaue man sich openpty(3) oder, wenn man gleich Subprozesse oeffnen will, forkpty(3) an. Unten ist ein kleines Testprogramm, was ein pty Paar oeffnet, forkt, das Slave-Pty mit den std{in,out,err} des Childs verbindet, getpass() aufruft, und ein Passwort vom Parent zum Child uebergibt.
Irgendwie stehe ich gerade auf dem Schlauch. Bei mir gibt es kein forkpty. Ich habe dann nachgesehen, das ist in libutil, welches in glibc zu finden sein sollte. Das Devel-Paket ist bei mir installiert, allerdings nicht die aktuellste Version. Watt nu? Danke Volker -- Volker Kroll 4mino AG Chief System Developer Chausseestr. 52 b volker.kroll@4mino.de D-10115 Berlin Tel.: +49-30-2888490-0 Fax.: +49-30-2888490-99
Hi, On 22 Aug 2002, Volker Kroll wrote:
Irgendwie stehe ich gerade auf dem Schlauch. Bei mir gibt es kein forkpty.
Bitte? Wie alt ist denn das System? Was ist die Fehlermeldung? Erst beim Linken? Dann ein -lutil dazu. Sie sollte in /usr/lib/libutil.so sein.
Ich habe dann nachgesehen, das ist in libutil, welches in glibc zu finden sein sollte. Das Devel-Paket ist bei mir installiert, allerdings nicht die aktuellste Version.
Welche ist es denn? Ciao, Micha.
On Thu, 2002-08-22 at 17:41, Michael Matz wrote:
Hi,
On 22 Aug 2002, Volker Kroll wrote:
Irgendwie stehe ich gerade auf dem Schlauch. Bei mir gibt es kein forkpty.
Ooooops mein Fehler. Es gibt keine manpage und das Programm funktionierte nicht.
Bitte? Wie alt ist denn das System?
SuSE 7.2
Was ist die Fehlermeldung? Erst beim Linken? Dann ein -lutil dazu. Sie sollte in /usr/lib/libutil.so sein.
Was daran lag, daß ich nicht gegen util gelinkt hatte..... libutil ist vorhanden, keine Ahnung, warum ich es gerade nicht gefunden hatte...
Ich habe dann nachgesehen, das ist in libutil, welches in glibc zu finden sein sollte. Das Devel-Paket ist bei mir installiert, allerdings nicht die aktuellste Version.
Welche ist es denn? 2.2.2
Sorry, war mein Fehler. Jetzt funktioniert es. Danke Volker -- Volker Kroll 4mino AG Chief System Developer Chausseestr. 52 b volker.kroll@4mino.de D-10115 Berlin Tel.: +49-30-2888490-0 Fax.: +49-30-2888490-99
participants (3)
-
Michael Matz
-
Peter Wiersig
-
Volker Kroll