OSX bash & erwarten
Habe ich ein Skript ausführen muss ein "sudo" - operation auf jedes von einer Anzahl von hosts. Ich bin versucht zu bekommen, erwarten, zu arbeiten, so ich nur geben Sie es einmal, und haben, laufen Sie in ein paar Probleme.
Zunächst einige Beispiele empfehlen:
/usr/bin/expect <<EOD
spawn ssh -t $host /usr/bin/sudo -v
expect "Password:"
send "$SUDOPASS\n"
EOD
Jedoch, sobald ich in das zweite '<', alle zitiert wird nach oben geschraubt, und mein Skript endet mit einem unerwarteten Ende der Datei. Das ist wirklich seltsam, als ich denselben Mechanismus verwenden, mit der Katze zu schreiben, die Dateien in andere scripts.
Andere Beispiele zeigen:
/usr/bin/expect -c "
spawn ssh -t $host /usr/bin/sudo -v
expect "Password:"
send "$SUDOPASS\n"
"
Tun es auf diese Weise (und durch das hinzufügen von-d-zu erwarten), bekomme ich Fehler über keine tty-Schnittstelle und eine Wiederholung des Passworts mit ein 'n' am Ende angehängt, so dass es nicht senden eines newline (ich habe versucht, '\r' als auch), aber stattdessen scheint die Flucht des 'n'
Da die meisten der Beispiele, die ich zu finden bin sind von Linux erwarte ich (ha, ha, Wortspiel nicht beabsichtigt!) dass Sie mit einem GNU erwarten, und ich bin mit einem BSD erwarten. Ich bin mit dem Lesen der man-page, aber das Wort "spawn" erscheint so oft, es könnte noch eine Weile, bis ich zufällig die richtige Instanz.
Hier ist ein Ergebnis, das scheint zu sein, am nächsten zu arbeiten:
flamingo:~ jnojr$ Scripts/getinfo_expect.sh
Assuming you have one 'sudo' password for all of your hosts, enter it now:
expect version 5.45
spawn /usr/bin/ssh -t macbook /usr/bin/sudo -v
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {67358}
expect: does "" (spawn_id exp7) match glob pattern "Password:"? no
Password:
expect: does "Password:" (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) "Password:"
send: sending "password\n" to { exp7 }
argv[0] = /usr/bin/expect argv[1] = -d argv[2] = -c argv[3] =
spawn /usr/bin/ssh -t macbook /usr/bin/sudo -v
expect Password: { send password\n }
set argc 0
set argv0 "/usr/bin/expect"
set argv ""
sudo: no tty present and no askpass program specified[/CODE]
Dass mit dem verlassen des '\n' außerhalb der Anführungszeichen, wie in
send "$SUDOPASS"\n
Scheint es zu sein, vor allem arbeiten, außer das auslassen der '-t' option, um ssh -
- Haben Sie als Umgehung dieser ganz zu Gunsten von ohne Passwort
ssh
- und/odersudo
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich, die zweite @BrianCain Kommentar, dass ohne Passwort
ssh
w/sudo
wäre die bessere Lösung. Das sagte, lassen Sie uns versuchen zu helfen, mit Ihrerexpect
script und Sie können entscheiden, ob Sie weiterhin zu viel Kopfschmerzen.Ich glaube, Sie gehen zu wollen, zu verwenden
expect -f -
(Lesen Sie das Skript von der Standardeingabe (STDIN), wenn Sie diebash
"hier der string" (<<
) zur Eingabe des Skriptexpect
. Also: