2014-10-04 37 views
0

所以我有這樣的bash腳本做加密:猛砸標準輸入 - 我失去了所有的換行符charachters

#!/bin/bash 
#encrypt.sh 

fn=$1 
if [ $# -eq 0 ] 
    then 
    echo "Filename required..." 
fi 

echo "Type text. Hit Ctrl-d when done" 
keyvariable=$(cat) 

echo -e $keyvariable | gpg --symmetric --cipher-algo AES256 > $fn 

而且我有這個腳本做解密:

#!/bin/bash 
#decrypt.sh 

fn=$1 
if [ $# -eq 0 ] 
    then 
    echo "Filename required..." 
fi 

cat $fn | gpg --decrypt 

例子:

sh encrypt.sh test

Type text. Hit Ctrl-d when done 
hello 

how 

are 




you 

? 

我輸入密碼並確認。太好了。我現在有一個名爲「test」的加密文件。

但是當我去解密 「測試」,這裏的輸出:

sh decrypt test

gpg: AES256 encrypted data 
gpg: encrypted with 1 passphrase 
-e hello how are you ? 

我失去所有的換行符!該怎麼辦?


答案非常簡單,實際上是:

echo -e "$keyvariable" | gpg --symmetric --cipher-algo AES256 > $fn

注意引號$ keyvariable。

就是這樣!

回答

5

在這一行

echo -e $keyvariable | gpg --symmetric --cipher-algo AES256 > $fn 

$keyvariable展開,任何嵌入式空白(不只是換行符)被用來將結果字符串分成許多不同的單詞。 echo然後將每個單詞輸出到標準輸出,並由一個空格分隔。換行符只是最明顯的「受害者」;您可能會看到製表符(0x09)被空格替換,並且多次將空格縮小爲單個空格。由於文件名的生成,其他字符也可能會改變(這裏的細節並不重要)。

的解決方案是引用參數擴展:

echo -e "$keyvariable" | gpg --symmetric -cipher-algo AES256 > "$fn" 

正如其他人提及的,這是更簡單的,以允許gpg從標準輸入直接讀取,而不是使用cat攔截擊鍵和將它們放置在一變量。

echo "Type text. Hit Ctrl-d when done" 
gpg --symmetric --cipher-algo AES256 > "$fn" 

(實際上,gpg可能略有不同的表現時,它是直接從終端讀取,如下所示,對從管道,讀取當您從echo命令讀出。這可以解釋你被提示。密碼我認爲的解決方法是告訴gpg專門通過增加從標準輸入讀取「 - 」作爲最後一個參數,但請諮詢手冊頁要驗證,

gpg --symmetric --cipher-algo AES256 - > "$fn" 

+0

它與引號完美結合!非常感謝! – Eamorr 2014-10-04 14:28:24

+0

@Eamorr:它​​很棒與引號,但真正chepner的解決方案的最後一部分是最好的一個,你可以避免存儲輸入,並讓gpg直接採用stdin,考慮使用它。 – 2014-10-05 01:02:08

+0

嘿,該解決方案在命令行工作,但它不會在腳本中提示輸入 – Eamorr 2014-10-05 09:28:50

1

不要將其存儲在變量中,然後將該變量回顯爲gpg。通過管道。在你的設置中,你只需通過gpg調用發送cat的輸出,而不需要回顯。

或者完全沒有cat!刪除您存儲的輸入線,並刪除回聲一部分,所以該行剛讀

gpg --symmetric ... 
+0

嗨,所以我刪除了回聲。我所得到的就是'輸入文字。按Ctrl-d完成後,輸入密碼:'我沒有機會輸入任何文字! – Eamorr 2014-10-04 14:24:41

1

問題不在於gpg,而在於bash和回聲。你缺少引號。檢查這個腳本並查看其差異。

s=$(printf "one\ntwo") 
echo $s 
echo "$s" 
+0

是的,你是對的,我會改變標題。 – Eamorr 2014-10-04 18:36:36