Скрипт 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
Другие вопросы по тегам