답변:
두 번째 명령이 다른 값을 출력하는 이유는 무엇입니까?
역사적 이유로 곱셈 연산자로 dd
간주 x
됩니다. 따라서 0x3
0으로 평가됩니다.
건너 뛰기 오프셋을 16 진수 값으로 dd에 전달할 수 있습니까?
내가 아는 한 직접적이지 않습니다. 연산자를 사용한 곱셈뿐만 아니라 "곱하기 512"(0x200) 를 의미하고 "1024 곱하기"(0x400) 를 의미 x
하는 숫자를 접미사로 붙일 수 있습니다 . GNU는 접미사를 사용하여 직접 dd , , , , , 및 는 각각 (20)의 전원, 30, 40, 50, 60, 70, 80 또는 90로 2 곱셈 의미하고 상부 사용하거나 제외 소문자 수 에 대한 접미사. (다른 접미사도 많이 있습니다. 예를 들어 "곱하기 10 18 "을 의미하고 "곱하기 2 50 "을 의미 합니다. GNU 설치가있는 경우 자세한 내용을 참조하십시오 .)b
K
M
G
T
P
E
Z
Y
b
EB
PiB
info coreutils "block size"
위와 같은 비전적이고, 시대에 뒤 떨어지고, 괴짜가 터무니없는 점을 발견 할 수 있습니다. 걱정하지 마십시오 : 당신은 혼자가 아닙니다. 다행스럽게도, 당신은 그것을 모두 무시하고 대신 쉘의 산술 대체를 사용할 수 있습니다 (bash와 다른 Posix 호환 쉘뿐만 아니라 일부 Posix 쉘도 작동합니다). 쉘은 16 진수를 이해하며 일반적인 방식으로 작성된 광범위한 산술 연산자를 허용합니다. 표현식을 $((...))
다음 과 같이 둘러싸면됩니다 .
# dd if=2013-Aug-uptime.csv bs=1 count=$((0x2B * 1024)) skip=$((0x37))
$((...))
아무것도 바뀌지 않습니다. 따옴표가 무엇을 할 것인지 생각할 수있는 유일한 경우는 당신이 뭔가를 가지고 IFS=4
있지만 모든 종류의 다른 혼란을 일으킬 것입니다.
$((...))
입니다. POSIX의 확장은 $((...))
단어 분리에 따라 달라집니다 . 목록 컨텍스트에서 인용되지 않은 명령 / 산술 / 변수 확장을 남겨 두는 것은 split + glob 연산자입니다. split / glob 연산자를 필요하지 않은 / 원치 않는 곳에 사용하지 않고 split + glob 연산자가 필요할 때마다 IFS를 설정하면 IFS = 4로 설정해도 모든 종류의 문제가 발생하지는 않습니다.
IFS
내가 포함하지 않은 숫자, 내가 믿지 않은 것으로 설정 하면 인용해야합니다. 아마도 누군가가 그렇게하고 있다면, 그 일이 우연히 할 가능성이 거의 없기 때문에 그 필요성을 알고있을 것입니다. 또는 적어도 내가 할 가능성이 거의없는 기간입니다. 나는 당신을 위해 말하는 것을 의미하지 않습니다.
나는 이것이 오래된 스레드라는 것을 알고 있지만, 나 같은 바보가 가고 실수로 fileB가 아직 백업되지 않은 git에 체크인하지 않은 경우 bash 기록에서 'cp fileA fileB'를 실수로 리콜 및 호출 할 때 문제는 여전히 역사적입니다. 밤새도록 몇 시간 동안 코딩하고 :-/
이 스레드의 개념 덕분에 손실 된 파일을 완전히 복구 할 수 있었지만 32Gb 디스크와 매우 작은 RAM (Ubuntu 18.04 실행)이있는 원격 Virtual Private Server에서 'grep'을 사용하여 모든 attemtps를 잃어 버렸습니다. 위의 '메모리 부족'으로 빠르게 사망
내 경우에는 hexdump -C /dev/sdX1 | grep 'shortString'
내 구조에 온 것이 었습니다 . grep과는 달리 16 진수의 매우 narroy ASCII 표현 만 표시하므로 짧고 고유 한 문자열 만 찾아서 감쌀 수 있음을 명심해야합니다. 일치하는 16 진수 주소를 출력하면 위와 비슷한 방식으로 'dd'를 사용할 수 있었지만 기본적으로 블록 크기가 4096 인 것으로 보인 것을 제외하고는 16 진수 바이트 주소를 10 진수로 변환하지만 4096으로 나누면 dd의 skip 매개 변수에 대해 4k 블록으로 크기를 조정할 수 있습니다.이 숫자가 dd에 비해 너무 큰 경우 오류 메시지는 skip=
전달 된 숫자가 아니라 유효하지 않은 것에 대해 불평하는 것처럼 보입니다. .
bash를 사용하여 $((0xabcd))
easilty obtaion hex-> dec conversion :-)에 대한 팁을 추가 한 사람들에게
내 마지막 단어-내 경우에는 같은 파일의 사본이 모두 가까이에있었습니다. 그러나 hexdump 가보고 한 가장 높은 주소에서 가장 낮은 주소를 빼면 가능한 모든 사본이 포함 된 ~ 5MB 영역을 식별 할 수 있었으므로 가장 낮은 주소에서 dd를 대상으로하고 전체 영역을 임시 파일로 추출 할 수있었습니다. Vim 편집기는 이제 바이너리 컨텐츠를 상당히 정상적으로 처리하므로 임시 파일을 검사하고 필요에 따라 재구성 할 수 있습니다.
$((...))
, 모든에서 bash는 특정는 POSIX 산술 확장하지, 당신은 사용하지 않아도bash
그것을 사용하는 모든 POSIX 쉘은 할 것입니다. 그러나을 포함하여 많은 쉘에서bash
단어 분할이 발생하므로 인용해야합니다.