Heim >Betrieb und Instandhaltung >Betrieb und Wartung von Linux >Beispiele zur Erläuterung des Expect-Befehls zur Implementierung der automatisierten Shell-Interaktion

Beispiele zur Erläuterung des Expect-Befehls zur Implementierung der automatisierten Shell-Interaktion

小云云
小云云Original
2017-12-22 09:19:262866Durchsuche

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

  • $-Symbol stellt den Wert einer Variablen dar. In diesem Beispiel lautet der Variablenname foo.

    $foo

  • Die eckigen Klammern führen einen verschachtelten Befehl aus . Wenn Sie beispielsweise das Ergebnis eines Befehls als Argument an einen anderen Befehl übergeben möchten, verwenden Sie die Notation

    [cmd arg]

  • doppelte Anführungszeichen, um das zu kennzeichnen Phrase als Argument für den Befehl. Das „$“-Symbol und eckige Klammern werden weiterhin in doppelten Anführungszeichen interpretiert.

    „some stuff“

  • Klammern kennzeichnen eine Phrase auch als Argument für ein Befehl. Andere Symbole werden jedoch nicht interpretiert.

    {einige Dinge🎜>

  • Das Backslash-Symbol wird verwendet, um spezielle Symbole in Anführungszeichen zu setzen. Beispiel: n steht für einen Zeilenumbruch . Das Backslash-Symbol wird auch verwendet. Schließen Sie die besondere Bedeutung des „$“-Symbols, der Anführungszeichen, der eckigen Klammern und der geschweiften Klammern

  • Beispiel


login.exp dient der schnellen und einfachen Remote-Anmeldung. Verwendung: login.exp „exclude“ „${remote_ip}“ „${remote_user}“ „${remote_passwd}“ „${remote_command}“

Hast du es gelernt? Ich hoffe, dass Sie nach der Lektüre dieses Artikels ein tieferes Verständnis für die Interaktion mit der Shell-Automatisierung haben.
#!/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 Wiedergabefunktionsskript

Python realisiert die einfache Funktion des Shell-Sed-Ersatzes

Linux-Shell-FTP-Methode zum Herunterladen von Dateien nach Datum

Das 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn