Shell-Programmierung issueshttps://www.0x50.de/rschaten/shell-programmierung/-/issues2017-08-17T04:58:53Zhttps://www.0x50.de/rschaten/shell-programmierung/-/issues/7Shell-Doku, Version 2.0.02017-08-17T04:58:53ZRonald SchatenShell-Doku, Version 2.0.0Von: "Uwe Waldmann" <uwe@mpi-sb.mpg.de>
Hallo Ronald,
ein paar Anmerkungen zu Deinem Text:
Kap. 3.2:
Man sollte sich in der Shell insbesondere angewöhnen, Dateien
"am Stück" zu verarbeiten, und nicht etwa zeilen- oder
z...Von: "Uwe Waldmann" <uwe@mpi-sb.mpg.de>
Hallo Ronald,
ein paar Anmerkungen zu Deinem Text:
Kap. 3.2:
Man sollte sich in der Shell insbesondere angewöhnen, Dateien
"am Stück" zu verarbeiten, und nicht etwa zeilen- oder
zeichenweise. Pro Datei drei Prozesse zu starten ist meist
harmlos, pro Zeile drei Prozesse zu starten ist ziemlich unschön,
pro Zeichen drei Prozesse zu starten ist fatal.
Auch wenn Funktionen wie "read" in der Shell zur Verfügung
stehen: Ein einziger sed-Aufruf ist um Längen besser als eine
"while read A"-Schleife.
Kap. 4.7:
Zum Thema Quoting kann man ziemlich viel schreiben (siehe
http://www.mpi-sb.mpg.de/~uwe/lehre/unixffb/quoting-guide.html),
aber zumindest auf den Unterschied zwischen $VAR und "$VAR"
sollte unbedingt hingewiesen werden -- verbunden mit dem
Hinweis, daß man mit "$VAR" fast immer richtig, mit $VAR
dagegen häufig falsch liegt. Entsprechendes gilt für "$"
und Konsorten: "$" ist (bei modernen Shells) fast immer
richtig, "$*" selten, $@ und $* so gut wie nie.
Kap. A.4
getopt ist, was das Quoting angelangt, eklig; insbesondere
führt die Verwendung von getopt mit einiger Sicherheit dazu,
daß das resultierende Skript bei Dateinamen, die Leerzeichen
enthalten, versagt (und gerade Newbies haben leider eine
Schwäche für Dateinamen wie "Mail von Paul.txt"). Falls vorhanden
sollte stattdessen getopts verwendet werden.
Gruß
Uwe
Ronald SchatenRonald Schatenhttps://www.0x50.de/rschaten/shell-programmierung/-/issues/6Selflinux - Shellprogrammierung2017-08-17T04:58:54ZRonald SchatenSelflinux - ShellprogrammierungVon: "Ralf Doering" <rdoering@netsys-it.de>
```
Hallo,
erstmal ein Lob für den Beitrag zum selflinux-Projekt, auch wenn ich
gleich noch etwas inhaltlich meckern muss ;)
Da du als Autor des Teils über Shellskripting genannt bist,...Von: "Ralf Doering" <rdoering@netsys-it.de>
```
Hallo,
erstmal ein Lob für den Beitrag zum selflinux-Projekt, auch wenn ich
gleich noch etwas inhaltlich meckern muss ;)
Da du als Autor des Teils über Shellskripting genannt bist, möchte ich
versuchen, einige Schnitzer, die mir bisher aufgefallen sind, zu
korrigieren.
1.2 Die Qual der Wahl =====================
Hier fehlt meiner Meinung nach ein Hinweis, auf POSIX/SUSv3 konforme
Shells. Eine original Bourne-Shell besitzt zumindest Linux nicht. Für
portable Shellskripte sollte man sich an SUSv3 halten, nicht an die
original Bourn Shell (auch wenn z.B. Solaris eine solche noch besitzt)
Die Bash ist übrigens nicht vollständig abwärtskompatibel zur Original
Bourne Shell. Features, die sh aufweist, aber von bash nicht unterstützt
werden, sind u.a. in der Bash-FAQ aufgeführt.
Die ksh unter "Einfach-Shells" einzuordnen halte ich für sehr gewagt,
die gehört (sowohl vom interaktiven Modus als auch von den Erweiterungen
für Shellskripte) in die Rubrik "Komfort-Shells".
Bei den Komfort-Shells fehlt IMO auch noch die zsh, die für interaktives
Arbeiten viele einzigartige Features aufweist.
3.9 Kommentare ==============
Ist es in diesem Zusammenhang sinnvoll, nochmal explizit darauf
hinzuweisen, das ein gequotetes # natürlich keinen Kommentar einleitet?
3.17 for ========
Diese Schleife ist etwas, was man normalerweise (ausser in ganz
besonderen, wohlüberlegten Fällen) vermeiden möchte:
----------------------------------------------------
for item in `cat program_list` # cat: Datei ausgeben
do
----------------------------------------------------
Erstens: uuoc (IMO)
Zweitens: wenn $item zeilenweise den Inhalt von program_list enthalten
soll, dann macht das Beispiel bei Vorkommen von IFS ind den Zeilen nicht
was es eigentlich soll
In der Regel is es hier eigentlich fast immer besser, ein
"while read item; do ... ; done < program_list"
zu nehmen.
5.2 Ein typisches init Skript =============================
----------------------------
Source function library.
/etc/rc.d/init.d/functions
----------------------------
Das Beispiel sieht mir so aus, als würde es von einem RH/Fedora o.ä.
System ausgehen? Obiges funktioniert so nicht auf allen Systemen, es
fehlt ein entsprechender Hinweis.
5.4 Fallensteller =================
---------------------------
#!/bin/sh
stat=1
temp=/tmp/zeige$$
---------------------------
Ist ein häufiges Konstrukt, kann aber durch Dritte sehr schön über eine
Symlink-Attacke dazu benutzt werden, eine beliebige Datei des
aufrufenden Nutzers zu überschreiben. Soetwas sollte man nicht als
Beispiel hernehmen, die Praxis mit Security Reports ala 'Insecure
tempfile creation' gibt mir recht. Besser für so etwas mktemp(1)
benutzen, auch wenn das Beispiel dann komplexer wird. Solche
fehlerhaften Idiome bekommt man nur schwer aus den Köpfen der Nutzer
wieder heraus.
Analog gilt das auch für 3.17 (for-beispiele.sh), dort wäre der Angriff
sogar noch einfacher:
for file do
pr $file > $file.tmp # pr: Formatiert Textdateien
done
Ganz am Ende ist ein HTML-Typo:
---------------------------------------------------
*) echo "Anwendung: `basename $0` Dateiname" 1gt;&2
---------------------------------------------------
6. Anhang B ===========
Der Link auf das Bash Reference Manual führt ins Leere.
Als weitere Referenzen fehlen hier IMO mindesten noch folgende:
- Advanced Bash Skripting Guide: http://www.tldp.org/LDP/abs/html/
- POSIX/SUSv3 Spezifikation
```Ronald SchatenRonald Schatenhttps://www.0x50.de/rschaten/shell-programmierung/-/issues/5Selflinux - Shellprogrammierung2017-08-17T04:58:54ZRonald SchatenSelflinux - ShellprogrammierungVon: "Spielmann Werner" <Werner.Spielmann@SWAROVSKI.COM>
Hallo Herr Schaten!
Ich finde es ganz toll, dass es Leute gibt, die Unterlagen wie das
Shellskript-Manual auf www.selflinux.org erstellen.
Beim Durchsehen dieses Skripts ...Von: "Spielmann Werner" <Werner.Spielmann@SWAROVSKI.COM>
Hallo Herr Schaten!
Ich finde es ganz toll, dass es Leute gibt, die Unterlagen wie das
Shellskript-Manual auf www.selflinux.org erstellen.
Beim Durchsehen dieses Skripts fiel mir kleine Tippfehler auf:
(http://www.selflinux.org/selflinux/html/shellprogrammierung03.html)
Dabei ist nur der letzte Punkt ein Fehler im Code, die anderen sind nur
Rechtschreib-Unsauberkeiten.
Ich hoffe, damit nicht all zu sehr zu nerven ... ;-)
Abschnitt 3.1.2 Rückgabewerte
Wenn unter Unix ein Prozeß beendet [...] seinen aufrufenden Prozeß zurück.
So kann der Mutterprozeß kontrollieren, [...]
=> jeweils "Prozess"
Abschnitt 3.3 Vordefinierte Variablen
$$ Prozeßnummer der aktiven Shell
$! Prozeßnummer des letzten Hintergrundprozesses
=> wie oben, jeweils "Prozess..."
Abschnitt 3.4 Variablen-Substitution
[...] Das umfaßt sowohl [...]
=> "umfasst"
Abschnitt 3.7 Mustererkennung
[...]
Sonderzeichen in Suchmustern:
[...]
$ Übereinstimmung, wenn der vorhergehende Azusdruck am Zeilenende
steht.
=> "Ausdruck"
[...]
[^a-z] erfaßt alle Zeichen, die keine Kleinbuchstaben sind.[...]
=> erfasst
[...]
Beispiele: Muster
[...]
"Wort" Ein Wort in Anführunszeichen.
=> Anführungszeichen
Abschnitt 3.17: for. . .
(Wenn man trotzdem eine Laufvariable braucht, muss man dazu die
while-Schleife mißbrauchen.
=> missbrauchen).
Abschnitt 3.19:
Hier steht nach "test" eine Klammer zu viel:
[...] wie bei der if-Anweisung, mit dem Befehl test) formuliert.[...]
Abschnitt 3.23:
{ Befehl1 ; Befehl2 } Ausführung der Befehle in der momentanen Shell
Hier fehlt vor der abschließenden geschwungenen Klammer ein ';'
Danke nochmals für Ihre Arbeit!
Mit freundlichen Grüßen
Werner SpielmannRonald SchatenRonald Schatenhttps://www.0x50.de/rschaten/shell-programmierung/-/issues/4Typo in "Shellprogrammierung"2017-08-17T04:58:54ZRonald SchatenTypo in "Shellprogrammierung"Von: "markus schnalke" <meillo@marmaro.de>
Hoi,
ich lese regelmäßig deinen Blog und kommentiere auch hin und wieder.
Aus Neugier lese ich gerade dein ``Shellprogrammierung''. Eigentlich
kann ich es ja schon ziemlich gut ... aber ...Von: "markus schnalke" <meillo@marmaro.de>
Hoi,
ich lese regelmäßig deinen Blog und kommentiere auch hin und wieder.
Aus Neugier lese ich gerade dein ``Shellprogrammierung''. Eigentlich
kann ich es ja schon ziemlich gut ... aber man lernt immer mal was
Neues.
Du wolltest Rechtschreibfehler -- hier hast du den ersten:
Seitennummer 3:
Shells, Exoten: rc:
... und mit eine C-ähnlichen Syntax ...
(ein `r' fehlt)
Aber ich habe auch inhaltlich dazu noch was anzumerken:
AFAIR hat Plan9 nichts mit AT&T zu tun. Es sind halt die selben
Entwickler wie damals bei Unix ... aber soviel ich weiß kommt Plan9
aus der Zeit nach AT&T. Lucent Software ist da wohl eher der
Arbeitgeber. (Aber das ist nur aus dem Gedächtnis ... du sollstest das
kontrollieren.)
Und dann frage ich mich noch, ob `rc' wirklich ein `sh'-Clone ist, wo
schon ein alleine die Syntax eine andere ist. IMO ist `rc' eine
unabhängige Entwicklung. Keine Ahnung wie es im Code aussieht, ich
würde aber eher vermuten, dass `rc' nicht auf `sh' aufbaut. (Auch hier
äußere ich nur Vermutungen. Eigentlich traurig, denn ich könnte ja
selbst nachforschen und Tatsachen liefern ...)
Wenn ich noch mehr finde, schreibe ich wieder.
meillo
Ronald SchatenRonald Schatenhttps://www.0x50.de/rschaten/shell-programmierung/-/issues/3Unix-Timestamp in Datum konvertieren2017-08-17T04:58:54ZRonald SchatenUnix-Timestamp in Datum konvertierenAls Tip aufnehmen:
```sh
TIMESTAMP=`date +%s` DATE=`date -date="1970-01-01 $TIMESTAMP sec GMT"` echo $DATE
```Als Tip aufnehmen:
```sh
TIMESTAMP=`date +%s` DATE=`date -date="1970-01-01 $TIMESTAMP sec GMT"` echo $DATE
```Ronald SchatenRonald Schatenhttps://www.0x50.de/rschaten/shell-programmierung/-/issues/2Passwort unsichtbar einlesen2017-08-17T04:58:54ZRonald SchatenPasswort unsichtbar einlesenAls Tip aufnehmen:
```sh
#!/bin/sh
read -p "Username: " username
stty -echo
read -p "Password: " password
stty echo
echo Thanks!
```Als Tip aufnehmen:
```sh
#!/bin/sh
read -p "Username: " username
stty -echo
read -p "Password: " password
stty echo
echo Thanks!
```Ronald SchatenRonald Schatenhttps://www.0x50.de/rschaten/shell-programmierung/-/issues/1Rueckgabewerte aus Funktionen nicht mit exit2017-08-17T04:58:54ZRonald SchatenRueckgabewerte aus Funktionen nicht mit exitPer Mail bekommen:
> Ein kleiner Fehler ist mir aufgefallen. Unter 3.13 http://www.selflinux.org/selflinux/html/shellprogrammierung03.html#d139e2815 werden die Funktionen beschrieben. Dort steht, dass man mit exit Werte zurückgegeben ...Per Mail bekommen:
> Ein kleiner Fehler ist mir aufgefallen. Unter 3.13 http://www.selflinux.org/selflinux/html/shellprogrammierung03.html#d139e2815 werden die Funktionen beschrieben. Dort steht, dass man mit exit Werte zurückgegeben kann. Damit wird aber das Skript verlassen. Die Rückgabe muss mit return erfolgen.
Ronald SchatenRonald Schaten