Bash stdin - 我正在丢失所有换行符

时间:2014-10-04 14:13:18

标签: bash gnupg

所以我有这个bash脚本来加密:

#!/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”的加密文件。

但是当我去解密“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周围的引号。

就是这样!

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分:1)

不要将其存储在变量中,然后将变量回显到gpg中。管它通过。在您的设置中,您应该通过gpg调用发送cat的输出而不需要回声。

完全没有cat!删除存储输入的行,并删除回声部分,以便该行只读

gpg --symmetric ...

答案 2 :(得分:1)

问题不是关于gpg,而是关于bash和echo。你缺少报价。检查此脚本并查看差异。

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