Tại sao di chuyển thư mục đến / dev / null nguy hiểm?


28

Khi cố gắng di chuyển một test_dirthư mục đến /dev/null, tôi nhận được tin nhắn

mv: cannot overwrite non-directory ‘/dev/null’ with directory ‘test_dir/’

Vậy thì tại sao mọi người lại nói "Đừng chạy lệnh sudo mv ~ /dev/null, nó sẽ chuyển thư mục nhà của bạn sang một lỗ?"

Liên kết

Nhưng /homecũng là một thư mục.

Câu trả lời:


39

Vì người ta giả sử. Tôi là một trong những người đó cho đến khi tôi thử nó . Thật dễ hiểu tại sao mọi người cho rằng ... Nó có vẻ nguy hiểm ...

... nhưng bạn thực sự không thể chuyển mọi thứ sang /dev/null- Đó là một tệp đặc biệt chỉ hấp thụ các chuyển hướng (và gửi chúng vào hư vô). Nếu bạn cố gắng di chuyển một thư mục đến nó, hệ thống tập tin sẽ phát nổ một cách rõ ràng trên khuôn mặt của bạn và nếu bạn cố gắng di chuyển một tập tin vào nó, có thể bạn sẽ thay thế nó.

Liên kết đầu tiên sẽ xử lý các thư mục, nhưng đây là một thử nghiệm riêng biệt chỉ để ghi đè lên nó bằng một tệp. Như Rmano chỉ ra trong các bình luận, đây có lẽ là điều bạn không nên làm nếu không có sự giám sát của người lớn. Có rủi ro liên quan.

$ echo "this is my file" > test
$ cat test
this is my file

$ sudo mv test /dev/null
$ cat /dev/null
this is my file

# Fix this!
$ sudo rm /dev/null
$ sudo mknod -m 0666 /dev/null c 1 3

2
Không, di chuyển tệp sang / dev / null sẽ loại bỏ thiết bị null của bạn và thay thế nó bằng tệp đó, không loại bỏ nội dung của tệp.
psusi

2
Câu trả lời hơi mơ hồ. Di chuyển một tập tin /dev/nullsẽ không dẫn đến việc dữ liệu đó được chuyển vào hư vô. Nó sẽ dẫn đến việc dữ liệu được chuyển alright, nhưng /dev/nullsẽ ghi đè, và do đó bạn có thể di chuyển nó trở lại chưa :) Xem thêm askubuntu.com/questions/435887/...
Malte Skoruppa

1
Đúng, bởi vì sudo mv file /dev/null sẽ thành công, và có thể dễ dàng dẫn đến một hệ thống hoàn toàn không sử dụng được. Xem ý kiến ​​của tôi về câu hỏi được liên kết trong nhận xét của @MalteSkoruppa. Đây là một ví dụ rõ ràng khác về " sudochỉ trả trước khi bạn ba lần kiểm tra bạn biết bạn đang làm gì" ;-)
Rmano 18/03/2016

5
Bạn có thể thực hiện thử nghiệm tạo bản sao / dev / null của riêng mình: sudo mknod -m 0666 /tmp/mynull c 1 3--- và sau đó chơi với nó ;-)
Rmano

10
Đây là nơi những câu hỏi tốt nhất đến từ. "Gửi Ask Ubuntu, gần đây tôi đã chuyển bài tập về nhà sang / dev / null và nó đã bị hút vào 90% các tệp cấu hình hệ thống của tôi. Bây giờ tôi thấy các bài tiểu luận của Shakespeare mỗi khi tôi khởi động. Và trackpad của tôi không hoạt động. Halp! "
Oli

18

/dev/nullchỉ là một tệp, nó là tệp "ký tự đặc biệt" nhưng nó không bị ràng buộc bởi các quy tắc mà các tệp phải tuân theo. Điều đó được nói rằng bạn không bao giờ có thể chạy lệnh này:

$ mv ~ /dev/null

Các mvlệnh sẽ không cho phép điều này kể từ khi bạn đang di chuyển một thư mục vào một tập tin, mà chỉ không có ý nghĩa theo ngữ cảnh và mvbiết điều này.

Thí dụ

$ mkdir dir
$ touch afile
$ mv dir afile
mv: cannot overwrite non-directory ‘afile’ with directory ‘dir’

Bạn không thể sao chép vào /dev/nullmột trong hai tệp nhân vật nếu bạn cố sao chép một tệp thông thường lên nó.

$ cp ~/bzip2_1.0.6-4_amd64.deb /dev/null
$ ls -l |grep null
crw-rw-rw-  1 root root        1,   3 Mar 16 14:25 null

Về điều duy nhất bạn có thể làm với tệp này là sao chép mvqua tệp khác hoặc xóa tệp đó.

$ mv /path/to/afile /dev/null

Sau lệnh này, /dev/nulllà một tập tin thông thường. Tác động nguy hiểm nhất của thay đổi này là được cho /dev/nullkhông bao giờ xuất bất kỳ dữ liệu nào, vì vậy một số tập lệnh shell sẽ cho rằng

`... < /dev/null` 

tương đương với nói "không có gì". Giả định này bị phá vỡ có thể dẫn đến dữ liệu ngẫu nhiên (tốt, dữ liệu mà quá trình cuối cùng được ghi vào `/ dev / null ') được chèn vào các tệp hệ thống trên toàn hệ thống --- có thể dẫn đến một hệ thống bị hỏng hoàn toàn và không thể phục hồi.


13

Bạn có thể ghi tập tin hoặc các luồng đầu vào khác vào /dev/nullnhưng không phải thư mục. Nếu bạn thử di chuyển một thư mục đến /dev/nullnó sẽ báo lỗi vì đó /dev/nullkhông phải là một thư mục mà là một tệp.

Tuy nhiên, vì bạn muốn thử nghiệm /dev/null, trước tiên bạn được đề nghị biết hậu quả của việc di chuyển tệp để ghi đè /dev/nullvà cách phục hồi từ tình huống đó:

Theo đề xuất của @Rmano trong câu trả lời cho câu hỏi này, để thử nghiệm với /dev/nullchúng ta, chúng ta nên tạo một bản sao của nó và sau đó thực hiện thử nghiệm của chúng tôi. Vì vậy, hãy tạo /tmp/nullvà sử dụng nó cho mục đích thử nghiệm của chúng tôi:

sudo mknod -m 0666 /tmp/null c 1 3

Bây giờ trở đi, /tmp/nulllà của chúng tôi /dev/nullcho tất cả các mục đích:

Hãy để chúng tôi tạo một test_filevà một test_dirbên trong một thư mục được gọi là ask_ubuntu.

$ mkdir ask_ubuntu
$ cd ask_ubuntu
$ touch test_file
$ mkdir test_dir
$ echo "Let us test if we can recover our test_file." > test_file

Sau đây cho thấy nội dung của ask_ubuntuthư mục:

$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:10 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir
-rw-r--r-- 1 aditya aditya    0 Mar 18 17:10 test_file

Bây giờ hãy thử di chuyển test_fileđến /tmp/nullvà xem nội dung của ask_ubuntu:

$ sudo mv test_file /tmp/null   # This succeeds
$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir

Lệnh thành công và test_filekhông còn có sẵn. Bây giờ hãy thử chuyển test_dirsang /tmp/nullcái không thành công:

$ sudo mv test_dir/ /tmp/null 
mv: cannot overwrite non-directory ‘/tmp/null’ with directory ‘test_dir/’

test_dirvẫn còn hiện diện bên trong ask_ubuntu:

$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir

Bây giờ, hãy cho chúng tôi biết nếu chúng tôi có thể phục hồi test_filetừ /tmp/null:

$ cat /tmp/null
Let us test if we can recover our test_file.

Vì vậy, nó vẫn còn đó và /tmp/nullđó là một tập tin đặc biệt đã bị ghi đè và nó đã trở thành giống như bất kỳ tập tin bình thường khác. Chúng tôi có thể khôi phục tệp của mình bằng cách sao chép /tmp/nullgiống như bất kỳ tệp nào khác:

$ cp /tmp/null our_test_file
$ cat our_test_file
Let us test if we can recover our test_file.

Khôi phục tập tin.

Chú thích:

Nếu bạn không tạo /tmp/nullvà thử trực tiếp các lệnh đó bằng cách sử dụng /dev/null; đảm bảo bạn khôi phục tệp (nếu bạn cần) bằng cách chạy cp /dev/null our_test_file; và khôi phục /dev/nullcho các mục đích nó tồn tại trên hệ thống của chúng tôi bằng cách chạy các lệnh sau như được đưa ra trong câu hỏi được liên kết càng sớm càng tốt:

$ sudo rm /dev/null
$ sudo mknod /dev/null c 1 3
$ sudo chmod 666 /dev/null

Phần kết luận:

  • Vì vậy, không thể di chuyển một thư mục đến /dev/nullvà do đó không có câu hỏi về việc khôi phục thư mục từ đó.

  • Đối với các tệp có liên quan, nếu bạn trực tiếp di chuyển tệp đến /dev/null, bạn vẫn có thể khôi phục tệp như đã trình bày ở trên. Tuy nhiên, có hai trường hợp ngoại lệ:

    1. Trong khoảng thời gian bạn chạy sudo mv test_file /dev/nullcp /dev/null our_test_file, nếu bất kỳ tập lệnh gốc nào trong hệ thống sẽ ghi đè lên nó bằng cách chạy echo "Whatever text the root script wants to send to /dev/null" > /dev/null(hoặc các lệnh tương tự khác). Sau đó, chúng tôi không có cách dễ dàng để khôi phục tập tin của chúng tôi.

    2. Nếu bạn khởi động lại hệ thống giữa việc chạy hai lệnh đó. /dev/nullđược tạo lại khi khởi động, vì vậy tệp của chúng tôi bị mất khi tắt máy tính.

  • Nhưng nếu bạn muốn khôi phục các luồng đầu vào như echo "Stream this line to /dev/null" > /dev/null, bạn không thể khôi phục đó /dev/nulllà một tệp đặc biệt để loại bỏ các tệp không mong muốn và các luồng đầu vào và như bài viết trên Wikipedia đề cập, nó không cung cấp bất kỳ dữ liệu nào cho quá trình đọc từ nó.


Tham khảo: Bài viết trên Wikipedia về/dev/null


4
sudo mv test_file /dev/nullthay thế /dev/nullbằng test_file. Vì vậy, sau đó /dev/nullchỉ là một tập tin bình thường và bạn có thể đọc từ nó bất cứ điều gì bạn đã viết vào nó. ĐỪNG LÀM ĐIỀU NÀY
Florian Diesch 18/03/2016

"Vì vậy, không thể khôi phục bất kỳ tệp nào mà bạn đã chuyển sang / dev / null" nói đúng là không đúng. Nếu bạn đã tắt hệ thống, gắn kết nó và chạy phục hồi dữ liệu trên nó, bạn rất có thể khôi phục tệp nếu nó không bị ghi đè.
pzkpfw 18/03 '

@FlorianDiesch: Cập nhật câu trả lời :)
Aditya

7

Tất cả mọi thứ gửi đến /dev/nulllà âm thầm loại bỏ. Nếu bạn gõ:

echo "Hello World"

bạn Hello Worldlên màn hình Nếu bạn gõ:

echo "Hello World" >/dev/null

bạn không nhận được bất cứ điều gì trên màn hình.

Nhưng trong trường hợp lệnh di chuyển, lệnh mvcố gắng thay thế tệp / dev / null bằng thư mục, điều không thể. Bởi vì mọi thứ đều là một tệp trong Linux, / dev / null là một tệp. Tất nhiên là một tệp đặc biệt (tệp thiết bị), tệp đặc biệt cho phép truy cập vào phần cứng (như đĩa, phân vùng, thẻ âm thanh, cổng nối tiếp, ...). Trong trường hợp / dev / null, điều này không được liên kết với bất kỳ phần cứng nào nên dữ liệu được gửi tới nó sẽ bị loại bỏ trong âm thầm. Đây là lý do tại sao "họ" có thể đã gọi nó là một lỗ đen.


thư mục không phải là tập tin.
Thorbjørn Ravn Andersen

1
@ ThorbjørnRavnAndersen Trong thế giới Linux, các thư mục là các tệp!
Habeeb Perwad

@HabeebPerwad chỉ bên trong kernel.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen Xin lỗi, tôi đã không vào được kernel, vì vậy không có ý kiến ​​gì :)
Habeeb Perwad 19/03/2016

"Bởi vì mọi thứ là một tệp trong Linux" - Không chính xác. Có các tập tin và cũng có rất nhiều loại đối tượng khác. Không chắc chắn nơi bạn có được điều này.
ggPeti
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.