Erstellen von Shell-Skripten: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(24 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
 +
boot  home        lib            libx32      mnt    root  srv  usr  vmlinuz.old
 +
dev  initrd.img  lib32          lost+found  opt    run  sys  var
 +
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
 +
hat nicht funktioniert
  
<!----->
 
<span id="beispiele"></span>
 
 
= Beispiele =
 
= Beispiele =
  
Zeile 36: Zeile 37:
  
 
* '''pgrep''' gibt manchmal nicht genug Informationen aus
 
* '''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
 
* '''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'''
 
* 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 ==
 
== 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