내 Windows 컴퓨터에는 일종의 토끼 구멍처럼 작동하는 네 개의 점이있는 폴더가 있습니다. 어떻게 일어 났습니까?


198

폴더 이름은 파일 탐색기에 일반 네 개의 점으로 나열되었습니다 .....

그것을 열어 보았을 때, 나는 똑같은 폴더를 계속해서 다시 열었던 일종의 끝없는 토끼 구멍 고리에 들어갔습니다. C:\ExamplePath\....\....\....\....\....등 의 경로 표시

하나의 특정 프로젝트에서 TypeScript 컴파일이 중단되었습니다. 이 폴더와 관련 문제를 발견하기까지 1 년 이상이 걸렸습니다. 폴더가 중첩 된 폴더에 뿌리를두고 있기 때문입니다. 나는 이와 같은 문제를 예상하지 않았으므로 결코 찾지 못했습니다.

특수 이름으로 인해 폴더를 일반적인 방식으로 삭제할 수 없습니다. 결국 명령 줄을 사용하고으로 부모 폴더를 삭제하여 제거 할 수 rd /s /q path있습니다.

나중에 폴더를 다시 만들려고했지만 파일 탐색기와 명령 줄을 모두 사용하여 폴더를 만들 수 없었습니다.

20 년 이상 Windows를 사용하면서이 버그를 본 적이 없었기 때문에 아마추어 사용자에게는 이것이 귀찮고 혼란스러운 문제라고 생각할 수 있습니다.

아무도 이것이 어떻게 일어날 수 있고이 문제를 재현하는 방법을 알고 있습니까?

최신 정보

관심있는 사람들을 위해 :이 경로는 TFS 폴더 안에 있습니다. 아마도 TFS는 @grawity가 설명한 바이 패스 방법 ( "다양한 파일 관리자, 아카이버 등" )

드문 TFS 버그를 발견 했습니까?


5
아래의 답변은 무슨 일이 일어나고 있는지, 의도적으로 재생산하는 방법과 수정하는 방법에 대해 자세히 설명하지만 왜 그런지 언급하지는 않습니다. 이후 ..나타내는 '하나 개의 폴더를 이동'하는 경로에서 사용할 수있는, 내가 어딘가에 라인을 따라, 일부 프로그램 또는 스크립트 경로를 생성하는 두 개의 문자열을 연결된 것을 짐작 것, 하나는 끝났다 .., 그리고 그 다음으로 시작 ..하고, 아래에 언급 된 기술 중 하나를 사용했기 때문에 경로 구분 기호가 없어도 경로를 만드는 데 성공했습니다.
3D1T0R

6
당신의 이름에 공백 만있는 폴더를 만들 경우 이상한 일들도 일어날 것입니다
phuclv

7
이 서버는 인터넷에 있습니까? 인터넷에서 웹 서버가 다음을 요청하는 해킹 시도를 정기적으로 봅니다 GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini. 이것이 악용하려는 어딘가에 분명히 취약점이 있습니다.
Andy Brown

4
@AndyBrown 훨씬 더 가능성 그건 ..아니고 ..... \winnt시작 지점의 깊이가 9 레벨 미만인 한 시작 지점의 깊이 (웹 루트) 에 관계없이 단순히 이동하는 방법 입니다. ..루트 디렉토리에서 나가면 루트 디렉토리에있게 된다는 사실에 의존합니다 .
홉스

5
@hobbs Linux의 Apache 액세스 로그에서 복사하여 붙여 넣습니다. 거기에 확실히 4 개의 점. 로그인 다른 해킹 시도가있다 사용 ..나는이 사람이 오히려 이상한 발견 이유였다.
앤디 브라운

답변:


303

Win32에서는 이름이 끝나는 파일 또는 폴더를 만들 수 없습니다. .모든 점이 끝에서 제거됩니다. 만들려고 test.차종이 test대신 나타납니다. (이것은 구 DOS / Win9x 시대 소프트웨어에서 8.3 이름과의 호환성을위한 것입니다.)

결과적으로라는 이름의 폴더에 액세스하려고 할 때마다 ....해당 이름이 빈 문자열로 줄어들고 이전에 있던 폴더로 돌아갑니다.

그러나 NT 커널은 그러한 이름을 허용합니다. Win32 API에 의해 부과 된 파일 이름 제한을 우회하는 다양한 메커니즘이 있습니다. 예를 들어 WSL (Linux for Windows Subsystem)은 Win32 위에서 실행되지 않으며 영향을받지 않습니다. \\?\우회 방법 도 있는데 , 그들이 무엇을하고 있는지 알고있는 프로그램을 위해 의도적으로 "백도어"가 남아있다. 당신이 만들 수는 없지만 C:\Example\....\, 잘 만들 있습니다 \\?\C:\Example\....\.

마찬가지로 rmdir \\?\C:\path\...Cmd에서 이러한 디렉토리를 삭제할 수 있습니다 (아직 PowerShell으로 테스트하지 않았습니다).

다양한 파일 관리자, 아카이버 등이이 \\?\방법을 사용하여 평소보다 긴 경로 이름을 사용할 수 있습니다. 그렇게하면 Win32의 호환성 코드에 영향을받지 않습니다. 그들은 도트 스트립과 우회 CON또는 같은 마술 파일 이름의 번역을 우회 NUL합니다.

그래서 그것은 당신의 프로그램 중 하나 일 수 있습니다 :

  1. 항상 \\?\파일에 액세스 하는 데 사용합니다.
  2. 실수로 이름이 지정된 폴더를 만들려고했지만 ....사실을 확실히 알 수는 없습니다.

13
이러한 폴더를 만드는 또 다른 방법은 대체 데이터 스트림을 사용하는 것입니다. cmd에서 : echo "" > ....::$INDEX_ALLOCATION. 그러면 ....현재 폴더를 가리키는 폴더가 생성됩니다 .
WorldSEnder

2
@DirkBoer 나는 이것을 발견했다 : docs.microsoft.com/en-us/dotnet/standard/io/…
user31389

124
Microsoft는이를 "확장 경로 접두사"라고하며 해당 접두사가있는 경로를 "확장 길이 경로"라고합니다. (재미 : \\?\".NET 참조 소스 에서 검색 하면 서버에서 런타임 오류가 발생합니다).
dlatikay

2
@grawity 그래서. . . 이 폴더를 삭제하려면 어떻게해야합니까?
Shadow503

21
클라이언트가 Windows 시스템에서 계정을 만들 때마다 호기심 많은 '컴퓨터 수리'클라이언트 사례가 있었지만 정상적으로 작동하지만 로그 / 재부팅하면 계정에 로그인하지 않고 대신 임시 계정을 만들었습니다. 세션. 지역의 PC 수리점은 충격을 받았습니다 (아직 충전). 그의 실제 이름은 Con이며, 그는 항상 그의 Windows 계정에 자신의 이름을 사용했습니다 ..... 그날 나는 com1마법의 파일 이름 이상의 것을 알게되었습니다
RozzA

23

@grawity의 답변 외에도 Win32 프로그램은 "기본"API를 직접 호출하여이를 수행 할 수 있습니다. 내가 실수하지 않으면 현재의 경우 NtCreateDirectoryObject가됩니다. 이러한 호출은 요즘 꽤 잘 문서화되어 있으며, 특히 커널 대응 (Win32 프로그램에서는 호출 할 수 없음),이 경우 ZwCreateDirectoryObject입니다.

"끝없는 깊이"와 관련하여 이것을 달성하는 쉬운 방법은 링크를 사용하는 것입니다. 디렉토리를 작성한 다음 그 내부에 디렉토리를 작성하고 ( mklink /j예를 들어 사용할 수 있음 ) 매우 깊은 구조로 끝납니다. 마지막으로이 작업을 Windows 2000에서 수행했을 때 재귀가 끝났습니다 ( "무한하게 발굴"할 수 없음). 아마도 새로운 OS에서 한계가 더 크거나 제거되었을 수도 있습니다. 또한 이전 디렉토리의 하위 디렉토리 인 10 개의 디렉토리를 만들고 10 번째 디렉토리에서 첫 번째 디렉토리로 다시 링크를 만들 수 있습니다.


4
그것은 아마도 아마도 사악한 천재
Agi Hammerthief

1
디스크가 설정된 한도에 가까워 졌는지 확인할 수 있도록 테스트하기 위해 디스크를 인위적으로 채울 수 있도록이 디렉토리와 비슷한 전체 디렉토리를 복사했습니다.
mickeyf

cygwin 'smkdir ....
lucidbrot을

18

디렉토리를 작성하는 더 쉬운 방법이 있습니다. 명령 프롬프트에서 다음을 입력하십시오.

MD ....\

Enter 키를 누르면 4 개의 점이있는 디렉토리가 만들어집니다. 이 디렉토리는 탐색기에서도 볼 수 있습니다.

MS-DOS에는 버전 1.0으로 돌아가는 결함이 있습니다. MS는 한동안 그것에 대해 알고 있었지만 고칠 수 없었거나 고칠 수 없었습니다. PowerShell의 문제를 해결했습니다.

BTW, 시도하면 :

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 CD 하위 디렉토리로 이동할 수도 있습니다.

그러나 C : \ test .... \ temp에서 CD 인 경우 .. C : \ test로 돌아갑니다.

해당 디렉토리에 CD를 넣을 수는 없지만 하위 폴더를 만들어 폴더를 조작 할 수 있습니다.

ECHO "테스트 중">> C : \ test .... \ test.txt

또한 작동하고 해당 폴더에 파일을 만듭니다. 그래서 네 개의 점이있는 폴더를 만들 수 있고, 파일과 폴더를 추가 할 수 있으며, 디렉토리를 얻을 수는 있지만 CD를 넣을 수는 없습니다. 이것에 어떤 종류의 사악한 천재가 사용될 수 있습니까? 코스에서 너무 멀리 벗어난 경우 개조에 대한 사과드립니다.


6
명령 프롬프트가 이제 약 20 년 동안 더 이상 "MS-DOS"가 아니었다는 점에서 Win32 API 결함처럼 들립니다.
grawity

2
흥미롭게도 Windows 탐색기에서 디렉토리를 삭제하려고하면 버전으로 디렉토리를 만들 때 충돌이 발생합니다. cygwin으로 만들면 단순히 실패하고 그렇게 말합니다.
lucidbrot

DOS 3.3과 DOS 6.0 컴퓨터가 있으며 명령이 작동합니다. 그들이 32 비트로 전환했을 때 문제는 여전히있었습니다. 모든 서버 버전을 포함하여 win95부터 현재까지 CMD 창에서 작동합니다. 이제 Powershell로 전환하고 더 이상 작동하지 않습니다. 나는 그것이 디렉토리를 만들지 만 OP 가보고있는 효과를 제공하지 않는다는 것을 깨달았다. 4 개의 점이있는 디렉토리에 CD를 넣으려고하면 그냥 쫓겨납니다.
Larryc

내 Windows 7 컴퓨터 MD ....` only creates .... \ ....`트리에는 재귀 단계가 하나뿐입니다.
Tomáš

흥미롭게도 FAR 관리자 는 이것을 특별한 방식으로 보지 않으며 전혀 문제없이 "많은 점"이라는 디렉토리의 내용을 생성 / 이름 바꾸기 / 삭제 / 나열합니다.
RomanSt

-1

나는 같은 문제가 있었다. 필자의 경우 .NET Core publish 명령의 오타였습니다.

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

제거하거나 이름을 바꿀 수없는 이름이 '....'인 디렉토리를 작성했습니다. 이 디렉토리는 상위 디렉토리에 대한 참조처럼 작동했습니다. 그 폴더 안에 들어가면 여전히 상위 폴더에 있지만 경로에 '.... \'가 추가되었습니다.

이 주제에서 언급 한 모든 명령을 시도했지만 그 중 아무것도 작동하지 않았습니다. 내 이해에는 부모 디렉토리에 다른 파일과 디렉토리가 있기 때문에 모든 내용을 재귀 적으로 삭제할 수있는 매개 변수를 사용해야했기 때문에 그렇게 행동했습니다.

나는이 명령을 발견했다.

rmdir /s /q ....\

'....'디렉토리를 제거 할 수 있습니다. 이 '....'디렉토리가 실제로는 더 이상 아무것도 아닌 상위 디렉토리에 대한 참조 만 삭제합니다. 명령 인수에도 불구하고 :

  • / s-제거 된 디렉토리 내의 모든 내용을 제거합니다.
  • / q-확인없이 제거

부모 디렉토리는 그대로 남아 있습니다.


두 번째 명령이 왜 효과가 있었는지 분명히 알 수 있습니까?
버기

디렉토리, 서브 디렉토리 및 파일 삭제와 같이 명령이 작동하는 이유 또는 수행하는 작업에 대한 설명을 제공하지 않았기 때문에 투표하지 않습니다.
Winter Faulk

실제로 이름이 '....'인 디렉토리를 삭제합니다. 이 '....'디렉토리가 실제로는 더 이상 아무것도 아닌 상위 디렉토리에 대한 참조 만 삭제합니다. 이 주제에서 언급 한 모든 명령을 시도했지만 그중 아무것도 작동하지 않습니다. 이해하기 때문에이 명령은 부모 디렉토리에 다른 파일과 디렉토리가 있으므로 모든 내용을 재귀 적으로 삭제할 수있는 매개 변수를 사용해야했기 때문에 작동했습니다. 명령 인수에도 불구하고 상위 디렉토리는 그대로 유지됩니다.
Mateusz

나는 Visual Studio를 사용 하여이 동일한 상황에 처하게 되었고이 명령은 몇 시간의 좌절 끝에 무슨 일이 일어나고 있는지 알아 내려고 노력하면서 베이컨을 구했습니다.
NPNelson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.