2013-08-23 6 views
7

mi piacerebbe fare qualcosa di simileuscita tubo dal comando interattivo a meno

openssl enc -d -aes256 -in somefile | less 

openssl richiede una password da stdin. e tutto si incasina quando è coinvolto il numero less.

C'è un modo per prendere l'output da un comando interattivo (come openssl che richiede una password) e inviare l'output a less?

Oppure esiste una tecnica migliore che utilizza uno script bash?

+0

seguente avrebbe funzionato, ma speravo di trovare un modo che non ha utilizzato i file temporanei ... '$ tmp_file = $ (mktemp); openssl enc -d -in somefile> $ tmp_file; meno $ tmp_file; rm $ tmp_file' –

+0

Lo faccio sempre con 'rsync' su' ssh', e di solito non ho problemi. Quando le cose si confondono, sembra essere una cosa di temporizzazione - non è successo per un po ', ma se ricordo bene, se rsync era lento nel chiedere una password, le cose andavano in tilt. – drevicko

risposta

1

Si può provare questo:

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

Ma questo non sembra sicuro.

Non ho provato a eseguire openssl in questo modo, ma nel caso sia troppo prolisso e se il codice precedente non funziona, puoi sempre provare a utilizzare expect. Ecco un esempio:

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

Forse hanno lo script di shell chiedere la chiave, quindi memorizzare la chiave nell'opzione -kfile un file temporaneo e l'uso di OpenSSL per trovarlo. Spero che la tua versione di openssl supporti -kfile.

Mi preoccuperei della sicurezza con questo, ma con un po 'di attenzione il buco di sicurezza è forse più piccolo di quanto si possa pensare. (Ma ti fidi del tuo amministratore di sistema e 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

Si prega di non dimenticare di usare virgolette doppie attorno a variabili. Sostituisci '' $ TMPKEY'' con '' "$ TMPKEY" ''. Questo è molto importante perché se un file contiene uno spazio, sarà diviso in due parametri separati. Ad esempio: '' myFile = 'my awesome file''' '' rm "$ myFile" '' sta per rimuovere un file chiamato '' my awesome file'', questo è ** corretto **. Ma '' rm $ myFile'' sta per rimuovere tre file: '' my'', '' awesome'' e '' file'' che sono ** errati ** e imprevedibili, a meno che tu non sappia davvero cosa sei facendo. –

+0

In generale, una regola molto buona. Avendo creato e poi utilizzato la variabile TMPKEY in una dozzina di righe nello script di esempio, sapevo che non conteneva spazi ($$ risolve tutte le cifre). Ma come dici tu, la maggior parte degli script dovrebbe usare la tecnica più sicura: citare le variabili che contengono un nome di percorso singolo, arbitrario. – sjnarv

+0

Il punto è che il tuo script è un esempio e molto probabilmente le persone cambieranno le variabili a loro piacimento, ma non si aspettano che fallirà solo a causa degli spazi in una directory. Potresti correggerlo per poter votare? –