На моей машине с Windows у меня была папка с именем из четырех точек, которая действовала как некая кроличья нора - как это случилось?


198

Имя папки было указано в проводнике с четырьмя точками .....

Когда я попытался открыть его, я попал в какую-то бесконечную петлю кроличьей норы, где я снова и снова открывал одну и ту же папку - я мог делать это бесконечно. Отображение пути как C:\ExamplePath\....\....\....\....\....и т. Д.

Он повесил мою компиляцию TypeScript в одном конкретном проекте. У меня ушло больше года, прежде чем я нашел эту папку и связанные с ней проблемы, потому что она была глубоко укоренена во вложенных папках. Я никогда не ожидал такой проблемы, поэтому никогда не искал ее.

Я не мог удалить папку обычным способом из-за специального имени. В конце концов, я могу удалить его, используя командную строку и удалив родительскую папку с помощью rd /s /q path.

После этого я снова попытался создать папку, но не смог сделать это ни с помощью Проводника, ни с помощью командной строки.

За 20 с лишним лет использования Windows я никогда раньше не сталкивался с этой ошибкой, поэтому могу себе представить, что это действительно будет раздражающей и запутывающей проблемой для пользователей-любителей.

Кто-нибудь знает, как это могло произойти и как воспроизвести эту проблему?

Обновить

Для людей, которые заинтересованы: этот путь находится глубоко в папке TFS. Так что, вероятно, TFS использует метод обхода, объясненный @grawity ( «Различные файловые менеджеры, архиваторы и т. Д.» )

Я наткнулся на редкую ошибку TFS?


5
Ответы ниже подробно описывают, что происходит, как преднамеренно воспроизвести и как это исправить, но они не упоминают, почему это произошло. Поскольку ..в пути можно использовать указание «перейти на одну папку», я рискну предположить, что где-то в строке какая-то программа или скрипт объединяют две строки для создания пути, одна из которых заканчивается .., а следующая начинается с .., и поскольку он использовал один из методов, упомянутых ниже, ему удалось создать путь, даже при том, что между ними отсутствовал разделитель папок.
3D1T0R

6
странные вещи также произойдут, если вы создадите папку с только пробелами в названии
phuclv

7
Этот сервер в интернете? Просто , чтобы предупредить вас , я регулярно вижу Hack попытки по Интернету , с которыми сталкиваются веб - сервера , запрашивающие: GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini. Очевидно, что где-то есть / была какая-то уязвимость, которую он пытается использовать.
Энди Браун

4
@AndyBrown гораздо более вероятно, что ..нет ..... Это просто способ перехода к \winntнезависимо от глубины начальной точки (веб-корня), если начальная точка имеет глубину менее 9 уровней. Он основан на том факте, что выход ..из корневого каталога оставляет вас в корневом каталоге.
Хоббс

5
@hobbs Это копия и вставка из журнала доступа Apache в Linux. Определенно 4 точки там. Есть и другие попытки взломать авторизованы , которые делают использование ..именно поэтому я нашел это один довольно странно.
Энди Браун

Ответы:


303

Win32 не позволяет создавать файлы или папки с именами, заканчивающимися на .- все точки удаляются с конца. Попытка создания test.делает testпоявление вместо. (Это для совместимости с именами 8.3 в старом программном обеспечении эпохи DOS / Win9x.)

В результате, когда вы пытаетесь получить доступ к папке с именем ...., ее имя сводится к пустой строке, и вы возвращаетесь к папке, в которой вы были раньше.

Ядро NT, однако, допускает такие имена. Существуют различные механизмы, которые обходят ограничения имени файла, налагаемые API-интерфейсами Win32 - например, WSL (Windows Subsystem for Linux) не работает поверх Win32 и не подвержен его влиянию. Существует также \\?\метод обхода, намеренный «черный ход», оставленный для программ, которые знают, что они делают. Даже если вы не можете создать C:\Example\....\, вы можете создать \\?\C:\Example\....\просто отлично.

Точно так же вы можете удалить такие каталоги с rmdir \\?\C:\path\...из Cmd (я не проверял с PowerShell все же).

Различные файловые менеджеры, архиваторы и т. Д. Могут использовать этот \\?\метод, чтобы иметь возможность использовать более длинные пути, чем обычно, - и при этом на них также не влияет код совместимости в Win32; они обходят удаление точек, а также перевод волшебных имен файлов, таких как CONили NUL.

Так что это может быть одна из ваших программ:

  1. всегда использует \\?\для доступа к файлам,
  2. случайно попытался создать папку с именем ....- но на самом деле невозможно узнать наверняка по факту.

13
Другой способ создания такой папки - использование альтернативных потоков данных. На ЦМД: echo "" > ....::$INDEX_ALLOCATION. Это создаст папку с именем ....(все еще указывая на текущую папку).
WorldSEnder

2
@DirkBoer Я нашел это: docs.microsoft.com/en-us/dotnet/standard/io/…
user31389

124
Microsoft называет это «Расширенным префиксом пути», а пути с этим префиксом называются «путями расширенной длины». (забавно: при поиске \\?\"в справочном источнике .NET это вызывает ошибку времени выполнения на их сервере).
dlatikay

2
@ Grawity Так. , , как мне теперь удалить эту папку?
Shadow503

21
У меня был любопытный случай клиента «ремонт компьютера», когда всякий раз, когда клиент создавал учетную запись на любом компьютере с Windows, он работал бы просто отлично, но как только он вошел в систему / перезагрузился, он не пустил бы его в свою учетную запись, вместо этого создав временную учетную запись для сессия. Локальная мастерская по ремонту ПК была поставлена ​​в тупик (по-прежнему обвиняла его). Оказывается, его настоящее имя - Кон, и он всегда использовал свое имя для своей учетной записи Windows ..... в тот день я узнал, что было нечто большее, чем просто com1волшебное имя файла
RozzA

23

В дополнение к ответу @ grawity, программа Win32 также может сделать это, напрямую вызвав «нативный» API. Если я не ошибаюсь, в данном случае это будет NtCreateDirectoryObject. Эти вызовы довольно хорошо документированы в настоящее время, особенно их аналог ядра (который вы не можете вызвать из программы Win32), в данном случае ZwCreateDirectoryObject.

Что касается «бесконечной глубины», то простым способом достижения этого является использование ссылок. Создайте каталог, затем внутри него создайте соединение с ним (вы можете использовать, mklink /jнапример), и вы получите очень глубокую структуру. В последний раз, когда я делал это на Windows 2000, рекурсия была окончена (вы не могли «копать бесконечно»). Возможно, на более новых ОС предел больше или удален, также вы можете создать, скажем, 10 каталогов, каждый из которых является дочерним по отношению к предыдущему, а в 10-м - создать ссылку на первую.


4
Это очень возможно злой гений материал прямо здесь ...
Аги Hammerthief

1
Я скопировал полные каталоги аналогично этому, чтобы искусственно заполнить диск для тестирования, чтобы определить, когда он был близок к установленному пределу.
mickeyf

Также возможно воспроизвести, используя cygwin'smkdir ....
lucidbrot

18

Существует более простой способ создания каталога. Из командной строки введите:

MD ....\

и нажмите Enter, он создаст каталог с четырьмя точками. Этот каталог также можно просматривать с помощью проводника.

В MS-DOS есть недостаток, который восходит к версии 1.0. MS знал об этом в течение некоторого времени, но не мог или не хотел бы это исправить. Они исправили проблему с PowerShell.

Кстати, если вы попробуете:

RD ....

Это не удастся удалить. Вы должны использовать этот специфический синтаксис, чтобы удалить его.

RD ....\

Я использую это на определенных серверах, которые я администратор. Я часто создаю папку пользователя в корне диска и не хочу, чтобы другой администратор пришел и удалил ее.

Поэтому я зайду в свою папку и создаю подпапку с именем CON, AUX или LPT и т. Д.

Если другой администратор хочет удалить мою папку, он должен знать, как удалить эту подпапку.

РЕДАКТИРОВАТЬ: я думал об этой дискуссии сегодня утром, и я решил сделать еще один шаг вперед. Я предполагаю, что моды решат, если это актуально.

Я не могу записать CD в папку.

Подумайте, если я MD c: \ test, то CD C: \ test и MD .... \ Я получаю C: \ test ....

и все хорошо.

Но CD .... терпит неудачу и пинает меня обратно в C: \ test. (CD .... \ делает то же самое.)

Однако я могу DIR .... и получить список DIR. я тоже могу

MD C: \ test .... \ temp и создает этот подкаталог в ....

Я также могу CD C: \ test .... \ temp и перейти в этот подподкаталог.

Но пока я в C: \ test .... \ temp, если я CD ... я снова в C: \ test.

Я не могу перейти в этот каталог, но я могу манипулировать папкой, создавая подпапки, и достаточно интересно что-то вроде

ЭХО "Тестирование" >> C: \ test .... \ test.txt

также работает и создает файл в этой папке. Таким образом, я могу создать папку с четырьмя точками, я могу добавить в нее файлы и папки, я могу получить списки каталогов, но я не могу вставить в нее компакт-диск. Может ли быть какой-то злой гений использовать для этого? Мои извинения модам, если я отклонился слишком далеко от курса.


6
Это скорее звучит как недостаток Win32 API, учитывая, что командная строка больше не была "MS-DOS" больше двадцати лет назад.
Gravity

2
Интересно, что если я пытаюсь удалить каталог в проводнике Windows, он вылетает, когда я создал его с вашей версией. Когда я создал его с Cygwin, он просто терпит неудачу и говорит так.
lucidbrot

У меня есть машины DOS 3.3 и DOS 6.0, и на них работают команды. Когда они переключились на 32 бит, проблема все еще была. он работает в окне CMD от win95 вплоть до сегодняшнего дня, включая все версии сервера. Теперь, когда мы переходим на Powershell, он больше не работает. После того, как я написал, я понял, что он создает каталог, но не дает того эффекта, который видит OP. Если я пытаюсь записать CD в каталог с четырьмя точками, это просто выгоняет меня обратно.
Ларрик

На моем компьютере с Windows 7 MD ....` only creates .... \ .... `tree - есть только один шаг рекурсии.
Томаш Зато

Любопытно, что менеджер FAR не видит в этом ничего особенного и создает / переименовывает / удаляет / перечисляет содержимое каталогов с именем «много точек» без каких-либо проблем.
RomanSt

-1

У меня такая же проблема. В моем случае это была опечатка в команде для публикации .NET Core:

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

Он создал каталог с именем «....», который я не смог удалить или переименовать. Этот каталог действовал как ссылка на родительский каталог. Если я зайду в эту папку, я все еще буду в родительской папке, но путь будет добавлен как «....».

Я перепробовал все команды, упомянутые в этом разделе, но ни одна из них не сработала. В моем понимании, так и было, потому что у меня были другие файлы и каталоги в родительском каталоге, поэтому мне пришлось использовать параметры, которые могут рекурсивно удалять весь контент.

Я узнал, что это команда:

rmdir /s /q ....\

Можно удалить каталог «....». Он только удаляет ссылку на родительский каталог, которым на самом деле является этот каталог «....», ни больше, ни меньше. Несмотря на аргументы команды:

  • / s - удаляет весь контент внутри удаленного каталога,
  • / q - удаляет без подтверждения,

родительский каталог остался нетронутым.


Не могли бы вы уточнить, почему у вас работает вторая команда?
Бурги

Отказался, потому что вы не дали никакого объяснения, почему команда работает или что она делает, например удаляет каталог, подкаталоги и файлы.
зимний фолк

Это фактически удаляет каталог с именем «....». Он только удаляет ссылку на родительский каталог, которым на самом деле является этот каталог «....», ни больше, ни меньше. Я перепробовал все команды, упомянутые в этом разделе, но ни одна из них не работает. Насколько я понимаю, эта команда работала, потому что у меня были другие файлы и каталоги в родительском каталоге, поэтому мне пришлось использовать параметры, которые могут рекурсивно удалять весь контент. Несмотря на аргументы команды, родительский каталог остался нетронутым.
Матеуш

Я попал в точно такую ​​же ситуацию с Visual Studio, и эта команда спасла мой бекон после нескольких часов разочарования, пытаясь выяснить, что происходит.
NPNelson
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.