Erstellen von Shell-Skripten: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(13 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 2: Zeile 2:
  
 
* [[Umgang mit der Shell]]
 
* [[Umgang mit der Shell]]
* [[Vim]]
+
* [[Vim]] oder Nano
 +
* [[Reguläre Ausdrücke]]
  
 
= Logische Operatoren =
 
= Logische Operatoren =
Zeile 8: Zeile 9:
 
* 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
  
Zeile 49: Zeile 50:
 
;Gesamter Befehl
 
;Gesamter Befehl
  
* '''ps alx | head -n 1 && ps alx | grep sshd | grep -v grep'''
+
* '''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 Programm selbst
+
* das letzte '''grep -v grep''' verbirgt den Programmaufruf von grep
  
 
;als Skript
 
;als Skript
Zeile 62: Zeile 63:
 
  #!/bin/bash
 
  #!/bin/bash
 
   
 
   
  ps alx | head -n 1 && ps alx | grep *'$1*' | grep -v grep
+
  ps alx | head -n 1 && ps alx | grep '''$1''' | grep -v grep
 
* '''chmod +x pgreppier'''
 
* '''chmod +x pgreppier'''
 
* '''pgreppier sshd'''
 
* '''pgreppier sshd'''
Zeile 68: Zeile 69:
 
  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 78: Zeile 80:
 
* '''vim del'''
 
* '''vim del'''
  
#!/bin/bash
+
<syntaxhighlight lang=bash>
+
#!/bin/bash
papierkorb="$HOME/.trash"
+
 
+
papierkorb="$HOME/.trash"
ls $papierkorb > /dev/null 2>&amp;1 || mkdir -p $papierkorb
+
 
mv $* $papierkorb
+
ls $papierkorb > /dev/null 2>&1 || mkdir -p $papierkorb
+
mv $* $papierkorb
for i in $*
+
 
do
+
for i in $*
    echo $i in den Papierkorb verschoben.
+
do
done
+
    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'''
Zeile 99: Zeile 104:
  
 
  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 &quot;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

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