디렉토리를 / dev / null로 옮기는 것이 왜 위험한가요?


28

test_dir디렉토리를 (으) 로 이동하려고 /dev/null하면 메시지가 나타납니다.

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

그렇다면 왜 사람들은 "명령을 실행하지 않으면 sudo mv ~ /dev/null홈 디렉토리를 구멍으로 옮길 것입니까?"라고 말합니다.

링크

그러나 /home디렉토리이기도합니다.

답변:


38

사람들이 가정하기 때문입니다. 나는 그것을 테스트 할 때까지 그 사람들 중 하나였습니다 . 사람들이 왜 가정하는지 이해하기 쉽습니다 ... 위험 해 보입니다 ...

...하지만 실제로 물건을 옮길 수는 없습니다. /dev/null리디렉션을 흡수하고 아무것도 보내지 않는 특수 파일입니다. 디렉토리를 디렉토리로 이동하려고하면 파일 시스템이 눈에 띄게 폭발하여 파일을 이동하려고하면 대체하게됩니다.

첫 번째 링크는 디렉토리를 다루지 만 파일로 덮어 쓰는 별도의 테스트가 있습니다. Rmano가 의견에서 지적했듯이 이것은 아마도 성인의 감독 없이는해서는 안되는 일입니다. 위험이 있습니다.

$ 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
아니요, 파일을 / dev / null로 이동하면 null 장치가 제거되고 해당 파일로 대체되어 파일 내용이 제거되지 않습니다.
psusi

2
대답은 약간 모호합니다. 파일을 /dev/null로 이동해도 해당 데이터는 아무것도 이동 하지 않습니다. 데이터가 올바르게/dev/null 이동 하지만 덮어 쓰여질
Malte Skoruppa

1
그렇기 때문에 성공할 sudo mv file /dev/null 것이며 완전히 사용할 수없는 시스템으로 쉽게 이어질 수 있기 때문 입니다 . @MalteSkoruppa의 의견에 링크 된 질문에 대한 내 의견을 참조하십시오. 이것은 " sudo당신 무엇을하고 있는지 3 번 확인한 경우에만
우선합니다

5
/ dev / null의 사본을 직접 만들어 실험 해 볼 수 있습니다 : sudo mknod -m 0666 /tmp/mynull c 1 3--- 그리고 그것을 가지고 놀아 라 ;-)
Rmano

10
가장 좋은 질문이 나오는 곳입니다. "우분투에게 물어보세요. 최근에 실수로 숙제를 / dev / null로 옮겼는데 시스템 구성 파일의 90 %에 빠졌습니다. 이제 부팅 할 때마다 셰익스피어 에세이가 표시됩니다. 트랙 패드가 작동하지 않습니다. "
Oli

18

/dev/null파일 일 뿐이고 "특수 문자"파일이지만 파일이 따라야하는 규칙에 덜 구속 적이지는 않습니다. 이 명령을 절대 실행할 수 없다고합니다.

$ mv ~ /dev/null

mv파일로 디렉토리를 이동하고 있기 때문에 단지 문맥 이해가되지 않는 명령이 허용하지 않습니다 mv이 알고있다.

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

/dev/null일반 파일을 복사하려고하면 문자 파일 인 경우 복사 할 수 없습니다 .

$ 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

이 파일에 대해 할 수있는 유일한 일은 mv다른 파일을 복사 하거나 삭제하는 것입니다.

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

이 명령 뒤에는 /dev/null일반 파일입니다. 이 변화의 가장 위험한 효과는 해당이됩니다 /dev/null하도록되어 결코 쉘 스크립트의 숫자가 가정 있도록, 출력 데이터

`... < /dev/null` 

"아무것도"라고 말하는 것과 같습니다. 이 가정이 깨지면 시스템 주변의 시스템 파일에 무작위 데이터 (마지막 프로세스가`/ dev / null '에 쓴 데이터)가 삽입되어 완전히 고장 나고 복구 할 수없는 시스템으로 이어질 수 있습니다.


13

파일이나 다른 입력 스트림을 /dev/null디렉토리에 쓸 수 있지만 디렉토리에는 쓸 수 없습니다. 디렉토리로 이동하려고 하면 디렉토리가 아니라 파일 /dev/null이므로 오류를보고 /dev/null합니다.

그러나을 (를) 실험하고 싶을 /dev/null때는 먼저 파일을 덮어 쓰기로 이동 한 결과 /dev/null와 해당 상황에서 복구하는 방법을 알아야합니다.

@Rmano 가 제안한 것처럼 , 이 질문에 대한 대답 에서 실험하기 위해/dev/null 오히려 사본을 만든 다음 실험을 수행해야합니다. /tmp/null실험 목적으로 사용하고 작성해 보겠습니다 .

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

이제는 모든 목적을 위해 /tmp/null우리 /dev/null입니다.

라는 디렉토리 안에 a test_filetest_dir내부를 만들어 봅시다.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

다음은 내용을 보여줍니다 ask_ubuntu 디렉토리 .

$ 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

이제 우리를 이동하려고 test_file/tmp/null와의 내용을 참조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

명령이 성공하여 test_file더 이상 사용할 수 없습니다. 이제 이동하려고 test_dir/tmp/null성공하지 않는 :

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

test_dir안에 여전히 존재합니다 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

이제, 우리는 우리의 복구 할 수 있다면 우리가 봅시다 test_file에서 /tmp/null:

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

그래서 그것은 여전히 ​​거기에 있으며 /tmp/null어떤 특수 파일이 덮어 쓰여져 다른 일반 파일처럼되었습니다. /tmp/null다른 파일과 마찬가지로 복사하여 파일을 복구 할 수 있습니다 .

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

파일이 복구되었습니다.

노트 :

/tmp/null직접 사용하여 해당 명령을 작성 하고 시도 하지 않은 경우 /dev/null; 다음을 실행하여 파일을 복구하십시오 (필요한 경우) cp /dev/null our_test_file. /dev/null가능한 빨리 링크 된 질문에 제공된 다음 명령을 실행하여 시스템에 존재하는 목적으로 복원 하십시오.

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

결론:

  • 따라서 디렉토리를 이동할 수 없으므로 디렉토리를 /dev/null복구 할 필요가 없습니다.

  • 파일과 관련하여 파일을 (으)로 직접 이동 /dev/null해도 위에서 설명한대로 파일을 복구 할 수 있습니다. 그러나 두 가지 예외가 있습니다.

    1. 이 기간 동안 sudo mv test_file /dev/null및 을 실행 cp /dev/null our_test_file하면 시스템의 루트 스크립트가 실행 echo "Whatever text the root script wants to send to /dev/null" > /dev/null(또는 다른 유사한 명령) 하여 루트 스크립트를 덮어 씁니다 . 그런 다음 파일을 쉽게 복구 할 수있는 방법이 없습니다.

    2. 두 명령을 실행하는 사이에 시스템을 재부팅하면 /dev/null부팅시 다시 생성되므로 컴퓨터를 종료하면 파일이 손실됩니다.

  • 그러나와 같은 입력 스트림을 복구하려는 경우 원치 않는 파일과 입력 스트림을 제거하는 특수 파일 echo "Stream this line to /dev/null" > /dev/null이므로 /dev/nullWikipedia 기사에서 언급했듯이 읽은 프로세스에 데이터를 제공하지 않습니다.


참조 : Wikipedia Article on/dev/null


4
sudo mv test_file /dev/null로 대체 /dev/null됩니다 test_file. 따라서 그 후에 /dev/null는 정상적인 파일이므로 파일에서 작성한 것을 읽을 수 있습니다. DO NOT DO THAT
플로리안 Diesch

"따라서 / dev / null로 이동 한 파일은 복구 할 수 없습니다." 시스템을 종료하고 마운트 한 후 데이터 복구를 실행하면 파일을 덮어 쓰지 않은 경우 파일을 복구 할 수 있습니다.
pzkpfw

@FlorianDiesch : 답변 업데이트 :)
Aditya

7

전송 된 모든 내용 /dev/null은 자동으로 삭제됩니다. 입력하면 :

echo "Hello World"

당신은 얻을 Hello World화면. 입력하면 :

echo "Hello World" >/dev/null

화면에 아무것도 표시되지 않습니다.

그러나 move 명령의 경우 명령 mv은 / dev / null 파일을 디렉토리로 바꾸려고 시도합니다. 모든 것은 Linux에서 파일이므로 / dev / null은 파일입니다. 물론 특별한 장치 (장치 파일), 디스크, 파티션, 사운드 카드, 직렬 포트 등과 같은 하드웨어에 액세스 할 수있는 특수 파일. / dev / null의 경우 하드웨어와 연결되어 있지 않으므로 전송 된 데이터는 자동으로 삭제됩니다. 이것이 "그들"이 블랙홀이라고 불렀던 이유입니다.


디렉토리는 파일이 아닙니다.
Thorbjørn Ravn Andersen

1
@ ThorbjørnRavnAndersen 리눅스 세계에서 디렉토리는 파일입니다!
Habeeb Perwad

@HabeebPerwad는 커널 내부에서만 가능합니다.
Thorbjørn Ravn Andersen 9

@ ThorbjørnRavnAndersen 죄송합니다, 나는 커널에 들어 가지 않았으므로 전혀 모른다 :)
Habeeb Perwad

"모든 것이 리눅스에서 파일이기 때문에"-틀렸다. 파일과 다른 많은 종류의 객체가 있습니다. 어디서 구했는지 잘 모르겠습니다.
ggPeti
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.