Trên máy Windows của tôi, tôi có một thư mục có tên bốn chấm hoạt động giống như một loại lỗ thỏ - điều đó đã xảy ra như thế nào?


198

Tên thư mục đã được liệt kê trong File Explorer chỉ với bốn dấu chấm đơn giản .....

Khi tôi thử mở nó, tôi đã đi vào một loại vòng lặp lỗ thỏ vô tận, nơi tôi mở cùng một thư mục chính xác - tôi có thể làm điều này vô tận. Hiển thị đường dẫn như C:\ExamplePath\....\....\....\....\...., vv

Nó đã treo phần biên dịch TypeScript của tôi trong một dự án cụ thể. Phải mất hơn một năm trước khi tôi tìm thấy thư mục này và các vấn đề liên quan, bởi vì nó được bắt nguồn sâu trong các thư mục lồng nhau. Tôi không bao giờ mong đợi một vấn đề như thế này, vì vậy tôi không bao giờ tìm kiếm nó.

Tôi không thể xóa thư mục theo cách thông thường vì tên đặc biệt. Cuối cùng, tôi có thể loại bỏ nó bằng cách sử dụng dòng lệnh và xóa thư mục mẹ với rd /s /q path.

Sau đó, tôi đã cố gắng tạo lại thư mục nhưng không thể làm như vậy với cả File Explorer và dòng lệnh.

Trong hơn 20 năm sử dụng Windows, tôi chưa bao giờ thấy lỗi này trước đây, vì vậy tôi có thể tưởng tượng rằng nó thực sự sẽ là một vấn đề khó chịu và khó hiểu đối với người dùng nghiệp dư.

Có ai biết làm thế nào điều này có thể xảy ra và làm thế nào để tái tạo vấn đề này?

Cập nhật

Đối với những người quan tâm: đường dẫn này nằm sâu trong thư mục TFS. Vì vậy, có lẽ TFS sử dụng phương thức bypass @grawity đã giải thích ( "Trình quản lý tệp, trình lưu trữ khác nhau, v.v." )

Có phải tôi đã vấp phải một lỗi TFS hiếm gặp?


5
Các câu trả lời dưới đây nêu chi tiết những gì đang xảy ra, làm thế nào để tái tạo nó một cách có chủ ý và cách khắc phục nó, nhưng họ không đề cập đến lý do tại sao nó xảy ra. Vì ..có thể được sử dụng trong một đường dẫn để chỉ ra 'đi lên một thư mục', tôi sẽ mạo hiểm đoán rằng ở đâu đó dọc theo dòng, một số chương trình hoặc tập lệnh nối hai chuỗi để tạo một đường dẫn, một chuỗi kết thúc ..và tiếp theo bắt đầu ..và vì nó đã sử dụng một trong những kỹ thuật được đề cập dưới đây, nó đã thành công trong việc tạo đường dẫn, mặc dù nó bị thiếu dấu phân cách thư mục giữa chúng.
3D1T0R

6
những điều kỳ lạ cũng sẽ xảy ra nếu bạn tạo một thư mục chỉ có khoảng trắng trong tên của nó
phuclv

7
Là máy chủ này trên internet? Chỉ để cảnh báo bạn, tôi thường xuyên thấy các nỗ lực hack trên internet đối với các máy chủ web yêu cầu : GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini. Rõ ràng có / có một số lỗ hổng ở đâu đó mà điều này cố gắng khai thác.
Andy Brown

4
@AndyBrown nhiều khả năng đó .., không phải ..... Nó chỉ đơn giản là một cách để đi qua \winntbất kể độ sâu của điểm bắt đầu (gốc web), miễn là điểm bắt đầu sâu dưới 9 cấp. Nó dựa vào thực tế là đi ..từ thư mục gốc để lại cho bạn thư mục gốc.
hobbs

5
@hobbs Đó là bản sao và dán từ nhật ký truy cập Apache trên linux. Chắc chắn có 4 chấm trong đó. Có rất nỗ lực Hack khác đăng nhập mà làm sử dụng ..đó là lý do tại sao tôi thấy cái này khá kỳ quặc.
Andy Brown

Câu trả lời:


303

Win32 không cho phép bạn tạo các tệp hoặc thư mục có tên kết thúc .- tất cả các dấu chấm được xóa từ cuối. Đang cố gắng để tạo ra test.làm cho testxuất hiện để thay thế. (Đây là tính tương thích với 8.3 tên trong phần mềm cũ của DOS / Win9x.)

Kết quả là, bất cứ khi nào bạn cố gắng truy cập vào một thư mục có tên ...., tên của nó sẽ bị giảm xuống chuỗi trống và bạn quay lại thư mục mà bạn đã ở trước đó.

Hạt nhân NT, tuy nhiên, cho phép các tên như vậy. Có nhiều cơ chế khác nhau vượt qua các giới hạn tên tệp được áp dụng bởi API Win32 - ví dụ: WSL (Hệ thống con Windows cho Linux) không chạy trên Win32 và không bị ảnh hưởng bởi nó. Ngoài ra còn có \\?\phương pháp bỏ qua, một "cửa hậu" có chủ ý còn lại cho các chương trình biết họ đang làm gì. Mặc dù bạn không thể tạo C:\Example\....\, bạn có thể tạo \\?\C:\Example\....\tốt.

Tương tự như vậy, bạn có thể xóa các thư mục như vậy với rmdir \\?\C:\path\...từ Cmd (Tôi chưa thử nghiệm với PowerShell).

Các trình quản lý tệp, trình lưu trữ khác nhau, v.v. có thể sử dụng \\?\phương thức này để có thể sử dụng tên đường dẫn dài hơn bình thường - và bằng cách đó, chúng cũng không bị ảnh hưởng bởi mã tương thích trong Win32; họ bỏ qua việc tước dấu chấm, cũng như dịch các tên tập tin ma thuật như CONhay NUL.

Vì vậy, nó có thể là một trong những chương trình của bạn:

  1. luôn luôn sử dụng \\?\để truy cập các tập tin,
  2. vô tình cố gắng tạo một thư mục có tên ....- nhưng thực tế không thể biết chắc chắn sau thực tế.

13
một cách khác để tạo một thư mục như vậy là bằng cách sử dụng các luồng dữ liệu thay thế. Trên cmd : echo "" > ....::$INDEX_ALLOCATION. Điều này sẽ tạo một thư mục có tên ....(vẫn trỏ đến thư mục hiện tại).
WorldSEnder


124
Microsoft gọi đây là "Tiền tố đường dẫn mở rộng" và các đường dẫn có tiền tố đó được gọi là "đường dẫn có độ dài mở rộng". (buồn cười: khi bạn tìm kiếm \\?\"trong nguồn tham chiếu .NET , nó gây ra lỗi thời gian chạy trên máy chủ của họ).
dlatikay

2
@grawity Vậy. . . Làm thế nào tôi nên xóa thư mục này bây giờ?
Shadow503

21
Tôi có một trường hợp khách hàng 'sửa chữa máy tính' tò mò, trong đó bất cứ khi nào khách hàng tạo tài khoản trên bất kỳ máy windows nào, nó sẽ hoạt động tốt nhưng một khi anh ta đăng nhập / khởi động lại, nó sẽ không cho anh ta vào tài khoản của mình, thay vào đó là tạo tài khoản tạm thời cho phiên. Các cửa hàng sửa chữa máy tính địa phương đã bị cản trở (vẫn tính tiền). Hóa ra tên thật của anh ta là Con & anh ta luôn sử dụng tên của mình cho tài khoản windows của mình ..... vào ngày đó tôi đã biết rằng không chỉ có com1một tên tập tin ma thuật
RozzA

23

Ngoài câu trả lời của @ grawity, một chương trình Win32 cũng có thể thực hiện điều này bằng cách gọi trực tiếp API "gốc". Nếu tôi không nhầm, trong trường hợp hiện tại, đó sẽ là NtCreateDirectoryObject. Những cuộc gọi này hiện được ghi lại khá tốt, đặc biệt là đối tác hạt nhân của chúng (mà bạn không thể gọi từ chương trình Win32), trong trường hợp này là ZwCreateDirectoryObject.

Về "độ sâu vô tận", một cách dễ dàng để đạt được điều này là sử dụng các liên kết. Tạo một thư mục, sau đó bên trong nó, tạo một đường nối với nó ( mklink /jví dụ bạn có thể sử dụng ) và bạn sẽ kết thúc với một cấu trúc rất sâu. Lần trước tôi đã làm điều này là trên Windows 2000, đã có một kết thúc cho phép đệ quy (bạn không thể "đào vô hạn"). Có thể trên hệ điều hành mới hơn, giới hạn lớn hơn hoặc bị xóa, bạn cũng có thể tạo 10 thư mục, mỗi thư mục là con của thư mục trước và trong thư mục thứ 10, tạo liên kết quay lại thư mục đầu tiên.


4
Đó là tài liệu thiên tài rất có thể ngay tại đó ...
Agi Hammerthief

1
Tôi đã sao chép các thư mục đầy đủ tương tự như thế này để lấp đầy đĩa một cách giả tạo để kiểm tra khả năng xác định khi nào nó gần với giới hạn đã đặt.
mickeyf

Cũng có thể sao chép bằng cygwin'smkdir ....
lucidbrot

18

Có một cách dễ dàng hơn để tạo thư mục. Từ loại dấu nhắc lệnh:

MD ....\

và nhấn enter, nó sẽ tạo một thư mục có bốn dấu chấm. Thư mục này cũng có thể xem được với explorer.

Có một lỗ hổng trong MS-DOS quay trở lại phiên bản 1.0. MS đã biết về nó một thời gian nhưng không thể hoặc sẽ không sửa nó. Họ đã khắc phục sự cố với PowerShell.

BTW, nếu bạn thử:

RD ....

Nó sẽ không xóa. Bạn cần sử dụng cú pháp cụ thể này để loại bỏ nó.

RD ....\

Tôi sử dụng điều này trên các máy chủ nhất định mà tôi quản trị. Tôi thường tạo một thư mục người dùng trên thư mục gốc của đĩa và tôi không muốn một quản trị viên khác đi cùng và xóa nó.

Vì vậy, tôi sẽ vào trong thư mục của mình và tạo một thư mục con có tên CON, AUX hoặc LPT, v.v ...

Nếu một Quản trị viên khác muốn xóa thư mục của tôi, họ cần biết cách xóa thư mục con này trước.

EDIT: Tôi đã suy nghĩ về cuộc thảo luận này sáng nay và tôi quyết định tiến thêm một bước này. Tôi giả sử các mod sẽ quyết định nếu điều này có liên quan.

Tôi không thể CD vào thư mục.

Hãy xem xét, nếu tôi MD c: \ test thì CD C: \ test và MD .... \ Tôi kết thúc với C: \ test ....

và tất cả đều tốt

Nhưng CD .... thất bại và đưa tôi trở lại C: \ test. (CD .... \ làm tương tự.)

Tuy nhiên tôi có thể TRỰC TIẾP .... và nhận được một danh sách dir. tôi cũng có thể

MD C: \ test .... \ temp và nó tạo ra thư mục con đó trong ....

Tôi cũng có thể CD C: \ test .... \ temp và vào thư mục con đó.

Nhưng trong khi ở C: \ test .... \ temp, nếu tôi CD .. tôi quay lại C: \ test.

Tôi không thể cd vào thư mục đó, nhưng tôi có thể thao tác thư mục bằng cách tạo các thư mục con và đủ thú vị như

ECHO "Kiểm tra" >> C: \ test .... \ test.txt

cũng hoạt động và tạo một tập tin trong thư mục đó. Vì vậy, tôi có thể tạo một thư mục có bốn dấu chấm, tôi có thể thêm tệp và thư mục vào đó, tôi có thể lấy danh sách thư mục của nó, nhưng tôi không thể CD vào đó. Có thể có một số loại thiên tài ác sử dụng cho điều này? Tôi xin lỗi các mod nếu tôi đi lạc quá xa khóa học.


6
Điều đó nghe có vẻ như là một lỗ hổng API Win32, do dấu nhắc lệnh đã không còn là "MS-DOS" trong khoảng hai mươi năm nay.
grawity

2
Thật thú vị, nếu tôi cố xóa thư mục trong windows explorer, nó sẽ gặp sự cố khi tôi tạo nó với phiên bản của bạn. Khi tôi tạo nó bằng cygwin, nó chỉ đơn giản là thất bại và nói như vậy.
lucidbrot

Tôi có một máy DOS 3.3 và DOS 6.0 và các lệnh hoạt động trên chúng. Khi họ chuyển sang 32 bit, vấn đề vẫn còn đó. nó hoạt động trong cửa sổ CMD từ win95 cho đến ngày hôm nay, bao gồm tất cả các phiên bản máy chủ. Bây giờ chúng tôi đang chuyển sang Powershell Nó không còn hoạt động. Tôi nhận ra sau khi tôi viết rằng nó tạo thư mục nhưng nó không cung cấp hiệu ứng mà OP đang thấy. Nếu tôi cố gắng đưa CD vào thư mục có bốn dấu chấm, nó sẽ khiến tôi bị loại.
Larryc

Trên máy Windows 7 của tôi MD ....` only creates .... \ .... `cây - chỉ có một bước đệ quy.
Tomáš Zato

Người quản lý FAR tò mò không thấy điều này là đặc biệt theo bất kỳ cách nào và tạo / đổi tên / xóa / liệt kê nội dung của các thư mục có tên "rất nhiều dấu chấm" mà không có vấn đề gì cả.
RomanSt

-1

Tôi đã từng gặp vấn đề tương tự. Trong trường hợp của tôi, đó là một lỗi chính tả cho xuất bản .NET Core:

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

Nó tạo thư mục có tên '....', mà tôi không thể xóa hoặc đổi tên. Thư mục này hoạt động như tham chiếu đến thư mục cha. Nếu tôi vào trong thư mục đó, tôi vẫn ở trong thư mục mẹ, nhưng đường dẫn được thêm vào bởi '.... \'.

Tôi đã thử tất cả các lệnh được đề cập trong chủ đề này, nhưng không có lệnh nào trong số chúng hoạt động. Theo hiểu biết của tôi, nó đã hành động như vậy, vì tôi có các tệp và thư mục khác trong thư mục mẹ, vì vậy tôi phải sử dụng các tham số có thể xóa đệ quy tất cả nội dung.

Tôi phát hiện ra rằng lệnh này:

rmdir /s /q ....\

có thể xóa thư mục '....'. Nó chỉ xóa tham chiếu đến thư mục cha, mà thư mục '....' này thực sự là, không hơn, không kém. Bất chấp các đối số lệnh:

  • / s - xóa tất cả nội dung trong thư mục đã xóa,
  • / q - xóa mà không cần xác nhận,

thư mục cha vẫn còn nguyên.


Bạn có thể làm rõ lý do tại sao lệnh thứ hai làm việc cho bạn?
Burgi

Bỏ phiếu xuống vì bạn không đưa ra bất kỳ giải thích nào tại sao lệnh hoạt động hoặc những gì nó làm, chẳng hạn như xóa thư mục, thư mục con và tệp.
Winter Faulk

Điều này thực sự xóa thư mục có tên '....'. Nó chỉ xóa tham chiếu đến thư mục cha, mà thư mục '....' này thực sự là, không hơn, không kém. Tôi đã thử tất cả các lệnh được đề cập trong chủ đề này, nhưng không có lệnh nào hoạt động. Theo hiểu biết của tôi, lệnh này đã hoạt động, vì tôi có các tệp và thư mục khác trong thư mục mẹ, vì vậy tôi phải sử dụng các tham số có thể xóa đệ quy tất cả nội dung. Mặc dù các đối số lệnh, thư mục cha vẫn còn nguyên.
Mateusz

Tôi đã gặp tình huống tương tự chính xác bằng cách nào đó với Visual Studio và lệnh này đã cứu được thịt xông khói của tôi sau nhiều giờ thất vọng khi cố gắng tìm hiểu chuyện gì đang xảy ra.
NPNelson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.