2009-06-05 11 views
60

一部のソフトウェア(例:NetBeans IDE)はLinuxインストーラを.shファイルで提供しています。 IDE全体を「シェルスクリプト」にいかに正確にパッケージ化しているのか不思議で、エディタでファイルを開きました。私はいくつかのプレーンテキストシェルスクリプトコードを見て、それからいくつかのランダムな不器用さを見ました。私はそれが「バイナリ」または非プレーンテキストであると考えています。Linuxバイナリインストーラ(.bin、.sh)はどのように動作しますか?

私はそれらが普通のシェルスクリプトをどのように混ぜて、おそらくバイナリである「読み込み不可能な」ものを呼び出すのだろうと思います。

これについての洞察はありますか?

+0

私はCurtの答えを選んだのですが、プロセスを説明するツールを指すのではなく、その説明をしたからです。 Seb、James、Nikありがとうございました。 –

答えて

83

基本的には、tarアーカイブなど、ある種の圧縮されたアーカイブの前に置かれたシェルスクリプトです。 tailまたはsedコマンド(Bourneシェルの変数$0)を使用して、前面のシェルスクリプトを取り除き、残りの部分をunarchiverに渡します。

#!/bin/sh -e 
sed -e '1,/^exit$/d' "$0" | tar xzf - && ./project/Setup 
exit 

sedコマンドは、上記の「出口」で始まる最初のものへのファイルの最初の行からのすべての行を削除し、次に渡し:

たとえば、self-extractingとして次のスクリプトを作成しますスルーしてください。 "exit"行がtarファイルの直後に開始するものがある場合は、tarコマンドがそれを抽出します。成功した場合は、./project/Setupファイル(おそらくタールボールから抽出されたもの)が実行されます。その後

mkdir project 
echo "#!/bin/sh" > project/Setup 
echo "echo This is the setup script!" >> project/Setup 
chmod +x project/Setup 
tar czf - project >> self-extracting 

あなたは古いprojectディレクトリを取り除く場合さて、あなたはself-extractingを実行することができ、それはそのtarファイルを抽出し、設定スクリプトを実行します。

+0

シェルスクリプトはアーカイブコンテンツとどのように対話するのですか(おそらくその他の言語アセンブリ/バイナリ/バイトコード) –

+1

多くの実際のケースでは、バイナリ部分はbase64でエンコードされるか、印刷可能な文字のみが含まれます。 – SingleNegationElimination

+2

Amit:アーカイブを解凍したら、それはディスク上のファイルだけで、シェルスクリプトがディスク上のファイルでできることは何でも行うことができます。私の例では、アーカイブから抽出されたセットアップスクリプトが実行されます。 –

51

あなたは著者のノートからmakeself.sh

をチェックアウトする場合があります。

makeself.shは、ディレクトリから、自己抽出のtar.gzアーカイブを作成する小さなシェルスクリプトです。結果のファイルはシェルスクリプトとして表示され(それらの多くは.run接尾辞を持ちます)、そのまま起動することができます。アーカイブは一時ディレクトリに解凍され、オプションの任意のコマンドが実行されます(インストールスクリプトなど)。

メイクアップアーカイブには、整合性自己検証(CRCおよび/またはMD5チェックサム)のチェックサムも含まれています。

makeself.shスクリプト自体は、ファイルのディレクトリからアーカイブを作成するためにのみ使用されます。作成されたアーカイブは実際に圧縮された(gzip、bzip2、またはcompressを使用した)TARアーカイブで、最初に小さなシェルスクリプトスタブが付いています。この小さなスタブは、ファイルの抽出、埋め込みコマンドの実行、および一時ファイルの削除のすべてのステップを実行します。このようなアーカイブに含まれているソフトウェアをインストールするためにユーザーが何をしなければならないかは、アーカイブを実行することです[スクリプトを実行しています]

私はこのスクリプトのコードをできるだけポータブルそれはbash特有の機能に依存しておらず、機能するUNIX互換システムにインストールされたコマンドだけを呼び出します。このスクリプトとそれが生成するアーカイブは、互換性のあるBourneシェルとともにUnixフレーバーで実行する必要があります。ただし、圧縮プログラムが利用可能であることはもちろんです。

最後に、makeselfパッケージ自体は、makeself.runという自己解凍スクリプトとして提供されます。

+0

クールで、Ubuntuリポジトリにもパッケージがあります! sudo apt-get installをインストールする – weekens

4

のGNUのsharutils:

http://www.gnu.org/software/sharutils/

シェルアーカイブを作成するためのツールセットであり、そのようなペイロードが破損していないことを確実にチェックサムとして役立つかもしれないいくつかの追加機能を(提供輸送中)。

最終的な製品がシェルによって解釈可能でなければならない場合、悪意のある変更から保護することは実際には実現可能ではありません - 世代技術を理解している誰でもチェックサムを変更する可能性があります。

0

他にも/商用のソフトウェアインストーラビルダー(InstallAnywhereなど)もあります。これらは基本的に独自のバージョンのshar/makeselfを持っています。

NetBeansはアンパックと起動がNBIネイティブ・ランチャー・コンポーネントで行われていた、自分のインストーラエンジンを持っており、その一部:http://wiki.netbeans.org/NBINativeLaunchers

は、Linux/Unixの/ MacOSのためのシェル(スクリプト)のアーカイブを作成し、 Windows用のネイティブ実行可能ファイルあなたはあなた自身のプロジェクトにもこのツールを使うことができます。

関連する問題