2016-01-18 52 views
0

我试图在python 3脚本中运行一个shell命令并使用raw_input来获取该信息。子进程中的可变扩展.Popen

我已经看到了我的答案,并没有尝试过所有的一些补救措施。我更加好奇为什么我会得到这个结果,而不是我期望的结果。

这里是我的测试代码:

#!/usr/bin/env python3 

import subprocess 

iface = "en0" 

iocmd = "ifconfig %s | grep netmask | awk {'print $2'}" % (iface) 
ip = subprocess.Popen(iocmd , shell=True, stdout=subprocess.PIPE) 

print (ip) 

这是一切优秀的花花公子(我知道壳=真正的是安全问题,但现在我更感兴趣的是代码的工作),但当我运行这个,而不是它输出的IP,我得到:

<subprocess.Popen object at 0x1020d85f8> 

我想知道为什么这是返回状态,而不是命令输出?

我也试过:

ip = subprocess.Popen(['ifconfig ' + iface + ' | grep netmask | awk {\'print $4\'}'], shell=True, stdout=subprocess.PIPE) 

,并得到相同的结果...

任何想法如何精简呢?我最终会转向更安全的方法,但这是我使用的子进程调用的唯一实例,因为我需要获取IP和网络掩码并希望使用本机模块。

感谢您的任何意见!

克里斯

+0

'壳= TRUE;不一定是一个安全问题,如果你是在传递所有PARAMS控制。 –

+0

是的,文档说如果你使用变量传递你的参数,它可能导致shell注入和任意命令执行。在将它传递给这样的函数之前,有没有办法保护raw_input? –

回答

1

这里ipPopen对象。它有一个stdout属性,你可以从read()

print(ip.stdout.read()) 
+0

谢谢!我比我使用的.communicate功能更好。 输出: 'b'192.168.0.100 \ n'' ** b **和** \ n **表示什么? –

+0

'b'是一个前缀,表示文字是字节(而不是unicode)。 '\ n'是一个换行符 –

+0

只是FYI给任何想剥离字节和换行符的人可以使用这个: 'print(subprocess.check_output(iocmd,shell = True,universal_newlines = True),end =“ “)' –