結論
シバン(#!)がないからかな?と思ったらやっぱりそうでした
はじめに
shc は shell script をストリップ済のバイナリにコンパイルしてくれるツールです
暗号化ストレージを起動時に復号化する shell とか、起動時にコピーされたSDかチェックするとか中身を読んでほしくないし触ってほしくない shell をカジュアルに難読化するのに便利です
shc が元の shell script から生成した c ファイルを眺めてみると(キレイで読みやすいコードで、読んでて楽しいです)、元の shell を RC4 で暗号化してバイナリで保持し、複合して実行してくれるようです
ファイルへの変更の痕跡のチェックとかいい感じで対タンパーチェックもしてくれているようです
shc のインストール
debian だと
sudo apt-get install shc
でオッケーです。Raspberry Pi の Raspbian もこれでオッケーでした
shc の使い方
man page を見ると例として
shc -v -r -T -f myscript.sh
とかで myscript.sh から myscript.sh.x というバイナリの実行形式をつくってくれるそうです。
因みに -T は「トレーサブル」オプションで、strace とか ptrace とかでトレースできちゃうようなバイナリをつくってくるそうです。いらないので私はつかってません
詳細な説明は文献1 のブログがすごくわかりやすかったです
エラー
で、表題のエラー
シバンがないことが原因かな?とか思いながらググってみたらやっぱり文献2のとおりでしたので、バイナリ化する shell の先頭行に
#!/bin/bash
を追加すると正常にバイナリ化できました
感想
「結論を最初に」ってよく言いますけど、思い切って「はじめに」よりも前に「結論」をもってきてみたんですけど、これ、案外いけてる構成な気がするんですがどうでしょ
futur works
生成された c のコードを例えば Obfuscator-LLVM みたいなオブフスケーターにかけてみたらどうなるかとか
references
-
[文献1]シェル・スクリプトをバイナリ化 (shc) わかりやすく詳細な説明がありがたいです。このブログで shc の存在を知りました。感謝です。
-
[文献2]how to encrypt shell script シバンがないよ、という回答