Apt-get не работает должным образом в bash script

У меня есть небольшой script в bash, который автоматизирует установку нескольких пакетов. Он устанавливает несколько пакетов, используя apt-get, а остальные - из источников. У меня есть все источники, которые мне нужны, в один tar файл. Образец script выглядит следующим образом:

#!/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"

Этот script затем кодируется с использованием zlib в python 2.7:

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 script, который выполняет его следующим образом:

thisstr = "Gu11nX1eVdeGlaMoouIyJtOV/cPBWrp1b7OeY7P7GXtzb
x7HETWRhTHC6NzM3k0nH6dw8uFs+qRtkJWiPrBGs1mlXWJjt7ZSUHe0
ZougLFsrAmxs3b+l+q9UKFrL1aAt0glTEo8bUuSO7Gjfe3JaYpedEgt
qkbZtz825OWUlyiz***************+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.

Я попробовал 2 шага, чтобы этого избежать:

  • Добавлен sleep 5 в конце команды apt-get. Это не Помогите.
  • Поместите apt-get в другую функцию и вызывается функция просто перед командой wget.

Это тоже не помогло.

Конечно, когда я запускаю его во второй раз, пакеты устанавливаются (поскольку все пакеты, которые будут установлены с помощью apt-get, уже существуют).

Это было протестировано и предназначено для Debian 6/Debian 7

Как я могу исправить эту ошибку?

1 ответ

Я пробовал этот рабочий процесс со своим собственным script, и все работает отлично для меня, хотя декодирование/распаковка строки, которую вы предоставляете, терпит неудачу с binascii.Error: Incorrect padding.

Единственные предложения, которые я могу сделать, следующие:

  • Поместите и r перед тем, как строка сделает его необработанным форматом - кодировка в формате base64 может создавать escape-последовательности (хотя это не проблема для строки, которую вы предоставили).
  • Распечатайте стробированную переменную str - это соответствует оригиналу script? Если в конце строки apt-get был &, это создало бы поведение, которое вы описываете.
  • Найдите, что произойдет, когда вы попробуете вызов с оригинальным script т.е.

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

    Если это приведет к такому же поведению, проверьте, не произошло ли это при запуске script непосредственно из bash. Это может быть какая-то странность, которую вводит python или какая-то проблема с конфигурацией bash/apt, которая заставляет вещи заходить в фоновый режим (хотя я не знаю ни одного варианта, который мог бы это сделать, и я знаю оба достаточно хорошо).

licensed under cc by-sa 3.0 with attribution.