2017-02-20 3 views
2

Ich versuche, ein Expect-Skript in einem Bash-Skript zu implementieren. Bear mit mir, da ich ziemlich neu bin zu bash/erwarten.Expect innerhalb Bash-Skript

Hier ist das Skript erwarten, die wie beabsichtigt funktioniert:

log_user 0 

file delete foo.txt 

set fh [open foo.txt a] 

set servers {[email protected] [email protected]} 

foreach s $servers { 
spawn ssh $s 
expect "password: " 
send "PASSWORD\r" 
expect "$ " 
send "grep "something" /some/log/file.log" 
expect "$ " { puts $fh "$expect_out(buffer)"} 
send "exit\r" 
} 

close $fh 

Nun, ich bin die Hoffnung, dieses Skript erwartet in einer Bash-Skript zu schließen, aber es funktioniert nicht wie beabsichtigt.

Hier ist, was ich bisher:

#!/bin/bash 

XYZ=$(expect -c " 
file delete foo.txt 

set fh [open foo.txt a] 

set servers {[email protected] [email protected]} 

foreach s $servers { 
spawn ssh $s 
expect "password: " 
send "PASSWORD\r" 
expect "$ " 
send "grep "something" /some/log/file.log" 
expect "$ " { puts $fh "$expect_out(buffer)"} 
send "exit\r" 
} 

close $fh 
") 

echo "$XYZ" 

Der Fehler Ich erhalte ist:

command substitution: line 42: syntax error near unexpected token `(' 
command substitution: line 42: `expect "$ " { puts $fh "$expect_out(buffer)"}' 

Ich bin offen für alle anderen Möglichkeiten, dies zu implementieren! :)

+0

In Ihrem ursprünglichen Skript wird die Variable '$ Server' um Tcl erweitert, da das ganze Zeug ein Tcl-Programm ist. In Ihrem zweiten Skript wird die Variable '$ server' um bash erweitert, und da es keine bash-Variable mit diesem Namen gibt, wird sie durch die leere Zeichenkette ersetzt. – user1934428

Antwort

2

können Sie /usr/bin/expect -c verwenden expect Befehle auszuführen:

#!/bin/bash 

/usr/bin/expect -c ' 

file delete foo.txt 

set fh [open foo.txt a] 

set servers {[email protected] [email protected]} 

foreach s $servers { 
spawn ssh $s 
expect "password: " 
send "PASSWORD\r" 
expect "$ " 
send "grep "something" /some/log/file.log" 
expect "$ " { puts $fh "$expect_out(buffer)"} 
send "exit\r" 
} 

close $fh 
' 
+0

Ausgezeichnet, das ist genau das, was ich gesucht habe. Vielen Dank! –

+0

Gibt es eine Möglichkeit, Variablen mit diesem Ansatz an den erwarteten Code zu übergeben? – Kayvar

0

Bertrandsche Antwort ist ein Weg, um Ihre Frage zu lösen, aber nicht das Problem mit erklären, was Sie taten.

Bash versucht Variablen in doppelte Anführungszeichen zu erweitern, so dass Ihr expect Skript Leerzeichen sehen, wo Sie wollen $servers sehen, $s und $fh. Außerdem haben Sie dreifach verschachtelte Sätze von Strings in doppelten Anführungszeichen, die alle möglichen Probleme beim Parsen der Argumente auf expect verursachen.

Es ist eine Frage der Meinung, aber ich denke, wenn etwas zu einem bestimmten Punkt kommt, wo es als ein eigenes Programm betrachtet wird, sollte es in eine separate Datei getrennt werden.

#!/usr/bin/expect 
log_user 0 

file delete foo.txt 

set fh [open foo.txt a] 

set servers {[email protected] [email protected]} 

foreach s $servers { 
    spawn ssh $s 
    expect "password: " 
    send "PASSWORD\r" 
    expect "$ " 
    send "grep 'something' /some/log/file.log" 
    expect "$ " { 
     puts $fh "$expect_out(buffer)" 
    } 
    send "exit\r" 
} 

close $fh 

Stellen Sie sicher, es ist ausführbar, und es dann von Ihrem bash Skript aufrufen:

#!/bin/bash 
/usr/local/bin/my_expect_script 

(dies richtig wirklich zu tun, sollten Sie Authentifizierung über öffentliche Schlüssel einrichten und dann können Sie erwarten loswerden insgesamt ssh server "grep 'something' /some/log/file.log" direkt von bash)

+0

Auch das Logging, das in Ihrem 'expect'-Skript läuft, könnte viel prägnanter auf der' bash' Seite der Dinge durchgeführt werden. – miken32