2013-08-23 3 views
7

Я хотел бы сделать что-то вродевыход трубы из интерактивной команды менее

openssl enc -d -aes256 -in somefile | less 

openssl требует пароль от stdin. и это становится все испорченным, когда задействовано less.

Есть ли способ получить выходные данные из интерактивной команды (например, openssl с просьбой ввести пароль) и передать вывод в less?

Или есть лучшая техника, использующая скрипт bash?

+0

следующий будет работать, но я надеялся найти способ, который не использовал временные файлы ... '$ tmp_file = $ (Mktemp); openssl enc -d -in somefile> $ tmp_file; less $ tmp_file; rm $ tmp_file' –

+0

Я делаю это все время с 'rsync' над' ssh' и обычно не имеет проблем. Когда что-то перепуталось, похоже, что это время. Это не так давно, но, как я помню, если rsync медленно запрашивал пароль, все шло не так. – drevicko

ответ

1

Вы можете попробовать это:

echo 'mypassword' | openssl enc -d -aes256 -in somefile | less 

Но это не выглядит безопасным.

Я не пробовал работать openssl таким образом, но в случае, если он слишком подробный, и если предыдущий код не будет работать, вы всегда можете попробовать использовать expect. Вот пример:

expect -c ' 
    spawn yourscript 
    expect "Please enter your password:" 
    send "$PASSWORD" 
' 
3

Возможно, есть сценарий оболочки попросить ключ, а затем сохранить ключ в -kfile вариант временный файл и использовать OpenSSL, чтобы найти его. Надеюсь, ваша версия openssl поддерживает -kfile.

Я буду беспокоиться о безопасности с этим, но с небольшой осторожностью отверстие безопасности, возможно, меньше, чем вы думаете. (Но вы доверяете своему сисадмину и sudoers ...?)

#!/bin/bash 

INFILE=somefile 

read -s -p "Enter key for $INFILE: " key 
echo 

# write the key to a temp file; use mktemp(1) 
# for safer creation of a privately-owned file. 
# 
TMPKEY=$(mktemp -t) || exit 1 
echo "$key" > "$TMPKEY" 

# will remove the temp file on script exit 
trap 'rm -f "$TMPKEY"' EXIT 

# remove the key file a couple seconds after openssl runs 
(sleep 2; rm -f "$TMPKEY") & 

openssl enc -d -aes256 -in "$INFILE" -kfile "$TMPKEY" | less 

[ -f "$TMPKEY" ] && rm -f "$TMPKEY" 
trap - EXIT 

# rest of script... 

exit 0 
+0

Пожалуйста, не забудьте использовать двойные кавычки вокруг переменных. Замените '' $ TMPKEY'' '' 'TMPKEY $' ''. Это очень важно, потому что если файл содержит пробельный символ, он будет разделен на два отдельных параметра. Например: '' myFile = 'my awesome file'' '' 'rm' $ myFile" '' собирается удалить один файл, который называется '' my awesome file'', это ** правильно **. Но '' rm $ myFile'' собирается удалить три файла: '' my'', '' awesome'' и '' file'', который является ** неправильным ** и непредсказуемым, если вы действительно не знаете, делает. –

+0

В общем, очень хорошее правило. Создав, а затем использовал переменную TMPKEY всего в пределах дюжины строк в сценарии образца, я знал, что в ней нет пробелов ($$ разрешается для всех цифр). Но, как вы говорите, большинство сценариев должны использовать более безопасную технику: котировки переменных, которые содержат одно, произвольное, имя пути. – sjnarv

+0

Дело в том, что ваш сценарий является примером, и, скорее всего, люди изменят переменные по своему вкусу, но они не ожидают, что он потерпит неудачу только из-за пробелов в каталоге. Не могли бы вы исправить это, чтобы я мог его проголосовать? –

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