![위험한 Linux 명령: 어떤 면에서 한 명령은 해롭고 다른 명령은 효과가 없는 것처럼 보입니까?](https://linux55.com/image/225835/%EC%9C%84%ED%97%98%ED%95%9C%20Linux%20%EB%AA%85%EB%A0%B9%3A%20%EC%96%B4%EB%96%A4%20%EB%A9%B4%EC%97%90%EC%84%9C%20%ED%95%9C%20%EB%AA%85%EB%A0%B9%EC%9D%80%20%ED%95%B4%EB%A1%AD%EA%B3%A0%20%EB%8B%A4%EB%A5%B8%20%EB%AA%85%EB%A0%B9%EC%9D%80%20%ED%9A%A8%EA%B3%BC%EA%B0%80%20%EC%97%86%EB%8A%94%20%EA%B2%83%EC%B2%98%EB%9F%BC%20%EB%B3%B4%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
많은 사람들이 알고 있듯이 >>
연산자는 명령 뒤에 입력하는 내용에 명령의 출력을 추가합니다.
파일을 덮어쓰거나 파일에 데이터를 추가하는 데 사용될 수 있다는 것을 알고 있지만 악의적인 방식으로 사용될 수도 있다는 것도 알고 있습니다. 드라이브나 파티션을 출력으로 사용하면 명령의 출력이 다음 위치에 직접 기록됩니다. 해당 드라이브나 파티션이 손상될 수 있습니다.
예를 들어, >> /dev/sda
명령에 추가하면 명령의 출력이 /dev/sda
.
호기심에 Ubuntu VM을 설정하고 재미있게 사용해 보았습니다. 컴퓨터의 가상 드라이브는 /dev/vda
, /dev/vda1
부팅 파티션은 , /dev/vda2
루트 파티션은 이며, 별도의 파티션이 없습니다 /home
.
이제 재미있는 부분이 나옵니다.
echo "Hello world" >> /dev/vda
가상 머신에서 (루트로) 실행한 다음 다시 시작해도 아무 것도 손상된 것 같지 않습니다 . 재부팅 후 정상적으로 시작되었고 그 이후에는 모든 것이 괜찮아 보였습니다.- 그러나
echo "Hello world" >> /dev/vda1
동일한 가상 머신(또한 루트)에서 실행한 다음 다시 시작하면 부팅에 실패합니다.
그래서 나는 출력 쓰기가 왜 vda1
나쁜지 이미 알고 있습니다(부팅 파티션이 손상됨). 내 질문은: 출력을 추가하면 /dev/vda
아무 일도 일어나지 않는 것처럼 보이지만 출력을 추가하면 문제가 발생하는 이유 는 무엇입니까 /dev/vda1
? 결과를 전달하면 명령 출력이 /dev/vda2
"이후"이기 때문에 기록됩니까 ?/dev/vda1
vda
vda2
답변1
UEFI 모드로 부팅하신 것 같습니다. 이는 부팅 프로세스가 드라이브의 헤드 끝을 확인하지 않음을 의미합니다.
BIOS 모드(별칭 CSM 레거시 모드)에서 부팅하는 경우 드라이브의 첫 번째 바이트에는 마스터 부트 레코드 MBR이 포함되어야 합니다. 파티션 테이블도 디스크 헤드와 매우 가까운 곳에 저장됩니다.
블록 장치에서 사용되는 경우 >>
추가되지 않고 드라이브 헤드에 씁니다. /dev/sdc
USB 플래시 드라이브가 포함된 아래 데모를 참조하세요 .
$ sudo bash -c 'echo "Hello world" >> /dev/sdc'
$ sudo dd if=/dev/sdc bs=12 count=1
Hello world
1+0 poster in
1+0 poster ut
12 byte kopierade, 0,00127171 s, 9,4 kB/s
설명이 정확하다면 헤드엔드에 긴 데이터 블록(MBR뿐만 아니라 파티션 테이블을 덮을 만큼 긴)을 쓰면 프로세스가 손상됩니다.
BIOS 부팅을 위해 설정된 드라이브에서 드라이브 헤드에 쓰면 MBR이 손상되었기 때문에 부팅 프로세스가 손상됩니다.
편집 1:
FAT32 파일 시스템의 파티션 헤더를 같은 방식으로 쓰면 파일 시스템이 손상되었음을 알 수 있습니다.
$ lsblk -o model,name,size,fstype,label,mountpoint /dev/sdc
MODEL NAME SIZE FSTYPE LABEL MOUNTPOINT
Voyager sdc 7,5G
├─sdc1 256M vfat
└─sdc2 512M vfat
$ sudo dd if=/dev/sdc1 bs=12 count=1
�X�mkfs.fat1+0 poster in
1+0 poster ut
12 byte kopierade, 0,00118622 s, 10,1 kB/s
$ sudo bash -c 'echo "Hello world" >> /dev/sdc1'
$ lsblk -o model,name,size,fstype,label,mountpoint /dev/sdc
MODEL NAME SIZE FSTYPE LABEL MOUNTPOINT
Voyager sdc 7,5G
├─sdc1 256M
└─sdc2 512M vfat
$ sudo dd if=/dev/sdc1 bs=12 count=1
Hello world
1+0 poster in
1+0 poster ut
12 byte kopierade, 0,00118594 s, 10,1 kB/s
편집 2:
파티션 #2는 영향을 받지 않습니다. ASCII가 아닌 문자의 보기 흉한 표현뿐만 아니라 16진수 덤프도 살펴보는 것이 좋습니다.
$ sudo dd if=/dev/sdc2 bs=12 count=1 | hexdump -C
1+0 poster in
1+0 poster ut
12 byte kopierade, 0,00129779 s, 9,2 kB/s
00000000 eb 58 90 6d 6b 66 73 2e 66 61 74 00 |.X.mkfs.fat.|
0000000c