2012-11-12 174 views
1

我是一個Python的新手,但是測試了一些我在Ubuntu學到的東西。 基本上,該腳本應該設置您的TCP/IP配置,然後重新啓動網絡守護程序並顯示更改。腳本執行停止在os.execlpe()

這是整個腳本:

#!/usr/bin/env python 
import commands 
import os 
import sys 

euid = os.geteuid() 
if euid != 0: 
    print "Script not started as root. Running sudo.." 
    args = ['sudo', sys.executable] + sys.argv + [os.environ] 
    # the next line replaces the currently-running process with the sudo 
    os.execlpe('sudo', *args) 

print 'Running. Your euid is', euid 

print "IP" 
IP = raw_input(">>") 
print "Gateway" 
PE = raw_input(">>") 

ifconfig = commands.getoutput("ifconfig") 
interfaz = ifconfig[0:5] 

ArchivoInterfaces = open("/etc/network/interfaces", "w") 
ArchivoInterfaces.write("#auto lo\n#iface lo inet loopback\nauto %s\niface %sinet static\naddress %s\ngateway %s\nnetmask 255.255.255.0"%(interfaz, interfaz, IP, PE)) 
ArchivoInterfaces.close() 

ArchivoResolv = open("/etc/resolv.conf", "w") 
ArchivoResolv.write("# Generated by NetworkManager\ndomain localdomain\nsearch localdomain\nnameserver 8.8.8.8\nnameserver 8.8.4.4") 
ArchivoResolv.close() 
os.execlpe('/etc/init.d/networking', "test","restart", os.environ) 
print "Todo esta correcto, su IP ahora es %s" %(IP) 
fin = raw_input("write d and press enter to show the changes, or press enter to exit.") 

if fin == "d": 
    ArchivoResolv = open("/etc/resolv.conf") 
    ArchivoInterfaces = open("/etc/network/interfaces") 
    ifconfig2 = commands.getoutput("ifconfig") 
    print "ARCHIVO resolv.conf\n"+ArchivoResolv.read()+"\n\n"+"ARCHIVO interfaces\n"+ArchivoInterfaces.read()+"\n\n"+"RESULTADO DE \"ifconfig\"\n"+ifconfig2 
    fin = raw_input("Presiona ENTER para salir.") 

不幸的是,它一直停在這行 - 我不知道爲什麼:

os.execlpe('/etc/init.d/networking', "test","restart", os.environ) 

到達該點後,腳本運行重新啓動,然後退出。

我很想讓它運行腳本的最後部分,以便我可以看到發生了什麼變化,但我無法。有任何想法嗎?

回答

1

因爲所有exec函數系列都是通過用當前進程替換當前進程來實現的。

如果您只是想運行外部命令,請改用spawn函數。 (在這種情況下,os.spawnlpe是非常接近一個簡易替換。)

+0

好吧,我會測試它,謝謝你的回答快,反正即時通訊現在只是curius,爲什麼在第一os.execlpe(「須藤」,*參數),我跑,它繼續我的整個腳本? –

+0

因爲它工作正常 - 它在'sudo'下重新啓動你的腳本。在那之後沒有必要繼續。 – duskwuff

+0

再次感謝您,它運作得非常好。 –

0

os.execlpe(以及類似os.exec *函數)取代當前進程:

這些功能都執行一個新的程序, 取代當前進程; 他們不返回。

+0

好吧,我會測試它,謝謝你的快速答案,無論如何,現在我只是curius,爲什麼在我運行的第一個os.execlpe('sudo',* args),它繼續我的整個腳本? –

+0

@ adrian.py因爲那個時候新的可執行文件是你的腳本(再次)。所以它用'sudo' yourscript替換你的腳本。如果你在腳本的第一行放置一個打印文件,你會發現如果你不以root身份運行它(兩次在sudo之後再次運行),它會被調用兩次。 –