DUICUO

自己解凍スクリプトを使用してソフトウェアとデータをパッケージ化する方法

[[438295]]

[51CTO.com クイック翻訳]場合によっては、パッケージ マネージャーを使用せずにデータやソフトウェアをユーザーに配布するための高速かつ信頼性の高い方法が必要になることがあります (たとえば、エンド ユーザーにアプリケーションをインストールするためのルート アクセス権がない場合があります)。

この問題はコンテナとPodman、またはDockerを使用することで解決できますが、ターゲットシステムでこれらが利用できない場合はどうなるでしょうか?また、アプリケーションがベアメタル環境で正しく動作することが要件の1つである場合はどうなるでしょうか?

pip で Python を使用することもできます (Python 以外の成果物もパッケージ化できることはご存知でしょう)。ただし、インストールの制限 (仮想環境または --user オプション) が発生する可能性があり、Python コードをパッケージ化するための定型コードが必要になることは言うまでもありません。

この記事では、権限昇格を必要としない自己解凍スクリプトを作成するための、非常に小さいながらも効果的な手法を紹介します。

データを設定する

Damiaan Zwietering 氏は、COVID-19 に関する優れた Git コードリポジトリを公開しています。データと可視化ツール(Jupyter ブックと Excel スプレッドシート)は揃っていますが、インストーラーがありません。もし、ユーザーにこのリポジトリを公開したいものの、Git にアクセスできない場合は、自己解凍型のインストーラーを作成すればいいでしょう。

実際には、配布したいデータは既に存在します。ただし、処理するサンプルデータもいくつかあるため、まずリポジトリをホームディレクトリにクローンします。

  1. $ git クローン https://gitlab.com/dzwietering/corona.git

現時点では大量のデータとそれほど浅くないディレクトリ構造がありますが、`git archive` コマンドを使用して .tar ファイルを作成できます。

  1. $ cd $HOME / コロナ
  2. $ git アーカイブ--verbose --output $tempdir/corona.tar.gz HEAD  

この例では、パッケージ化されたファイルはユーザーと共有するファイルです。

自己解凍スクリプトの構造

自己解凍スクリプトは次の部分で構成されます。

1. ユーザーがデータを抽出するのに役立つコード(「ペイロード」)

2. スクリプトから抽出されるデータ(抽出対象)が抽出されるアンカー ポイント。

3. 後続のデータのアンカーポイントの位置を抽出します。

Bash は、こ​​のようにスクリプトを定義するのに非常に優れていることが証明されています。

ペイロードを作成する

一つのアイデアです。配布したいデータが、多数のスクリプトとデータを含むディレクトリだとします。権限と構造はそのままに、ユーザーが自分のホームディレクトリに「解凍」できるようにしたいとします。

tarコマンドは動作するように思えます。しかし、ユーザーがtarの使い方を知らない場合や、tarballファイルをマウントする際に特別なオプション(特定のファイルのみを抽出するなど)が必要な場合を考えてみましょう。

もう1つの問題は、.tarアーカイブがバイナリファイルであることです。メールで送信する場合は、安全な送信のためにUuencodeまたはBase64を使用して正しくエンコードする必要があります。

どうすればいいでしょうか?.tarファイルを捨てずに、Bashスクリプト(すぐに作成します)に追加できるように準備しておきましょう。

  1. $ base64 $tempdir/corona.tar.gz > $tempdir/corona_payload
  2. $ ファイル $tempdir/corona_payload
  3. /tmp/tmp.8QNdzdKEkG/corona_payload: ASCIIテキスト

.tar ファイルからデータを抽出する

すべてのコンテンツを新しいディレクトリに移動できます。

  1. $newbase=$HOME/コロナデータ
  2. $ テスト ! -d $newbase && /bin/mkdir --parents --verbose $newbase  
  3. $ tar --directory $newbase \  
  4. --file corona.tar.gz --extract --gzip --verbose  

あるいは、対策、試行、テストのリストなど、その一部のみを抽出することもできます。

  1. $newbase=$HOME/コロナデータ
  2. $ テスト ! -d $newbase && /bin/mkdir --parents --verbose $newbase  
  3. $ tar --directory $newbase --file corona.tar.gz \  
  4. --extract --gzip --verbose 測定実験テスト 

この演習では、すべてのコンテンツがベース ディレクトリ (例: $HOME) に抽出され、次の結果になりました。

  1. $HOME/$COVIDUSERDIR

自己解凍スクリプトの解析

以下は自己解凍型スクリプトのコードです。このスクリプトをご自身のGitリポジトリに保存し、他のデプロイメント環境で再利用できます。以下の点にご注意ください。

  • SCRIPT_END は、スクリプト内のペイロードの開始位置です。
  • ユーザー入力をクリーンアップします。
  • メタデータがどこにあるかがわかったら、それをスクリプト ($0) から抽出し、バイナリ コードに再デコードして解凍します。
  1. #!/usr/bin/env バッシュ
  2. # 著者: ホセ・ビセンテ・ヌニェス
  3. SCRIPT_END=$(/bin/grep --max-count 2 --line-number ___END_OF_SHELL_SCRIPT___ "$0"| /bin/cut --field 1 --delimiter :| /bin/tail -1)|| exit 100  
  4. ((SCRIPT_END+=1))
  5. ベースディレクトリ=
  6. while test -z "$basedir" ; 実行する
  7. read -r -p "$HOMEを基準として、COVID-19データをどこに抽出しますか?(例:mydata -> $HOME/mydata。中止するにはCTRL-Cを押してください)" basedir
  8. 終わり
  9. :<<ドキュメント
  10. ユーザー入力をサニタイズします。これは非常に制限的ので、実際アプリケーションの要件によって異なります
  11. ドキュメント
  12. CLEAN=${basedir//_/}
  13. クリーン=${クリーン// /_}
  14. クリーン=${クリーン//[^a-zA-Z0-9_]/
  15. if [ ! -d "$HOME/$CLEAN" ]; then  
  16. echo "[INFO]: ディレクトリ $HOME/$CLEAN を作成しようとします"  
  17. if ! /bin/mkdir --parent --verbose "$HOME/$CLEAN"; then  
  18. echo "[エラー]: $HOME/$CLEAN の作成に失敗しました"  
  19. 出口100
  20. フィ
  21. フィ
  22.  
  23. /bin/tail --lines +"$SCRIPT_END" "$0"| /bin/base64 -d| /bin/tar --file - --extract --gzip --directory "$HOME/$CLEAN"  
  24. 出口0
  25. # これで終わり スクリプト埋め込まれたファイル
  26. ___シェルスクリプトの終了___

では、スクリプトにペイロードを追加するにはどうすればいいでしょうか? 2つの部分を結合するには、少しの猫用接着剤を使うだけです。

  1. $ cat covid_extract.sh \
  2. $tempdir/corona_payload > covid_final_installer.sh

実行可能にする:

  1. $ chmod u+x covid_final_installer.sh

インストーラーがペイロードとどのように結合されるかがわかります。ペイロードが含まれているため、インストーラーのサイズはかなり大きくなります。

インストーラーを実行する

これは効果がありますか?ぜひご自身でも試してみてはいかがでしょうか?

  1. $ ./covid_final_installer.sh
  2. COVID-19データをどこで抽出たいですか   /home/josevnz?(例:mydata -> /home/josevnz/mydata。中止するにはCTRL-Cを押してください):COVIDDATA
  3. [INFO]: 試しみます  /home/josevnz/COVIDDATAディレクトリを作成します。
  4. /bin/mkdir: ディレクトリ'/home/josevnz/COVIDDATA'を作成しました 
  5. $ ツリー /home/josevnz/COVIDDATA
  6. /home/josevnz/COVIDDATA
  7. ├── acaps_covid19_政府対策_データセット_0.xlsx
  8. ├── acaps_covid19_政府対策_データセット.xlsx
  9. ├── COVID-19-地理的分布-世界.xlsx
  10. ├── EUCDC.ipynb
  11. ├──実験
  12. ...

自己解凍インストーラーは非常に便利です。

自己解凍型インストーラーはさまざまな理由から非常に便利だと思います。

まず、スクリプトは好きなだけ複雑にもシンプルにもできます。最も複雑な部分は、スクリプトがペイロードをどこから抽出するかを定義することです。

この手法を知っておくと便利です。マルウェアインストーラーもこの手法を使用しているためです。これで、スクリプト内でこのようなコードを見つける準備がより整いました。同様に重要なのは、自己解凍型スクリプトでユーザー入力を検証することで、シェルインジェクションの悪用を防ぐ方法も理解できたことです。

原題: 自己圧縮スクリプトによるソフトウェアとデータのパッケージ、著者: Jose Vicente Nunez

[この記事は51CTOによって翻訳されました。提携サイトへの転載の際は、元の翻訳者と出典を51CTO.comとして明記してください。]