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

Eam*_*orr 0 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
Run Code Online (Sandbox Code Playgroud)

我有这个脚本来做解密:

#!/bin/bash
#decrypt.sh

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

cat $fn | gpg --decrypt
Run Code Online (Sandbox Code Playgroud)

例:

sh encrypt.sh test

Type text. Hit Ctrl-d when done
hello

how

are




you

?
Run Code Online (Sandbox Code Playgroud)

我输入密码并确认.太好了.我现在有一个名为"test"的加密文件.

但当我去解密"测试"时,这是输出:

sh decrypt test

gpg: AES256 encrypted data
gpg: encrypted with 1 passphrase
-e hello how are you ?
Run Code Online (Sandbox Code Playgroud)

我正在丢失所有换行符!该怎么办?


答案其实很简单:

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

请注意$ keyvariable周围的引号.

而已!

che*_*ner 5

在这一行

echo -e $keyvariable | gpg --symmetric --cipher-algo AES256 > $fn
Run Code Online (Sandbox Code Playgroud)

$keyvariable展开时,使用任何嵌入的空格(不仅仅是换行符)将结果字符串拆分为多个不同的单词.echo然后将每个单词输出到标准输出,由单个空格分隔.换行只是最明显的"受害者"; 您可能会看到标签(0x09)被空格替换,以及多个空白空间被缩减为单个空格.由于文件名生成(其详细信息在此处不重要),还有其他字符也可能会发生变化.

解决方案是引用参数扩展:

echo -e "$keyvariable" | gpg --symmetric -cipher-algo AES256 > "$fn"
Run Code Online (Sandbox Code Playgroud)

正如其他人所提到的,允许gpg直接从标准输入读取,而不是cat用来拦截击键并将它们放在变量中更简单.

echo "Type text. Hit Ctrl-d when done"
gpg --symmetric --cipher-algo AES256 > "$fn"
Run Code Online (Sandbox Code Playgroud)

(实际上,gpg直接从终端读取时可能会略有不同,如此处所示,而不是从管道读取,就像您从echo命令中读取时那样.这可以解释为您提示输入密码.我认为解决方案是gpg通过添加" - "作为最终参数,告诉标准输入读取,但请查阅您的手册页以进行验证.即,

gpg --symmetric --cipher-algo AES256 - > "$fn"
Run Code Online (Sandbox Code Playgroud)

)