English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Implementation of Shell automation interaction using the expect command explained

Hintergrund

In Linux-Skripten gibt es viele Szenarien, die Remoteoperationen durchführen, wie z.B. Remote-Login mit ssh, Remote-Kopieren mit scp, Dateiübertragung mit sftp und so weiter. Diese Befehle beinhalten alle die Eingabe von Sicherheitspasswörtern, und bei der normalen Verwendung der Befehle ist es erforderlich, dass der Benutzer manuell das Passwort eingibt und eine Sicherheitsvalidierung akzeptiert. Um automatisierte Remoteoperationen zu erreichen, können wir die Funktionen von expect nutzen.

expect ist eine kostenlose Programmiersprache, die zum Kommunikationsaustausch zwischen automatisierten und interaktiven Aufgaben verwendet wird, ohne menschliche Intervention. expect entwickelt sich weiter und wird mit der Zeit immer leistungsfähiger und hat sich zu einem mächtigen Assistenten für Systemadministratoren entwickelt. expect benötigt die Unterstützung der Programmiersprache Tcl, um auf dem System ausgeführt zu werden, und Tcl muss zuerst installiert werden, um expect auszuführen.

expect Installation

expect wurde auf der Basis von Tcl erstellt, daher sollten wir Tcl zuerst installieren, bevor wir expect installieren.

(一)Tcl Installation

Startseite: http://www.tcl.tk

Download-Adresse: http://www.tcl.tk/Software/tcltk/downloadnow84.tml

1.Herunterladen des Quellcodepakets

wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz 

2.Entpacken Sie das Quellcodepaket

tar xfvz tcl8.4.11-src.tar.gz 

3.Installation und Konfiguration

cd tcl8.4.11/unix 
./configure --prefix=/usr/tcl --aktivieren-shared 
make 
make install 

Hinweis:

1、Nach Abschluss der Installation wechseln Sie in das Wurzelverzeichnis der Tcl-Quellcodes und kopieren Sie die Datei tclUnixPort.h aus dem Unterverzeichnis unix in das Unterverzeichnis generic.

2、Entfernen Sie vorläufig die Tcl-Quellcodes, da der Installationsprozess von expect sie noch benötigt.

(二)expect Installation (benötigt Tcl-Bibliothek)

Startseite: http://expect.nist.gov/

1.Herunterladen des Quellcodepakets

wget http://sourceforge.net/Projekte/expect/Dateien/Expect/5.45/expect5.45.tar.gz/download 

2.Entpacken Sie das Quellcodepaket

tar xzvf expect5.45.tar.gz 

3.Installation und Konfiguration

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 

expect

Das Kernstück von expect sind spawn, expect, send, set.

spawn Rufen Sie den auszuführenden Befehl auf

  • expect Warten Sie auf das Erscheinen der Befehlsausgabe, das heißt, fangen Sie den Hinweis der Benutzerinput ein:
  • send Senden Sie den erforderlichen interaktiven Wert, der den manuellen Eingabehinweis des Benutzers ersetzt
  • set Setzen Sie den Wert der Variablen
  • Nach Abschluss des Interact-Vorgangs wird der Interaktionsmodus beibehalten, die Kontrolle wird an die Konsole übergeben, zu diesem Zeitpunkt können Sie manuell operieren. Ohne diesen Befehl wird das Programm nach der Anmeldung beendet, anstatt im Remote-Terminal zu bleiben.
  • expect eof Diese muss unbedingt hinzugefügt werden, was mit spawn korrespondiert, um die Beendigung der Ausgabeinformationen des Terminals zu erfassen, ähnlich wie if....endif

Ein expect-Skript muss mit interact oder expect eof enden, um automatische Aufgaben auszuführen, reicht in der Regel expect eof aus.

Andere Einstellungen

  • expect niemals timeout setzen set timeout -1
  • expect setzen 300 Sekunden Timeout, wenn mehr als300 Es erscheint kein expect-Inhalt, dann wird set timeout beendet 300

expect-Schreibsyntax

expect verwendet die Tcl-Syntax

  • Ein Tcl-Befehl besteht aus durch Leerzeichen getrennten Wörtern组成. Der erste Wort ist der Befehlsname, die anderen sind Befehlsparameter
    cmd arg arg arg
  • Das $-Zeichen stellt den Wert einer Variablen dar. In diesem Beispiel ist der Variablenname foo.
    $foo
  • Eckige Klammern führen einen eingebetteten Befehl aus. Zum Beispiel, wenn Sie das Ergebnis eines Befehls als Parameter für einen anderen Befehl übergeben möchten, verwenden Sie dieses Symbol
    [cmd arg]
  • Doppelte Anführungszeichen kennzeichnen Phrasen als Parameter eines Befehls. Das "$"-Zeichen und die eckigen Klammern werden innerhalb der doppelten Anführungszeichen interpretiert
    "some stuff"
  • Geschweifte Klammern kennzeichnen auch Phrasen als Parameter eines Befehls. Aber andere Symbole werden innerhalb der geschweiften Klammern nicht interpretiert
    {some stuff}
  • Der Backslash-Zeichen wird verwendet, um spezielle Zeichen zu referenzieren. Zum Beispiel: n stellt Zeilenumbruch dar. Das Backslash-Zeichen wird auch verwendet, um die spezielle Bedeutung von "$", Anführungszeichen, eckigen Klammern und geschweiften Klammern zu deaktivieren

Beispiel

login.exp ist speziell für Remote-Login vorgesehen, schnelle Verwendungsmethode: login.exp "exclude" "${remote_ip}" "${remote_user}" "${remote_passwd}" "${remote_command}"

#!/usr/bin/expect -f
##########################################################
# SSH anmelden und Befehl ausführen
# Parameter:1.Use_Type [check/execute]
#  2.SSHServerIp
#  3.SSHUser
#  4.SSHPassword
#  5.CommandList [Befehle werden durch Semikolon getrennt]
# Rückgabewert:
# 0 Erfolg
#  1 Anzahl der Parameter ist falsch
#  2 SSH-Server-Dienst ist nicht geöffnet
#  3 SSH-Benutzername und Passwort sind falsch
#  4 Verbindung zum SSH-Server ist abgelaufen
##########################################################
proc usage {} {
 regsub ".*/" $::argv0 "" name
 send_user "Verwendung:\n"
 send_user " $name Use_Type SSHServerIp SSHUser SSHPassword CommandList\n"
 exit 1
} 
## Parameteranzahl überprüfen
if {[llength $argv] != 5}
 usage
}
# Variablenwerte setzen
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% Paketverlust" {
#  send_error "Ping ${SSHServerIp} ist nicht erreichbar, Bitte überprüfen Sie die IP-Adresse.\n"
# exit 1
# }
#}
set timeout 360
set resssh 0
# Definieren Sie eine Variable, um zu markieren, ob bei der SSH-Verbindung "ja" bestätigt werden muss
set inputYes 0
set ok_string ANMELDEERFOLG
if {$Use_Type=="check"} {
 # Aktivieren Sie die SSH-Verbindung, wenn Sie bestätigen müssen, dass Sie "ja" eingeben, geben Sie "ja" ein und stellen Sie inputYes ein auf1,sonst geben Sie das SSH-Passwort ein
 spawn ssh ${SSHUser}@${SSHServerIp} "echo $ok_string"
} else {   
 spawn ssh ${SSHUser}@${SSHServerIp} "$CommandList"
}
expect {
 -nocase -re "ja/nein" {
  send -- "ja\n"
  set inputYes 1
 }
 -nocase -re "assword: " {
  send -- "${SSHPassword}\n"
  set resssh 1
 }
 #-nocase -re "Letzter Login: " { 
 #  send -- "${CommandList}\n"
 #}
 $ok_string {}
 -nocase -re "Verbindung abgelehnt" {
  send_error "SSH-Dienste auf ${SSHServerIp} sind nicht aktiv.\n"
  exit 2
 }
 timeout {}}}
  send_error "连接到SSH服务器${SSHUser}@${SSHServerIp}超时(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用户:${SSHUser} 密码错误.\n"
   exit 3
  }
  -nocase -re "assword:" {
   send_error "SSH用户:${SSHUser} 密码错误.\n"
   exit 3
  }
  eof {}
 }
}
send_error -- "$expect_out(buffer)"
#-nocase -re "No such user" {
# send_error "No such user.\n"
# exit 5
# }
#exit

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或工作具有一定的参考价值。如有疑问,大家可以留言交流,感谢大家对呐喊教程的支持。

声明:本文内容来自网络,版权属于原作者。内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未进行人工编辑处理,也不承担相关法律责任。如果您发现涉嫌版权的内容,欢迎发送邮件至:notice#oldtoolbag.com(在发送邮件时,请将#替换为@进行举报,并提供相关证据。一经查实,本站将立即删除涉嫌侵权内容。)

You May Also Like