Python: повторение с помощью команды subprocess.call - PullRequest
0 голосов
/ 04 марта 2019

У меня есть следующий код для повторного просмотра списка IP-адресов для поиска строки SNMP:

ВХОД:

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: "15.11.2017"

Этот код работает нормально, но мне нужно заменить os.system на subprocess.call, так как os.system очень ограничена и не можетбыть сохраненным в переменной.

Я пытался подключить subprocess.call, но постоянно получаю сообщение об ошибке:

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

TypeError: 'int' object is not iterable

Любая помощь будет принята с благодарностью, спасибо!

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

import os import subprocess ip_list = ['10 .10.10.10 ',' 10.10.10.11 '] snmp = ["snmpget", "- v1", "- c", "public"] # список аргументов

output = [] для x в ip_list: cp = subprocess.run (snmp + [x], check = False) output.append (cp.stdout.decode ())

0 голосов
/ 04 марта 2019

эм, вы цепочка 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())

это запускает вашу команду безопасным и простым способом, получает выходные данные и помещает каждую выходную строку в список строк (попытка назначить выходные данные также не работала сcall или os.system, поскольку он возвращает код выхода , а не вывод программы. Поскольку ваша команда может возвращать ненулевой код возврата, вы не можете использовать check_output, но вы можете использоватьrun - это то, что вам нужно (но вам нужен Python 3.5, иначе вам придется использовать решение Popen, описанное здесь: Запуск команды оболочки и получение вывода ):

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