當使用find
帶有-execdir
選項的程式時,我看到人們說{}
將替換為目錄,將+
替換為檔案名,但手冊沒有說明它們的作用。有一些官方文件可以解釋這一點嗎?我還想知道它們是否會擴展為相對路徑或絕對路徑。我嘗試創建一個腳本,它將採用{}
和+
作為參數並將其內容保存到單獨的文件中。我假設它們會作為兩個單獨的參數傳遞,這將使我能夠看到每個參數是如何擴展的,但我得到的結果使它看起來只有一個參數被傳遞給腳本,所以我仍然不能完全向自己證明這些是什麼以及它們是如何擴展的。
這是我正在運行的命令:find '/home/jesse/hacking/sh_sandbox' -type f -execdir /home/jesse/hacking/sh_sandbox/save_params.sh {} +
save_params.sh 腳本是一個可執行的 shell 腳本,其程式碼如下:
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
Zero_param 文字檔案將填入正在執行的腳本的名稱,這是預期的。 first_param.txt 檔案中充滿了./filename
不同的檔案名稱。 Second_param 和 Third_param 文字檔案都填入有空行,每個空白行的行數與其他檔案相同。這讓我相信沒有第二個參數被傳遞給save_params.sh
.
答案1
+
是結束標記,{}
替換為檔案名,目前目錄是路徑。
所以
$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
或類似的東西...重新閱讀問題,似乎編寫腳本是為了修改 find 正在搜尋的目錄,所以真正發生的情況可能更複雜。
第一次運行時只找到一個文件
$PWD
=/home/jesse/hacking/sh_sandbox/
$0
=/home/jesse/hacking/sh_sandbox/save_params.sh
$1
=./save_params.sh
因此,將建立包含反映這一點的內容的文件。
答案2
find ... -execdir command {} +
不做那樣的事情。
它的工作原理與執行命令之前完全相同,find ... -exec
只是find
首先將目錄更改為匹配文件所在的目錄。
運行man find
(或如果使用 GNU find,info find
或者pinfo find
獲取更詳細的文檔)並蒐索-execdir
.
來自 GNUfind
手冊頁:
-execdir command ;
-execdir command {} +
與 類似
-exec
,但指定的命令是從包含匹配檔案的子目錄運行的,該子目錄通常不是您開始尋找的目錄。這是一種更安全的呼叫命令的方法,因為它避免了解析匹配檔案的路徑期間的競爭條件。與
-exec
操作一樣,+
的形式-execdir
將建立一個命令列來處理多個匹配的文件,但任何給定的命令呼叫只會列出同一子目錄中存在的文件。如果你使用這個選項,你必須確保你的
$PATH
環境變數沒有引用.
;否則,攻擊者可以透過在您將運行的目錄中保留適當命名的檔案來執行他們喜歡的任何命令-execdir
。這同樣適用於其中的條目為
$PATH
空或不是絕對目錄名稱。如果 find 遇到錯誤,有時會導致立即退出,因此某些掛起的命令可能根本無法運作。操作的結果取決於是否 正在使用該操作
+
或 變體;始終傳回 true,而 僅當命令傳回 0 時才傳回 true。;
-execdir command {} +
-execdir command {} ;
請注意,即使手冊頁摘錄沒有提及它,也;
必須像\;
從 shell 命令列或腳本運行一樣進行轉義,以便 shell 不會將其解釋為命令的結尾find
,而是作為參數傳遞給to 表示命令的find
結束。不需要逃避。find
-exec
+