Как подставить данные для 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 шт):
Сразу ошибка - Вы в очередь сложили в одну кучу и адреса и логины и пароли. И все их трактуете как адреса. Естественно, что логин или пароль система как адрес не найдет.
Надо в очередь добавлять массив из трех элементов - адрес, логин, пароль. В зависимости от того, чего Вы хотите - это будут либо три вложенных цикла (перебрать все сочетания каждый с каждым), либо все файлы надо читать одним циклом (для каждого адреса свой логин и пароль с построчным соответствием в файлах).
При этом в вызове sshserv(ip_list, login, secret, port) в качестве адреса, имени пользователя и пароля Вы передаете имена файлов. Собственно именно об этом Вам и выдана ошибка, что не найдено доменное имя ip.txt.
Очень рекомендую для имен переменных с именем файла добавлять суффикс _file.