Скрипт Python неправильно передает переменную
В последней версии 32-разрядной версии Debian с Python 2.7.3 я скомпилировал Plink (часть набора инструментов PuTTY) из исходного кода. Для тех, кто незнаком, Plink - отличный инструмент для выдачи команд на SSH-серверах, так что вы можете создавать сценарии для своих команд (я нашел их замечательными для коммутаторов Cisco, что я и делаю здесь).
У меня есть файл с именем switch.list, содержащий имена ключей в каждой строке, например:
Net-Switch-1
Net-Switch-2
Backbone-1
Теперь мой скрипт на Python выглядит так:
import subprocess
Switches = []
SwitchFile = open("switch.list")
for line in SwitchFile:
Switches.append(line)
SwitchFile.close()
for sw in Switches:
p = subprocess.Popen(["./plink","-ssh","-l","admin","-pw","REDACTED","-noagent","-batch",sw,"show","clock"], stdout=subprocess.PIPE)
print p.communicate()
Мой вывод:
Unable to open connection:
Name or service not known
('', None)
Снова и снова, столько раз, сколько мой счетчик. Это говорит мне о том, что он читает файл и просто заполняет массив, но цикл Plink for запутан.
Устранение неполадок: если я заменю sw на жестко закодированное имя коммутатора, например Net-Switch-1, то он будет работать нормально. Вот почему я знаю, что переменная sw не передается правильно.
Дополнительные способы устранения неполадок: если я запускаю команду Plink из интерфейса командной строки, опуская имя коммутатора, я получаю ту же ошибку, но без третьей строки " ('', None) "
Устранение неполадок, когда я начинаю хитрить: это тоже не работает:
p = subprocess.Popen(["./plink","-ssh","-l","admin","-pw","REDACTED","-noagent","-batch",(" "+sw),"show","clock"], stdout=subprocess.PIPE)
2 ответа
При чтении из файла строки содержат завершающий символ новой строки. Попробуйте это вместо этого:
for line in SwitchFile:
Switches.append(line.strip())
Также обратите внимание, что обычной практикой является вызов переменных с именами в нижнем регистре.
Вы правильно читаете файл? Если информация в файле разделена символами новой строки, попробуйте что-то другое, например.
with open(file_path, 'r') as f:
data = f.readlines() #extracts to a list.
print data