【问题标题】:Variable expansion in subprocess.Popen [duplicate]subprocess.Popen中的变量扩展
【发布时间】: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


【解决方案1】:

这里ip 是一个Popen 对象。它有一个stdout 属性,您可以从

read()
print(ip.stdout.read())

【讨论】:

  • 谢谢!我比我使用的 .communicate 函数更喜欢它。输出:b'192.168.0.100\n' b\n 表示什么?
  • b 是一个前缀,表示字面量是字节(而不是 unicode)。 \n 是换行符
  • 仅供参考,任何想要剥离字节和换行符的人都可以使用:print (subprocess.check_output(iocmd, shell=True, universal_newlines=True),end="")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
相关资源
最近更新 更多