Wenn ich das find
Programm mit der -execdir
Option 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 ./filename
mit 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 ... -exec
außer dass find
vor 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 find
oder pinfo find
für eine ausführlichere Dokumentation) und suchen Sie nach -execdir
.
Aus der GNU- find
Manpage:
-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
-exec
Aktion wird durch die+
Form-execdir
eine 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
$PATH
Umgebungsvariable 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,
$PATH
die 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 find
Befehls interpretiert, sondern als Argument übergeben wird, um das Ende des Befehls find
anzuzeigen . Das muss nicht maskiert werden.find
-exec
+