In diesem Artikel erklären wir den Expect-Befehl zur Realisierung der automatisierten Shell-Interaktion anhand von Beispielen. Wir können einfache Kontrollflussfunktionen über Shell implementieren, wie z. B. Schleifen, Beurteilung usw. Der folgende Artikel stellt Ihnen hauptsächlich die relevanten Informationen zur Verwendung des Expect-Befehls zur Realisierung der Shell-Automatisierungsinteraktion vor. Freunde in Not können einen Blick darauf werfen.
Hintergrund
Es gibt viele Szenarien in Linux-Skripten für Remote-Vorgänge, wie z. B. Remote-Anmeldung SSH, Remote-Kopie SCP, Dateiübertragung SFTP usw. Für alle diese Befehle ist die Eingabe eines Sicherheitskennworts erforderlich. Die normale Verwendung des Befehls erfordert die manuelle Eingabe des Kennworts und die Annahme der Sicherheitsüberprüfung. Um automatisierte Remote-Operationen zu erreichen, können wir die Funktionalität von Expect ausleihen.
expect ist eine kostenlose Programmiersprache, die zur Implementierung automatischer und interaktiver Kommunikationsaufgaben ohne menschliches Eingreifen verwendet wird. Expect entwickelt sich ständig weiter, seine Funktionen werden immer leistungsfähiger und es ist zu einem leistungsstarken Assistenten für Systemadministratoren geworden. Um Expect auf dem System ausführen zu können, muss zunächst Tcl installiert werden.
Expect-Installation
Expect wird basierend auf Tcl erstellt, daher sollten wir zuerst Tcl installieren, bevor wir Expect installieren.
(1) Tcl-Installation
Homepage: http://www.tcl.tk
Download-Adresse: http://www.tcl.tk
Download-Adresse: http://www. tcl .tk/software/tcltk/downloadnow84.tml
wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz
1. Laden Sie das Quellcodepaket herunter
tar xfvz tcl8.4.11-src.tar.gz
2. Entpacken Sie das Quellcodepaket
cd tcl8.4.11/unix ./configure --prefix=/usr/tcl --enable-shared make make install
3. Installationskonfiguration
Hinweis:
1 Geben Sie nach Abschluss der Installation das Stammverzeichnis des TCL-Quellcodes ein und kopieren Sie tclUnixPort.h darunter Unterverzeichnis unix in das Unterverzeichnis generic middle.
2. Löschen Sie den TCL-Quellcode noch nicht, da er noch für den erwarteten Installationsprozess benötigt wird.
(2) Installation erwarten (erfordert Tcl-Bibliothek)
Homepage: http://expect.nist.gov/
wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download
1 Quellpaket
tar xzvf expect5.45.tar.gz
2. Entpacken Sie das Quellpaket
cd expect5.45 ./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic make make install ln -s /usr/tcl/bin/expect /usr/expect/bin/expect
3. Installationskonfiguration
erwarten Der Kern besteht aus Spawn, Expect, Send und Set.
spawn ruft den auszuführenden Befehl auf
expect wartet auf das Erscheinen der Eingabeaufforderungsinformationen, das heißt, um die Benutzereingabeaufforderung zu erfassen:
send sendet Werte, die eine Interaktion erfordern, und ersetzt die manuelle Eingabe des Benutzers
set setzt variable Werte
Interaktion nach Abschluss der Ausführung Behalten Sie den interaktiven Status bei und geben Sie die Kontrolle an die Konsole. Zu diesem Zeitpunkt können Sie manuell arbeiten. Wenn kein solcher Satz vorhanden ist, wird er nach Abschluss der Anmeldung beendet, anstatt auf dem Remote-Terminal zu bleiben.
expect eof Dies muss hinzugefügt werden und entspricht spawn, um die Beendigung der Capture-Terminal-Ausgabeinformationen anzuzeigen, ähnlich wie if....endif
expect Das Skript muss mit „interact“ enden oder „expect eof“ reicht normalerweise aus, um automatisierte Aufgaben auszuführen.
Andere Einstellungen
Erwartung auf nie Timeout einstellen, Timeout auf -1 setzen
Erwartung auf 300 einstellen Zweites Timeout: Wenn nach mehr als 300 kein Expect-Inhalt angezeigt wird, Exit-Set-Timeout 300
Expect-Schreibsyntax
Expect verwendet TCL-Syntax
Ein Tcl-Befehl besteht aus durch Leerzeichen getrennten Wörtern. Das erste Wort ist der Befehlsname und der Rest sind Befehlsparameter
cmd arg arg arg
$foo
[cmd arg]
„some stuff“
{einige Dinge🎜>
login.exp dient der schnellen und einfachen Remote-Anmeldung. Verwendung: login.exp „exclude“ „${remote_ip}“ „${remote_user}“ „${remote_passwd}“ „${remote_command}“
#!/usr/bin/expect -f ########################################################## # 通过SSH登陆和执行命令 #参数:1.Use_Type [check/execute] # 2.SSHServerIp # 3.SSHUser # 4.SSHPassword # 5.CommandList [多个命令间以;间隔] #返回值: # 0 成功 # 1 参数个数不正确 # 2 SSH 服务器服务没有打开 # 3 SSH 用户密码不正确 # 4 连接SSH服务器超时 ########################################################## proc usage {} { regsub ".*/" $::argv0 "" name send_user "Usage:\n" send_user " $name Use_Type SSHServerIp SSHUser SSHPassword CommandList\n" exit 1 } ## 判断参数个数 if {[llength $argv] != 5} { usage } #设置变量值 set Use_Type [lindex $argv 0] set SSHServerIp [lindex $argv 1] set SSHUser [lindex $argv 2] set SSHPassword [lindex $argv 3] set CommandList [lindex $argv 4] #spawn ping ${SSHServerIp} -w 5 #expect { # -nocase -re "100% packet loss" { # send_error "Ping ${SSHServerIp} is unreachable, Please check the IP address.\n" # exit 1 # } #} set timeout 360 set resssh 0 #定义变量标记ssh连接时是否输入yes确认 set inputYes 0 set ok_string LOGIN_SUCCESS if {$Use_Type=="check"} { #激活ssh连接,如果要需要输入yes确认,输入yes,设置inputYes为1,否则输入ssh密码 spawn ssh ${SSHUser}@${SSHServerIp} "echo $ok_string" } else { spawn ssh ${SSHUser}@${SSHServerIp} "$CommandList" } expect { -nocase -re "yes/no" { send -- "yes\n" set inputYes 1 } -nocase -re "assword: " { send -- "${SSHPassword}\n" set resssh 1 } #-nocase -re "Last login: " { # send -- "${CommandList}\n" #} $ok_string {} -nocase -re "Connection refused" { send_error "SSH services at ${SSHServerIp} is not active.\n" exit 2 } timeout { send_error "Connect to SSH server ${SSHUser}@${SSHServerIp} timeout(10s).\n" exit 4 } } #如果输入了yes确认,输入ssh密码 if {$inputYes==1} { expect { -nocase -re "assword: " { send -- "${SSHPassword}\n" set resssh 1 } } } #如果出现try again或者password:提示,说明输入的用户密码错误,直接退出。 if {$resssh==1} { expect { -nocase -re "try again" { send_error "SSH user:${SSHUser} passwd error.\n" exit 3 } -nocase -re "assword:" { send_error "SSH user:${SSHUser} passwd error.\n" exit 3 } eof {} } } send_error -- "$expect_out(buffer)" #-nocase -re "No such user" { # send_error "No such user.\n" # exit 5 # } #exit
Verwandte Empfehlungen:
Linux Shell Produktionsaufzeichnungs- und WiedergabefunktionsskriptPython realisiert die einfache Funktion des Shell-Sed-ErsatzesLinux-Shell-FTP-Methode zum Herunterladen von Dateien nach DatumDas obige ist der detaillierte Inhalt vonBeispiele zur Erläuterung des Expect-Befehls zur Implementierung der automatisierten Shell-Interaktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!