Порядок операций при раскрытии выражений оболочки с помощью xargs - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь заменить некоторые байты в двоичном файле, используя это довольно длинное выражение

objdump --show-raw-insn -d libc-2.30.so | grep -w movdqa | awk '{print substr($1, 1, length($1)-1)}' | xargs -I {} sh -c "printf '\xf3' | dd of=$mybinary bs=1 seek=$((0x{})) count=1 conv=notrunc;"

В этом выражении $((0x{})) оценивается оболочкой до того, как xargs заменит {} шестнадцатеричным значением байта, который нужно перезаписать. $((0x{})) заменяет шестнадцатеричное значение десятичным, например, 0xF на 16.

-bash: 0x{}: syntax error: invalid arithmetic operator (error token is "{}")

Как я могу заставить xargs выполнить замену до того, как bash попытается раскрыть $((0x{}))?

1 Ответ

0 голосов
/ 06 мая 2020

Помещение части выражения xargs в одинарные кавычки вместо двойных кавычек решило проблему. Оболочка не будет расширять выражения в одинарных кавычках и поэтому должна ждать вызова xargs перед расширением выражений. Printf также нужно было поменять кавычки, чтобы отразить это изменение.

objdump --show-raw-insn -d libc-2.30.so | grep -w movdqa | awk '{print substr($1, 1, length($1)-1)}' | xargs -I {} sh -c 'printf "\xf3" | dd of=libc-2.30.so bs=1 seek=$((0x{})) count=1 conv=notrunc;'
...