Die Bash-Funktion funktioniert nur, wenn das Passwort manuell eingegeben wird

642
N Klosterman

Bei der Arbeit muss ich jeden Tag die folgende Funktion ausführen. Die Funktion funktioniert einwandfrei, wenn Sie zur Eingabe des Kennworts aufgefordert werden. Ich habe jedoch versucht, mein Passwort fest zu codieren, damit ich es nicht jeden Tag eingeben muss. Das geht nicht. Irgendwelche Tipps, warum?

function update() { firewalluser=`whoami` # -s => silent (no echo of characters), -p => prompt user #read -s -p "Password: " firewallpass  firewallpass="mypassword"  TRUSTED=( xxx.yyy.com jenkins.xxx.com svn.xxx.com ) for server in $ do echo "" echo "--> connecting to $server" expect <<EOF  set timeout 20  spawn telnet $server  expect "Username: "  send "$firewalluser\r"  expect "Password: "  send "$firewallpass\r"  expect "Firewall User Authentication: Accepted"  send "exit"  exit  EOF  done } 

Ich führe dies GNU bash, version 3.2.53(1)-release (x86_64-apple-darwin13)mit der in meinem definierten Funktion aus .bash_profile.

Danke im Voraus.

EDIT: Ich habe hinzugefügt exp_internal 1und hier ist die Antwort vom Programm:

--> connecting to some.domain.name.com spawn telnet some.domain.name.com parent: waiting for sync byte parent: telling child to go ahead parent: now unsynchronized from child spawn: returns   expect: does "" (spawn_id exp7) match glob pattern "Username: "? no Trying xx.yy.zz...  expect: does "Trying xx.yy.zz...\r\n" (spawn_id exp7) match glob pattern "Username: "? no Connected to some.domain.name.com. Escape character is '^]'.  expect: does "Trying xx.yy.zz...\r\nConnected to some.domain.name.com.\r\nEscape character is '^]'.\r\n" (spawn_id exp7) match glob pattern "Username: "? no Please Authenticate to VSD DR2 Username: expect: does "Trying xx.yy.zz...\r\nConnected to some.domain.name.com.\r\nEscape character is '^]'.\r\nPlease Authenticate to VSD DR2\r\nUsername: " (spawn_id exp7) match glob pa\ tern "Username: "? yes expect: set expect_out(0,string) "Username: " expect: set expect_out(spawn_id) "exp7" expect: set expect_out(buffer) "Trying xx.yy.zz...\r\nConnected to some.domain.name.com.\r\nEscape character is '^]'.\r\nPlease Authenticate to VSD DR2\r\nUsername: " send: sending "nklosterman\r" to { exp7 }  expect: does "" (spawn_id exp7) match glob pattern "Password: "? no  Password: expect: does "\r\nPassword: " (spawn_id exp7) match glob pattern "Password: "? yes expect: set expect_out(0,string) "Password: " expect: set expect_out(spawn_id) "exp7" expect: set expect_out(buffer) "\r\nPassword: " send: sending "mypassword!\r" to { exp7 }  expect: does "" (spawn_id exp7) match glob pattern "Firewall User Authentication: Accepted"? no  Firewall User Authentication: Failed  expect: does "\nFirewall User Authentication: Failed\r\n" (spawn_id exp7) match glob pattern "Firewall User Authentication: Accepted"? no Connection closed by foreign host.  expect: does "\nFirewall User Authentication: Failed\r\nConnection closed by foreign host.\r\n" (spawn_id exp7) match glob pattern "Firewall User Authentication: Accepted"? no expect: read eof expect: set expect_out(spawn_id) "exp7" expect: set expect_out(buffer) "\nFirewall User Authentication: Failed\r\nConnection closed by foreign host.\r\n" send: sending "exit" to { exp7 send: spawn id exp7 not open while executing "send "exit"" 

Ich kann sehen, dass mein Passwort mit dem angehängten \ r gesendet wird. Ich bin nicht sicher, warum es es nicht akzeptiert. Ich habe sogar versucht, mein Passwort im Heredoc hart zu codieren, anstatt die Variable zu setzen, und das hat nicht funktioniert.

0
Im Allgemeinen werden Anforderungen für Kennwörter nicht durch Standard-E / A durchlaufen. Die Eingabe kann daher nicht umgeleitet werden. Befehle wie `echo password | su` funktionieren nicht. Ich kenne das 'Expect'-Programm nicht, aber es sieht so aus, als würde es funktionieren, indem es die Dialoge anderer Programme liest und schreibt, indem es ihre E / A durch Pipes umleitet. In `ftp` können Sie Passwörter (in Klartext!) In die` .netrc`-Initialisierungsdatei einfügen, und ich automatisiere erfolgreich FTP-Übertragungen mit dieser Option, aber ich weiß nicht, dass `.telnetrc` dasselbe zulässt. AFH vor 9 Jahren 0
Das Problem scheint mit "Erwarten" zu sein, von dem, was ich gelesen habe, sollte es in der Lage sein, Passwörter auf diese Weise zu verwenden. Und ist die IT-Abteilung / der Chef Ihrer Arbeit glücklich darüber, dass Kennwörter in Klartext gespeichert werden? Xen2050 vor 9 Jahren 0
Fügen Sie "exp_internal 1" zu dem Expect-Skript vor "set timeout" hinzu. Dadurch wird das ausführliche Debugging aktiviert, sodass Sie sehen können, was mit dem Kennwort erwartet wird. glenn jackman vor 9 Jahren 0
@ Xen2050 In Bezug auf den Sicherheitsaspekt stimme ich zu, dass dies ein ernstes Sicherheitsbedenken darstellt. Diese Stelle weist jedoch Passwörter zu und verwendet sie (!) So, dass Mitarbeiter Ihr Passwort leicht erraten können. Daher denke ich, dass ein Klartext-Passwort in einem Skript das kleinste der Löcher ist, um das man sich Sorgen machen muss! N Klosterman vor 9 Jahren 0
Sind Sie sicher, dass Sie `\ r` in` send "$ firewalluser \ r" `und` send "$ firewallpassword \ r" `hinzufügen müssen? In anderen Beispielen habe ich nur gesehen, "$ user" `zu senden ... Hastur vor 9 Jahren 0

1 Antwort auf die Frage

0
user210584

Es sieht aus wie ein Wagenrücklauf vs.

Ihr aktives Terminal stimmt möglicherweise nicht mit dem Remote-System überein, und einige automatische Übersetzungen könnten falsch sein. Sie können beide Systeme mit dem Befehl stty (1) vergleichen .

Aus der Expect- Dokumentation:

Wenn Sie in diesem Fall die Eingabetaste drücken, wird sie in eine neue Zeile übersetzt. Wenn Expect das dann an ein Programm weiterleitet, das sein Terminal in den Roher-Modus versetzt (wie Telnet), gibt es ein Problem, da das Programm eine echte Rückkehr erwartet.

Anstatt Zeilenumbrüche manuell durch Zeilenumbrüche zu ersetzen, verwenden Sie den Befehl "stty raw", um die Übersetzung zu stoppen. Beachten Sie jedoch, dass Sie dadurch nicht mehr die gekochten Bearbeitungsfunktionen für Zeilen erhalten.

Ich schlage vor, dass Sie versuchen, die \rdurch \nin Ihrem Code zu ersetzen . Wenn das immer noch nicht funktioniert, müssen beide möglicherweise \r\nfunktionieren. Wenn es immer noch nicht funktioniert, müssen Sie den Terminal-Modus beider Systeme und die Folgen der Wagenrückläufe und der Zeilenumbrüche überprüfen, wenn sie hin und her gehen.

Dies setzt natürlich voraus, dass Sie die richtigen Passwörter haben! ;)