Можно ли передать файл с кавычками и специальными символами в OpenSSL? - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь написать сценарий bash, который позволит пользователю ввести пароль, а затем передать stdin (либо через команды терминала, либо через файл) в openssl enc, чтобы зашифровать его построчно, используя это пароль, а затем, наконец, передать его на внешний TCP-сервер.

Это то, что у меня есть до сих пор, и в основном это работает:

#!/bin/bash
printf "What is your encryption 
password?\n"
read -s password </dev/tty
while read line; do echo "$line" | openssl enc -aes-256-cbc -base64 -pass pass:$password -e; done > >(openssl s_client -quiet -connect localhost:3001)

Вы запускаете это через файл cat | script. sh.

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

Есть ли способ обойти это?

1 Ответ

1 голос
/ 30 мая 2020

И read, и некоторые версии echo будут выполнять некоторые виды обработки escape / quote / whitespace / et c. Вы можете заставить read вести себя с IFS= read -r - IFS= не позволяет ему обрезать начальные и конечные пробелы (и поскольку это префикс, он не испортит другие вещи, такие как общее присвоение IFS) , а -r говорит ему не пытаться анализировать escape-символы (backsla sh). echo безнадежно, поэтому используйте вместо него printf '%s\n'.

Аналогичные проблемы возникают и с переменной password; используйте те же приемы read, а затем заключите его в двойные кавычки, чтобы не допустить странных вещей при разбиении слов и подстановочных знаках. О, и я предпочитаю использовать read -p prompt вместо того, чтобы печатать отдельное приглашение, и после этого отправлять новую строку в / dev / tty, чтобы он не просто сидел там в приглашении.

Канал и openssl сами по себе не должны вызывать никаких проблем - это оба бинарно-безопасные интерфейсы, так что никаких цитат или чего-нибудь там синтаксического анализа. Имейте в виду, у вас могут быть проблемы со стороны дешифрования ...

Примерно так:

#!/bin/bash
IFS= read -rs -p "What is your encryption password? " password </dev/tty
echo >/dev/tty
while IFS= read -r line; do
    printf '%s\n' "$line" | openssl enc -aes-256-cbc -base64 -pass "pass:$password" -e
done > >(openssl s_client -quiet -connect localhost:3001)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...