2017-10-14 14 views
0

問題が1つあります。私はファイルから文字列を直接解凍したいと思います。私は別のスクリプトを作成するbashに1つのスクリプトを持っています。Gunzip from string

#!/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を生成したいと思います。 "My name is Daniel"という文字列を圧縮してファイルtest.shに直接書き込もうとしています

しかし、test.shを実行するとgzipが得られます:stdinにフラグ0x81があります - サポートされていません 私はこの問題を抱えていますか?

答えて

1

gzip出力はバイナリなので、任意の文字を含むことができます。スクリプトはbashで生成されるため、エンコードされた文字(echo $LANG)が含まれています。

シングルクォーテーションで問題が発生する文字は、NUL 0x0,' 0x27、非アスキー文字128-256 0x80-0xffです。

解決策は、ANSI Cの引用符$'..'を使用し、NULと非ASCII文字をエスケープすることができます。 bashの文字列はNUL文字含めることはできません

EDIT:ANSI文字列

echo -n $'\x1f\x8b\x08\x00\xf7i\xe2Y\x00\x03\xf3\xadT\xc8K\xccMU\xc8,VpI\xcc\xcbL\xcd\^C1\x00\xa5u\x87\xad\x11\x00\x00\x00' | od -c -tx1 

を作成しようとして

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

は、文字列がヌル文字の後に切り捨てられていることを示しています。

最良の妥協はbase64エンコードを使用することがあります

gzip <<<"My name is Daniel"| base64 

base64 --decode <<__END__ | gzip -cd 
H4sIAPts4lkAA/OtVMhLzE1VyCxWcEnMy0zN4QIAgdbGlBIAAAA= 
__END__ 

または

base64 --decode <<<H4sIAPts4lkAA/OtVMhLzE1VyCxWcEnMy0zN4QIAgdbGlBIAAAA=|gzip -cd 
0

問題は、bashスクリプトにnull文字(\ 0)を格納していました。 エコーおよび可変文字列には、NULL文字を格納できません。ファイルやパイプに格納することができます。

は、私が使用BASE64を避けたいが、私はバイナリエディタを祝福して、スクリプトを編集し

printf "...%b....%b" "\0" "\0" 

でそれを修正しました。それは私のために働いています:)