Wie werden {} und + in find mit der Option -execdir erweitert?

Wie werden {} und + in find mit der Option -execdir erweitert?

Wenn ich das findProgramm mit der -execdirOption verwende, habe ich Leute sagen hören, dass das {}durch das Verzeichnis und das durch den Dateinamen ersetzt wird +, aber im Handbuch steht nicht, was diese bewirken. Gibt es eine offizielle Dokumentation, die dies erklärt? Außerdem möchte ich wissen, ob sie als relative oder absolute Pfade erweitert werden. Ich habe versucht, ein Skript zu erstellen, das das {}und das +als Parameter verwendet und deren Inhalt in separaten Dateien speichert. Ich nahm an, dass sie als zwei separate Parameter übergeben würden und ich so sehen könnte, wie jeder erweitert wird, aber die Ergebnisse, die ich erhalte, lassen es so aussehen, als würde nur ein einziger Parameter an das Skript übergeben, also kann ich mir immer noch nicht vollständig beweisen, was diese sind und wie sie erweitert werden.

Hier ist der Befehl, den ich ausführe:find '/home/jesse/hacking/sh_sandbox' -type f -execdir /home/jesse/hacking/sh_sandbox/save_params.sh {} +

Das Skript save_params.sh ist ein ausführbares Shell-Skript mit dem folgenden Code:

echo $0 >> /home/jesse/hacking/sh_sandbox/zero_param.txt
echo $1 >> /home/jesse/hacking/sh_sandbox/first_param.txt
echo $2 >> /home/jesse/hacking/sh_sandbox/second_param.txt
echo $3 >> /home/jesse/hacking/sh_sandbox/third_param.txt

Die Textdatei zero_param wird erwartungsgemäß mit dem Namen des ausgeführten Skripts gefüllt. Die Datei first_param.txt wird ./filenamemit anderen Dateinamen gefüllt. Sowohl die Textdateien second_param als auch third_param werden mit Leerzeilen gefüllt, jede mit der gleichen Zeilenanzahl wie die anderen Dateien. Dies lässt mich glauben, dass kein zweiter Parameter an übergeben wird save_params.sh.

Antwort1

+ist der Endmarker, {}wird durch den Dateinamen ersetzt, der aktuelle Verzeichnispfad ist.

Also

  • $PWD=/home/jesse/hacking/sh_sandbox/
  • $0=/home/jesse/hacking/sh_sandbox/save_params.sh
  • $1=./zero_param.txt
  • $2=./first_param.txt
  • $3=./second_param.txt
  • $4=./third_param.txt

oder so ähnlich ... beim erneuten Lesen der Frage scheint es, dass das Skript geschrieben wurde, um das Verzeichnis zu ändern, das von „find“ durchsucht wird. Was also tatsächlich passiert, ist möglicherweise komplexer.

beim ersten Durchlauf wird nur eine Datei gefunden

  • $PWD=/home/jesse/hacking/sh_sandbox/
  • $0=/home/jesse/hacking/sh_sandbox/save_params.sh
  • $1=./save_params.sh

Daher würden die Dateien mit Inhalten erstellt, die dies widerspiegeln.

Antwort2

find ... -execdir command {} +macht so etwas nicht.

Es funktioniert genauso wie zuvor, find ... -execaußer dass findvor der Ausführung des Befehls zunächst das Verzeichnis in das Verzeichnis gewechselt wird, in dem sich die übereinstimmenden Dateien befinden.

Führen Sie es aus man find(oder wenn Sie GNU find verwenden info findoder pinfo findfür eine ausführlichere Dokumentation) und suchen Sie nach -execdir.

Aus der GNU- findManpage:

-execdir command ;

-execdir command {} +

Wie -exec, aber der angegebene Befehl wird aus dem Unterverzeichnis ausgeführt, das die übereinstimmende Datei enthält, was normalerweise nicht das Verzeichnis ist, in dem Sie find gestartet haben. Dies ist eine viel sicherere Methode zum Aufrufen von Befehlen, da sie Race Conditions während der Auflösung der Pfade zu den übereinstimmenden Dateien vermeidet.

Wie bei der -execAktion wird durch die +Form -execdireine Befehlszeile erstellt, um mehr als eine übereinstimmende Datei zu verarbeiten, aber bei jedem Aufruf des Befehls werden nur Dateien aufgelistet, die im selben Unterverzeichnis vorhanden sind.

Wenn Sie diese Option verwenden, müssen Sie sicherstellen, dass Ihre $PATHUmgebungsvariable nicht auf verweist .. Andernfalls kann ein Angreifer beliebige Befehle ausführen, indem er eine entsprechend benannte Datei in einem Verzeichnis hinterlässt, in dem Sie ausführen -execdir.

Dasselbe gilt für Einträge, $PATHdie leer sind oder keine absoluten Verzeichnisnamen sind. Wenn find auf einen Fehler stößt, kann dies manchmal zu einem sofortigen Beenden führen, sodass einige ausstehende Befehle möglicherweise überhaupt nicht ausgeführt werden.

Das Ergebnis der Aktion hängt davon ab, ob + oder die ; Variante verwendet wird; -execdir command {} +gibt immer „true“ zurück, während -execdir command {} ;„true“ nur dann zurückgibt, wenn der Befehl 0 zurückgibt.

Beachten Sie, dass, obwohl es im Manpage-Auszug nicht erwähnt wird, das ;maskiert werden muss, als \;ob es von einer Shell-Befehlszeile oder einem Skript ausgeführt würde, damit die Shell es nicht als das Ende des findBefehls interpretiert, sondern als Argument übergeben wird, um das Ende des Befehls findanzuzeigen . Das muss nicht maskiert werden.find-exec+

verwandte Informationen