Python: проблема с открытым файлом и строками в нем - PullRequest
0 голосов
/ 08 марта 2020

Я запустил этот собственный небольшой проект, чтобы создать сценарий python, который будет подключаться к Linux серверам через S SH и запускать команды на них. Это было успешно, но когда я попытался использовать список IP-адресов из файла, я столкнулся с проблемой, когда он будет подключаться только к одному из IP-адресов (только одна строка) в файле. Файл содержит следующие записи:

172.18.8.130

172.18.8.137

И проблема в том, что скрипт возвращает выходные данные только со второго IP:

['Linux 172.18.8.137 4.18.0-147.5.1.el8_1.x86_64 # 1 SMP Ср 5 февраля 02:00:39 UT C 2020 x86_64 x86_64 x86_64 GNU / Linux \ n']

Код

import paramiko

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

with open(r'D:\servers.txt', 'r') as fp:
    for line in fp:
     line = (fp.read())

ssh.connect(line, 22, "root", "password")

stdin, stdout, stderr = ssh.exec_command("uname -a")

print (stdout.readlines())

Как мне сделать так, чтобы go проходил через все строки (IP) в этом файле, чтобы он подключался и запускал uname -a на всех серверах

Ответы [ 2 ]

0 голосов
/ 08 марта 2020

Проблема в том, что файлы являются устройствами ввода-вывода (как и stdout, stdin и т. Д. c.) В python. Поэтому, если вы пытаетесь прочитать каждую строку в файле, вам следует использовать fp.readline() вместо fp.read(). read читает все содержимое файла (пока не будет достигнут EOF), тогда как readline читает, пока не будет достигнут символ новой строки.

Попробуйте заменить ваш код чем-то вроде этого и посмотрите, работает ли он для вас :

import paramiko

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

with open(r'D:\servers.txt', 'r') as fp:
    for ip in [line.strip() for line in fp.readlines()]:
        ssh.connect(ip, 22, "root", "password")
        stdin, stdout, stderr = ssh.exec_command("uname -a")
        print (stdout.readlines())

Это читает все строки в списке и удаляет все лишние пробельные символы в начале и конце, затем мы можем перебрать этот массив в нашем для l oop, ссылаясь на каждый IP-адрес, открывая подключение и выполнение любых необходимых вам задач.

0 голосов
/ 08 марта 2020

В каждой вашей итерации для l oop вы обновляете переменную "line". Поскольку в вашем списке 2 разных IP-адреса, второй переменной всегда назначается переменная "line".

Чтобы сохранить IP-адреса в вашей программе, используйте список.

IP_list = []
with open(r'D:\servers.txt', 'r') as fp:
    for line in fp:
        line = line.strip() 
        IP_list += [line]            
...