2013-08-23 9 views
7

chciałbym zrobić coś takiegowyjście rury z polecenia interaktywnej mniej

openssl enc -d -aes256 -in somefile | less 

openssl wymaga hasła od stdin. i to wszystko jest pomieszane, gdy jest zaangażowane less.

Czy istnieje sposób pobrania danych wyjściowych z interaktywnego polecenia (np. openssl z prośbą o podanie hasła) i wyprowadzenia wyniku do less?

A może jest lepsza technika przy użyciu skryptu bash?

+0

następujące będzie działać, ale miałem nadzieję znaleźć sposób, że nie wykorzystują pliki tymczasowe ... '$ tmp_file = $ (mktemp); openssl enc -d -in somefile> $ tmp_file; less $ tmp_file; rm $ tmp_file' –

+0

Robię to cały czas z 'rsync' przez' ssh', i zwykle nie mam żadnych problemów. Kiedy coś się miesza, wydaje się, że jest to kwestia czasu - nie dzieje się to przez jakiś czas, ale jak pamiętam, jeśli rsync był powolny w pytaniu o hasło, wszystko poszło w rozsypkę. – drevicko

Odpowiedz

1

Można spróbować to:

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

Ale to nie wygląda bezpieczna.

Nie próbowałem w ten sposób uruchamiać openssl, ale w przypadku, gdy jest zbyt szczegółowy i poprzedni kod nie będzie działał, zawsze możesz spróbować użyć expect. Oto przykład:

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

Może mieć skrypt powłoki poprosić o klucz, a następnie przechowywać klucz w opcji -kfile plik temp i użyć OpenSSL, aby go odnaleźć. Mam nadzieję, że twoja wersja obsługi openssl -kfile.

Obawiałabym się o bezpieczeństwo z tym, ale z drobną ostrożnością dziura bezpieczeństwa może być mniejsza niż myślisz. (Ale ufasz Twojego administratora i 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

Proszę nie zapomnieć o podwójnym cudzysłowy wokół zmiennych. Zamień '' $ TMPKEY'' na '' "$ TMPKEY" ''. Jest to bardzo ważne, ponieważ jeśli plik zawiera znak spacji, zostanie podzielony na dwa osobne parametry. Na przykład: 'myFile = 'mój niesamowity plik''' 'rm" $ myFile "' 'usunie jeden plik, który nazywa się' 'mój niesamowity plik'', to jest ** poprawne **. Ale '' rm $ myFile'' usunie trzy pliki: '' mój'', '' awesome'' i '' plik'', który jest ** zły ** i nieprzewidywalny, chyba że naprawdę wiesz, kim jesteś robić. –

+0

Ogólnie rzecz biorąc, bardzo dobra zasada. Po utworzeniu, a następnie zastosowaniu zmiennej TMPKEY w ciągu kilkunastu linii w przykładowym skrypcie, wiedziałem, że nie zawiera ona spacji ($$ rozróżnia wszystkie cyfry). Ale jak mówisz, większość skryptów powinna używać bezpieczniejszej techniki: cytuj zmienne, które zawierają pojedynczą, dowolną nazwę ścieżki. – sjnarv

+0

Chodzi o to, że twój skrypt jest przykładem i prawdopodobnie ludzie zmienią zmienne według własnych upodobań, ale nie spodziewają się, że zawiodą tylko z powodu spacji w katalogu. Czy możesz to naprawić, abym mógł zagłosować? –