3

我在 bash 中有一个小脚本,它可以自动安装一些包。它使用 apt-get 安装一些软件包,其余的来自源代码。我将需要的所有资源都压缩到一个 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仍在执行中。

我尝试了两个步骤来避免这种情况:

  • 在命令sleep 5末尾添加。apt-get这没有帮助。
  • 放入apt-get另一个函数并在命令
    之前调用该函数。wget

这也没有帮助。

当然,当我第二次运行它时,会安装包(因为要安装的所有包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 回答