Linuxバイナリインストーラー(.bin、.sh)はどのように機能しますか?
1. 概要
バイナリファイルにはバイナリデータが含まれています。バイナリデータは通常、マシンで読み取り可能なバイトシーケンスです。 多くのバイナリ形式があり、そのほとんどはソースコードのコンパイル済みバージョンであり、実行可能であることを意味します。 一方、 BLOB (バイナリラージオブジェクト)のような実行不可能なファイルであり、画像、ビデオ、または任意のリッチマルチメディアオブジェクトを含めることができます。
.shファイルも実行可能です。 .sh ファイルは、コマンドを含むシェルスクリプトファイルです。 これらは通常、物事を自動化するために使用され、インストーラーとしても使用できます。
2. Linuxのバイナリファイル
バイナリパッケージは、(ビルド済みの)実行可能ファイルを含み、ソースコードからビルドされ、元に戻せないアプリケーションパッケージです。 バイナリの最も重要な利点は、ソースコードを隠し、将来の変更を防ぐことができることです。 Linuxは、.binまたは任意のファイル名を持っている場合でもバイナリを実行できます。 拡張機能はどういうわけか無関係です。
Linuxシステムでは、バイナリファイルまたはパッケージの標準ディレクトリは / usr / bin、であり、システム固有のバイナリのほとんどが見つかります。 また、 / user / local / bin は、非システムバイナリ、つまり ローカルでコンパイルまたは保守されたパッケージは保持されます。 ただし、これらのディレクトリは両方とも、システム全体のすべてのユーザーを対象としています。 特定のユーザーの場合、バイナリをそこに保持しないでください。適切なディレクトリは $ HOME /binまたは$HOME / .local /binです。
2.1. ソースからバイナリを作成する
アプリケーションを作成して、バイナリファイルにコンパイルしてみましょう。
$ cat > demo.c <<EOF
#include <stdio.h>
void main() {
printf(“Hello World!\n”);
}
EOF
今、それをコンパイルします:
$ gcc demo.c -o demo
実行可能バイナリファイルのデモに準拠させたら、次のように実行します。
$ ./demo
Hello, World!
ソースが多数のファイルで構成されている場合、上記のようにコンパイルするのは非常に面倒です。 このような場合、 make を使用して、ビルドプロセスを自動化および管理できます。 Makefile。と呼ばれる一連のタスクを含む構成ファイルが必要です。
2.2. .shからバイナリを作成する
シェルスクリプトコンパイラまたはSHCは、スクリプトを取得してエンコードまたは暗号化するツールです。 これにより、不要な変更を防ぎ、ソースコードを非表示にします。 この例では、汎用シェルコンパイラを使用します。 スクリプトをコンパイルまたは難読化するためのツールは他にもたくさんあります。
まず、入力した数値の合計を返すスクリプトsum.shを作成しましょう。
#!/bin/bash
total=0
for i in $@; do
if [ ! -z “${i##[0-9]*}” ]; then
echo “Please enter numeric only”
exit 1
fi
total=$(($total + $i))
done
if [ $total -eq 0 ]; then
echo “Plesae execute script like: $0 10 20 30”
exit 0
fi
echo $total
実行する前に、その権限を実行可能ファイルに変更する必要があります。
$ chmod +x sum.sh
$ ./sum.sh 8 9 10
27
次に、SHCの最新バージョンをダウンロードしてインストールしましょう。 次に、スクリプトをコンパイルしてバイナリに変換します。
$ shc -U -f sum.sh
スクリプトのC言語バージョンsum.sh.xc、、およびバイナリバージョン sum.sh.x、の2つの新しいファイルが作成されます。 これで、sum.sh.xをバイナリとして実行できます。
$ mv sum.sh.x sum.bin
$ ./sum.bin
3. 自己抽出インストーラー
通常、パッケージのインストール、更新、削除にはパッケージマネージャーを使用します。 パッケージのダウンロード、抽出、検証のプロセスを自動化します。
ただし、インストールを管理する方法はこれらだけではありません。 バイナリペイロードまたはアーカイブファイルをシェルスクリプトに追加することは、パッケージを配布する1つの方法です。 自己抽出インストーラーはそのペイロードを抽出し、コンテンツを適切な場所にコピーします。
ここでは、.shファイルをインストーラーとして使用する方法について説明します。 この例では、パッケージソースを作成しましょう。
$ mkdir demo-package && touch demo-package/demo-app.txt
次に、デモパッケージをビルドしてアーカイブします。
$ tar -cvf archive.tar demo-package ; gzip -9 archive.tar
それでは、インストーラースクリプトinstaller.shを作成しましょう。
#!/bin/bash
function die() { echo "Error!"; exit 1; }
installer="$(pwd)/$(basename $BASH_SOURCE)"
cd ~/ || die
echo "Installing demo-app to ~/demo-app..."
archive=$(grep -a -n "__ARCHIVE_BELOW__:$" $installer | cut -f1 -d:)
echo $(tail -n +$((archive + 1)) $installer)
tail -n +$((archive + 1)) $installer | gzip -vdc - | tar -xvf - > /dev/null || die
# run some post installation if any
# ./app_name/bin/post_install_configuration.sh || die
echo "Installation complete!"
exit 0
__ARCHIVE_BELOW__:
次に、アーカイブをInstaller.shに追加します。
$ cat archive.tar.gz >> installer.sh
次に、実行可能にします。
$ chmod +x installer.sh
そして最後に、インストーラーの準備が整いました。 これを実行して、パッケージを〜/にインストールできます。
$ ./installer.sh
悪意のある変更に対する由緒あるため、この例を本番環境で使用することはお勧めしません。 また、パッケージマネージャーとは連携しないため、依存関係の解決が面倒な場合があります。そのため、静的にリンクされた実行可能ファイルを使用するパッケージもあります。つまり、必要なすべてのライブラリも追加されています。 これらの追加ライブラリは、パッケージマネージャーからのインストールと比較して、使用時に少しのメモリを浪費します。
3.1. makeselfを使用する
makeself などのコマンドラインツールを使用して、自己抽出インストーラーを作成することもできます。 インストーラーに必要なオプションがたくさんあります。 これには、整合性と自己検証のチェックサムが含まれており、前の例の主要なセキュリティ上の欠陥を軽減します。
構文:
$ makeself.sh [args] package_directory file_name label startup_script [script_args]
この例では、パッケージソース / demo-app があり、demo-pkg.runというインストーラーを作成します。
$ makeself.sh --notemp ./demo-app ./demo-pkg.run "SFX archive for backup" echo "Extraction done"
Header is 715 lines long
About to compress 4 KB of data...
Adding files to archive named "./demo-pkg.run"...
./demo.txt
CRC: 3275129549
MD5: a718fbcfbb01730655ecaf5695dcb95b
Self-extractable archive "./demo-pkg.run" successfully created.
$ ./demo-pkg.run
Creating directory demo-app
Verifying archive integrity... 100% MD5 checksums are OK. All good.
Uncompressing SFX archive for backup 100%
Extraction done
echo“ Extraction done”をスタートアップスクリプトに置き換えることができます。 この起動スクリプトは、ディスク上のパッケージファイルを使用してシェルスクリプトで実行できることは何でも実行できます。 パッケージを適切なディレクトリに移動できます。
4. 結論
この記事では、単一のスクリプトファイルでも、数百のファイルを含むソフトウェアパッケージ全体をインストールできることを学びました。 さらに、バイナリファイル/パッケージと、 .sh スクリプトをバイナリファイルに変換し、バイナリと同じように使用する方法について学びました。