Warum kann ich durch das Umleiten der Ausgabe Kennwortaufforderungen sehen?

2561
Matt Simmons

Ich habe also einen Befehl, den ich ausgeben werde, der im Wesentlichen 'ssh'ing in verschiedene Hosts ist:

 command 2&>1 | grep "desired output" 

Hin und wieder trifft es mitten im Befehl auf einen Host, bei dem ich meine Schlüssel nicht eingerichtet habe. Wenn das passiert, erhalte ich folgende Ausgabe:

 Password: 

Da ich STDERR in STDOUT umleite und dann STDOUT filtere, um nur die "gewünschte Ausgabe" zu erhalten (die kein "Passwort:" enthält). Wie wird mir die Passwort-Eingabeaufforderung angezeigt?

6

1 Antwort auf die Frage

8
parkydr

ssh öffnet / dev / tty zum Lesen und Schreiben, um das Kennwort einzugeben.

Ich denke, dies ist ein Sicherheitsmerkmal, die Eingabe muss vom tty erfolgen und nicht von stdin.

Wenn Sie strace ssh <host>strace ausführen, werden Ihnen die Systemaufrufe angezeigt, die der Befehl ausführt.

Ich bekomme:

open("/dev/tty", O_RDWR|O_LARGEFILE) = 4 ... write(4, "dave@host"..., 16dave's password: ) = 16 read(4, 
Nach meinem Verständnis ist dies auch der Grund, warum Sie das Kennwort nicht einfach von einem Skript mit einer Weiterleitung an ssh übergeben können. Sie brauchen 'Expect' (http://expect.sourceforge.net und http://stackoverflow.com/questions/459182/using-expect-to-pass-a-password-to-ssh). mpy vor 11 Jahren 1
Großartig. Ich habe nicht gedacht, dass ich nicht nachgiebig wäre, weil es eine vorübergehende Neugier war, aber danke dafür. Ich bin mir sicher, dass das Wissen nützlich sein wird! Matt Simmons vor 11 Jahren 0
@ terdon - der Befehl, den Sie wollen (denke ich), liegt in der Mitte der Antwort, die von parkydr geschrieben wurde: `strace ssh ` Kevin Fegan vor 11 Jahren 0
@ KevinFegan Danke, ich weiß. Der Beitrag wurde bearbeitet, seit ich meinen Kommentar gepostet habe. Überprüfen Sie das [Bearbeitungsprotokoll] (http://superuser.com/posts/569437/revisions). terdon vor 11 Jahren 0