2013-09-25 85 views
3

我在bash中有一個小腳本,它可以自動安裝一些軟件包。它使用apt-get安裝一些軟件包,其餘來自源代碼。我有我需要的所有來源tarred到一個單一的tar文件。示例腳本看起來如下:apt-get在bash腳本中無法正常工作

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]) 

#!/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編碼

這裏發生的是,當apt-get正在執行時,中間會嘗試wget。由於wget尚未安裝,因此wget命令失敗,然後執行移至編譯和構建步驟(由於文件不可用而拋出錯誤)。一直以來,apt-get仍在執行中。

我試圖2個步驟,以避免這樣的:

  • apt-get命令結束時加入sleep 5。這沒有 的幫助。
  • apt-get放在另一個函數中,並在wget命令之前調用的函數只是

這也沒有幫助。

當然,當我第二次運行它時,軟件包會被安裝(因爲所有要使用apt-get安裝的軟件包已經存在)。

這是測試,是Debian 6/Debian的7

我怎樣才能糾正這一錯誤?

+0

你有沒有試過在'apt-get'之後放置'wait'? – lifesaspanner

+0

@lifesaspanner - 不,我不知道這樣的選擇。你可以給'wait'的語法,以便我可以試試嗎? – rahuL

+0

這只是「等待」。只需在'apt-get'後面輸入就可以了。看看「男人等待」參考。 – lifesaspanner

回答

1

我已經用我自己的腳本嘗試過這個工作流程,並且對我來說一切正常,雖然解碼/解壓縮您提供的字符串失敗binascii.Error: Incorrect padding

唯一的建議,我可以有:

  1. 認沽和r字符串,使其RAW格式之前 - 的Base64格式編碼可以創建轉義序列(雖然這不是您所提供的字符串問題)。
  2. 打印str已解碼的字符串變量 - 這是否與原始腳本匹配?如果在apt-get行末尾有&,這會產生您描述的行爲。
  3. 找到你試圖用原始腳本調用即

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

    如果產生相同的行爲,檢查它是否仍然發生直接從bash的運行腳本會發生什麼。python引入了一些奇怪的東西,或者是一些與bash/apt配置有關的問題,這些問題會導致一些東西進入後臺(儘管我不知道任何可以做到這一點的選擇,而且我都很清楚)。