Ich habe eine C ++ - Klasse, die verwendet wird, um mit externen Prozessen zu starten und zu kommunizieren (ähnlich Qt's QProcess - wir können Qt nicht verwenden, da wir an einem kleinen Embedded-System arbeiten). Es verwendet Pipe- und dup2-Systemaufrufe, um eine Verbindung zwischen Eltern- und Kindprozess herzustellen. Das Problem ist - es funktioniert nicht mit ssh, scp und anderen Programmen, die ein Passwort erwarten. Ich habe ssh verschränkt und es scheint, dass es / dev / tty öffnet und es irgendwie benutzt, um das Passwort von der Befehlszeile zu lesen. Gibt es eine Möglichkeit, das Passwort von meiner Klasse einzugeben oder zu erkennen, dass eine Anwendung Eingaben von einer anderen Quelle als stdin erwartet (muss überhaupt nicht portierbar sein)?
Es ist üblich, dass SSH-Programme Passwörter direkt von Terminals lesen. Sie müssen ein Pseudoterminal zuweisen und ssh innerhalb dieses Pseudoterminals ausführen, um diese E / A zu erfassen. Die pty man-Seite (Abschnitt 7, man 7 pty
) ist eine gute Einführung.
Ich würde gerne sagen, dass Sie ssh normalerweise keine Passwörter geben wollen, es gibt viele bessere Authentifizierungsoptionen. Verwenden Sie eine Authentifizierung mit öffentlichem Schlüssel für Prozesse, die ohne Benutzereingabe ausgeführt werden sollen und können.
Suchen Sie nach einem Programm, das es bereits tut, zum Beispiel lftp.
Oder straffen Sie diesen Perl-One-Liner, um eine Vorstellung davon zu bekommen, was Sie tun sollten:
%Vor%Es reduziert sich meistens auf das Zuordnen eines Pseudo-Tty-Paares auf den Master-Prozess, das Forcen und Setzen des Slave-Teils des pty auf dem Kind als das aktuelle tty vor der Ausführung von ssh.