我在 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
一直在执行。
我尝试了两个步骤来避免这种情况:
- 在
apt-get
命令的末尾添加了sleep 5
。这没有 帮助。 - 将
apt-get
放在另一个函数中并调用该函数
在wget
命令之前。
这也没有帮助。
当然,当我第二次运行它时,包就安装好了(因为所有要使用apt-get
安装的包都已经存在了)。
这已经过测试并且适用于 Debian 6/Debian 7
我该如何纠正这个错误?
最佳答案
我已经用我自己的脚本尝试了这个工作流程,一切对我来说都很好,尽管解码/解压缩您提供的字符串失败并显示 binascii.Error: Incorrect padding
。
我能提出的唯一建议是:
- 在字符串前加上
r
以使其成为原始格式 - base64 格式编码可以创建转义序列(尽管这对于您提供的字符串来说不是问题)。 - 打印您的
str
解码字符串变量 - 这与原始脚本匹配吗?如果 apt-get 行末尾有&
,这将产生您描述的行为。 找出当您尝试使用原始脚本调用时会发生什么 ie
subprocess.call(['/bin/bash', '/usr/local/src/sample.sh'])
如果这产生相同的行为,请检查它是否仍然直接从 bash 运行脚本。可能是 python 引入了一些奇怪的东西,或者是 bash/apt 配置的一些问题导致事情进入后台(尽管我不知道可以做到这一点的任何选项,而且我对两者都非常了解)。
关于python - apt-get 在 bash 脚本中没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19000977/