【发布时间】:2016-04-24 06:34:32
【问题描述】:
我正在尝试在 python 3 脚本中运行 shell 命令并使用 raw_input 获取该信息。
我已经看到了一些针对我的答案的补救措施,但还没有全部尝试过。我更想知道为什么我会得到这个结果,而不是我所期望的。
这是我的测试代码:
#!/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)
这一切都很好(我知道 shell=True 是一个安全问题,但现在我更感兴趣的是让代码正常工作),但是当我运行它时,而不是输出 IP,我'我得到:
<subprocess.Popen object at 0x1020d85f8>
我想知道为什么这会返回状态而不是命令输出?
我也试过了:
ip = subprocess.Popen(['ifconfig ' + iface + ' | grep netmask | awk {\'print $4\'}'], shell=True, stdout=subprocess.PIPE)
得到了同样的结果...
任何想法如何简化这一点?我最终将转向更安全的方法,但这是我正在使用的子进程调用的唯一实例,因为我需要获取 IP 和网络掩码并希望使用本机模块。
感谢您的任何意见!
克里斯
【问题讨论】:
-
shell=True如果您可以控制所有传递的参数,则不一定是安全问题。 -
是的,文档说如果你使用变量来传递你的参数,它可能会导致 shell 注入和任意命令执行。有没有办法在将 raw_input 传递给这样的函数之前保护它?
标签: bash variables python-3.x subprocess