Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python apt get不';在bash脚本中无法按预期工作_Python_Linux_Bash_Debian - Fatal编程技术网

Python apt get不';在bash脚本中无法按预期工作

Python apt get不';在bash脚本中无法按预期工作,python,linux,bash,debian,Python,Linux,Bash,Debian,我在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

我在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"
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])
然后使用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脚本,该脚本按如下方式执行:

#!/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"
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而失败。错误:填充不正确

我唯一能提出的建议是:

  • 将和
    r
    放在字符串之前,使其成为原始格式-base64格式编码可以创建转义序列(尽管这对于您提供的字符串不是问题)
  • 打印
    str
    解码字符串变量-这与原始脚本匹配吗?如果apt get行末尾有一个
    &
    ,这将产生您描述的行为
  • 找到当您尝试使用原始脚本调用时发生的情况

    subprocess.call(['/bin/bash','/usr/local/src/sample.sh'])

    如果这会产生相同的行为,请检查是否仍然直接从bash运行脚本。可能是python引入了一些奇怪的东西,或者是bash/apt配置出现了一些问题,导致事情进入后台(尽管我不知道有什么选项可以做到这一点,而且我对这两个选项都非常了解)


  • 你有没有试过把
    等待
    放在
    apt get
    之后?@lifespanner-没有,我不知道有这样的选择。你能给出
    wait
    的语法吗?这样我就可以试试了。它只是
    wait
    。只需在apt get之后的
    行中键入它即可。请查看
    人工等待
    以供参考。@lifespanner-不。不行。相同错误。问题中给出的base64字符串无效。因此,所讨论的代码不可能是正确的复制者。