我在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"
然后使用python 2.7中的zlib
对此脚本进行编码:
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
如何更正此错误?
答案 0 :(得分:1)
我已经使用自己的脚本尝试了这个工作流程,一切正常,但解码/解压缩您提供的字符串失败了binascii.Error: Incorrect padding
。
我可以提出的唯一建议是:
r
以使其成为原始格式 - base64格式编码可以创建转义序列(尽管这不是您提供的字符串的问题)。str
已解码的字符串变量 - 这是否与原始脚本匹配?如果在apt-get行的末尾有&
,则会产生您描述的行为。查看使用原始脚本尝试呼叫时发生的情况,即
subprocess.call(['/bin/bash', '/usr/local/src/sample.sh'])
如果这会产生相同的行为,请检查它是否仍然直接从bash运行脚本。这可能是python引入的一些奇怪或bash / apt配置的一些问题导致事情进入后台(虽然我不知道任何可以做到这一点的选项,我知道两者都相当好。)