-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathssh_connection.py
125 lines (91 loc) · 4.57 KB
/
ssh_connection.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import paramiko
import datetime
import os.path
import time
import sys
import re
#Checking username/password file
#Prompting user for input - USERNAME/PASSWORD FILE
user_file = input("\n# Enter username/password file path and name (e.g. D:\MyApps\filename.txt): ")
#Verifying the validity of the USERNAME/PASSWORD file
if os.path.isfile(user_file) == True:
print("\n* Username/password file is valid :)\n")
else:
print("\n* File {} does not exist :( Please check and try again.\n)".format(user_file))
sys.exit()
#Checking commands file
#Prompting user for input - COMMAND FILE
cmd_file = input("\n# Enter command file path and name (e.g. D:\MyApps\filename.txt): ")
if os.path.isfile(cmd_file) == True:
print("\n* Command file is valid :)\n")
else:
print("\n* File {} does not exist :( Please check and try again.\n)".format(cmd_file))
sys.exit()
#Open SSHv2 connection to the device
def ssh_connection(ip):
global user_file
global cmd_file
#Creating SSH CONNECTION
try:
#Define SSH parameters
selected_user_file = open(user_file, 'r')
#Starting from the beginning of the file
selected_user_file.seek(0)
#Reading the username from the file
username = selected_user_file.readlines()[0].split(',')[0].rstrip("\n")
#Starting from the beginning of the file
selected_user_file.seek(0)
#Reading the password from the file
password = selected_user_file.readlines()[0].split(',')[1].rstrip("\n")
#Logging into the device
session = paramiko.SSHClient()
#For testing purposes, this allows auto-accepting unknown host keys
#Do not use in production! The default would be RejectPolicy
session.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#Connect to the device using username and password
session.connect(ip.rstrip("\n"), username = username, password = password)
#Start an interactive shell session on the router
connection = session.invoke_shell()
#Setting terminal length for entire output - disable pagination
connection.send("enable\n")
connection.send("terminal length 0\n")
time.sleep(1)
#Entering global config mode
connection.send("\n")
connection.send("configure terminal\n")
time.sleep(1)
#Open user selected file for reading
selected_cmd_file = open(cmd_file, 'r')
#Starting from the beginning of the file
selected_cmd_file.seek(0)
#Writing each line in the file to the device
for each_line in selected_cmd_file.readlines():
connection.send(each_line + '\n')
time.sleep(2)
#Closing the user file
selected_user_file.close()
#Closing the cmd file
selected_cmd_file.close()
#checking command output for IOS syntax errors
router_output = connection.recv(65535)
if re.search(b"% Invalid input", router_output):
print("*There was atleast one IOS syntax error on device {} :(".format(ip))
else:
print("\nDONE for device {}. Data sent to the file at {}.\n".format(ip, str(datetime.datetime.now())))
#Test for reading command output
#print(str(router_output) + "\n")
#Searching for the CPU utilization value within the output of "show processes top once"
cpu = re.search(b"%Cpu\(s\):(\s)+(.+?)(\s)+us,", router_output)
#Extracting the second group, which matches the actual value of the CPU utilization and decoding the bytes object to produce a string (encoded to the popular UTF-8 format)w
utilization = cpu.group(2).decode("utf-8")
#Printing the CPU utilization value to the screen
#print(utilization)
#Opening the CPU utilization text file and appending the results
with open(".\\cpu.txt", "a") as f:
#f.write("{}, {}\n".format(str(datetime.datetime.now()), utilization))
f.write(utilization + "\n")
#Closing the connection
session.close()
except paramiko.AuthenticationException:
print("* Invalid username or password : ( \n* Please check the username/password file used or the device configuration.")
print("* Closing program... Bye!")