Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash stdin-我失去了所有的新行角色_Bash_Gnupg - Fatal编程技术网

Bash stdin-我失去了所有的新行角色

Bash stdin-我失去了所有的新行角色,bash,gnupg,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 我有这个脚本来解密: #!/

我有这个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的加密文件

但当我进行解密测试时,输出如下:

sh解密测试

我失去了所有的新线人物!怎么办

答案其实很简单:

echo-e$keyvariable | gpg-对称密码算法AES256>$fn

请注意$keyvariable周围的引号

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

就这样

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

或者干脆不要猫!删除存储输入的行,并删除回显部分,以便该行只读取数据

gpg --symmetric ...
在这一行

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"

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

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

嗨,所以我删除了回音。我得到的只是打字。完成后按Ctrl-d,然后输入密码短语:。我没有机会输入任何文本!它与引号完美配合!非常感谢你@Eamorr:它与引号一起工作是很好的,但实际上chepner解决方案的最后一部分是最好的,在这里您完全避免存储输入,只需让gpg直接获取stdin即可。考虑使用它。嘿,这个解决方案在命令行上工作,但是它并不提示脚本内的输入。
s=$(printf "one\ntwo")
echo $s
echo "$s"