Können Sie ein „Hier-Dokument“ als Quelle angeben?

Können Sie ein „Hier-Dokument“ als Quelle angeben?

Nehmen wir an, ich habe ein Bash-Skript, das als Konfigurationsdatei für ein anderes Bash-Skript fungiert:

config.sh:

verbose=yes
echo "Malicious code!"
name=test

Skript.sh:

source config.sh
echo "After sourcing: verbose='$verbose', name='$name'"

Das Problem ist, dass dies nicht sehr sicher ist, da alles, was in config.sh eingegeben wird, ausgeführt wird:

$ ./script.sh
Malicious code!
After sourcing: verbose='yes', name='test'

Um es sicherer zu machen, dachte ich, ich würde Zuweisungsoperationen herauslesen und nur diese ausführen. Ich würde das erreichen, indem ich sourceein „Here-Dokument“ übergebe:

Skript.sh:

source <<EOF
$(grep -P '^\s*\w+=' test.sh)
EOF
echo "After sourcing: verbose='$verbose', name='$name'"

(Ja, ich weiß, dass der reguläre Ausdruck nicht so stark ist; es handelt sich nur um einen Platzhalter.) Leider scheint die Quelle nicht gut mit den folgenden Dokumenten zu funktionieren:

./script.sh: line 1: source: filename argument required
source: usage: source filename [arguments]
After sourcing: verbose='', name=''

Natürlich könnte ich alles Mögliche tun, um Konfigurationsdaten aus einer Datei abzurufen, und das ist wahrscheinlich sowieso sicherer.

Aber ich habe immer noch diesen Juckreiz; ich möchte herausfinden, ob das, was ich versucht habe, funktioniert. Irgendwelche Vorschläge?

Antwort1

source <(cat << EOF
A=42
EOF
)
echo $A

Ausgabe:

42

Antwort2

sourceeinen Dateinamen benötigt, können Sie die Eingabe nicht dorthin umleiten.

Auf meinem System konnte ich stattdessen die Prozesssubstitution verwenden:

source <( grep = test.sh )

Ersetzen Sie es =durch den entsprechenden regulären Ausdruck.

Antwort3

Sie können evales direkt verwenden:

eval "$(grep -P '^\s*\w+=' config.sh)" 
#quotes needed if you want the full content of the file (including newlines etc.)

Sourcing ist im Wesentlichen dasselbe wie:

eval "$(cat file)"   

Beachten Sie jedoch, dass auf der rechten Seite des Gleichheitszeichens alle möglichen Codes ausgeführt werden könnten:

a=$(evil_code_here)
b=`evil_code_here`
c="something" evil_code_here
#etc.

Sie benötigen einen besseren Filter.

verwandte Informationen