20
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

シェルスクリプトの後ろにバイナリを埋め込む手法はPOSIXで考慮されているという話

Posted at

思いっきり雑学レベルの話ですみませんが、思い出した今書かないと忘れそうだなと思ったのでw

この手法で何が出来るかと言うと、シェルスクリプトを実行するとスクリプトファイルの後ろ(exit で終了されて実行されない領域)に結合されたバイナリ形式の圧縮ファイル部分を抜き出して /tmp 以下に展開してそこに含まれているバイナリ形式の実行ファイルを実行して、一見シェルスクリプトのように見えるのに実はバイナリファイルを実行してるじゃんなどという楽しいことができます。いかにもハックまがいの手法に見えますが、どうやらこの手法は POSIX で考慮されているようです。

これを知ったのは「シバン shebang がないシェルスクリプトはどのシェルで動くかわからない(からちゃんと書いとけ)」の記事を書いている時に見つけた fish の PR 7802 です。fish はシバンがないスクリプトを実行するとエラーになっていたのですが 3.3.0 からエラーにならずに POSIX シェルで実行するようになりました。PR 7802 はその修正を行った PullRequest です。

この PullRequest によると、(この修正により fish は)「バイナリコンテンツが結合されたシェルスクリプトを実行できるようになります。」「POSIX は最近この動作を要求するように改定されました」とあります。

...
it can run shell scripts having concatenated binary content.
...
POSIX was recently revised to require this behavior:

この話に関係する POSIX の Issue Tracker(Austin Group Defect Tracker)の Issue は次の 2 つです

詳細は記事参照ということで逃げますが、ようするには以前は「シェルスクリプトはテキストファイルでなければならない」という仕様だったのが「実際にはシェルスクリプトの後ろにバイナリコンテンツ(圧縮ファイルなど)が結合されたシェルスクリプトがたくさん使われてるよね?テキストファイルでなければならないだとダメだよね?」という流れで、シェルスクリプトが実行可能かどうかを判断する方法が修正されました。

ま、POSIX ってこういうもんです。POSIX が仕様を決めてみんながそのとおりに実装するという流れではなくて、現実の実装を元に仕様としてまとめてるだけなんです。どの実装も今はこうなってるからこれを仕様にしようぜって後から改定してるのが POSIX です。

ということで今はそういうシェルスクリプトは POSIX で認められているということです。POSIX 準拠の方法ですので、みなさんもバンバン、シェルスクリプトにバイナリを埋め込みましょう!

20
12
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?