В последней версии 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)
Снова и снова, столько раз, сколько насчитывалось мое переключение. Это говорит мне, что он читает файл и заполняет массив просто отлично, но цикл for Plink испорчен.
Устранение неполадок. Если я заменю sw жестко заданным именем коммутатора, например Net-Switch-1, все будет работать нормально. Вот почему я знаю, что переменная sw не передается правильно.
Дополнительные способы устранения неполадок: если я запускаю команду Plink из интерфейса командной строки, опуская имя переключателя, я получаю тот же вывод об ошибке, но без третьей строки "('', None)"
Устранение неполадок, с которыми я начинаю сталкиваться. Это тоже не работает:
p = subprocess.Popen(["./plink","-ssh","-l","admin","-pw","REDACTED","-noagent","-batch",(" "+sw),"show","clock"], stdout=subprocess.PIPE)
SwitchFile = open("switch.list")
. Вместо этого сделайте так:with open("switch.list") as SwitchFile: # Indented code follows where you do file operations. No need to call .close()
. - person Aleksander Lidtke   schedule 03.01.2014