Erstellen von Shell-Skripten: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(→del) |
|||
| (17 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
| − | |||
= Grundlagen = | = Grundlagen = | ||
* [[Umgang mit der Shell]] | * [[Umgang mit der Shell]] | ||
| + | * [[Vim]] oder Nano | ||
| + | * [[Reguläre Ausdrücke]] | ||
| − | |||
| − | |||
= Logische Operatoren = | = Logische Operatoren = | ||
* Jedes Programm generiert beim Beenden ein exit code (oder return code) | * Jedes Programm generiert beim Beenden ein exit code (oder return code) | ||
* Ein Wert von 0 bedeutet, dass das Programm erfolgreich ausgeführt wurde | * Ein Wert von 0 bedeutet, dass das Programm erfolgreich ausgeführt wurde | ||
| − | * Je nach Fehlerart gibt das Programm einen höheren Wert zurück | + | * Je nach Fehlerart gibt das Programm einen höheren Wert zurück (bis maximal 255) |
* den exit code des letzten Befehls kann man mit '''echo $?''' abfragen | * den exit code des letzten Befehls kann man mit '''echo $?''' abfragen | ||
| − | |||
| − | |||
== UND == | == UND == | ||
* Befehl 1 '''&&''' Befehl 2 | * Befehl 1 '''&&''' Befehl 2 | ||
* Befehl 2 wird ausgeführt, wenn Befehl 1 mit exit code 0 beendet | * Befehl 2 wird ausgeführt, wenn Befehl 1 mit exit code 0 beendet | ||
| − | * ls / && echo "hat funktioniert" | + | * '''ls / && echo "hat funktioniert"''' |
| − | |||
bin etc initrd.img.old lib64 media proc sbin tmp vmlinuz | bin etc initrd.img.old lib64 media proc sbin tmp vmlinuz | ||
boot home lib libx32 mnt root srv usr vmlinuz.old | boot home lib libx32 mnt root srv usr vmlinuz.old | ||
dev initrd.img lib32 lost+found opt run sys var | dev initrd.img lib32 lost+found opt run sys var | ||
hat funktioniert | hat funktioniert | ||
| − | + | ||
== ODER == | == ODER == | ||
* Befehl 1 '''||''' Befehl 2 | * Befehl 1 '''||''' Befehl 2 | ||
* Befehl 2 wird ausgeführt, wenn Befehl 1 mit exit code >0 beendet | * Befehl 2 wird ausgeführt, wenn Befehl 1 mit exit code >0 beendet | ||
| − | * ls nichtexistentedatei || echo "hat nicht funktioniert" | + | * '''ls nichtexistentedatei || echo "hat nicht funktioniert"''' |
| − | |||
ls: Zugriff auf 'nichtexistentedatei' nicht möglich: Datei oder Verzeichnis nicht gefunden | ls: Zugriff auf 'nichtexistentedatei' nicht möglich: Datei oder Verzeichnis nicht gefunden | ||
hat nicht funktioniert | hat nicht funktioniert | ||
| − | + | ||
= Beispiele = | = Beispiele = | ||
| Zeile 44: | Zeile 39: | ||
* '''pgrep -a sshd''' | * '''pgrep -a sshd''' | ||
| − | |||
453 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups | 453 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups | ||
* '''ps alx | grep ''<Programm>''''' verbirgt die Kopfzeilen | * '''ps alx | grep ''<Programm>''''' verbirgt die Kopfzeilen | ||
| − | |||
4 0 453 1 20 0 10192 6644 - Ss ? 0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups | 4 0 453 1 20 0 10192 6644 - Ss ? 0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups | ||
0 1000 81102 81042 20 0 6588 2512 pipe_r S+ pts/3 0:00 grep --color sshd | 0 1000 81102 81042 20 0 6588 2512 pipe_r S+ pts/3 0:00 grep --color sshd | ||
| Zeile 54: | Zeile 47: | ||
* '''ps alx | head -n 1''' | * '''ps alx | head -n 1''' | ||
| − | |||
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND | F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND | ||
;Gesamter Befehl | ;Gesamter Befehl | ||
| − | * '''ps alx | head -n 1 & | + | * '''ps alx | head -n 1 && ps alx | grep sshd | grep -v grep''' |
| − | |||
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND | F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND | ||
4 0 453 1 20 0 10192 6644 - Ss ? 0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups | 4 0 453 1 20 0 10192 6644 - Ss ? 0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups | ||
| − | * das letzte '''grep -v grep''' verbirgt den | + | * das letzte '''grep -v grep''' verbirgt den Programmaufruf von grep |
| − | |||
;als Skript | ;als Skript | ||
| Zeile 71: | Zeile 61: | ||
* '''vim pgreppier''' | * '''vim pgreppier''' | ||
| − | |||
#!/bin/bash | #!/bin/bash | ||
| − | ps alx | head -n 1 & | + | ps alx | head -n 1 && ps alx | grep '''$1''' | grep -v grep |
* '''chmod +x pgreppier''' | * '''chmod +x pgreppier''' | ||
* '''pgreppier sshd''' | * '''pgreppier sshd''' | ||
| − | |||
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND | F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND | ||
4 0 453 1 20 0 10192 6644 - Ss ? 0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups | 4 0 453 1 20 0 10192 6644 - Ss ? 0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups | ||
| + | |||
== del == | == del == | ||
| Zeile 91: | Zeile 80: | ||
* '''vim del''' | * '''vim del''' | ||
| − | < | + | <syntaxhighlight lang=bash> |
| − | + | #!/bin/bash | |
| − | + | ||
| − | + | papierkorb="$HOME/.trash" | |
| − | + | ||
| − | + | ls $papierkorb > /dev/null 2>&1 || mkdir -p $papierkorb | |
| − | + | mv $* $papierkorb | |
| − | + | ||
| − | + | for i in $* | |
| − | + | do | |
| − | + | echo $i in den Papierkorb verschoben. | |
| − | + | done | |
| + | </syntaxhighlight> | ||
| + | |||
* '''chmod +x del''' | * '''chmod +x del''' | ||
* '''touch test{1,2,3}.dat''' | * '''touch test{1,2,3}.dat''' | ||
* '''del test?.dat''' | * '''del test?.dat''' | ||
| − | |||
test1.dat in den Papierkorb verschoben. | test1.dat in den Papierkorb verschoben. | ||
test2.dat in den Papierkorb verschoben. | test2.dat in den Papierkorb verschoben. | ||
| Zeile 113: | Zeile 103: | ||
* '''ls ~/.trash''' | * '''ls ~/.trash''' | ||
| − | |||
test1.dat test2.dat test3.dat | test1.dat test2.dat test3.dat | ||
| + | |||
| + | = Übungen = | ||
| + | |||
| + | == Benutzer mit Login-Shell aus ''/etc/passwd'' ausgeben == | ||
| + | |||
| + | * Benutzer, die vom System angelegt wurden sollen nicht angezeigt werden (mit Ausnahme von ''root'') | ||
| + | * Nur der Benutzername soll zu sehen sein | ||
| + | |||
| + | == IP-Konfiguration ausgeben == | ||
| + | |||
| + | * Alle vorhandenen IP-Adressen ausgeben | ||
| + | * Zuordnung zu Geräten ist nicht wichtig | ||
| + | |||
| + | == Log-Datei sortieren == | ||
| + | |||
| + | * [[Bild:log.txt]] herunterladen mit '''curl "https://xinux.net/images/6/6d/Log.txt" > log.txt''' | ||
| + | * Ports nach Nummern sortieren | ||
| + | * nur einzigartige Elemente anzeigen | ||
Aktuelle Version vom 31. Mai 2023, 12:20 Uhr
Grundlagen
- Umgang mit der Shell
- Vim oder Nano
- Reguläre Ausdrücke
Logische Operatoren
- Jedes Programm generiert beim Beenden ein exit code (oder return code)
- Ein Wert von 0 bedeutet, dass das Programm erfolgreich ausgeführt wurde
- Je nach Fehlerart gibt das Programm einen höheren Wert zurück (bis maximal 255)
- den exit code des letzten Befehls kann man mit echo $? abfragen
UND
- Befehl 1 && Befehl 2
- Befehl 2 wird ausgeführt, wenn Befehl 1 mit exit code 0 beendet
- ls / && echo "hat funktioniert"
bin etc initrd.img.old lib64 media proc sbin tmp vmlinuz boot home lib libx32 mnt root srv usr vmlinuz.old dev initrd.img lib32 lost+found opt run sys var hat funktioniert
ODER
- Befehl 1 || Befehl 2
- Befehl 2 wird ausgeführt, wenn Befehl 1 mit exit code >0 beendet
- ls nichtexistentedatei || echo "hat nicht funktioniert"
ls: Zugriff auf 'nichtexistentedatei' nicht möglich: Datei oder Verzeichnis nicht gefunden hat nicht funktioniert
Beispiele
pgreppier
- pgrep gibt manchmal nicht genug Informationen aus
- pgrep -a sshd
453 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups
- ps alx | grep <Programm> verbirgt die Kopfzeilen
4 0 453 1 20 0 10192 6644 - Ss ? 0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups 0 1000 81102 81042 20 0 6588 2512 pipe_r S+ pts/3 0:00 grep --color sshd
- Ziel ist es ein Skript zu schreiben, das mehr Informationen ausgibt als pgrep
- ps alx | head -n 1
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
- Gesamter Befehl
- ps alx | head -n 1 && ps alx | grep sshd | grep -v grep
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 4 0 453 1 20 0 10192 6644 - Ss ? 0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups
- das letzte grep -v grep verbirgt den Programmaufruf von grep
- als Skript
- cd /usr/local/bin
- vim pgreppier
#!/bin/bash ps alx | head -n 1 && ps alx | grep $1 | grep -v grep
- chmod +x pgreppier
- pgreppier sshd
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 4 0 453 1 20 0 10192 6644 - Ss ? 0:00 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups
del
- rm löscht Dateien, ohne sie dabei in einen Papierkorb zu verschieben
- Lösung: Wir schreiben ein Skript, das
- einen Papierkorb erstellt, wenn er nicht bereits existiert
- beliebig viele angegebene Dateien dorthin verschiebt (so wie bei rm)
- Auskunft über die Verschiebungen gibt
- cd /usr/local/bin
- vim del
#!/bin/bash
papierkorb="$HOME/.trash"
ls $papierkorb > /dev/null 2>&1 || mkdir -p $papierkorb
mv $* $papierkorb
for i in $*
do
echo $i in den Papierkorb verschoben.
done
- chmod +x del
- touch test{1,2,3}.dat
- del test?.dat
test1.dat in den Papierkorb verschoben. test2.dat in den Papierkorb verschoben. test3.dat in den Papierkorb verschoben.
- ls ~/.trash
test1.dat test2.dat test3.dat
Übungen
Benutzer mit Login-Shell aus /etc/passwd ausgeben
- Benutzer, die vom System angelegt wurden sollen nicht angezeigt werden (mit Ausnahme von root)
- Nur der Benutzername soll zu sehen sein
IP-Konfiguration ausgeben
- Alle vorhandenen IP-Adressen ausgeben
- Zuordnung zu Geräten ist nicht wichtig
Log-Datei sortieren
- Datei:Log.txt herunterladen mit curl "https://xinux.net/images/6/6d/Log.txt" > log.txt
- Ports nach Nummern sortieren
- nur einzigartige Elemente anzeigen