Чому цей файл прихований під час запуску ls?


10

EDIT: Я повністю забув про цю тему. Виявляється, у мене поганий жорсткий диск. Нам довелося перерозподілити цей сервер для інших потреб, тому я нарешті зайнявся заміною одного поганого диска, і ми знову в роботі.

Кілька тижнів я не міг зрозуміти, чому мені не вдалося видалити цей конкретний файл. Як root, я можу, але мій скрипт оболонки працює як інший користувач. Тому я бігаю ls -la і його там немає. Однак, якщо я називаю це параметром, він відображається! Звичайно, власник - root, тому я не можу видалити.

Зауважте, 6535 відсутня ...

[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

Тепер він відображається, якщо ви телефонуєте безпосередньо.

[root@server]# ls -la 6535
-rw-rw-r--  1 root root 3486 Mar 26 01:01 6535

Ось щось цікаве. Тож я потрапив у цю проблему, оскільки в моєму скрипті оболонки не вдалося видалити, оскільки 6535 належить root. Файл відображається після запуску "rm -rf." Я спробував це раніше, і не вдалося видалити каталог, оскільки він сказав мені, що каталог не порожній. Я зайшов і подивився і досить впевнений, файл "6535" нарешті з'являється. Поняття не маю, чому це робить.

strace говорить наступне

#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

2
Якщо ви це зрозумієте, будь ласка, опублікуйте оновлення.
einstiien

Цікаво. про що повідомляється з ls -ab? Можливо, якийсь непарний неоктальний символ є у назві файлу? Я б подумав - я все-таки перерахував би це, але я не впевнений.
egorgry

1
Ви нещодавно запускали fsck? Віддалено можливо, що щось порушено у файловій системі.
Зоредаче

Мені доведеться перевірити це ще завтра, залишивши на день.
luckytaxi

Відповіді:


7

Це трохи хвилююче. Я б переконався, що ваш lsфайл не було змінено, порівнюючи з відомим хорошим файлом. Ви можете використовувати пакетні інструменти розповсюдження для перевірки файлу в ізольованій системі.


+1: ls -al має показати все. Якщо цього немає, десь є проблема.
Satanicpuppy

2
Цілком можливо, що lsбуло модифіковано, щоб приховати певний PID, можливо 6535.
MikeyB

Ні ... нічого ...
luckytaxi

6

Іноді назви файлів отримують в них непарні символи, такі як послідовності руху курсору. Спробуйте це переконатися:

ls -lq

Він повинен містити знаки запитання замість контрольних символів (це, мабуть, за замовчуванням, але це може бути не так).

Це частково демонструє тип проблеми, який може бути наявним:

touch A C
touch B$(tput cuu1)$'\r'
ls -l
ls -lq
ls -l --show-control-chars    # for systems that have that option and default to -q

Я також спробую:

type -a ls
alias ls
declare -f ls
md5sum /bin/ls    # compare to a known-good identical system

щоб побачити, чи визначено псевдонім або функцію, або побачити, чи двійковий файл знаходиться в непарному місці чи був модифікований.


1
+1 хороший огляд. Важливо зауважити, що якби вони lsбули модифіковані, md5sumто система в системі могла б також бути змінена. Для отримання остаточного висновку потрібне відоме здорове середовище.
Warner

Я виявив, що навіть якщо md5 було змінено для отримання фіктивних результатів, якщо ви робите такі речі, як "md5 файл", ви все одно можете отримати хороші результати (якщо програма md5 взагалі працює), зробивши щось на зразок bzip2 <файл | md5 і порівняйте його з тією ж командою в іншому місці.
chris


2

Я зазвичай роблю щось подібне, якщо вважаю, що "ls" було змінено ...

python -c "import os; print os.listdir('.')"

Звичайно, Python, бібліотека C, ядро ​​або файлова система також можуть бути змінені, але зазвичай це просто утиліти оболонки.


2
Або ви можете скористатися розширенням імені файлу оболонки, щоб прочитати каталог - echo * (а якщо хочете все, echo *. *)
chris

*.*лише покаже вам файли, у яких є символи (символи), а за ними крапка, а за ними символи. Це точно не все в системі * nix. Я не впевнений, що ехо покаже вам все за одну команду, я зміг це зробитиecho * && echo .*
einstiien

4
Якщо ви придивитесь уважніше, це * (пробіл). *, А не *. * Пунктуація не є сильною приналежністю цієї системи коментування ... І, ехо абсолютно радий розширити стільки виразів, розділених "$ IFS", як ти дбаєш її годувати. Булева && не потрібна, або навіть має багато сенсу, тому що && є булевим і завжди працюватиме, оскільки команда echo завжди успішна.
chris

@chris: мені погано, насправді важко це бачити.
einstiien

2

Ви можете вивчити, що саме ls робить, використовуючи strace, і це може сказати вам, чому уникнути показу цього імені файлу.

strace ls -la 653* 2>&1 | less

подивіться це через це і подивіться, що відбувається.

strace ls -la 653* 2>&1 | grep ^open

Вихід буде виглядати приблизно так:

open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/librt.so.1", O_RDONLY)       = 3
open("/lib/libacl.so.1", O_RDONLY)      = 3
open("/lib/libselinux.so.1", O_RDONLY)  = 3
open("/lib/libc.so.6", O_RDONLY)        = 3
open("/lib/libpthread.so.0", O_RDONLY)  = 3
open("/lib/libattr.so.1", O_RDONLY)     = 3
open("/lib/libdl.so.2", O_RDONLY)       = 3
open("/lib/libsepol.so.1", O_RDONLY)    = 3
open("/etc/selinux/config", O_RDONLY|O_LARGEFILE) = 3
open("/proc/mounts", O_RDONLY|O_LARGEFILE) = 3
open("/selinux/mls", O_RDONLY|O_LARGEFILE) = 3

і якщо ви бачите щось подібне

open("/var/tmp/.../H@ckl1st", O_RDONLY) = 3

будьте обережні, ви були 0wned ...

Це не переконливий тест, але це хороший показник ...

(якщо ви використовуєте solaris або інші ОС, вам може знадобитися використовувати ферму або іншу подібну утиліту замість стрижка)

(якщо ви використовуєте оболонку csh / tcsh, вам, швидше за все, знадобляться різні заяви про переадресацію)


Мені це подобається. straceУтиліта дійсно є швейцарським армійським ножем. Ви добираєтесь до рівня системного виклику і обходите цілу купу довільних ускладнень. Це одне з перших речей будь-якого системного адміністратора. варто копійки варто скинути на нещодавно встановлену машину.
McJeff

Так - два найцінніші інструменти для системного адміністратора - це truss / strace та tcpdump. З цим ви завжди можете заглянути під обкладинки, щоб побачити, як відбувається WTF, коли щось відбувається чи не так, як ви очікуєте.
chris

2

Швидке оновлення, нам довелося замінити сервер з інших причин. Це була файлова система. Зараз все добре !!! Всім дякую.


Ви маєте на увазі, що файлова система була накручена, і це був просто прискіпливий симптом?
chris

так, це було все
luckytaxi

Ви, ймовірно, могли застрягнути в редагуванні, сказавши, що в списку нижче є рішення, оскільки воно заховане під іншими схваленими (і корисними для усунення несправностей) відповідями.
Барт Сільверстрім

0

Теорія хаків цікава, але в мене є альтернативна теорія. Семантика видалення файлу Unix збереже файл, поки всі процеси не закриють відкриті файли, що вказують на нього. Можливо, хтось призупинив оформлення / фіксацію SVN, або поток сервера завис. Якщо перезапуск процесу SVN (або Apache) вирішує вашу проблему, саме тут я ставлю провину.

Можливо, ви можете ідентифікувати процес, який все ще використовує цей файл lsof | grep 6535?


так, нічого не показали. Цікавим є те, що 6535 також "відсутній" у джерелі. Мій сценарій робить гарячу копію оригінального репо в інший каталог. Ось тоді я зіткнувся з проблемами з того, що я не міг чомусь видалити цей конкретний файл.
luckytaxi

Видалений, але відкритий файл не перешкоджатиме видаленню каталогу, що міститься, тому що після того, як цей запис буде видалено, запис у каталозі не буде існувати, тому каталог буде порожнім. Ви не отримаєте місця з файлу, поки не буде знищений процес, у якому він відкритий, але каталог, який мав цей файл, тепер можна буде видалити.
chris

Ваша альтернативна теорія цікава. Видалення, якщо воно буде успішним, негайно видалить жорстке посилання. Inode, ймовірно, все ще містить дані, і деякі ручки файлів можуть зберігати кеш у пам'яті, але я не вірю, що цей сценарій міг би пояснити описану поведінку. Або, що сказав Кріс, хе.
Warner
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.