Na moim komputerze z systemem Windows miałem folder o nazwie czterech kropek, który zachowywał się jak królicza nora - jak to się stało?

198

Nazwa folderu została wymieniona w Eksploratorze plików za pomocą zwykłych czterech kropek .....

Kiedy próbowałem go otworzyć, natrafiłem na coś w rodzaju nieskończonej pętli z króliczym otworem, w której wielokrotnie otwierałem dokładnie ten sam folder - mogłem to robić w nieskończoność. Wskazanie ścieżki jak C:\ExamplePath\....\....\....\....\....itp.

Zawieszała moją kompilację TypeScript w jednym konkretnym projekcie. Ponad rok zajęło mi znalezienie tego folderu i powiązanych z nim problemów, ponieważ był on głęboko zakorzeniony w zagnieżdżonych folderach. Nigdy nie spodziewałem się takiego problemu, więc nigdy go nie szukałem.

Nie mogłem usunąć folderu w zwykły sposób z powodu specjalnej nazwy. Na koniec mogłem go usunąć za pomocą wiersza polecenia i usunąć folder nadrzędny za pomocą rd /s /q path.

Następnie próbowałem ponownie utworzyć folder, ale nie mogłem tego zrobić zarówno w Eksploratorze plików, jak i wierszu poleceń.

Przez ponad 20 lat korzystania z systemu Windows nigdy wcześniej nie widziałem tego błędu, więc mogę sobie wyobrazić, że byłby to irytujący i zagmatwany problem dla amatorskich użytkowników.

Czy ktoś wie, jak to się mogło stać i jak odtworzyć ten problem?

Aktualizacja

Dla osób zainteresowanych: ta ścieżka znajdowała się głęboko w folderze TFS. Prawdopodobnie więc TFS stosuje wyjaśnioną metodę @grawity ( „Różne menedżery plików, archiwizatory itp.” )

Czy natknąłem się na rzadki błąd TFS?

Dirk Boer
źródło
5
Poniższe odpowiedzi szczegółowo opisują, co się dzieje, jak celowo to odtworzyć i jak to naprawić, ale nie wspominają, dlaczego tak się stało. Ponieważ ..może być użyty w ścieżce do wskazania „idź w górę o jeden folder”, zaryzykowałbym przypuszczenie, że gdzieś po linii, jakiś program lub skrypt połączył dwa ciągi znaków, aby utworzyć ścieżkę, jeden kończył się .., a następny zaczynał od .., i ponieważ zastosował jedną z poniższych technik, udało mu się utworzyć ścieżkę, mimo że brakowało między nimi separatora folderów.
3D1T0R
6
dziwne rzeczy zdarzają się również, jeśli utworzysz folder z tylko spacjami w jego nazwie
phuclv
7
Czy ten serwer jest w Internecie? Wystarczy, aby ostrzec cię regularnie zobaczyć hackerskich prób w Internecie stoją serwery WWW z żądaniem: GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini. Najwyraźniej istnieje / była pewna podatność gdzieś, którą ta próba wykorzystuje.
Andy Brown,
4
@AndyBrown jest o wiele bardziej prawdopodobne, że ..nie ..... Jest to po prostu sposób przejścia do \winntdowolnej głębokości punktu początkowego (katalogu głównego), o ile głębokość punktu początkowego jest mniejsza niż 9 poziomów. Polega on na tym, że przejście ..z katalogu głównego pozostawia cię w katalogu głównym.
hobbs
5
@hobbs To jest kopia i wklej z dziennika dostępu Apache na Linux. Zdecydowanie 4 kropki. Są rejestrowane inne próby włamania, które użyteczne, ..dlatego uznałem to za dość dziwne.
Andy Brown

Odpowiedzi:

303

Win32 nie pozwala tworzyć plików ani folderów z nazwami kończącymi się na .- wszystkie kropki są usuwane od końca. Próbując stworzyć test.marki testpojawiają się zamiast. (Ma to na celu zapewnienie zgodności z 8.3 nazwami w starym oprogramowaniu z czasów DOS / Win9x.)

W rezultacie, za każdym razem, gdy próbujesz uzyskać dostęp do folderu o nazwie ...., jego nazwa zostaje zredukowana do pustego ciągu i wracasz do folderu, w którym byłeś wcześniej.

Jądro NT pozwala jednak na takie nazwy. Istnieją różne mechanizmy, które omijają ograniczenia nazw plików narzucone przez interfejsy API Win32 - na przykład WSL (Windows Subsystem for Linux) nie działa na systemie Win32 i nie ma na niego wpływu. Istnieje również \\?\metoda obejścia, celowe „backdoor” pozostawione programom, które wiedzą, co robią. Nawet jeśli nie można utworzyć C:\Example\....\, to może stworzyć \\?\C:\Example\....\dobrze.

Podobnie możesz usunąć takie katalogi z rmdir \\?\C:\path\...Cmd (nie testowałem jeszcze z PowerShell).

Różne menedżery plików, archiwizatory itp. Mogą korzystać z tej \\?\metody, aby móc używać dłuższych nazw ścieżek niż zwykle - a dzięki temu nie ma na nie wpływu kod zgodności w Win32; omijają usuwanie kropek, a także tłumaczenie magicznych nazw plików, takich jak CONlub NUL.

Może to być jeden z twoich programów:

  1. zawsze używa \\?\dostępu do plików,
  2. przypadkowo próbowałem utworzyć folder o nazwie ....- ale po tym fakcie nie można na pewno wiedzieć.
grawitacja
źródło
13
innym sposobem utworzenia takiego folderu jest użycie alternatywnych strumieni danych. Na cmd: echo "" > ....::$INDEX_ALLOCATION. Spowoduje to utworzenie folderu o nazwie ....(nadal wskazującego bieżący folder).
WorldSEnder
2
@DirkBoer znalazłem to: docs.microsoft.com/en-us/dotnet/standard/io/…
user31389
124
Microsoft nazywa to „rozszerzonym prefiksem ścieżki”, a ścieżki z tym prefiksem nazywane są „ścieżkami o rozszerzonej długości”. (zabawne: wyszukiwanie \\?\"w źródle referencyjnym .NET powoduje błąd czasu wykonywania na ich serwerze).
dlatikay
2
@grawity So. . . jak powinienem teraz usunąć ten folder?
Shadow503
21
Miałem ciekawy przypadek klienta „naprawy komputera”, w którym za każdym razem, gdy klient utworzył konto na dowolnej maszynie z systemem Windows, działałoby to dobrze, ale gdy się zaloguje / uruchomi ponownie, nie wpuści go na swoje konto, zamiast tego utworzy konto tymczasowe dla sesja. Lokalny warsztat komputerowy był zakłopotany (nadal obciążono go opłatą). Okazuje się, że jego prawdziwe imię to Con i zawsze używał swojej nazwy dla swojego konta Windows ..... tego dnia dowiedziałem się, że istnieje coś więcej niż tylko com1magiczna nazwa pliku
RozzA
23

Oprócz odpowiedzi @ grawity program Win32 może to zrobić, wywołując bezpośrednio „natywny” interfejs API. Jeśli się nie mylę, w niniejszej sprawie byłby to NtCreateDirectoryObject. Wywołania te są obecnie dość dobrze udokumentowane, zwłaszcza ich odpowiednik jądra (którego nie można wywołać z programu Win32), w tym przypadku ZwCreateDirectoryObject.

Jeśli chodzi o „nieskończoną głębokość”, łatwym sposobem na osiągnięcie tego jest użycie linków. Utwórz katalog, a następnie wewnątrz niego, stwórz z nim połączenie (możesz mklink /jna przykład użyć ), a skończysz z bardzo głęboką strukturą. Ostatnim razem, gdy to robiłem, było w systemie Windows 2000, zakończyła się jednak rekurencja (nie można było „kopać w nieskończoność”). Możliwe, że w nowszym systemie operacyjnym limit jest większy lub usunięty, możesz także utworzyć, powiedzmy, 10 katalogów, z których każdy jest dzieckiem poprzedniego, aw 10., utworzyć link z powrotem do pierwszego.

użytkownik1532080
źródło
4
To bardzo możliwe, że zły geniusz jest tutaj ...
Agi Hammerthief,
1
Skopiowałem pełne katalogi podobnie do tego, aby sztucznie wypełnić dysk w celu przetestowania, aby móc określić, kiedy był on bliski ustawionego limitu.
mickeyf
Można również reprodukować przy użyciu mkdir ....
cygwina
18

Istnieje łatwiejszy sposób na utworzenie katalogu. W wierszu polecenia wpisz:

MD ....\

i naciśnij Enter, utworzy katalog z czterema kropkami. Ten katalog można również wyświetlić w Eksploratorze.

W systemie MS-DOS występuje usterka, która sięga wstecz do wersji 1.0. MS wiedział o tym od jakiegoś czasu, ale nie mógł lub nie mógł tego naprawić. Rozwiązali problem z PowerShell.

BTW, jeśli spróbujesz:

RD ....

Nie uda się go usunąć. Musisz użyć tej konkretnej składni, aby ją usunąć.

RD ....\

Używam tego na niektórych serwerach, którymi administruję. Często tworzę folder użytkownika w katalogu głównym dysku i nie chcę, aby inny administrator pojawił się i go usunął.

Więc wejdę do mojego folderu i utworzę podfolder o nazwie CON, AUX lub LPT itp.

Jeśli inny administrator chce usunąć mój folder, musi najpierw wiedzieć, jak usunąć ten podfolder.

EDYCJA: Myślałem o dzisiejszej dyskusji i postanowiłem pójść o krok dalej. Zakładam, że mody zdecydują, czy to jest istotne.

Nie mogę włożyć płyty CD do folderu.

Rozważmy, że jeśli wykonam MD c: \ test, to CD C: \ test i MD .... \ Skończę na C: \ test ....

i wszystko jest dobrze.

Ale CD .... zawodzi i kopie mnie z powrotem do C: \ test. (CD .... \ robi to samo.)

Jednak mogę DIR .... i uzyskać listę reż. mogę też

MD C: \ test .... \ temp i tworzy ten podkatalog w ....

Mogę także CD C: \ test .... \ temp i przejść do tego podkatalogu.

Ale będąc w C: \ test .... \ temp, jeśli mam CD .. Jestem z powrotem w C: \ test.

Nie mogę cd do tego katalogu, ale mogę manipulować folderem, tworząc podfoldery i wystarczająco interesujące coś takiego

ECHO „Testowanie” >> C: \ test .... \ test.txt

działa również i tworzy plik w tym folderze. Mogę więc utworzyć folder z czterema kropkami, mogę dodawać do niego pliki i foldery, mogę uzyskać listę jego katalogów, ale nie mogę na nim CD. Czy może być do tego jakiś zły geniusz? Przepraszam modów, jeśli zboczyłem zbyt daleko z kursu.

Larryc
źródło
6
To raczej brzmi jak błąd Win32 API, biorąc pod uwagę, że wiersz poleceń nie jest już „MS-DOS” już od około dwudziestu lat.
grawity
2
Co ciekawe, jeśli spróbuję usunąć katalog w Eksploratorze Windows, zawiesza się on podczas tworzenia go w Twojej wersji. Kiedy stworzyłem go z cygwinem, po prostu zawodzi i tak mówi.
lucidbrot
Mam maszyny DOS 3.3 i DOS 6.0, a polecenia działają na nich. Po przejściu na wersję 32-bitową problem nadal występował. działa w oknie CMD od win95 do dziś, włączając wszystkie wersje serwerów. Teraz, gdy przechodzimy na PowerShell, to już nie działa. Zrozumiałem po tym, jak napisałem, że tworzy katalog, ale nie zapewnia efektu, który widział OP. Jeśli spróbuję włożyć CD do katalogu z czterema kropkami, po prostu mnie to wyrzuci.
Larryc,
Na moim komputerze z systemem Windows 7 MD ....` only creates .... \ .... `drzewo - jest tylko jeden krok rekurencji.
Tomáš Zato,
Co ciekawe, menedżer FAR nie postrzega tego w żaden sposób jako specjalnego, i tworzy / zmienia nazwy / usuwa / wyświetla zawartość katalogów o nazwie „mnóstwo kropek” bez żadnych problemów.
RomanSt
-1

Miałem ten sam problem. W moim przypadku była to literówka w poleceniu publikowania .NET Core:

dotnet publish "Api.csproj" --output "....\output\"

Utworzył katalog o nazwie „....”, którego nie mogłem usunąć ani zmienić nazwy. Ten katalog działał jak odniesienie do katalogu nadrzędnego. Jeśli wejdę do tego folderu, nadal znajduję się w folderze nadrzędnym, ale do ścieżki dodano „.... \”.

Próbowałem wszystkich poleceń wymienionych w tym temacie, ale żadne z nich nie działało. W moim rozumieniu tak to działało, ponieważ miałem inne pliki i katalogi w katalogu nadrzędnym, więc musiałem użyć parametrów, które mogą rekurencyjnie usuwać całą zawartość.

Dowiedziałem się, że to polecenie:

rmdir /s /q ....\

można usunąć katalog „....”. Usuwa tylko odniesienie do katalogu nadrzędnego, którym w rzeczywistości jest ten katalog „....”, nic więcej, nic mniej. Pomimo argumentów polecenia:

  • / s - usuwa całą zawartość z usuniętego katalogu,
  • / q - usuwa bez potwierdzenia,

katalog nadrzędny pozostał nietknięty.

Mateusz
źródło
Czy możesz wyjaśnić, dlaczego drugie polecenie działało dla Ciebie?
Burgi
Głosowanie w dół, ponieważ nie wyjaśniłeś, dlaczego to polecenie działa ani co robi, na przykład usuwa katalog, podkatalogi i pliki.
Winter Faulk
To faktycznie usuwa katalog o nazwie „....”. Usuwa tylko odniesienie do katalogu nadrzędnego, którym w rzeczywistości jest ten katalog „....”, nic więcej, nic mniej. Próbowałem wszystkich poleceń wymienionych w tym temacie, ale żadne z nich nie działa. W moim rozumieniu to polecenie zadziałało, ponieważ miałem inne pliki i katalogi w katalogu nadrzędnym, więc musiałem użyć parametrów, które rekurencyjnie usuwają całą zawartość. Pomimo argumentów polecenia katalog nadrzędny pozostał nietknięty.
Mateusz
Jakoś znalazłem się w tej samej sytuacji z Visual Studio i to polecenie uratowało mi bekon po godzinach frustracji, próbując dowiedzieć się, co się dzieje.
NPNelson