CURL - недопустимый символ '\\n' в строковом литерале

Поэтому я пишу простой сценарий bash, который принимает текстовое сообщение, преобразует его в шестнадцатеричное и выполняет вызов curl для клиента geth, который работает на моем локальном хосте, чтобы подписать данные. Мне удалось преобразовать текстовое сообщение в шестнадцатеричное, однако при отправке преобразованной шестнадцатеричной переменной в качестве входных данных моей команде CURL это дает мне -

jsonrpc ":" 2.0 "," error ": {" code ": - 32600," message ":" недопустимый символ '\n' в строковом литерале "}}

Ниже приведен код -

#!/bin/bash

# grabbing day and month from current date
D=$(date)
DAY=$(date -d "$D" '+%d')
MONTH=$(date -d "$D" '+%m')
YEAR=$(date -d "$D" '+%Y')


echo "Day: $DAY"
echo "Month: $MONTH"
echo "Year: $YEAR"

# prepare todays JSON message for attestation

a="SH_$YEAR$MONTH$DAY"
b="_324019325_1_10_001_00_test"
filename=$a$b
hash="test hash"
addl_data="test data"
tag="test tag"

msg=$filename$tag$addl_data$hash
echo "Prepared Message is - $msg"


msg_hex_wn=$(xxd  -ps <<< "$msg")| tr -d '\040\011\012\015'
echo "Message in hex - $msg_hex_wn"
echo "\n"
echo $(xxd  -ps <<< "$msg")| tr -d '\040\011\012\015'


# Signing the message in hex
curl -X POST localhost:8545  -d "{\"jsonrpc\":\"2.0\",\"method\":\"eth_sign\",\"params\":[\"0x525c846b777d003048dbabd0f2dd677086839812\", \"$(xxd  -ps <<< "$msg")| tr -d '\040\011\012\015'\"],\"id\":5}" 





read

Очевидно, что здесь следует обвинять часть $(xxd -ps <<< "$msg"), которая может иметь \ n, и анализатор читает ее как \ n, когда я попытался использовать только 0x1234 вместо $ (xxd -ps < << "$ msg") Мне удалось получить ответ. Итак, я смотрю здесь, есть способ убрать гекс из новых строк и пустых мест из команды $(xxd -ps <<< "$msg")? или есть лучший способ получить строку преобразования в гекс?

1 ответ

Решение

Ваша конкретная проблема заключается в том, что вы прокладываете tr вне подстановки команды. | tr yada yada нужно идти внутрь $(xxd ...) закрывающая скобка.

Захват окончательного значения в переменную и интерполяция его в curl командная строка, вероятно, значительно упрощает поиск неисправностей.

Что касается других способов сделать это, я бы, возможно, пошел с простой однострочник

perl -pe 's/(.)/ sprintf("%02X", ord($1)) //ge' <<<"$msg"
Другие вопросы по тегам