的奇怪問題我正在研究一個PHP腳本來自動解壓縮和掃描位於外部USB驅動器上的tar.gz存檔,而且我遇到一些奇怪的問題,一旦腳本找到一個檔案,它會嘗試在USB驅動器上創建一個臨時目錄來解壓檔案,爲了保證唯一的臨時目錄名稱(因爲這個腳本可能同時運行多次)我使用當前時間的MD5的隨機5位部分爲文件命名,例如:PHP:shell_exec(「mkdir」)和shell_exec(「rm -rf)
$temp = "/media/$driveName/".substr(md5(microtime()), rand(0, 26), 5);
因爲USB驅動器未安裝在服務器文件系統,我無法使用PHP的內置文件管理命令(mkdir(),glob()等),而只能使用exec()或shell_exec()執行的終端命令與文件系統交互。因此,實際創建上述名稱的臨時目錄,我用一個基本的終端mkdir命令:
shell_exec("mkdir $temp");
接下來,我解壓存檔到臨時目錄:
shell_exec("tar -xzf $archivePath -C $temp");
最後,在完成存檔分析後,刪除臨時目錄及其內容:
shell_exec("rm -rf $temp");
不過,我遇到了個怪問題:
偶爾,也許就是每五隻奔跑的,臨時目錄與一個已損壞的名稱創建。當使用
ls directory
顯示時,它看起來像06191v??????.???v???
。但是,使用Tab鍵自動填充cd
命令時,它會填充更長的字符串,如06191v\342\226\200\342\225\232.\342\211\2100v\342\226\200/
。我知道在將字符串傳遞給shell_exec()之前該字符串沒有問題(我甚至試圖使用substr()將其限制爲正確的長度,但無濟於事),並且第一個斜槓後面的一系列字符(從342開始)始終是相同的,不管最初的五個字符是什麼(最初的五個字符和斜槓之間的字符總是一個字母,但是在其他情況下是隨機的)。但是,除此之外,我很茫然。由於某種原因,我用來刪除腳本末尾的臨時目錄的
shell_exec("rm -rf $temp");
只有在執行兩次時纔有效。如果我只執行一次,我會得到以下錯誤:rm: cannot remove '/media/FILESYSTEM/f3637': Directory not empty
,這本身很奇怪,因爲-rf
應該重寫此錯誤。此行爲也可以在服務器的命令提示符中重複。
我似乎無法找到與這些問題之一在網上任何東西,所以我希望這只是我做出愚蠢的錯誤,而不是與我的安裝或USB驅動器有問題。預先感謝任何幫助!
編輯:我其實有第三個問題,可能與第一個問題有關。運行shell_exec("tar -xzf")
命令解壓縮我的壓縮文件後,生成的目錄總是附加了一些奇怪的字符。例如,對於名爲BOOT的壓縮目錄執行一次運行,解壓縮的目錄在終端中顯示爲BOOT??w??????.???w???
,其回顯輸出顯示爲BOOT²w▀╚.∙wâ–€
。在使用Tab鍵填寫cd
命令到這個目錄後,我得到一個幾乎相同模式的字符串:BOOT\302\262w\342\226\200\342\225\232 2.\342\210\231w\342\226\200/
。 99%的時間,這不影響腳本的執行,但偶爾它會導致腳本無法掃描目錄。
這個問題是我需要能夠將臨時目錄的名稱保存到一個變量(我可以使用終端命令找到它,但似乎不必要地迂迴)。我嘗試過這樣:'shell_exec(「mkdir」。$ temp);'但它似乎沒有什麼區別。 – NinjaBlob
你可以直接回顯$ temp變量嗎?我的猜測是一些非ASCII字符正在進入。 –
我試過了,但我仍然遇到同樣的問題: 'ob_start(); echo $ temp; $ temp = ob_get_clean();' – NinjaBlob