проходження dd пропустити | шукати зміщення як шістнадцяткове


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

Чому друга команда видає інше значення?

Чи можна передати пропуск | шукати зміщення ddяк шістнадцяткове значення?

Відповіді:


18

Чому друга команда видає інше значення?

З історичних причин ddвважає xоператором множення. Так 0x3оцінюється як 0.

Чи можливо передати пропуск | шукати зміщення до dd як шістнадцяткове значення?

Не безпосередньо, наскільки я знаю. Окрім множення за допомогою оператора x, ви можете суфіксувати будь-яке число bна значення "помножити на 512" (0x200) та K"помножити на 1024" (0x400). З ГНУ д.д. ви можете також використовувати суфікси M, G, T, P, E, Zі Yозначає помножити на 2 певною мірою 20, 30, 40, 50, 60, 70, 80 або 90, відповідно, і ви можете використовувати верхній або нижній регістр , за винятком для bсуфікса. (Є багато інших можливих суфіксів. Наприклад, EBозначає "помножити на 10 18 " і PiBозначає "помножити на 2 50 ". Додаткову info coreutils "block size"інформацію див., Якщо у вас установка GNU.)

Ви можете виявити вищезгадане таємниче, анахронічне та прискіпливе до абсурду. Не хвилюйтеся: ви не самотні. На щастя, ви можете просто проігнорувати все це і використовувати замість арифметичної заміни вашої оболонки (працюватимуть bash та інші сумісні з Posix оболонки, а також деякі не-Posix-оболонки). Оболонка розуміє шістнадцяткові числа, і це дозволяє повний спектр арифметичних операторів, записаних звичайним чином. Вам просто потрібно оточити вираз за допомогою $((...)):

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

Зауважте, що $((...))це арифметичне розширення POSIX, воно зовсім не конкретно, не потрібно bashвикористовувати його, будь-яка оболонка POSIX буде робити. Однак зауважте, що у багатьох оболонках, у тому числі bash, воно зазнає розщеплення слів, тому його слід цитувати.
Стефан Шазелас

@StephaneChazelas: Це правда, це не конкретно. Однак, цитати не потребують. (Posix: "Вираз трактується так, ніби він був у подвійних лапках, за винятком того, що подвійне цитування всередині виразу не обробляється спеціально." Якщо в виразі була змінна, і її значення включало роздільник, тоді це не було б дійсним числом; розміщення лапок $((...))нічого не змінить. Єдиний випадок, коли я можу придумати, де цитати могли б зробити що-небудь, - якби у вас було щось подібне, IFS=4але це спричинило б усілякий інший хаос.
rici

У розділі, який ви цитуєте, йдеться про те, що знаходиться всередині $((...)). POSIX зрозуміло, що розширення $((...))підлягає поділу слів . Залишаючи будь-яке з команд / арифметичних / змінних розширень без котирування у контексті списку - це оператор split + glob. Встановлення IFS = 4 не спричинить усілякі проблеми, якщо ви не використовуєте оператор split + glob там, де він не потрібен / шуканий, і встановлювати IFS кожен раз, коли вам потрібен цей оператор split + glob.
Стефан Шазелас

@StephaneChazelas: так, числовий результат залежить від розділення слів. Але це ціле число. Якщо ви встановите IFSщось, що включає цифри, те, що я не вірю, що я коли-небудь робив, то вам потрібно буде цитувати. Імовірно, якби хтось робив це, хтось би усвідомлював необхідність, оскільки навряд чи це можна зробити випадково. Або, принаймні, це навряд чи щось, що я, мабуть, робитиму. Я не хочу говорити за тебе.
rici

1
@ogurets: яку оболонку ви використовуєте? (Будь ласка, включіть версію).
rici

0

Я знаю, що це стара тема, але ця проблема як і раніше актуальна, особливо коли ідіоти, такі як я, мимоволі згадують і виправдовують файл cp fileA fileB з історії башів, коли fileB ще не зареєстрований, щоб git не створив резервну копію вгору і містять кілька годин кодування після всебічного: - /

Завдяки концепціям у цій темі, я зміг повністю відновити втрачений файл, проте я втратив шахту на віддаленому віртуальному приватному сервері з 32 Гбітним диском і дуже мало оперативної пам’яті (працює на Ubuntu 18.04), і всі мої спроби, використовуючи 'grep' як вище швидко вмирає з "недостатньою пам'яттю"

У моєму випадку саме hexdump -C /dev/sdX1 | grep 'shortString'мені допомогли. На відміну від grep, він відображає лише дуже вузьке ASCII зображення шестигранника, тому важливо лише шукати короткий унікальний рядок і мати на увазі, що навіть це можна обернути. Після того, як він видав якусь шістнадцяткову адресу, де була відповідність, я зміг використовувати 'dd' аналогічним чином, як вище, за винятком того, що я виявив, що він здається дефолтним до розміру блоку 4096, тому мені не тільки довелося перетворіть шістнадцяткову байтову адресу в десяткову, але поділіть її на 4096, щоб її масштабувати до 4-х блоків для параметра пропуску ДД - безпомилково, якщо це число занадто велике для dd, повідомлення про помилку виглядає так, що воно скаржиться на skip=недійсне, а не на число, передане йому .

Кудо людям, які додали поради щодо використання bash з $((0xabcd))hex-> dec конвертацією :-)

Лише моє остаточне слово - У моєму випадку було кілька копій одного і того ж файлу, які знаходились у безпосередній близькості. Але віднявши найнижчу адресу від найвищої адреси, про яку повідомляв hexdump, я зміг виявити область ~ 5 МБ, що містить усі можливі копії, що означало, що я можу націлити DD на найнижчу адресу і витягнути всю цю область до тимчасового файлу. Тепер редактор Vim обробляє двійковий вміст досить витончено, тож ви зможете вивчити тимчасовий файл і змінити його за потребою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.