【问题标题】:apt-get doesn't work as expected within bash scriptapt-get 在 bash 脚本中无法按预期工作
【发布时间】: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 字符串无效。因此,有问题的代码不可能是正确的复制器。

标签: python linux bash debian


【解决方案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 配置的一些问题(尽管我不知道有什么选项可以做到这一点,而且我都非常了解)。

【讨论】:

    猜你喜欢
    • 2018-10-28
    • 1970-01-01
    • 2012-05-10
    • 2021-12-20
    • 2022-07-20
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 2021-11-08
    相关资源
    最近更新 更多