从绳子上拉起枪



我有一个问题。我想直接从文件中解压缩字符串。我在 bash 中有一个脚本可以创建另一个脚本。

#!/bin/bash

echo -n '#!/bin/bash 
' > test.sh #generate header for interpreter
echo -n "echo '" >> test.sh #print echo to file
echo -n "My name is Daniel" | gzip -f >> test.sh #print encoded by gzip string into a file
echo -n "' | gunzip;" >> test.sh #print reverse commands for decode into a file
chmod a+x test.sh #make file executable

我想生成最短脚本的脚本 test.sh。我正在尝试压缩字符串"我的名字是丹尼尔"并将其直接写入文件 test.sh

但是如果我运行 test.sh 我得到了 gzip:stdin 有标志0x81 - 不支持你知道为什么我会遇到这个问题吗?

gzip 输出是二进制的,因此它可以包含任何字符,因为脚本是使用 bash 生成的,它包含编码的字符(echo $LANG)。

导致单引号之间出现问题的字符是NUL 0x0' 0x27和非ASCII字符128-256 0x80-0xff

解决方案可以是使用 ANSI C 引号$'..'并转义 NUL 和非 ASCII 字符。

编辑 bash 字符串不能包含 NUL 字符:

gzip -c <<<"My name is Daniel" | od -c -tx1 

尝试创建 ANSI 字符串

echo -n $'x1fx8bx08x00xf7ixe2Yx00x03xf3xadTxc8KxccMUxc8,VpIxccxcbLxcd^C1x00xa5ux87xadx11x00x00x00' | od -c -tx1

显示字符串在 NUL 字符后被截断。

最好的折衷方案可能是使用 base64 编码:

gzip <<<"My name is Daniel"| base64
base64 --decode <<__END__ | gzip -cd
H4sIAPts4lkAA/OtVMhLzE1VyCxWcEnMy0zN4QIAgdbGlBIAAAA=
__END__ 

base64 --decode <<<H4sIAPts4lkAA/OtVMhLzE1VyCxWcEnMy0zN4QIAgdbGlBIAAAA=|gzip -cd
<</div> div class="one_answers">

问题在于在 bash 脚本中存储空字符 (\0)。空字符不能存储在回显和变量字符串中。它可以存储在文件和管道中。

我想避免使用 base64,但我用

printf "...%b....%b" "" ""

我用祝福十六进制编辑器编辑了脚本。它对我有用:)

相关内容

  • 没有找到相关文章

最新更新