2013-04-04 30 views
0

在控制檯上使用以下命令打印wlan0 NIC的本地MAC地址。我想這個集成到一個腳本,列表的0號子列表將在EXER將一個子進程附加到一個列表似乎只是在python中附加子進程對象的位置?

ifconfig wlan0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}' 

使用中的列表中,定位充滿了當地的MAC,得到它是從一個叫掃描字典第一和第二子列表。

所以我想要在第0子列表中的本地MAC和第1和第2子列表中的每個條目的條目。我曾嘗試代碼:

for s in scanned: 
    localisation[0].append(subprocess.Popen("ifconfig wlan0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'", shell=True)) 

,但我只是得到

<subprocess.Popen object at 0x2bf0f50> 

對於每一個進入名單。雖然有正確數量的條目。

我也有問題,出於某種原因程序打印輸出的代碼到我不想發生的屏幕上。

我在做什麼錯?

+0

在更換純shell腳本python,你可能想看看[sh](http://amoffat.github.com/sh/)模塊 - sh.grep(sh.ifconfig('wlan0'),'-o',' - E',r'([[:xdigit:]] {1,2}:){5} [[:xdigit:]] {1,2}')' – forivall 2013-04-04 18:00:52

+0

您應該使用python regex而不是grep – JBernardo 2013-04-04 18:11:16

回答

0

這是我嘗試:

使用check_output給出了命令的輸出。

In [3]: import subprocess 

In [4]: subprocess.check_output("ip link show wlan0 | grep link | awk '{print $2}'",shell=True).strip() 
Out[4]: '48:5d:60:80:e5:5f' 

使用ip link show而不是ifconfig保存你一個sudo命令。

0

popen對象在某種意義上是一個文件對象。

from subprocess import * 
handle = Popen(c, stdin=PIPE, stderr=PIPE, stdout=PIPE) 
handle.stdin.write('echo "Heeey there"') 
print handle.stdout.read() 
handle.flush() 

爲什麼不是所有的輸出重定向你的原因是標準錯誤=管道,它必須,否則將被呼應到控制檯不管是什麼。將它重定向到PIPE是個好主意。

另外,使用shell=True通常是一個壞主意,除非你知道爲什麼你需要它..在這種情況下(我不認爲)你不需要它。

Aaaand最後,您需要將您希望執行的命令劃分爲列表,至少列出2個列表或更多列表。例如:

c = ['ssh', '-t', '[email protected]', "service --status-all"] 

這將是ssh -t [email protected] "service --status-all"正常,注意的"service --status-all"的不分裂的一部分,因爲這是被作爲一個整體來SSH客戶端在我的例子中的參數。

沒有嘗試,嘗試:

c = ["ifconfig", "wlan0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'"] 

甚至:

from uuid import getnode as get_mac 
mac = get_mac() 
0

調用只是Popen只返回一個新Popen實例:

In [54]: from subprocess import Popen,PIPE 

In [55]: from shlex import split #use shlex.split() to split the string into correct args 

In [57]: ifconf=Popen(split("ifconfig wlan0"),stdout=PIPE) 

In [59]: grep=Popen(split("grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'"), 
                stdin=ifconf.stdout,stdout=PIPE) 

In [60]: grep.communicate()[0] 
Out[60]: '00:29:5e:3b:cc:8a\n' 

使用communicate()stdinstderr特定Popen實例的讀取數據:

In [64]: grep.communicate? 
Type:  instancemethod 
String Form:<bound method Popen.communicate of <subprocess.Popen object at 0x8c693ac>> 
File:  /usr/lib/python2.7/subprocess.py 
Definition: grep.communicate(self, input=None) 
Docstring: 
Interact with process: Send data to stdin. Read data from 
stdout and stderr, until end-of-file is reached. Wait for 
process to terminate. The optional input argument should be a 
string to be sent to the child process, or None, if no data 
should be sent to the child. 

communicate() returns a tuple (stdout, stderr). 
相關問題