
在/tmp
目錄中我有具有以下檔案名稱的檔案:
.<?php passthru($_GET['cmd']);echo 'm3rg3';?>
我無法透過正常方式刪除此文件,並嘗試引用此文件名稱但沒有結果。
接下來我該嘗試什麼?
答案1
ls -li
用於查看索引節點,然後使用刪除索引節點find
[root@server tmp]# ls -li .\<*
16163346 -rw-r--r-- 1 root root 0 Jun 23 12:02 .<?php passthru($_GET[cmd]);echo
[root@server tmp]# find . -inum 16163346 -exec rm -i {} \;
rm: remove regular empty file `./.<?php passthru($_GET[cmd]);echo'? y
參考:http://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html
答案2
嘗試這個:
rm -iv -- .\<\?php\ passthru\(\$_GET\[cmd\]\)\;echo\ m3rg3\;\?\>
將來,當你有非常奇怪的檔案名稱時,嘗試使用 shell全域機制,例如:
ls .*php*
應該是個好的開始。如果您有許多文件名稱相似的文件,則只需使用任何唯一的常規子字串
ls .*php*cmd*echo*m3rg3*
最後,Tab如果您使用的 shell 具有完成機制,則可以點擊完成檔案名稱。
答案3
rm
glob patterns
是個聰明的野獸,你可以在論證中 使用
對於您的情況,簡單rm .\<*
就足夠了
rm
*使用with時要小心glob patterns
,因為它會刪除與模式相符的多個文件
答案4
find
GNU 或非 GNU
使用GNU版本find
你可以直接寫入,而不需要去找它們的inode,
find . -name '.<*' -delete
當然,總是建議在沒有該-delete
選項的情況下嘗試並檢查要刪除的檔案的名稱。
對於非 GNU 版本,也可以直接完成,find . -name '.<*' -exec rm -i {} \;
也適用於 GNU 版本,僅慢約 3 倍[1]然後與-delete
.
當文件不是太多時,您也可以使用find . -name '.<*' -exec rm -i {} +
,同樣更快。
perl
假設 .<*
作為鍵選擇所有且僅選擇要刪除的檔案(並非沒有一些健身房在繩子上)
perl -e 'for(<'.'\<'*'>){((stat)[9]<(unlink))}'
刪除該目錄的所有隱藏檔案就足夠了perl -e 'for(<'.*'>){((stat)[9]<(unlink))}'
文件較多時速度更快。檢查表達式,因為我通常不使用 perl。
解決方法
一般來說,您可以嘗試將所有其他檔案移至另一個目錄中並刪除原始目錄
mv /tmp /tmp2; mkdir tmp; mv /tmp2/* /tmp; rm tmp2
如果某些文件正在使用,則會有缺點...但在某些情況下您也可以使用它。
Ps> 不要忘記rsync
使用/dev/null
選項-delete
...