dd skip | seek 오프셋을 16 진수로 전달


11
# dd if=2013-Aug-uptime.csv bs=1 count=1 skip=3 2> /dev/null
d
# dd if=2013-Aug-uptime.csv bs=1 count=1 skip=0x3 2> /dev/null
f

두 번째 명령이 다른 값을 출력하는 이유는 무엇입니까?

건너 뛰기 오프셋을 dd16 진수 값 으로 전달할 수 있습니까?

답변:


18

두 번째 명령이 다른 값을 출력하는 이유는 무엇입니까?

역사적 이유로 곱셈 연산자로 dd간주 x됩니다. 따라서 0x30으로 평가됩니다.

건너 뛰기 오프셋을 16 진수 값으로 dd에 전달할 수 있습니까?

내가 아는 한 직접적이지 않습니다. 연산자를 사용한 곱셈뿐만 아니라 "곱하기 512"(0x200) 를 의미하고 "1024 곱하기"(0x400) 를 의미 x하는 숫자를 접미사로 붙일 수 있습니다 . GNU는 접미사를 사용하여 직접 dd , , , , , 및 는 각각 (20)의 전원, 30, 40, 50, 60, 70, 80 또는 90로 2 곱셈 의미하고 상부 사용하거나 제외 소문자 수 에 대한 접미사. (다른 접미사도 많이 있습니다. 예를 들어 "곱하기 10 18 "을 의미하고 "곱하기 2 50 "을 의미 합니다. GNU 설치가있는 경우 자세한 내용을 참조하십시오 .)bKMGTPEZYbEBPiBinfo coreutils "block size"

위와 같은 비전적이고, 시대에 뒤 떨어지고, 괴짜가 터무니없는 점을 발견 할 수 있습니다. 걱정하지 마십시오 : 당신은 혼자가 아닙니다. 다행스럽게도, 당신은 그것을 모두 무시하고 대신 쉘의 산술 대체를 사용할 수 있습니다 (bash와 다른 Posix 호환 쉘뿐만 아니라 일부 Posix 쉘도 작동합니다). 쉘은 16 진수를 이해하며 일반적인 방식으로 작성된 광범위한 산술 연산자를 허용합니다. 표현식을 $((...))다음 과 같이 둘러싸면됩니다 .

# dd if=2013-Aug-uptime.csv bs=1 count=$((0x2B * 1024)) skip=$((0x37))

참고 $((...)), 모든에서 bash는 특정는 POSIX 산술 확장하지, 당신은 사용하지 않아도 bash그것을 사용하는 모든 POSIX 쉘은 할 것입니다. 그러나을 포함하여 많은 쉘에서 bash단어 분할이 발생하므로 인용해야합니다.
Stéphane Chazelas

@StephaneChazelas : 사실입니다. bash 특정 적이 아닙니다. 그러나 따옴표가 필요하지 않습니다. (Posix : "표현식 안에 큰 따옴표를 특수하게 처리하지 않는 한, 표현식은 따옴표로 묶인 것처럼 처리해야합니다."표현식에 변수가 있고 값에 구분 기호가 포함 된 경우, 유효한 숫자가 아닙니다. 인용 부호를 붙이면 $((...))아무것도 바뀌지 않습니다. 따옴표가 무엇을 할 것인지 생각할 수있는 유일한 경우는 당신이 뭔가를 가지고 IFS=4있지만 모든 종류의 다른 혼란을 일으킬 것입니다.
rici

인용하는 섹션은 내부 내용에 관한 것 $((...))입니다. POSIX의 확장은 $((...))단어 분리에 따라 달라집니다 . 목록 컨텍스트에서 인용되지 않은 명령 / 산술 / 변수 확장을 남겨 두는 것은 split + glob 연산자입니다. split / glob 연산자를 필요하지 않은 / 원치 않는 곳에 사용하지 않고 split + glob 연산자가 필요할 때마다 IFS를 설정하면 IFS = 4로 설정해도 모든 종류의 문제가 발생하지는 않습니다.
Stéphane Chazelas

@StephaneChazelas : 그렇습니다. 숫자 결과는 단어 분리에 영향을받습니다. 그러나 정수입니다. IFS내가 포함하지 않은 숫자, 내가 믿지 않은 것으로 설정 하면 인용해야합니다. 아마도 누군가가 그렇게하고 있다면, 그 일이 우연히 할 가능성이 거의 없기 때문에 그 필요성을 알고있을 것입니다. 또는 적어도 내가 할 가능성이 거의없는 기간입니다. 나는 당신을 위해 말하는 것을 의미하지 않습니다.
rici

1
@ ogurets : 사용중인 쉘은 무엇입니까? (버전을 포함하십시오).
rici

0

나는 이것이 오래된 스레드라는 것을 알고 있지만, 나 같은 바보가 가고 실수로 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 편집기는 이제 바이너리 컨텐츠를 상당히 정상적으로 처리하므로 임시 파일을 검사하고 필요에 따라 재구성 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.