Использование модуля Paramiko S SH с csv.reader? - PullRequest
1 голос
/ 01 февраля 2020

В настоящее время я использую модуль paramiko для S SH в списке IP-адресов, предоставляемых в виде файла .csv, а затем команды pu sh для этих IP-адресов. Для этого sh я использую csv.reader (), чтобы открыть и прочитать 100 строк файла в следующем формате.

Серийный номер, IP-адрес, MS, RM (MS & RM - это информация, связанная с IP-адресом)

Контекст

Здесь я использую csv.reader (), чтобы открыть и прочитать файл, чтобы затем разместить информацию в качестве словаря keys.

Затем я go вкладываю другой словарь в keys как keys[row[0]], чтобы индексировать IP-адрес и другую информацию как ep_ip, ms_key и rm_key.

option_dict = open('OptionKeyDict.csv','r')
reader= csv.reader(option_dict)

keys= {}

for row in reader:
    keys[row[0]]= {'IP':row[1],'MS': row[2],'RM': row[3]}

ep_ip = keys[row[0]]['IP']
ms_key= keys[row[0]]['MS']
rm_key= keys[row[0]]['RM']

command= 'xCommand SystemUnit OptionKey Add Key: '

multi_site= command + ms_key
remote_monitor= command + rm_key

Затем я go ввожу логин Paramiko c скрипта для принятия приведенных выше инструкций и S SH в IP-адрес, затем выполняю multi-site & remote-monitor команды.

for host in keys:
    host= ep_ip
    i = 1

    while True:
        print ("\nTrying to connect to %s (%i/2)" % (host, i))

        try:
           ssh = paramiko.SSHClient()
           ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
           ssh.connect(host, username=username, password=password, look_for_keys=False, timeout= 5)
           print ("\nConnected to %s" % host )
           connection_state = 1
           break

    if connection_state == 1:
        client_shell = ssh.invoke_shell()
        time.sleep(.4)
        client_shell.send(multi_site + "\n")
        time.sleep(.4)
        client_shell.send(remote_monitor + "\n")

Итак, запуск этого работает частично. Сценарий успешно S SH затем отправляет команды, но использует только фрагменты информации из последней строки (IP-адрес, MS и RM) и выполняется 100 раз, поскольку в .csv есть 100 строк.

Кажется, у меня не получается запустить скрипт в первом ряду, а затем пройти по каждой строке до 100-го ряда.

Теперь, когда я получил контекст с пути ... (Извините, новичок в StackOverflow)

Вопрос

Что мне здесь не хватает, что позволит это случиться? Я чувствую простую настройку, которую я не вижу.

Любая обратная связь будет принята с благодарностью. Спасибо!

1 Ответ

0 голосов
/ 01 февраля 2020

Вы вообще не используете переменную host в for host in keys: l oop.

И вы действительно можете использовать данные, как только прочитаете их. Похоже, вам вообще не нужно собирать данные в keys.

for row in reader:
    host = row[1]
    ms_key = row[2]
    rm_key = row[3]

    i = 1

    while True:
        print ("\nTrying to connect to %s (%i/2)" % (host, i))

        try:
           ssh = paramiko.SSHClient()
           ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
           ssh.connect(
               host, username=username, password=password, look_for_keys=False, timeout= 5)
           print ("\nConnected to %s" % host )
           connection_state = 1
           break

    if connection_state == 1:
        client_shell = ssh.invoke_shell()
        time.sleep(.4)
        client_shell.send(multi_site + "\n")
        time.sleep(.4)
        client_shell.send(remote_monitor + "\n")

(кстати, i никогда не изменяется от своего начального значения 1)

...