
dirに/tmp
次のファイル名のファイルがあります:
.<?php passthru($_GET['cmd']);echo 'm3rg3';?>
通常の方法ではこのファイルを削除できず、このファイル名を引用符で囲んで試してみましたが、結果は得られませんでした。
次は何を試してみるべきでしょうか?
答え1
ls -li
inodeを確認するには、inodeを削除します。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\;\?\>
そして将来、本当に奇妙なファイル名を持つ場合は、シェルを利用してみてくださいグロブメカニズム、例:
ls .*php*
良いスタートになるはずです。似たようなファイル名のファイルがたくさんある場合は、一意の正規の部分文字列を使用してください。
ls .*php*cmd*echo*m3rg3*
最後に、Tab使用しているシェルに補完メカニズムがある場合は、 を押してファイル名を補完することができます。
答え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