3

いくつかのパッケージのインストールを自動化する小さなスクリプトが bash にあります。apt-get を使用していくつかのパッケージをインストールし、残りはソースからインストールします。必要なすべてのソースを単一の tar ファイルに tar しました。サンプル スクリプトは次のようになります。

#!/bin/bash

apt-get install wget gcc g++ ruby php5 php5-dev xz-utils bzip2 -y

cd /usr/local/bin/
wget my-sources.tar.gz
tar zxvf my-sources.tar.gz
cd my-sources

tar zxvf package1.tar.gz
cd package1
./configure && make && make install

cd /usr/local/src/my-sources
tar zxvf package2.tar.gz
cd package2
./configure && make && make install

cd /usr/local/src/my-sources
tar zxvf package3.tar.gz
cd package3
./configure && make && make install

echo -e "\nFinished\n"

このスクリプトはzlib、Python 2.7 を使用してエンコードされます。

import tempfile
import subprocess
import zlib

with open("/usr/local/src/sample.sh") as inputfile:
    teststr = zlib.compress(inputfile.read()).encode('base64')
    print teststr

これは、次のように実行される python スクリプトに渡されます。

thisstr = "Gu11nX1eVdeGlaMoouIyJtOV/cPBWrp1b7OeY7P7GXtzb
x7HETWRhTHC6NzM3k0nH6dw8uFs+qRtkJWiPrBGs1mlXWJjt7ZSUHe0
ZougLFsrAmxs3b+l+q9UKFrL1aAt0glTEo8bUuSO7Gjfe3JaYpedEgt
qkbZtz825OWUlyiz+pMPmkOdlhYu2ia+at+ZJIGZRkFzsBIqJKNhAQ4
LlBdMzdGu593UzCBtsspZiVntsFlzbyefpjCBk+PDKbyefOZMPy9Xd/
wL3ieojA=="
str=zlib.decompress(thisstr.decode('base64'))

with tempfile.NamedTemporaryFile() as scriptfile:
    scriptfile.write(str)
    scriptfile.flush()
    subprocess.call(['/bin/bash', scriptfile.name])

ここで何が起こるかというと、apt-getが実行されている間に、wgetが試行されます。wgetはまだインストールされていないため、wget コマンドは失敗し、実行はコンパイルおよびビルドの手順に移ります (ファイルが利用できないため、エラーがスローされます) 。その間ずっと、apt-getはまだ実行されています。

これを回避するために2つのステップを試しました:

  • sleep 5コマンドの最後に追加されapt-getます。これは役に立ちませんでした。
  • 別の関数を入れて 、コマンドのapt-get直前に関数を呼び出しました。
    wget

これも役に立ちませんでした。

もちろん、2 回目に実行すると、パッケージがインストールされます (使用してインストールするすべてのパッケージapt-getが既に存在するため)。

これはテスト済みであり、Debian 6/Debian 7 用です。

このエラーを修正するにはどうすればよいですか?

4

1 に答える 1

1

私は自分のスクリプトでこのワークフローを試しましたが、すべて正常に機能しますが、指定した文字列のデコード/解凍はbinascii.Error: Incorrect padding.

私ができる唯一の提案は次のとおりです。

  1. 文字列の前にとrを付けて生の形式にします - base64 形式のエンコーディングではエスケープ シーケンスが作成される可能性があります (ただし、これは指定した文字列の問題ではありません)。
  2. strデコードされた文字列変数を出力します - これは元のスクリプトと一致しますか? &apt-get 行の最後にがあった場合、これにより、説明した動作が生成されます。
  3. 元のスクリプトで呼び出しを試みるとどうなるかを見つけます。

    subprocess.call(['/bin/bash', '/usr/local/src/sample.sh'])

    これで同じ動作が発生する場合は、スクリプトを直接 bash から実行しても発生するかどうかを確認してください。Python が導入する奇妙さ、または bash/apt 構成の問題が原因でバックグラウンドに移行する可能性があります (ただし、それを実行できるオプションについてはまったく知らず、両方ともかなりよく知っています)。

于 2013-09-29T17:52:36.937 に答える