Dlaczego ten plik jest ukryty po uruchomieniu ls?


10

EDYCJA: Całkowicie zapomniałem o tym wątku. Okazuje się, że miałem zły dysk twardy. Musieliśmy ponownie wdrożyć ten serwer do innych potrzeb, więc w końcu przystąpiłem do wymiany jednego uszkodzonego dysku i wróciliśmy do pracy.

Od kilku tygodni nie mogłem zrozumieć, dlaczego nie byłem w stanie usunąć tego konkretnego pliku. Jako root mogę, ale mój skrypt powłoki działa jako inny użytkownik. Więc idę uruchomić ls -la i nie ma go. Jednak jeśli wywołam to jako parametr, pojawi się! Rzeczywiście, właściciel jest rootem, dlatego nie mogę go usunąć.

Uwaga, brakuje 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

Teraz pokazuje się, jeśli zadzwonisz bezpośrednio.

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

Oto coś interesującego. Więc złapałem ten problem, ponieważ w moim skrypcie powłoki nie można go usunąć, ponieważ 6535 jest własnością root. Plik faktycznie pojawia się po uruchomieniu „rm -rf”. Próbowałem wcześniej i nie udało się usunąć katalogu, ponieważ powiedział mi, że katalog nie jest pusty. Wszedłem do środka i na pewno w końcu pojawia się plik „6535”. Nie mam pojęcia, dlaczego to robi.

strace mówi, co następuje

#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
Jeśli to rozwiążesz, opublikuj aktualizację.
einstiien

Ciekawy. co jest zgłaszane za pomocą ls -ab? Może w nazwie pliku znajduje się jakiś dziwny nie ósemkowy znak? Myślałbym, że i tak by to wymienił, ale nie jestem pewien.
egorgry

1
Czy ostatnio prowadziłeś fsck? Jest możliwe, że coś jest zepsute w systemie plików.
Zoredache

Będę musiał to przetestować jutro, wyjeżdżając na cały dzień.
luckytaxi

Odpowiedzi:


7

To trochę niepokojące. Sprawdziłbym, czy Twój lsplik nie został zmodyfikowany przez porównanie ze znanym dobrym plikiem. Możesz użyć narzędzi pakietu swojej dystrybucji do zweryfikowania pliku w izolowanym systemie.


+1: ls -al powinien pokazać wszystko. Jeśli nie, to gdzieś jest problem.
Satanicpuppy

2
Całkiem możliwe, że lszostał zmodyfikowany, aby ukryć konkretny PID, prawdopodobnie 6535.
MikeyB

Nie ... nic ...
luckytaxi

6

Czasami nazwy plików zawierają nieparzyste znaki, takie jak sekwencje ruchów kursora. Spróbuj tego, aby upewnić się:

ls -lq

Powinien wyświetlać znaki zapytania zamiast znaków kontrolnych (prawdopodobnie jest to ustawienie domyślne, ale może nie być).

To częściowo pokazuje rodzaj problemu, który może występować:

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

Spróbowałbym również:

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

aby sprawdzić, czy alias lub funkcja jest zdefiniowana, lub aby zobaczyć, czy plik binarny znajduje się w nieparzystym miejscu lub został zmodyfikowany.


1
+1 dobry wgląd. Ważne jest, aby pamiętać, że gdyby lszostały zmodyfikowane, również md5sumw systemie mógłby zostać potencjalnie zmodyfikowany. Potrzebujesz znanego rozsądnego środowiska, aby zweryfikować, aby dojść do ostatecznego wniosku.
Warner

Przekonałem się, że nawet jeśli md5 został zmieniony w celu uzyskania fałszywych wyników, jeśli robisz rzeczy takie jak „plik md5”, nadal możesz uzyskać dobre wyniki (jeśli program md5 w ogóle działa), robiąc coś takiego jak bzip2 <plik | md5 i porównaj to z tym samym poleceniem w innym miejscu.
Chris


2

Zwykle robię coś takiego, jeśli uważam, że „ls” zostało zmodyfikowane ...

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

Oczywiście Python, biblioteka C, jądro lub system plików również mogą być modyfikowane, ale zwykle jest to tylko narzędzie powłoki.


2
Lub możesz użyć rozszerzenia nazwy powłoki do odczytania katalogu - echo * (a jeśli chcesz wszystkiego, echo *. *)
Chris

*.*pokaże tylko pliki, które mają znak (i), po których następuje kropka i znak (i). To zdecydowanie nie wszystko w systemie * nix. Nie jestem pewien, czy echo pokaże ci wszystko jednym poleceniem, byłem w stanie to zrobićecho * && echo .*
einstiien

4
Jeśli przyjrzysz się uważnie, to jest * (spacja). *, Nie *. * Interpunkcja nie jest mocną stroną tego systemu komentowania ... I echo z przyjemnością rozszerzy tyle wyrażeń oddzielonych „$ IFS” jak chcesz to nakarmić. Wartość logiczna && nie jest konieczna, a nawet ma sens, ponieważ && jest wartością logiczną i zawsze będzie działać, ponieważ polecenie echa zawsze kończy się powodzeniem.
Chris

@chris: mój zły, naprawdę trudno to dostrzec.
einstiien

2

Możesz dokładnie sprawdzić, co robi ls, używając strace, a to może ci powiedzieć, dlaczego unika pokazywania tej nazwy pliku.

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

spójrz przez to i zobacz, co się dzieje.

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

Dane wyjściowe będą wyglądać następująco:

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

a jeśli zobaczysz coś takiego

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

bądź ostrożny, zostałeś uznany za ...

To nie jest rozstrzygający test, ale jest dobrym wskaźnikiem ...

(jeśli używasz systemu solaris lub innego systemu operacyjnego, może być konieczne użycie kratownicy lub innego podobnego narzędzia zamiast strace)

(jeśli używasz powłoki pochodnej csh / tcsh, prawdopodobnie będziesz potrzebować różnych instrukcji przekierowania)


Lubię to. straceNarzędzie naprawdę jest szwajcarski scyzoryk. Wchodzisz bezpośrednio do poziomu wywołania systemowego i omijasz cały stos arbitralnych komplikacji. Jest to jedna z pierwszych rzeczy, które każdy administrator systemu. warto ani grosza powinien zrzucić na nowo zainstalowanej maszynie.
McJeff,

Tak - dwa najcenniejsze narzędzia dla administratora systemu to kratownica / strace i tcpdump. Dzięki nim zawsze możesz zajrzeć pod przykrycia, aby zobaczyć, że wtf dzieje się, gdy coś jest lub nie działa tak, jak się spodziewasz.
chris

2

Szybka aktualizacja, musieliśmy wymienić serwer z innych powodów. To był system plików. Teraz wszystko jest dobrze !!! Dziękuje wszystkim.


Masz na myśli, że system plików był zepsuty, a to był tylko zwariowany objaw?
Chris

tak to było to.
luckytaxi

Prawdopodobnie mogłeś utknąć w edycji, aby powiedzieć, że istnieje rozwiązanie na poniższej liście, ponieważ zostało ono pochowane pod innymi pozytywnymi (i przydatnymi do rozwiązywania problemów) odpowiedziami.
Bart Silverstrim,

0

Teoria hacka jest interesująca, ale mam alternatywną teorię. Semantyka usuwania plików uniksowych utrzyma plik dookoła, dopóki wszystkie procesy nie zamkną otwartych uchwytów plików wskazujących na niego. Być może ktoś wstrzymał pobieranie / zatwierdzenie SVN lub wątek serwera został zawieszony. Jeśli ponowne uruchomienie procesu SVN (lub Apache) rozwiązuje twój problem, to właśnie tutaj obwiniłbym winę.

Być może możesz zidentyfikować proces, w którym nadal używasz tego pliku lsof | grep 6535?


tak, nic nie pokazałem. Interesujące jest to, że 6535 również „brakuje” w źródle. Mój skrypt wykonuje kopię oryginalnego repozytorium w innym katalogu. Właśnie wtedy napotkałem problemy z niemożnością usunięcia tego konkretnego pliku z jakiegoś powodu.
luckytaxi

Usunięty, ale otwarty plik nie powstrzyma Cię przed usunięciem katalogu zawierającego, ponieważ po usunięciu tego wpisu katalog nie będzie już istniał, więc katalog będzie pusty. Nie odzyskasz miejsca z pliku, dopóki proces, który go otworzył, nie zostanie zabity, ale katalog, który miał ten plik, można teraz usunąć.
Chris

Twoja alternatywna teoria jest interesująca. Usunięcie, jeśli się powiedzie, natychmiast usunie twardy link. I-węzeł prawdopodobnie nadal będzie zawierał dane, a niektóre uchwyty plików mogą mieć je buforowane w pamięci, ale nie sądzę, aby ten scenariusz mógł wyjaśnić opisane zachowanie. Albo, co powiedział Chris, heh.
Warner
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.