我试图在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和网络掩码并希望使用本机模块。
感谢您的任何意见!
克里斯
'壳= TRUE;不一定是一个安全问题,如果你是在传递所有PARAMS控制。 –
是的,文档说如果你使用变量传递你的参数,它可能导致shell注入和任意命令执行。在将它传递给这样的函数之前,有没有办法保护raw_input? –