【发布时间】:2013-09-30 19:29:51
【问题描述】:
我在 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
我该如何纠正这个错误?
【问题讨论】:
-
你试过把
wait放在apt-get后面吗? -
@lifesaspanner - 不,我不知道有这样的选择。您能否给出
wait的语法以便我试一试? -
只是
wait。只需在apt-get之后的行中输入即可。请查看man wait以供参考。 -
@lifesaspanner - 不。不工作。同样的错误。
-
问题中给出的 base64 字符串无效。因此,有问题的代码不可能是正确的复制器。