2013-08-23 13 views
7

Ich mag würde, etwas zu tun wieRohr Ausgabe von interaktivem Befehl weniger

openssl enc -d -aes256 -in somefile | less 

openssl erfordert ein Passwort aus stdin. und das wird alles durcheinander gebracht, wenn less beteiligt ist.

Gibt es eine Möglichkeit, die Ausgabe von einem interaktiven Befehl zu nehmen (wie openssl fragt nach einem Passwort) und die Ausgabe in less?

Oder gibt es eine bessere Technik mit einem Bash-Skript?

+0

folgendes funktionieren würde, aber ich hatte gehofft, einen Weg zu finden, die nicht temporäre Dateien verwendet haben ... '$ tmp_file = $ (mktemp); openssl enc -d -in somefile> $ tmp_file; weniger $ tmp_file; rm $ tmp_file' –

+0

Ich mache dies die ganze Zeit mit 'rsync' über' ssh' und habe normalerweise keine Probleme. Wenn die Dinge durcheinander geraten, scheint es ein Timing-Ding zu sein - es ist für eine Weile nicht passiert, aber wenn ich mich erinnere, wenn rsync langsam nach einem Passwort fragte, ging es drunter und drüber. – drevicko

Antwort

1

Sie können dies versuchen:

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

Aber das ist nicht sicher sieht.

Ich habe nicht versucht, openssl auf diese Weise laufen zu lassen, aber falls es zu ausführlich ist und wenn vorheriger Code nicht funktioniert, dann können Sie immer versuchen, expect zu verwenden. Hier ein Beispiel:

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

Vielleicht ist das Shell-Skript für den Schlüssel fragen, dann speichern Sie den Schlüssel in eine temporäre Datei und -kfile Option die Nutzung openssl es zu finden. Hoffe deine Version von openssl unterstützt -kfile.

Ich würde mir Sorgen über die Sicherheit mit diesem, aber mit ein wenig Sorgfalt das Sicherheitsloch ist vielleicht kleiner als Sie vielleicht denken. (Aber vertrauen Sie Ihrem Sysadmin und 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

Bitte vergessen Sie nicht, doppelte Anführungszeichen um Variablen zu verwenden. Ersetzen Sie '' TMPKEY'' durch '' "$ TMPKEY" ''. Dies ist sehr wichtig, denn wenn eine Datei ein Leerzeichen enthält, wird sie in zwei separate Parameter aufgeteilt. Zum Beispiel: '' myFile = 'meine tolle Datei' '' '' rm "$ myFile" '' wird eine Datei entfernen, die '' meine tolle Datei'' heißt, das ist ** korrekt **. Aber '' rm $ myFile'' wird drei Dateien entfernen: '' my'', '' awesome'' und '' file'' was ** falsch ** und unberechenbar ist, es sei denn, du weißt wirklich was du bist tun. –

+0

Im Allgemeinen eine sehr gute Regel. Nachdem ich die TMPKEY-Variable alle innerhalb eines Dutzend Zeilen im Beispielskript erstellt und dann verwendet hatte, wusste ich, dass sie keine Leerzeichen enthielt ($$ wird in alle Ziffern aufgelöst). Aber wie Sie sagen, sollten die meisten Skripts die sicherere Technik verwenden: quote Variablen, die einen einzigen, beliebigen Pfadnamen enthalten. – sjnarv

+0

Der Punkt ist, dass Ihr Skript ein Beispiel ist und höchstwahrscheinlich werden Leute die Variablen nach ihren eigenen Wünschen ändern, aber sie erwarten nicht, dass es nur wegen der Leerzeichen in einem Verzeichnis scheitern wird. Könnten Sie es bitte korrigieren, damit ich es abstimmen kann? –