0

在控制台使用以下命令打印 wlan0 的 NIC 的本地 MAC 地址。我想将它集成到一个脚本中,其中列表的第 0 个子列表将用 exer 中的本地 MAC 填充

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

使用中的列表,本地化,从名为scanned 的字典中获取它的第一个和第二个子列表。

所以我想在第 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>

对于列表中的每个条目。虽然有正确数量的条目。

我还有一个问题,由于某种原因,程序将代码的输出打印到我不想发生的屏幕上。

我究竟做错了什么?

4

3 回答 3

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

不是所有输出都为您重定向的原因是stderr = PIPE,否则无论如何都会回显到控制台中。将其重定向到 PIPE 是个好主意。

此外,shell=True除非您知道为什么需要它,否则使用通常是一个坏主意。在这种情况下(我不认为)您不需要它。

最后,您需要将您想要执行的命令分配到一个列表中,至少是一个包含 2 项或更多项的列表。例子:

c = ['ssh', '-t', 'user@host', "service --status-all"]

通常情况ssh -t user@root "service --status-all"下,请注意 NOT splitted 部分,"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()
于 2013-04-04T17:39:35.567 回答
0

这是我的尝试:

usecheck_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 命令。

于 2013-04-04T17:49:01.277 回答
0

调用 justPopen只会返回一个新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()读取数据:stdinstderrPopen

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).
于 2013-04-04T17:54:53.243 回答