2013-08-23 84 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; 減$ tmp_file; rm $ tmp_file' –

+0

我一直在'ssh'上用'rsync'來做這件事,而且通常沒有問題。當事情混淆不清時,這似乎是一個計時問題 - 這一段時間沒有發生,但是據我所知,如果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

也許有shell腳本索要鑰匙,然後將其存儲在一個臨時文件和使用OpenSSL的-kfile選擇的關鍵在於找到它。希望你的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 ='我真棒文件'''rm「$ myFile」''將刪除一個名爲「我真棒文件」的文件,這是**正確**。但'rm $ myFile''會去除三個文件:'''','awesome''和''file''這是錯誤的**和不可預知的,除非你真的知道你是什麼這樣做。 –

+0

一般來說,一個很好的規則。在示例腳本中創建並隨後使用了TMPKEY變量,這些變量都在十幾行中,我知道它不包含空格($$解析爲所有數字)。但正如你所說,大多數腳本應該使用更安全的技術:引用包含單個任意路徑名稱的變量。 – sjnarv

+0

關鍵是你的腳本是一個例子,很可能人們會根據自己的喜好來改變變量,但是他們並不期望它會因爲目錄中的空格而失敗。你能解決它,讓我可以投票嗎? –