EDIT: Saya benar-benar lupa tentang utas ini. Ternyata saya punya hard disk yang buruk. Kami harus memindahkan server ini untuk kebutuhan lain, jadi saya akhirnya mengganti satu disk yang rusak dan kami kembali berbisnis.
Selama beberapa minggu sekarang saya tidak tahu mengapa saya tidak dapat menghapus file tertentu ini. Sebagai root saya bisa, tetapi skrip shell saya berjalan sebagai pengguna yang berbeda. Jadi saya pergi menjalankan ls -la dan itu tidak ada. Namun, jika saya menyebutnya sebagai parameter, itu muncul! Benar saja, pemiliknya adalah root, maka saya tidak dapat menghapus.
Perhatikan, 6535 hilang ...
[root@server]# ls -la 653*
-rw-rw-r-- 1 svn svn 24002 Mar 26 01:00 653
-rw-rw-r-- 1 svn svn 7114 Mar 26 01:01 6530
-rw-rw-r-- 1 svn svn 8653 Mar 26 01:01 6531
-rw-rw-r-- 1 svn svn 6836 Mar 26 01:01 6532
-rw-rw-r-- 1 svn svn 3308 Mar 26 01:01 6533
-rw-rw-r-- 1 svn svn 3918 Mar 26 01:01 6534
-rw-rw-r-- 1 svn svn 3237 Mar 26 01:01 6536
-rw-rw-r-- 1 svn svn 3195 Mar 26 01:01 6537
-rw-rw-r-- 1 svn svn 27725 Mar 26 01:01 6538
-rw-rw-r-- 1 svn svn 263473 Mar 26 01:01 6539
Sekarang muncul jika Anda memanggilnya langsung.
[root@server]# ls -la 6535
-rw-rw-r-- 1 root root 3486 Mar 26 01:01 6535
Ini sesuatu yang menarik. Jadi saya menangkap masalah ini karena dalam skrip shell saya, itu akan gagal untuk menghapus karena 6535 dimiliki oleh root. File sebenarnya muncul setelah saya menjalankan "rm -rf." Saya sudah mencoba sebelumnya dan gagal menghapus direktori karena itu memberitahu saya direktori tidak kosong. Saya masuk dan melihat dan cukup yakin, file "6535" akhirnya muncul. Tidak tahu mengapa melakukan ini.
strace mengatakan yang berikut ini
#strace ls -la 653* 2>&1 | grep ^open
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib64/tls/librt.so.1", O_RDONLY) = 3
open("/lib64/libacl.so.1", O_RDONLY) = 3
open("/lib64/libselinux.so.1", O_RDONLY) = 3
open("/lib64/tls/libc.so.6", O_RDONLY) = 3
open("/lib64/tls/libpthread.so.0", O_RDONLY) = 3
open("/lib64/libattr.so.1", O_RDONLY) = 3
open("/etc/selinux/config", O_RDONLY) = 3
open("/proc/mounts", O_RDONLY) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
open("/proc/filesystems", O_RDONLY) = 3
open("/usr/share/locale/locale.alias", O_RDONLY) = 3
open("/usr/share/locale/en_US.UTF-8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US.utf8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.UTF-8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.utf8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/nsswitch.conf", O_RDONLY) = 3
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib64/libnss_files.so.2", O_RDONLY) = 3
open("/etc/passwd", O_RDONLY) = 3
open("/etc/group", O_RDONLY) = 3
open("/etc/mtab", O_RDONLY) = 3
open("/proc/meminfo", O_RDONLY) = 3
open("/etc/localtime", O_RDONLY) = 3
sumber
Jawaban:
Itu agak mengkhawatirkan. Saya akan memverifikasi bahwa
ls
file Anda tidak dimodifikasi dengan membandingkan dengan file yang dikenal baik. Anda bisa menggunakan alat paket distribusi Anda untuk memverifikasi file pada sistem yang terisolasi.sumber
ls
telah dimodifikasi untuk menyembunyikan PID tertentu, mungkin 6535.Terkadang nama file mendapatkan karakter aneh di dalamnya seperti urutan pergerakan kursor. Coba ini untuk memastikan:
Seharusnya menunjukkan tanda tanya alih-alih karakter kontrol (itu mungkin default, tapi mungkin tidak).
Ini sebagian menunjukkan jenis masalah yang mungkin ada:
Saya juga akan mencoba:
untuk melihat apakah alias atau fungsi didefinisikan atau untuk melihat apakah biner berada di tempat ganjil atau telah dimodifikasi.
sumber
ls
dimodifikasi,md5sum
sistem mungkin berpotensi dimodifikasi juga. Anda perlu lingkungan waras yang dikenal untuk memverifikasi untuk mencapai kesimpulan yang pasti.Anda mungkin ingin fsck volume itu.
sumber
Saya biasanya melakukan sesuatu seperti ini jika saya percaya 'ls' telah dimodifikasi ...
python -c "import os; print os.listdir('.')"
Tentu saja Python, Perpustakaan C, kernel, atau sistem file juga dapat dimodifikasi, tetapi biasanya itu hanya utilitas shell.
sumber
*.*
hanya akan menunjukkan kepada Anda file yang memiliki karakter diikuti oleh titik diikuti oleh karakter. Ini jelas bukan segalanya pada sistem * nix. Saya tidak yakin gema akan menampilkan semuanya dalam satu perintah, saya bisa melakukannyaecho * && echo .*
Anda dapat melihat dengan tepat apa yang dilakukan ls dengan menggunakan strace, dan itu bisa memberi tahu Anda mengapa ia tidak menunjukkan nama file itu.
lihat itu dan lihat apa yang terjadi.
Outputnya akan terlihat seperti ini:
dan jika Anda melihat sesuatu seperti
berhati-hatilah, kamu telah memiliki ...
Ini bukan tes konklusif, tetapi merupakan indikator yang baik ...
(jika Anda menggunakan solaris atau OS lain, Anda mungkin perlu menggunakan rangka, atau utilitas serupa lainnya alih-alih strace)
(jika Anda menggunakan shell turunan csh / tcsh, Anda mungkin membutuhkan pernyataan redirection yang berbeda)
sumber
strace
utilitas benar-benar adalah pisau tentara swiss. Anda bisa langsung ke level panggilan sistem dan melewati tumpukan kerumitan yang sewenang-wenang. Ini adalah salah satu hal pertama yang dilakukan admin sistem. layak sepeser pun harus membuang pada mesin yang baru diinstal.Pembaruan cepat, kami harus mengganti server karena alasan lain. Itu adalah sistem file. Semuanya baik-baik saja !!! Terima kasih semuanya.
sumber
Teori retas memang menarik, tapi saya punya teori alternatif. Semantik penghapusan file Unix akan menjaga file di sekitar sampai semua proses telah ditutup menangani file yang mengarah padanya. Mungkin seseorang telah menghentikan checkout / commit SVN, atau utas server terputus. Jika memulai kembali proses SVN (atau Apache) menyelesaikan masalah Anda, ini adalah tempat saya menyalahkan.
Mungkin Anda dapat mengidentifikasi proses masih menggunakan file ini dengan
lsof | grep 6535
?sumber