Erstellen von Shell-Skripten: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(21 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
<span id="grundlagen"></span>
 
 
= Grundlagen =
 
= Grundlagen =
  
 
* [[Umgang mit der Shell]]
 
* [[Umgang mit der Shell]]
 +
* [[Vim]] oder Nano
 +
* [[Reguläre Ausdrücke]]
  
<!----->
 
<span id="logische-operatoren"></span>
 
 
= 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
  
<!----->
 
<span id="und"></span>
 
 
== UND ==
 
== UND ==
  
 
* Befehl 1 '''&amp;&amp;''' Befehl 2
 
* Befehl 1 '''&amp;&amp;''' 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 / &amp;&amp; echo &quot;hat funktioniert&quot;
+
* '''ls / &amp;&amp; echo &quot;hat funktioniert&quot;'''
  
<!----->
 
 
  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
<span id="oder"></span>
+
 
 
== ODER ==
 
== ODER ==
  
 
* Befehl 1 '''||''' Befehl 2
 
* Befehl 1 '''||''' Befehl 2
 
* Befehl 2 wird ausgeführt, wenn Befehl 1 mit exit code &gt;0 beendet
 
* Befehl 2 wird ausgeführt, wenn Befehl 1 mit exit code &gt;0 beendet
* ls nichtexistentedatei || echo &quot;hat nicht funktioniert&quot;
+
* '''ls nichtexistentedatei || echo &quot;hat nicht funktioniert&quot;'''
  
<!----->
 
 
  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
<span id="beispiele"></span>
+
 
 
= 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 &amp;&amp; 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
 +
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
 
  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
 
  
<!----->
 
 
== del ==
 
== del ==
  
 
* '''rm''' löscht Dateien, ohne sie dabei in einen Papierkorb zu verschieben
 
* '''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'''
 +
 +
<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'''
 +
* '''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 ==
 +
 +
* [[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