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