2014-10-04 3 views
0

Так что у меня этот Баш скрипт для шифрования:Bash STDIN - Я теряю все символы новой строки charachters

#!/bin/bash 
#encrypt.sh 

fn=$1 
if [ $# -eq 0 ] 
    then 
    echo "Filename required..." 
fi 

echo "Type text. Hit Ctrl-d when done" 
keyvariable=$(cat) 

echo -e $keyvariable | gpg --symmetric --cipher-algo AES256 > $fn 

И у меня есть этот скрипт для дешифрования:

#!/bin/bash 
#decrypt.sh 

fn=$1 
if [ $# -eq 0 ] 
    then 
    echo "Filename required..." 
fi 

cat $fn | gpg --decrypt 

Пример:

sh encrypt.sh test

Type text. Hit Ctrl-d when done 
hello 

how 

are 




you 

? 

Я вводил пароль и подтверждаю его. Ок, отлично. Теперь у меня есть зашифрованный файл с именем «test».

Но когда я иду, чтобы расшифровать "тест", вот вывод:

sh decrypt test

gpg: AES256 encrypted data 
gpg: encrypted with 1 passphrase 
-e hello how are you ? 

Я теряю все символы новой строки! Что делать?


Ответ довольно прост на самом деле:

echo -e "$keyvariable" | gpg --symmetric --cipher-algo AES256 > $fn

Обратите внимание на кавычки вокруг $ keyvariable.

Вот и все!

ответ

5

В этой строке

echo -e $keyvariable | gpg --symmetric --cipher-algo AES256 > $fn 

когда $keyvariable расширяется, любой встроенный пробельные (а не только newlines) используются для разделения результирующей строки на несколько различных слов. echo затем выводит каждое слово на стандартный вывод, разделенный одним пробелом. Новые линии - это самые очевидные «жертвы»; вы можете заметить, что вкладки (0x09) заменяются пробелами, а также несколько пробелов пробела, которые сводятся к одному пространству. Существуют и другие символы, которые также могут измениться из-за генерации имени файла (подробности здесь несущественны).

Решение процитировать расширение параметра:

echo -e "$keyvariable" | gpg --symmetric -cipher-algo AES256 > "$fn" 

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

echo "Type text. Hit Ctrl-d when done" 
gpg --symmetric --cipher-algo AES256 > "$fn" 

(На самом деле, gpg может вести себя немного по-другому, когда он читает непосредственно из терминала, как показано здесь, по сравнению с чтением из трубы, а при чтении из команды echo. Это могло бы объяснить ваше существо запрошено . пароль Я думаю решение сказать gpg для чтения из стандартного ввода в частности, путем добавления «-». в качестве последнего аргумента, но обратитесь к странице руководства, чтобы убедиться, что это,

gpg --symmetric --cipher-algo AES256 - > "$fn" 

)

+0

Он отлично работает с кавычками! Большое вам спасибо! – Eamorr

+0

@Eamorr: Замечательно, что он работает с кавычками, но на самом деле последняя часть решения chepner - лучшая, где вы вообще не храните вход, и просто дайте gpg взять stdin напрямую. Подумайте об использовании. –

+0

Эй, это решение работает в командной строке, но он не запрашивает вход в скрипт. – Eamorr

1

Не храните его в переменной и затем повторяйте переменную в gpg. Протрите это. В вашей настройке вы должны просто отправить вывод cat через вызов gpg, не требуя эха.

Или обойтись без cat в целом! Удалите строку, в которой хранятся входные данные, и удалить эхо часть, так что линия просто читает

gpg --symmetric ... 
+0

Привет, поэтому я удалил эхо. Все, что я получаю, это «Тип текста. Нажмите Ctrl-D, когда закончите ", а затем' Enter passphrase: '. Я не получаю возможность ввести какой-либо текст! – Eamorr

1

Вопрос не в gpg, а о bash и echo. Вам не хватает котировок. Проверьте этот скрипт и посмотрите разницу.

s=$(printf "one\ntwo") 
echo $s 
echo "$s" 
+0

Да, вы правы. Я изменю заголовок. – Eamorr

Смежные вопросы