Python:重复通过subprocess.call命令

问题描述 投票:0回答:2

我有以下代码重新遍历IP地址列表以查找SNMP字符串:

INPUT:

import os
import subprocess
ip_list = ['10.10.10.10','10.10.10.11']
snmp = "snmpget -v1 -c public "

for x in ip_list:
     command = os.system(str(snmp + x))

输出:... = STRING:“11/15/2017”

这段代码工作正常,但我需要用subprocess.call替换os.system,因为os.system是非常有限的,不能存储在变量中。

我试图插入subprocess.call但我不断收到错误:

results = subprocess.call(os.system(str(snmp + r + static_oid + z)), shell=True)

TypeError: 'int' object is not iterable

任何帮助将不胜感激,谢谢!

python subprocess os.system
2个回答
2
投票

呃,你用os.system跟电话联系subprocess.call。这是完全错误的。而且,当os.system尝试迭代参数时,神秘消息的根本原因是你传递了subprocess.call的返回码,这是一个整数。

切换到subprocess是一个好主意,因为os.system已被弃用并且容易出现安全问题。也就是说,如果你考虑放弃shell=True

要删除shell=True,你必须传递一个参数列表,而不是自己编写你的arg字符串。

我的建议:

import os
import subprocess
ip_list = ['10.10.10.10','10.10.10.11']
snmp = ["snmpget","-v1","-c","public"]   # list of arguments

outputs = []
for x in ip_list:
     cp = subprocess.run(snmp + [x],check=False)
     outputs.append(cp.stdout.decode())

这将以安全,简单的方式运行您的命令,获取输出并将每个输出行放入字符串列表中(尝试分配输出无法使用callos.system,因为它返回退出代码,而不是程序输出。由于你的命令可以返回非零返回码你不能使用check_output但你可以使用run就是你需要的(但你需要python 3.5,否则你将不得不使用Popen解决方案,这里描述:Running shell command and capturing the output):

 p = subprocess.Popen(snmp + [x])
 result = p.communicate()[0]

-1
投票

import os import subprocess ip_list = ['10 .10.10.10','10.10.10.11'] snmp = [“snmpget”,“ - v1”,“ - c”,“public”]#参数列表

输出= []用于ip_list中的x:cp = subprocess.run(snmp + [x],check = False)outputs.append(cp.stdout.decode())

© www.soinside.com 2019 - 2024. All rights reserved.