Benutzer-Werkzeuge

Webseiten-Werkzeuge


network:shell_scripting

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
network:shell_scripting [18.09.2014 21:14] richardnetwork:shell_scripting [30.04.2023 15:57] (aktuell) – Status der Diskussion geändert richard
Zeile 1: Zeile 1:
-~~DISCUSSION|Ergänzungen~~+~~DISCUSSION:closed|Ergänzungen~~
 ====== Kurzeinführung in Skripting ====== ====== Kurzeinführung in Skripting ======
  
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>
network/shell_scripting.1411067679.txt.gz · Zuletzt geändert: 05.07.2018 09:52 (Externe Bearbeitung)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki