Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
network:shell_scripting [18.09.2014 21:14] richard |
network:shell_scripting [18.02.2019 13:01] (aktuell) richard |
||
---|---|---|---|
Zeile 71: | Zeile 71: | ||
sudo ip route add default via 10.0.0.1 | sudo ip route add default via 10.0.0.1 | ||
</file> | </file> | ||
+ | |||
+ | ==== Beispiel: telnet-Verbindung zu einem Switch aufbauen ==== | ||
+ | |||
+ | Mit dem folgenden Script wird eine Verbindung mit Hilfe von ''nc''((nc: netcat)) zu einer IP-Adresse aufgebaut. | ||
+ | Im Anschluss werden bis zum ''EOF''((EOF: end of file)) die einzelnen Befehle zeilenweise übertragen. | ||
+ | Die folgende Tabelle zeigt die Befehle und ihre Wirkung auf dem Switch: | ||
+ | |||
+ | ^ Befehl ^ Wirkung auf Switch ^ | ||
+ | | ''schueler'' | Benutzername wird als erstes vom Switch erwartet | | ||
+ | | ''schueler'' | Passwort für ''schueler'' | | ||
+ | | ''system-view'' | Wechsel in den Konfigurationsmodus | | ||
+ | | ''display vlan'' | Anzeigen der alten VLAN-Konfiguration | | ||
+ | | ''undo vlan all'' | Löschen der alten VLAN-Konfiguration | | ||
+ | | ''y'' | Bestätigung der Löschung | | ||
+ | | ''vlan 2'' | ''VLAN-ID 2'' anlegen durch Wechsel in den ''vlan-2''-Bereich | | ||
+ | | ''port Ethernet 1/0/1'' | Port 1/0/1 in ''VLAN2'' bringen | | ||
+ | | ''display vlan 2'' | neue Konfiguration von ''VLAN2'' anzeigen | | ||
+ | | ''vlan 3'' | ''VLAN-ID 3'' anlegen durch Wechsel in den ''vlan-3''-Bereich | | ||
+ | | ''port Ethernet 1/0/2'' | Port 1/0/2 in ''VLAN3'' bringen | | ||
+ | | ''quit'' | Zurück auf höchste Konfigurationsebene (VLAN verlassen) | | ||
+ | | ''interface Ethernet 1/0/5'' | In Konfigurationsebene von Port 1/0/5 wechseln | | ||
+ | | ''port link-type trunk'' | Betriebsmodus für aktuellen Port 1/0/5 auf ''trunk'' ändern | | ||
+ | | ''port trunk permit vlan 3'' | Port 1/0/5 tagged zu ''VLAN3'' hinzufügen | | ||
+ | | ''port trunk permit vlan 2'' | Port 1/0/5 tagged zu ''VLAN2'' hinzufügen | | ||
+ | | ''quit'' | Zurück auf höchste Konfigurationsebene (Port verlassen) | | ||
+ | | ''quit'' | Verbindung zu Switch beenden | | ||
+ | |||
+ | <file bash telsession.sh> | ||
+ | #!/bin/bash | ||
+ | # netcat (kurz nc) ist ein Kommandozeilen-Tool, mit dem Verbindungen zu entfernten Systemen aufgebaut werden können. | ||
+ | # Verwendung: nc <IP-Adresse> <PORT> | ||
+ | nc 192.168.33.61 23 <<'EOF' | ||
+ | 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 | ||
+ | </file> | ||
+ | |||
+ | ==== 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 ''/media/USERNAME/USB_STICK_NAME'' | ||
+ | - mit Befehl ''touch /media/USERNAME/USB_STICK_NAME/stick.ready'' Testdatei auf dem USB-Stick erzeugen | ||
+ | - Profil-Name von Luckyback eintragen (Default ist: default) | ||
+ | |||
+ | Wie funktioniert das Ganze? | ||
+ | |||
+ | Das Script prüft, ob die Datei ''/media/USERNAME/USB_STICK_NAME/stick.ready'' (natürlich auf den richtigen Stick) existiert. Sollte sie nicht existieren, dann legt | ||
+ | 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 ''default'' durch den entsprechenden Profilnamen ersetzt werden. | ||
+ | |||
+ | <file bash luckybackup.sh> | ||
+ | #!/bin/bash | ||
+ | # 1. Pfad zum USB-Stick anpassen (hier /media/USERNAME/USB_STICK_NAME | ||
+ | # 2. mit 'touch /media/USERNAME/USB_STICK_NAME/stick.ready' Testdatei auf dem USB-Stick erzeugen | ||
+ | # 3. Profil-Name von Luckyback eintragen (Default ist: default) | ||
+ | x=0 | ||
+ | while [ "$x" -lt 100 -a ! -e /media/USERNAME/USB_STICK_NAME/stick.ready ]; do | ||
+ | x=$((x+1)) | ||
+ | sleep .1 | ||
+ | echo "Laufwerk fehlt" | ||
+ | done | ||
+ | echo "Profile -default- wird synchronisiert!" | ||
+ | luckybackup --silent default | ||
+ | </file> | ||
+ | |||
+ | ===== Python ===== | ||
+ | |||
+ | Eine weitere sehr mächtige Variante Prozesse zu automatisieren, liegt in der Verwendung eine Script-Sprache wie ''python'' oder ''perl''. | ||
+ | |||
+ | <file python python_sample.py> | ||
+ | #!/usr/bin/python | ||
+ | # coding: utf8 | ||
+ | |||
+ | # Import für Call https://docs.python.org/2/library/subprocess.html | ||
+ | from subprocess import call | ||
+ | |||
+ | # Import für os.system https://docs.python.org/2/library/os.html | ||
+ | import os | ||
+ | |||
+ | call(["ls", "-l"]) | ||
+ | |||
+ | os.system("ps aux | grep -i apache > output_file") | ||
+ | |||
+ | |||
+ | # User anlegen | ||
+ | def createUser(name,username,password): | ||
+ | encPass = crypt.crypt(password,"22") | ||
+ | return os.system("useradd -p "+encPass+ " -s "+ "/bin/bash "+ "-d "+ "/home/" + username+ " -m "+ " -c \""+ name+"\" " + username) | ||
+ | |||
+ | testVar = raw_input("Ask user for something.") | ||
+ | print (testVar) | ||
+ | </file> | ||
+ | |||
+ | |||
+ | ===== ssh mit python ===== | ||
+ | |||
+ | Es gibt mehrere Implementierungen für ssh in python. Das Module ''paramiko'' wird hier vorgestellt. | ||
+ | |||
+ | Installation: | ||
+ | <code> | ||
+ | python3 -m pip --proxy https://192.168.21.91:3128 install --user paramiko | ||
+ | </code> | ||
+ | |||
+ | Beispiel-Script: | ||
+ | <file python ssh_paramiko_test.py> | ||
+ | # https://daanlenaerts.com/blog/2016/01/02/python-and-ssh-sending-commands-over-ssh-using-paramiko/ | ||
+ | |||
+ | import paramiko | ||
+ | USERNAME='schueler' | ||
+ | PASSWORD='schueler' #kritisch bei offenen Strukturen; hier besser keys verwenden | ||
+ | HOST='192.168.33.80' | ||
+ | |||
+ | ssh = paramiko.client.SSHClient() | ||
+ | ssh.set_missing_host_key_policy( | ||
+ | paramiko.AutoAddPolicy()) | ||
+ | |||
+ | ssh.connect(HOST, username=USERNAME, password=PASSWORD) | ||
+ | stdin, stdout, stderr = ssh.exec_command('ip address print') | ||
+ | while not stdout.channel.exit_status_ready(): | ||
+ | # Print data when available | ||
+ | if stdout.channel.recv_ready(): | ||
+ | alldata = stdout.channel.recv(1024) | ||
+ | prevdata = b"1" | ||
+ | while prevdata: | ||
+ | prevdata = stdout.channel.recv(1024) | ||
+ | alldata += prevdata | ||
+ | |||
+ | print("1:"+str(alldata, "utf8")) | ||
+ | |||
+ | stdin, stdout, stderr = ssh.exec_command('ip address add address=22.0.0.1/24 interface=ether4') | ||
+ | while not stdout.channel.exit_status_ready(): | ||
+ | # Print data when available | ||
+ | if stdout.channel.recv_ready(): | ||
+ | alldata = stdout.channel.recv(1024) | ||
+ | prevdata = b"1" | ||
+ | while prevdata: | ||
+ | prevdata = stdout.channel.recv(1024) | ||
+ | alldata += prevdata | ||
+ | |||
+ | print("2:"+str(alldata, "utf8")) | ||
+ | </file> | ||
+ | |||
+ | <file python ssh_ssh_test.py> | ||
+ | from ssh.session import Session | ||
+ | from ssh import options | ||
+ | # Username für Login | ||
+ | USERNAME= 'schueler' | ||
+ | # Zielmaschine hier mikrotik | ||
+ | HOST = '192.168.33.80' | ||
+ | |||
+ | # Aufbau der ssh-Session | ||
+ | s = Session() | ||
+ | s.options_set(options.HOST, HOST) | ||
+ | s.connect() | ||
+ | |||
+ | # Login mit USERNAME | ||
+ | s.userauth_agent(USERNAME) | ||
+ | |||
+ | chan = s.channel_new() | ||
+ | chan.open_session() | ||
+ | chan.request_exec('ip address print') | ||
+ | """ | ||
+ | # Ausgabe der Antwort | ||
+ | size, data = chan.read() | ||
+ | while size > 0: | ||
+ | print(data.strip()) | ||
+ | size, data = chan.read() | ||
+ | """ | ||
+ | chan.request_exec('ip address add address=30.0.0.1/24 interface=ether3') | ||
+ | chan.request_exec('ip address print') | ||
+ | |||
+ | # Ausgabe der Antwort | ||
+ | size, data = chan.read() | ||
+ | while size > 0: | ||
+ | print(data.strip()) | ||
+ | size, data = chan.read() | ||
+ | |||
+ | chan.close() | ||
+ | </file> | ||
+ | |||
+ | |||
+ | ===== ssh über bash ===== | ||
+ | |||
+ | <code bash ssh_test.sh> | ||
+ | #!/bin/bash | ||
+ | |||
+ | user="schueler" | ||
+ | host="192.168.33.80" | ||
+ | ip_addr="40.0.0.1" | ||
+ | |||
+ | ssh $user@$host<<EOF | ||
+ | /ip address print | ||
+ | /ip address add address=${ip_addr}/24 comment="MyNetz" interface=ether5 | ||
+ | /ip address print | ||
+ | EOF | ||
+ | </code> |