web-dev-qa-db-ja.com

Linux Shellスクリプトをコンパイルして、スタンドアロンの実行可能* binary *(つまり、chmod 755だけでなく)にする方法は?

さまざまな「古典的な」スクリプト言語をコンパイルする無料のオープンソースツールセットを探しています。 Korn Shell、ksh、csh、bashなどを実行可能ファイルとして-スクリプトが他のプログラムまたは実行可能ファイルを呼び出す場合、それらが単一の実行可能ファイルに含まれるようにします。

理由:

  1. 顧客への配信用のコードを難読化して、知的財産を明らかにしないようにします-アクセスに関して設定できる権限を制御できない顧客の自分のマシン/システムへの配信のため、プログラムファイルはバイナリである必要があります。これにより、テキストエディターまたはhexdumpビューアーで表示しても動作を簡単に確認できません。

  2. 外部の依存関係を最小限に抑えて、顧客に単一の展開プログラムを作成します。

パッケージマネージャーを必要としないシンプルなものを好みます。

  1. お客様の知識に頼ってパッケージングの指示を実行することはできません。

  2. パッケージのインストールに関する(そして実際にはサードパーティからの)マシンを管理するポリシーに頼ることはできません。

最も簡単な推奨アプローチは、依存関係なしですぐに実行できる単一の実行可能ファイルを適切なマシンコードにコンパイルできることです。

41
therobyouknow

私のニーズを完全に満たすソリューションは、無料ツールのSHC、または商用ツールのCCshです。どちらもシェルスクリプトをCにコンパイルし、Cコンパイラを使用してコンパイルできます。

SHCに関するリンク:

CCshに関するリンク:

39
therobyouknow

これを使用できます: http://megastep.org/makeself/

これにより、バンドルされたtar.gzアーカイブを一時ディレクトリに自動抽出するシェルスクリプトが生成され、抽出時に任意のコマンドを実行できます。

このツールを使用すると、1つのシェルスクリプトのみをクライアントに提供できます。

このスクリプトは、ofbsh難読化されたスクリプトとバイナリを/ tmpに抽出し、それらを透過的に実行します。

5
SirDarius

ofbshのようなもの でシェルスクリプトを難読化できます。ただし、他のプログラムをunixの単一の実行可能ファイルに簡単にバンドルすることはできません。通常、インストールのアプローチは、プラットフォームのパッケージマネージャー用のパッケージを作成する(たとえば、 rpm、deb、pkg )か、tarballを提供することです。適切なディレクトリで展開します。

内容を解凍する実行可能ファイルが必要な場合は、シェルアーカイブを使用できる場合があります。 shar(1) のドキュメントを見て、それがあなたが望むものを手に入れるかどうか見て

複数のCプログラムを結合するためのスクリプト機能が本当に必要な場合は、Tcl言語をご覧ください。 argv[]スタイルパラメータを参照することを期待するCプログラムを簡単にラップするように設計されたAPIがあります。 CコードのチャンクをカスタムTclインタープリターに埋め込み、さまざまなTclスクリプトと接着することもできます。

本当に不透明にする必要がある場合は、tclスクリプトを暗号化し、tclスクリプトを暗号化解除してバッファーに入れてからTclインタープリターを実行するもので全体をラップできます。 Tclはファイルまたはchar*バッファーからスクリプトを受け入れることができるため、暗号化されていないスクリプトがファイルシステムにアクセスする必要はありません。

shc

元の source を変更し、機能を追加してバグを修正した新しいバージョンにアップグレードしました。 こちら です。

使用例:

shc -f script.sh -o binary_name

script.shは、binary_nameという名前のバイナリにコンパイルされます

この実行可能ファイルを実行するには、システムに必要なシェルをインストールする必要があります。

3
Jahid

利用可能なオプション:

  • コードをボックスで初めて実行するときに、必要なパッケージがすべて存在するかどうかを確認するロジックをコードに記述します。そうでない場合、コードは自動的にパッケージ自体を取得してインストールします...ユーザーに何もせずにそれらをインストールします。ユーザーに尋ねる必要がある唯一の質問は、「前述のパッケージのインストールを続行してもよろしいですか?(Y/N)」です。それ以外のものは多すぎます。

  • 上記のコードが完成したら(はい、これをコーディングするのはそれほど簡単ではないかもしれませんが、コーディング機能がわからないかもしれません)、完成したコードをコピーして貼り付けます kinglazy.com のようなサイトで、実際の実行可能ファイルが生成されます。

この特定のオプションにはいくつかの利点があります。

  • はい。独自の情報を公開することなく、暗号化されたバージョンのスクリプトを実行できます。
  • 誰もあなたのスクリプトを「見る」ことはできません。もしそうすれば、彼らにとって意味のない解読不能な暗号化された専門用語しか見えないからです。
  • スクリプトを変更すると、スクリプトがすぐに動作しなくなるため、誰もスクリプトを変更できません。
  • スクリプトの動作を確認するためにスクリプトでデバッガを実行することはできません。存在する場合、スクリプトは中止されます。
  • また、同じサーバー上でスクリプトのコピーを作成することはできません。実行すると、中止されて機能しなくなります。ユーザーがスクリプトを配置したい場所の元の場所へのシンボリックリンクのみを作成できるようにします。

私はあなたが求めたもののいくつかを見逃しているかもしれませんが、上記はあなたが望むものの大部分を満たすと信じています。

これが他のスクリプトで機能するかどうかはわかりませんが、シェルスクリプトでは確実に機能します。

1
Blessed

arx は優れたバンドル機能であり、難読化ツールをワークフローに統合できる場合があります。

1
vdm