network:shell_scripting
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
network:shell_scripting [18.09.2014 20:49] – angelegt richard | network:shell_scripting [30.04.2023 15:57] (aktuell) – Status der Diskussion geändert richard | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ~~DISCUSSION: | ||
====== Kurzeinführung in Skripting ====== | ====== Kurzeinführung in Skripting ====== | ||
+ | |||
Um immer wiederkehrende Aufgaben zu automatisieren, | Um immer wiederkehrende Aufgaben zu automatisieren, | ||
- | Am Anfang eines Skriptes muss man Linux mitteilen, mit welchem Interpreter der folgende Text analysiert werden soll. Dies geschieht durch einen speziellen Kommentar((# | + | Zusammenfassung der notwendigen Schritte: |
+ | - Textdatei erstellen/ | ||
+ | - in der ersten Zeile den Interpreter benennen (''# | ||
+ | - Datei als ausführbar markieren ('' | ||
+ | |||
+ | ===== Textdatei erstellen ===== | ||
+ | Eine Textdatei kann mit einem Texteditor der Wahl erstellt werden. Hier einige Beispiele für Texteditoren: | ||
+ | * gedit (grafisch) | ||
+ | * leafpad (grafisch) | ||
+ | * vi / vim (Kommandozeile) | ||
+ | * nano (Kommandozeile) | ||
+ | * bluefish (grafisch) | ||
+ | * emacs (grafisch/ | ||
+ | |||
+ | Am Einfachsten erstellt man eine neue Datei, in dem den Editor öffnet und anschließend die Datei unter dem gewünschten Namen speichert. | ||
+ | Alternativ kann man auch mit dem Befehl '' | ||
+ | |||
+ | ===== Interpreter benennen ===== | ||
+ | Am Anfang eines Skriptes muss man Linux mitteilen, mit welchem Interpreter der folgende Text analysiert werden soll. Dies geschieht durch den speziellen Kommentar | ||
<file bash test.sh> | <file bash test.sh> | ||
Zeile 10: | Zeile 30: | ||
ls -l | ls -l | ||
</ | </ | ||
+ | |||
+ | ===== Textdatei ausführbar machen ===== | ||
Damit das Skript von Linux überhaupt ausgeführt werden kann, muss es zunächst als ausführbar gekennzeichnet werden (s.o.). | Damit das Skript von Linux überhaupt ausgeführt werden kann, muss es zunächst als ausführbar gekennzeichnet werden (s.o.). | ||
< | < | ||
Zeile 21: | Zeile 43: | ||
Die zweite Variante hängt aber vom jeweiligen System ab. | Die zweite Variante hängt aber vom jeweiligen System ab. | ||
+ | |||
+ | ===== Tipps zum Aufbau eines Skripts ===== | ||
+ | Skripte werden häufig im Bereich Administration von Servern und Netzelementen eingesetzt um Wiederkehrende Aufgaben zu erledigen. Hierzu zählen: | ||
+ | * Installationskripte z.B. für neue Software | ||
+ | * Konfiguration z.B. von IP-Adressen oder Routen | ||
+ | * Anlage von Usern in einem Active Directory | ||
+ | * ... | ||
+ | |||
+ | Die Liste lässt sich beliebig fortsetzen. Entscheidend für ein gutes Skript ist die gute Lesbarkeit. D.h. man sollte die einzelnen Abschnitt gut kommentieren, | ||
+ | |||
+ | Wie erreicht man nun ein gutes Ergebnis? Hierzu sollte man sich überlegen, welche Befehle benötigt werden. Diese kann man zunächst händisch auf der Kommandozeile ausprobieren und sie anschließend in seine Textdatei aufnehmen. Hat man alle benötigten Befehlszeilen zusammen, dann geht es an das Sortieren. Häufig ist die Reihenfolge wichtig (z.B. bei Firewall-Regeln oder beim Aktivieren einer Route). Hierbei ist es zweckmäßig zunächst einen definierten Zustand herzustellen. | ||
+ | |||
+ | ==== Beispiel: Routen in die Routing-Tabelle bringen ==== | ||
+ | |||
+ | Arbeitet man an einem Testsystem könnte man z.B. zunächst die eingesetzten Interfaces löschen((flush)). Dadurch werden auch alle Routen, die bereits anderweitig auf diesen Interfaces konfiguriert wurden gelöscht. Diese könnten ansonsten eventuell stören. | ||
+ | Danach beginnt man mit der Konfiguration der IP-Adressen, | ||
+ | |||
+ | <file bash routing_sample.sh> | ||
+ | #!/bin/bash | ||
+ | # alle IP-Adressen und Routen an eth1 löschen | ||
+ | sudo ip addr flush eth1 | ||
+ | |||
+ | # IP-Adresse 10.0.0.20 auf Interface eth1 setzen | ||
+ | sudo ip addr add dev eth1 10.0.0.20/8 | ||
+ | |||
+ | # Default-Route setzen (Standard-Gateway 10.0.0.1) | ||
+ | sudo ip route add default via 10.0.0.1 | ||
+ | </ | ||
+ | |||
+ | ==== Beispiel: telnet-Verbindung zu einem Switch aufbauen ==== | ||
+ | |||
+ | Mit dem folgenden Script wird eine Verbindung mit Hilfe von '' | ||
+ | Im Anschluss werden bis zum '' | ||
+ | Die folgende Tabelle zeigt die Befehle und ihre Wirkung auf dem Switch: | ||
+ | |||
+ | ^ Befehl ^ Wirkung auf Switch ^ | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | |||
+ | <file bash telsession.sh> | ||
+ | #!/bin/bash | ||
+ | # netcat (kurz nc) ist ein Kommandozeilen-Tool, | ||
+ | # Verwendung: nc < | ||
+ | nc 192.168.33.61 23 <<' | ||
+ | schueler | ||
+ | schueler | ||
+ | system-view | ||
+ | display vlan | ||
+ | undo vlan all | ||
+ | y | ||
+ | vlan 2 | ||
+ | port Ethernet 1/0/1 | ||
+ | display vlan 2 | ||
+ | vlan 3 | ||
+ | port Ethernet 1/0/2 | ||
+ | quit | ||
+ | interface Ethernet 1/0/5 | ||
+ | port link-type trunk | ||
+ | port trunk permit vlan 3 | ||
+ | port trunk permit vlan 2 | ||
+ | quit | ||
+ | quit | ||
+ | EOF | ||
+ | </ | ||
+ | |||
+ | ==== Beispiel: Automatische Synchonisieren von Dateien mit Luckybackup ==== | ||
+ | |||
+ | Mit dem folgenden Script lässt sich die Synchronisation unter Linux automatisieren. Voraussetzung dafür ist das automatische Einbinden von USB-Laufwerken. | ||
+ | Ein paar Anpassung sind nötig: | ||
+ | - Pfad zum USB-Stick anpassen (hier ''/ | ||
+ | - mit Befehl '' | ||
+ | - Profil-Name von Luckyback eintragen (Default ist: default) | ||
+ | |||
+ | Wie funktioniert das Ganze? | ||
+ | |||
+ | Das Script prüft, ob die Datei ''/ | ||
+ | sich das Script für 1 Sek schlafen. Wenn die Datei da ist, also der Stick vom System automatisch eingebunden wurde, dann wird Luckybackup mit dem Default-Profile ausgeführt. | ||
+ | Hier können auch andere Profile ausgewählt werden. Dazu muss '' | ||
+ | |||
+ | <file bash luckybackup.sh> | ||
+ | #!/bin/bash | ||
+ | # 1. Pfad zum USB-Stick anpassen (hier / | ||
+ | # 2. mit ' | ||
+ | # 3. Profil-Name von Luckyback eintragen (Default ist: default) | ||
+ | x=0 | ||
+ | while [ " | ||
+ | | ||
+ | sleep .1 | ||
+ | echo " | ||
+ | done | ||
+ | echo " | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ===== Python ===== | ||
+ | |||
+ | Eine weitere sehr mächtige Variante Prozesse zu automatisieren, | ||
+ | |||
+ | <file python python_sample.py> | ||
+ | # | ||
+ | # coding: utf8 | ||
+ | |||
+ | # Import für Call https:// | ||
+ | from subprocess import call | ||
+ | |||
+ | # Import für os.system https:// | ||
+ | import os | ||
+ | |||
+ | call([" | ||
+ | |||
+ | os.system(" | ||
+ | |||
+ | |||
+ | # User anlegen | ||
+ | def createUser(name, | ||
+ | encPass = crypt.crypt(password," | ||
+ | return | ||
+ | |||
+ | testVar = raw_input(" | ||
+ | print (testVar) | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== ssh mit python ===== | ||
+ | |||
+ | Es gibt mehrere Implementierungen für ssh in python. Das Module '' | ||
+ | |||
+ | Installation: | ||
+ | < | ||
+ | python3 -m pip --proxy https:// | ||
+ | </ | ||
+ | |||
+ | Beispiel-Script: | ||
+ | <file python ssh_paramiko_test.py> | ||
+ | # https:// | ||
+ | |||
+ | import paramiko | ||
+ | USERNAME=' | ||
+ | PASSWORD=' | ||
+ | HOST=' | ||
+ | |||
+ | ssh = paramiko.client.SSHClient() | ||
+ | ssh.set_missing_host_key_policy( | ||
+ | | ||
+ | |||
+ | ssh.connect(HOST, | ||
+ | stdin, stdout, stderr = ssh.exec_command(' | ||
+ | while not stdout.channel.exit_status_ready(): | ||
+ | # Print data when available | ||
+ | if stdout.channel.recv_ready(): | ||
+ | alldata = stdout.channel.recv(1024) | ||
+ | prevdata = b" | ||
+ | while prevdata: | ||
+ | prevdata = stdout.channel.recv(1024) | ||
+ | alldata += prevdata | ||
+ | |||
+ | print(" | ||
+ | |||
+ | stdin, stdout, stderr = ssh.exec_command(' | ||
+ | while not stdout.channel.exit_status_ready(): | ||
+ | # Print data when available | ||
+ | if stdout.channel.recv_ready(): | ||
+ | alldata = stdout.channel.recv(1024) | ||
+ | prevdata = b" | ||
+ | while prevdata: | ||
+ | prevdata = stdout.channel.recv(1024) | ||
+ | alldata += prevdata | ||
+ | |||
+ | print(" | ||
+ | </ | ||
+ | |||
+ | <file python ssh_ssh_test.py> | ||
+ | from ssh.session import Session | ||
+ | from ssh import options | ||
+ | # Username für Login | ||
+ | USERNAME= ' | ||
+ | # Zielmaschine hier mikrotik | ||
+ | HOST = ' | ||
+ | |||
+ | # Aufbau der ssh-Session | ||
+ | s = Session() | ||
+ | s.options_set(options.HOST, | ||
+ | s.connect() | ||
+ | |||
+ | # Login mit USERNAME | ||
+ | s.userauth_agent(USERNAME) | ||
+ | |||
+ | chan = s.channel_new() | ||
+ | chan.open_session() | ||
+ | chan.request_exec(' | ||
+ | """ | ||
+ | # Ausgabe der Antwort | ||
+ | size, data = chan.read() | ||
+ | while size > 0: | ||
+ | print(data.strip()) | ||
+ | size, data = chan.read() | ||
+ | """ | ||
+ | chan.request_exec(' | ||
+ | chan.request_exec(' | ||
+ | |||
+ | # Ausgabe der Antwort | ||
+ | size, data = chan.read() | ||
+ | while size > 0: | ||
+ | print(data.strip()) | ||
+ | size, data = chan.read() | ||
+ | |||
+ | chan.close() | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== ssh über bash ===== | ||
+ | |||
+ | <code bash ssh_test.sh> | ||
+ | #!/bin/bash | ||
+ | |||
+ | user=" | ||
+ | host=" | ||
+ | ip_addr=" | ||
+ | |||
+ | ssh $user@$host<< | ||
+ | /ip address print | ||
+ | /ip address add address=${ip_addr}/ | ||
+ | /ip address print | ||
+ | EOF | ||
+ | </ |
network/shell_scripting.1411066187.txt.gz · Zuletzt geändert: 05.07.2018 09:52 (Externe Bearbeitung)