2017-08-24 2 views
0

S'il vous plaît, aidez-moi à corriger mon script. Mon script vérifie le login SSH d'un hôte et affiche le succès/l'échec en fonction du résultat. Il échoue lorsque je donne un mauvais nom d'hôte.python3.5 paramiko a échoué avec le nom d'hôte

code est au-dessous:

[[email protected] script]# cat param.py 
import multiprocessing 
import paramiko 
import random 
import threading 
import time 

host_name = "test2" 
print ("Checking hostname :"+str(host_name)) 
file = open('output_file','a') 
ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
try: 
     ssh.connect(host_name, username='root', password='test') 
     print ("success") 
     file.write("success:"+str(host_name+"\n")) 
except paramiko.SSHException: 
     print ("Connection Failed") 
     file.write("failed:"+str(host_name+"\n")) 
     quit() 
stdin,stdout,stderr = ssh.exec_command("hostname&&uptime") 
for line in stdout.readlines(): 
     print (line.strip()) 
ssh.close() 

Il fonctionne très bien quand donné le nom d'utilisateur/mot de passe:

[[email protected] script]# python3 param.py 
Checking hostname :test2 
success 
test2 
12:31:49 up 83 days, 2:56, 2 users, load average: 0.00, 0.01, 0.05 

Il fonctionne très bien quand le mauvais mot de passe est donné. J'ai changé le mot de passe à un mauvais dans le script et il dit que la connexion a échoué comme prévu. Maintenant, ma question, quand je change le nom d'hôte à quelque chose n'existe pas, paramiko échoue et beaucoup d'erreurs surgissent.

[[email protected] script]# python3 param.py 
Checking hostname :invalidtest2 
Traceback (most recent call last): 
    File "param.py", line 16, in <module> 
    ssh.connect(host_name, username='root', password='test') 
    File "/root/usr/local/lib/python3.5/site-packages/paramiko/client.py", line 301, in connect 
    to_try = list(self._families_and_addresses(hostname, port)) 
    File "/root/usr/local/lib/python3.5/site-packages/paramiko/client.py", line 199, in _families_and_addresses 
    hostname, port, socket.AF_UNSPEC, socket.SOCK_STREAM) 
    File "/root/usr/local/lib/python3.5/socket.py", line 728, in getaddrinfo 
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags): 
socket.gaierror: [Errno -2] Name or service not known 

Comment puis-je savoir si la connexion a échoué? J'utilise python3.5

Répondre

0

Ce n'est pas une bonne idée de garder les mots de passe stockés dans le script lui-même. Modification du script afin qu'il prenne les noms d'hôte d'un fichier et écrit la sortie dans différents fichiers

#!/bin/python3 
import threading, time, paramiko, socket, getpass 
from queue import Queue 
start_time1 = time.time() 
locke1 = threading.Lock() 
q = Queue() 

#Check the login 
def check_hostname(host_name, pw_r): 
    with locke1: 
     print ("Checking hostname :"+str(host_name)+" with " + threading.current_thread().name) 
     file_output = open('output_file','a') 
     file_success = open('success_file','a') 
     file_failed = open('failed_file','a') 
     file_error = open('error_file','a') 
     ssh = paramiko.SSHClient() 
     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
     try: 
      ssh.connect(host_name, username='root', password=pw_r) 
      #print ("Success") 
      file_success.write(str(host_name+"\n")) 
      file_success.close() 
      file_output.write("success: "+str(host_name+"\n")) 
      file_output.close() 

      # printing output if required from remote machine 
      #stdin,stdout,stderr = ssh.exec_command("hostname&&uptime") 
      #for line in stdout.readlines(): 
      # print (line.strip()) 

     except paramiko.SSHException: 
       # print ("error") 
       file_failed.write(str(host_name+"\n")) 
       file_failed.close() 
       file_output.write("failed: "+str(host_name+"\n")) 
       file_output.close() 
       #quit() 
     except paramiko.ssh_exception.NoValidConnectionsError: 
       #print ("might be windows------------") 
       file_output.write("failed: " + str(host_name + "\n")) 
       file_output.close() 
       file_failed.write(str(host_name+"\n")) 
       file_failed.close() 
       #quit() 
     except socket.gaierror: 
      #print ("wrong hostname/dns************") 
      file_output.write("error: "+str(host_name+"\n")) 
      file_output.close() 
      file_error.write(str(host_name + "\n")) 
      file_error.close() 
     ssh.close() 

def performer1(): 
    while True: 
     hostname_value = q.get() 
     check_hostname(hostname_value,pw_sent) 
     q.task_done() 

if __name__ == '__main__': 

    print ("This script checks all the hostnames in the input_file with your standard password and write the outputs in below files: \n1.file_output\n2.file_success \n3.file_failed \n4.file_error \n") 

    f = open('output_file', 'w') 
    f.write("-------Output of all hosts-------\n") 
    f.close() 
    f = open('success_file', 'w') 
    f.write("-------Success hosts-------\n") 
    f.close() 
    f = open('failed_file', 'w') 
    f.write("-------Failed hosts-------\n") 
    f.close() 
    f = open('error_file', 'w') 
    f.write("-------Hosts with error-------\n") 
    f.close() 

    with open("input_file") as f: 
     hostname1 = f.read().splitlines() 

#Read the standard password from the user 
    pw_sent=getpass.getpass("Enter the Password:") 


    for i in hostname1: 
     q.put(i) 
    #print ("all the hostname : "+str(list(q.queue))) 
    for no_of_threads in range(3): 
     t = threading.Thread(target=performer1) 
     t.daemon=True 
     t.start() 

    q.join() 
    print ("Check output files for results") 
    print ("completed task in" + str(time.time()-start_time1) + "seconds")