init III
This commit is contained in:
54
Linux automated conf via expect/README
Normal file
54
Linux automated conf via expect/README
Normal file
@@ -0,0 +1,54 @@
|
||||
#########################################################################################################
|
||||
# devices.txt
|
||||
#########################################################################################################
|
||||
|
||||
Verbindungsparameter der einzelnen Hosts
|
||||
|
||||
Die 4 Parameter werden mit | voneinander abgetrennt
|
||||
1) Host (IP oder Name)
|
||||
2) Parameter für den ssh bspw. Cipher oder KeyExchange
|
||||
3) Benutzername für den ssh
|
||||
4) Passwort entweder hier eingetragen oder per Umgebungsvariable
|
||||
Vor Aufruf die Variable setzen mit export SSHPASS=Passwort
|
||||
In diesem Konfigfile wird dann ENV:SSHPASS eingetragen
|
||||
|
||||
Bsp
|
||||
10.1.1.74|-oKexAlgorithms=+diffie-hellman-group1-sha1 -caes256-cbc|ageissler|ENV:SSHPASS
|
||||
|
||||
|
||||
#########################################################################################################
|
||||
# configs.txt
|
||||
#########################################################################################################
|
||||
|
||||
Definition über auszuführende Befehle
|
||||
|
||||
Befehle für einen Host werden mit Host >>>> eingeleitet und mit <<<< beendet
|
||||
Die exakte Anzahl ist zu beachten.
|
||||
Zwischen diesen Zeilen steht in was zwischen connect und disconnect auszuführen ist.
|
||||
Also inklusive Passworteingabe ($pass), "term len", "exit" und ähnlichem.
|
||||
|
||||
Die Einträge werden in der angegebenen Reihenfolge bearbeitet.
|
||||
Sollen weitere Änderungen an einem Gerät durchgeführt werden, können diese einfach unten angehängt werden.
|
||||
|
||||
Es stehen die folgenden Variablen zur Verfügung
|
||||
|
||||
$pass Enthalten ist das Passwort aus devices.txt oder der Umgebungsvariablen SSHPASS (siehe devices.txt)
|
||||
$host Der Host (IP oder Name) auf dem die Konfig aktuell durchgeführt wird
|
||||
$user Der Username aus devices.txt
|
||||
|
||||
Bsp
|
||||
10.1.1.2 >>>>
|
||||
e assword: // e expect soll auf Wert warten
|
||||
s $pass; // s expect soll Wert senden Semikolons am Zeilenende werden durch Returns ersetzt
|
||||
e > // wartet auf >
|
||||
s en // sendet en\n
|
||||
e assword: // wartet auf assword:
|
||||
s $pass; // Kommentare können auch verwendet werden
|
||||
e #
|
||||
s reload in 5;;; // sendet reload in 5\n\n\n
|
||||
s exit;
|
||||
<<<<
|
||||
|
||||
An Sendebefehle wird automatisch ein \n angehängt
|
||||
daher 's en' => 'send "en\n"' und 's en;' => 'send "en\n\n"'
|
||||
|
||||
24
Linux automated conf via expect/configs.txt
Normal file
24
Linux automated conf via expect/configs.txt
Normal file
@@ -0,0 +1,24 @@
|
||||
# Bsp
|
||||
# 10.1.1.2 >>>>
|
||||
# e assword:
|
||||
# s $pass
|
||||
# e >
|
||||
# s en // Kommentar bspw enable Modus
|
||||
# e assword:
|
||||
# s $pass
|
||||
# e #
|
||||
# s reload in 5;;;
|
||||
# s exit;
|
||||
# <<<<
|
||||
|
||||
10.1.1.77 >>>>
|
||||
e assword1:
|
||||
s $pass
|
||||
e >
|
||||
s en
|
||||
e assword:
|
||||
s $pass
|
||||
e #
|
||||
s copy run start;;;
|
||||
s exit
|
||||
<<<<
|
||||
6
Linux automated conf via expect/devices.txt
Normal file
6
Linux automated conf via expect/devices.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
# Bsp
|
||||
# 10.1.1.74|-oKexAlgorithms=+diffie-hellman-group1-sha1 -caes256-cbc|ageissler|ENV:SSHPASS
|
||||
#
|
||||
|
||||
10.1.1.77|-oKexAlgorithms=+diffie-hellman-group1-sha1 -caes256-cbc|ageissler|H3rrIm#emd
|
||||
10.1.1.2|-oKexAlgorithms=+diffie-hellman-group1-sha1 -caes256-cbc|conetadm|Conet12#
|
||||
10
Linux automated conf via expect/expect.exp
Normal file
10
Linux automated conf via expect/expect.exp
Normal file
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/expect -f
|
||||
|
||||
spawn ssh 10.1.1.74 -l ageissler -oKexAlgorithms=+diffie-hellman-group1-sha1 -caes256-cbc
|
||||
|
||||
expect "assword:"
|
||||
send "fffffffffffff\n"
|
||||
expect "#"
|
||||
send "dir nvram:\n"
|
||||
send "exit\n"
|
||||
interact
|
||||
149
Linux automated conf via expect/run.pl
Normal file
149
Linux automated conf via expect/run.pl
Normal file
@@ -0,0 +1,149 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
my $config;
|
||||
my $configs;
|
||||
my $host;
|
||||
my @hosts;
|
||||
my $ssh_opt;
|
||||
my $user;
|
||||
my $pass;
|
||||
my $remain;
|
||||
my $count=1;
|
||||
|
||||
# Expect Befehl vom System ermitteln
|
||||
my $expect=`which expect`;
|
||||
chomp $expect;
|
||||
|
||||
# Datumsstring yyyymmdd_hhmmss
|
||||
my $date=`date +"%Y%m%M_%H%M%S"`;
|
||||
chomp $date;
|
||||
|
||||
# zu konfigurierende hosts aus configs.txt auslesen
|
||||
open CONFIGS, "<configs.txt" or die "\n\ncannot open configs.txt\n\n";
|
||||
foreach my $l (<CONFIGS>) {
|
||||
# Kommentarzeilen überspringen
|
||||
# Auskommentierte hosts überpringen
|
||||
next if ($l =~ /^#/);
|
||||
($host)=$l=~ /^(.*) >>>>$/;
|
||||
# host in @hosts aufnehmen
|
||||
push @hosts, $host if $host ne "";
|
||||
}
|
||||
close CONFIGS;
|
||||
|
||||
# komplette configs.txt einlesen
|
||||
open CONFIGS, "<configs.txt" or die "\n\ncannot open configs.txt\n\n";
|
||||
my @configs=<CONFIGS>;
|
||||
close CONFIGS;
|
||||
|
||||
# komplette configs in eine variable für multiline matche
|
||||
foreach (@configs) { next if /^#/; $configs=$configs . $_; }
|
||||
|
||||
# für alle zu konfigurierende hosts die konfig ermitteln
|
||||
foreach $host (@hosts) {
|
||||
# Logfilename erstellen
|
||||
# log_yyyymmdd_hhmmss_Nummer.txt
|
||||
# Nummer wird für jeden host hochgezählt, also neues logfile für jeden Konfigabschnitt
|
||||
$logfile="log_".$date."_$count".".txt";
|
||||
#$logfile="log";
|
||||
$count++;
|
||||
|
||||
# Initialisierung
|
||||
$ssh_opt=""; $user=""; $pass=""; $config=""; $remain="";
|
||||
|
||||
# Aus gesamtem Konfigfile den Teil für host selektieren (nach $config)
|
||||
# Der Rest geht nach $remain
|
||||
($config,$remain) = $configs =~ /$host >>>>\n(.*?)<<<<(.*)/s;
|
||||
# Der Rest ist dann die neue gesamte Konfiguration
|
||||
$configs=$remain;
|
||||
|
||||
# die parameter für verbindungen zum host aus devices.txt lesen
|
||||
open DEVICES, "<devices.txt" or die "\n\ncannot open devices.txt\n\n";
|
||||
foreach (<DEVICES>) {
|
||||
# steht am Anfang der Zeile (Kommentarzeile) ein # wird übersprungen
|
||||
next if /^#/;
|
||||
chomp;
|
||||
# Zeile holen in der Verbindungsparameter für host stehen
|
||||
if (/^$host/) {
|
||||
# Parameter splitten
|
||||
($host,$ssh_opt,$user,$pass) = split /\|/;
|
||||
$pwtxt="from config";
|
||||
# Wenn als Passwort ENV:SSHPASS angegeben ist,
|
||||
if ($pass eq "ENV:SSHPASS") {
|
||||
# Inhalt der Umgebungsvariablen SSHPASS als PW nutzen
|
||||
$pass = $ENV{'SSHPASS'};
|
||||
$pwtxt="from ENV:SSHPASS";
|
||||
}
|
||||
# vorhandene ssh Parameter werden angenommen
|
||||
# ist Zeichenkette leer: keine Paramter
|
||||
my $o=1; $o=0 if $ssh_opt eq "";
|
||||
# das expect skript dazu bauen
|
||||
# host, dessen konfig und Schalter ob ssh Parameter verwendet werden
|
||||
write_exp ($host, $config, $o);
|
||||
}
|
||||
}
|
||||
close DEVICES;
|
||||
|
||||
# wenn keine Zeile in devices für host gefunden wurde oder es wurde
|
||||
# kein User und/oder Passwort angegeben: Fehler und Tschüss
|
||||
if ($user eq "" or $pass eq "") {
|
||||
die "\n\nno user or password for host $host\n\n";
|
||||
}
|
||||
|
||||
# Logfile erstellen wird expect weiter gefüllt
|
||||
open LOG, ">$logfile";
|
||||
printf LOG "!\n! Let's have a look at host $host\n!\n\n";
|
||||
# alles soweit korrekt dann konfig durchführen
|
||||
($o1,$o2)=split/ /, $ssh_opt;
|
||||
print "Start expect with parameters\n\tscript run.exp\n\tlogfile $logfile\n\thost $host\n\tuser $user\n\tpassword *hidden* $pwtxt\n\nssh Options used\n\t-oStrictHostKeyChecking=no\n\t-oUserKnownHostsFile=/dev/null\n\t$o1\n\t$o2\n\n";
|
||||
printf LOG "Start expect with parameters\n\tscript run.exp\n\tlogfile $logfile\n\thost $host\n\tuser $user\n\tpassword *hidden* $pwtxt\n\nssh Options used\n\t-oStrictHostKeyChecking=no\n\t-oUserKnownHostsFile=/dev/null\n\t$o1\n\t$o2\n\n";
|
||||
close LOG;
|
||||
|
||||
`$expect run.exp $logfile $host $user $pass $ssh_opt`;
|
||||
}
|
||||
|
||||
unlink "run.exp";
|
||||
|
||||
# Funktion zum erstellen der run.exp
|
||||
sub write_exp {
|
||||
my ($host,$config,$options)=@_;
|
||||
open FILE, ">run.exp"; # Neue run.exp
|
||||
printf FILE <<'EOFILE1'; # run.exp füllen
|
||||
#!/usr/bin/expect -f
|
||||
set timeout 20
|
||||
log_file [lindex $argv 0]
|
||||
set host [lindex $argv 1]
|
||||
set user [lindex $argv 2]
|
||||
set pass [lindex $argv 3]
|
||||
set ssh1 [lindex $argv 4]
|
||||
set ssh2 [lindex $argv 5]
|
||||
set ssh3 [lindex $argv 6]
|
||||
EOFILE1
|
||||
close FILE; # Datei schließen
|
||||
|
||||
open FILE, ">>run.exp"; # an run.exp anhängen
|
||||
# ssh optionen vorhanden, daher ssh Aufruf mit diesen Parametern in run.exp schreiben
|
||||
if ($options == 1) { printf FILE 'spawn ssh $host -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -l $user $ssh1 $ssh2 $ssh3' . "\n"; }
|
||||
# ssh optionen nicht vorhanden, daher ssh ohne Parameter in run.exp schreiben
|
||||
if ($options == 0) { printf FILE 'spawn ssh $host -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -l $user' . "\n"; }
|
||||
close FILE; # Datei schließen
|
||||
|
||||
my @conf=split /\n/, $config;
|
||||
foreach (@conf) {
|
||||
chomp;
|
||||
s/\/\/.*//; # Kommentare entfernen
|
||||
s/\s*$//g; # Leerzeichen am Zeilenende entfernen
|
||||
($semi) = $_ =~ /(;*)$/; # Semikolons ausschneiden
|
||||
my $count=length($semi); # Anzahl Semikolons
|
||||
s/;*$//; # Semikolons entfernen
|
||||
for ($i=1; $i<=$count; $i++) { # und durch Anzahl
|
||||
$_=$_ .'\n'; # mal \n ersetzen; wichtig! ' verwenden
|
||||
}
|
||||
s/^s (.*)/send "$1\\n"/; # s durch send ersetzen und " hinzufügen
|
||||
s/^e (.*)/expect "$1"/; # e durch expect ersetzen und " hinzufügen
|
||||
$_=$_ . "\n"; # Zeilenumbruch anhängen; wichtig! " verwenden
|
||||
}
|
||||
open FILE, ">>run.exp"; # Expect Befehle in run.exp schreiben
|
||||
foreach (@conf) { printf FILE $_; }
|
||||
printf FILE "interact\n"; # Expect abschließen
|
||||
close FILE; # run.exp schließen
|
||||
}
|
||||
Reference in New Issue
Block a user