Как подставить данные для ssh из нескольких файлов?

У меня есть определенный список ssh, мне нужно обработать все их. Я не пойму как мне правильно подставить значение из из файлов чтобы успешно подключиться ? Вот мой код:

# _*_ coding: utf-8 _*_
from threading import Thread
from queue import *
import paramiko
import time
import os

ip_list = 'ip.txt'
login = 'login.txt'
secret = 'password.txt'
port = 22

domain_temp = "temp"


thread_count = 1

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())


def sshserv(ip_list, login, secret, port):
    try:
        client.connect(hostname=ip_list, username=login, password=secret, port=port, timeout=3)

        connect = client
        Good = 'Connect'
        if connect:
            return True, Good
    except paramiko.ssh_exception.AuthenticationException:
        return False
    return False


def run(queue, result_queue):
    # Цикл продолжается пока очередь задач не станет пустой
    while not queue.empty():
        # получаем первую задачу из очереди
        ip = queue.get_nowait()
        # проверяем URL
        status = sshserv(ip_list, login, secret, port)
        # сохраняем результат для дальнейшей обработки
        result_queue.put_nowait((status, ip))
        # сообщаем о выполнении полученной задачи
        queue.task_done()

        print('{} finished. Result = {}'.format(ip, status))


def main():
    start_time = time.time()

    # Для получения задач и выдачи результата используем очереди
    queue = Queue()
    result_queue = Queue()

    fr_success = os.path.join(domain_temp, "good.txt")
    fr_errors = os.path.join(domain_temp, "error.txt")

    # Сначала загружаем все данные из файлов в очередь задач
    with open(ip_list) as f:
        for line in f:
            queue.put(line.strip())

    with open(login) as f:
        for line in f:
            queue.put(line.strip())

    with open(secret) as f:
        for line in f:
            queue.put(line.strip())

    # Затем запускаем необходимое количество потоков
    for i in range(thread_count):
        thread = Thread(target=run, args=(queue, result_queue))
        thread.daemon = True
        thread.start()

    # И ждем, когда задачи будут выполнены
    queue.join()
    # После чего пишем результаты в файлы
    with open(fr_success, 'w') as fs, open(fr_errors, 'w') as fe:
        while not result_queue.empty():
            status, host = result_queue.get_nowait()

            if status[0]:
                f = fs
            else:
                f = fe

            f.write('{} >> {}'.format(host, status[1]))
            f.write('\n')

    print(time.time() - start_time)

if __name__ == '__main__':

    main()

Подскажите как правильно , я на питоне не давно.

Ошибка:

for res in _socket.getaddrinfo(host, port, family, type, proto, flags):

socket.gaierror: [Errno -2] Name or service not known


Ответы (1 шт):

Автор решения: reshu

Сразу ошибка - Вы в очередь сложили в одну кучу и адреса и логины и пароли. И все их трактуете как адреса. Естественно, что логин или пароль система как адрес не найдет.

Надо в очередь добавлять массив из трех элементов - адрес, логин, пароль. В зависимости от того, чего Вы хотите - это будут либо три вложенных цикла (перебрать все сочетания каждый с каждым), либо все файлы надо читать одним циклом (для каждого адреса свой логин и пароль с построчным соответствием в файлах).

При этом в вызове sshserv(ip_list, login, secret, port) в качестве адреса, имени пользователя и пароля Вы передаете имена файлов. Собственно именно об этом Вам и выдана ошибка, что не найдено доменное имя ip.txt.

Очень рекомендую для имен переменных с именем файла добавлять суффикс _file.

→ Ссылка