Ich muss eine Konfigurationsdatei für mein eigenes Skript erstellen: hier ein Beispiel:
Skript:
#!/bin/bash
source /home/myuser/test/config
echo "Name=$nam" >&2
echo "Surname=$sur" >&2
Inhalt von /home/myuser/test/config
:
nam="Mark"
sur="Brown"
das funktioniert!
Meine Frage: Ist dies der richtige Weg, oder gibt es andere Wege?
bash
shell
shell-script
Pol Hallen
quelle
quelle
abcde
tut es auch so und das ist ein ziemlich großes Programm (für ein Shell-Skript). Sie können es hier ansehen .Antworten:
source
ist nicht sicher, da es beliebigen Code ausführt. Dies ist möglicherweise kein Problem für Sie, aber wenn die Dateiberechtigungen nicht korrekt sind, kann ein Angreifer mit Dateisystemzugriff möglicherweise Code als privilegierter Benutzer ausführen, indem er Code in eine Konfigurationsdatei einfügt, die von einem ansonsten gesicherten Skript wie z Init-Skript.Die bisher beste Lösung, die ich identifizieren konnte, ist die unbeholfene Neuerfindung des Rades:
myscript.conf
Bei Verwendung
source
würde diesecho rm -rf /
zweimal ausgeführt werden und auch den aktiven Benutzer ändern$PROMPT_COMMAND
. Tun Sie stattdessen Folgendes:myscript.sh (Bash 4)
myscript.sh (Mac / Bash 3-kompatibel)
Bitte antworten Sie, wenn Sie eine Sicherheitslücke in meinem Code finden.
quelle
*
Eingaben nicht richtig verarbeitet, aber was in Bash behandelt dieses Zeichen dann gut?my\\password
Hier ist eine saubere und portable Version, die mit Bash 3 und höher auf Mac und Linux kompatibel ist.
Es gibt alle Standardeinstellungen in einer separaten Datei an, um zu vermeiden, dass in all Ihren Shell-Skripten eine riesige, überfüllte und duplizierte Konfigurationsfunktion für die Standardeinstellungen erforderlich ist. Und Sie können wählen, ob Sie mit oder ohne Standard-Fallbacks lesen möchten:
config.cfg :
config.cfg.defaults :
config.shlib (das ist eine Bibliothek, es gibt also keine Shebang-Linie):
test.sh (oder alle Skripte, in denen Sie Konfigurationswerte lesen möchten) :
Erklärung des Testskripts:
printf
Zeile? Nun, es ist etwas, das Sie beachten sollten: Esecho
ist ein falscher Befehl zum Drucken von Text, über den Sie keine Kontrolle haben. Selbst wenn Sie doppelte Anführungszeichen verwenden, werden Flags interpretiert. Setzen Siemyvar
(inconfig.cfg
) auf-e
und Sie werden eine leere Zeile sehen, weil Sieecho
denken, dass es eine Flagge ist. Aberprintf
hat das Problem nicht. Derprintf --
Befehl "Drucken Sie dies und interpretieren Sie nichts als Flags" und der"%s\n"
Befehl "Formatieren Sie die Ausgabe als Zeichenfolge mit einer nachgestellten Newline. Der letzte Parameter ist der Wert, den printf formatieren soll.myvar="$(config_get myvar)";
. Wenn Sie sie auf dem Bildschirm ausdrucken möchten, empfehle ich, printf zu verwenden, um die Sicherheit vor echounverträglichen Zeichenfolgen in der Benutzerkonfiguration zu gewährleisten. Aber Echo ist in Ordnung , wenn der Benutzer bereitgestellte Variable nicht ist das erste Zeichen der Zeichenfolge Sie Echo, denn das ist die einzige Situation ist , wo „Flags“ interpretiert werden könnte, so etwas wieecho "foo: $(config_get myvar)";
sicher ist, da die „foo“ nicht beginne mit einem Bindestrich und sage daher echo, dass der Rest des Strings auch keine Flags dafür sind. :-)quelle
config.cfg.defaults
anstelle der Definition zum Zeitpunkt des Anrufs$(config_get var_name "default_value")
. tritarget.org/static/…Analysieren Sie die Konfigurationsdatei, führen Sie sie nicht aus.
Momentan schreibe ich eine Anwendung bei der Arbeit, die eine extrem einfache XML-Konfiguration verwendet:
Im Shell-Skript (der "Anwendung") ist dies das, was ich mache, um den Benutzernamen zu ermitteln (mehr oder weniger, ich habe es in eine Shell-Funktion eingefügt):
Der
xml
Befehl lautet XMLStarlet und ist für die meisten Unices verfügbar.Ich verwende XML, da andere Teile der Anwendung auch Daten verarbeiten, die in XML-Dateien codiert sind. Das war also am einfachsten.
Wenn Sie JSON bevorzugen, gibt
jq
es einen einfach zu verwendenden Shell-JSON-Parser.Meine Konfigurationsdatei würde in JSON ungefähr so aussehen:
Und dann würde ich den Benutzernamen im Skript bekommen:
quelle
eval
mehrere Werte festlegen, führen Sie ausgewählte Teile der Konfigurationsdatei aus :-).eval
irgendetwas. Die Leistungseinbußen bei der Verwendung eines Standardformats mit einem vorhandenen Parser (auch wenn es sich um ein externes Dienstprogramm handelt) sind im Vergleich zu Robustheit, Codemenge, Benutzerfreundlichkeit und Wartbarkeit vernachlässigbar.Die gebräuchlichste, effizienteste und korrekteste Methode ist die Verwendung
source
oder.
Kurzform. Beispielsweise:oder
Zu berücksichtigen sind jedoch die Sicherheitsprobleme, die durch die Verwendung einer zusätzlichen externen Konfigurationsdatei auftreten können, da zusätzlicher Code eingefügt werden kann. Weitere Informationen, einschließlich Informationen zum Erkennen und Beheben dieses Problems, finden Sie im Abschnitt "Sichern" unter http://wiki.bash-hackers.org/howto/conffile#secure_it
quelle
Ich benutze dies in meinen Skripten:
Sollte jede Zeichenkombination unterstützen, mit Ausnahme der Tasten, die nicht enthalten sind
=
, da dies der Trenner ist. Alles andere funktioniert.Auch das ist völlig sicher, da es keine Art von
source
/ verwendeteval
quelle
Für mein Szenario
source
oder.
war in Ordnung, aber ich wollte lokale Umgebungsvariablen unterstützen (dhFOO=bar myscript.sh
), die Vorrang vor konfigurierten Variablen haben. Ich wollte auch, dass die Konfigurationsdatei vom Benutzer bearbeitet werden kann und für jemanden komfortabel ist, der Konfigurationsdateien verwendet und sie so klein / einfach wie möglich hält, um nicht vom Hauptschwerpunkt meines sehr kleinen Skripts abzulenken.Das habe ich mir ausgedacht:
Im Wesentlichen - es prüft auf Variablendefinitionen (ohne sehr flexibel in Bezug auf Leerzeichen zu sein) und schreibt diese Zeilen neu, sodass der Wert in einen Standardwert für diese Variable konvertiert wird und die Variable unverändert bleibt, wenn sie wie die gefunden wird
XDG_CONFIG_HOME
obige Variable. Es bezieht diese geänderte Version der Konfigurationsdatei und fährt fort.Zukünftige Arbeiten könnten das
sed
Skript robuster machen, Zeilen herausfiltern, die seltsam aussehen oder keine Definitionen usw. sind, und keine Zeilenende-Kommentare unterbrechen - aber das ist für mich im Moment gut genug.quelle
Das ist kurz und bündig:
Das
-i
stellt sicher, dass Sie nur die Variablen von erhaltencommon.vars
quelle
Du kannst es schaffen:
quelle