Frage

Wie kann ich Benutzereingaben in einem Bash-Skript sanieren, so dass ich dann als Argument an einem anderen Shell-Programm übergeben Sie sie? Ich möchte folgendes verhindern:

INPUT="filename;rm -rf /"
ls $INPUT

Ich dachte, es sollte genug sein, um die Benutzereingabe in doppelten Anführungszeichen zu umgeben, etwa so:

ls "$INPUT"

aber was, wenn es ein doppeltes Anführungszeichen in $INPUT?

Oder bash bereits mit diesem Problem umgehen?

War es hilfreich?

Lösung

Die Short

Bash beschäftigt sich schon damit. Zitiert reicht es aus.

ls "$INPUT"

The Long

Eine grobe Anleitung, wie die Shell parst diese Zeile ist:

"ls \"$INPUT\""                     # Raw command line.
["ls", "\"$INPUT\""]                # Break into words.
["ls", "\"filename; rm -rf /\""]    # Perform variable expansion.
["ls", "\"filename; rm -rf /\""]    # Perform word splitting (no change).
["ls", "filename; rm -rf /"]        # Remove quotes.

Aufgrund der Zitate der $INPUT Variable unterliegt keinem Wort Spaltung. Die ls wird eine Datei mit dem Namen filename; rm -rf / suchen.

Wenn Sie es nicht zitieren haben dann würde die Erweiterung anders vorgehen:

"ls $INPUT"                             # Raw command line.
["ls", "$INPUT"]                        # Break into words.
["ls", "filename; rm -rf /"]            # Perform variable expansion.
["ls", "filename;", "rm", "-rf", "/"]   # Perform word splitting.

Sie können zumindest Trost haben, dass dies nicht wirklich rm -rf / ausführen. Vielmehr wird es jeder dieser Zeichenfolgen als Dateinamen ls geben. Sie werden einige Dateien ls Sie nicht die Absicht haben, aber zumindest werden sie nicht versehentlich unerwünschte Befehle auszuführen.

jkugelman$ VAR='.; echo hi'
jkugelman$ ls $VAR
ls: .;: No such file or directory
ls: echo: No such file or directory
ls: hi: No such file or directory

Auszüge aus "man bash":

  

ANBIETEN

     

Zitiert wird verwendet, um die besondere Bedeutung bestimmter Zeichen oder Worte mit der Schale zu entfernen. Zitiert kann für Sonderzeichen zu deaktivieren Sonderbehandlung verwendet werden, um zu verhindern, reservierte Worte als solche erkannt zu werden, und Parameter Expansion zu verhindern.

     

EXPANSION

     

Die Expansion wird auf der Kommandozeile durchgeführt, nachdem es aufgeteilt in Worte gewesen. Es gibt sieben Arten          Expansionsdurchgeführt: Verstrebung Expansion tilde Expansions, Parameter- und Variablenerweiterung, Befehl          Substitution, arithmetische Erweiterung, einzelne Wörter aufgespalten, und Pfadname Expansion.

     

Nur Klammer Expansion, einzelne Wörter aufgespalten, und Pfadname Expansion kann die Anzahl der Wörter der Änderung          Erweiterung; andere Erweiterungen zu erweitern, um ein einzelnes Wort, ein einziges Wort. Die einzigen Ausnahmen sind          die Erweiterungen von "$@" und "${name[@]}" wie oben erläutert (siehe Parameter).

     

Word-Splitting

     

Die Schale scannt die Ergebnisse der Parameter, Kommando-Substitutionen und arithmetische Expansions          Das ist nicht in doppelten Anführungszeichen für Wort Spaltung auftreten.

     

Quote Entfernen

     

Nach den vorangegangenen Erweiterungen, alle unquoted Vorkommen der Zeichen \, ' und ", die nicht tat          ergeben sich aus einem der oben genannten Erweiterungen entfernt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top