Nên tham khảo bài Juniper - JunOS (mục 2) trước khi xem bài này
YÊU CẦU:
Dùng thư viện Netmiko trong python để SSH vào switch Juniper - JunOS để tìm các thiết bị hiện tại đang gắng vào port nào trên local switch khi biết địa chỉ IP của nó. Các địa chỉ IP cần tìm được lưu trữ trong file "device_list.csv".
Kết quả tìm được in ra màn hình và lưu vào file "Show_arp_Ketqua_192.168.0.1.csv"
THỰC HIỆN:
1. Chuẩn bị file danh sách thiết bị có dạng
2. Code
'''
Tìm thiết bị đang gắng vào port nào trên local switch khi biết địa chỉ IP của nó
Danh sách các IP cần tìm để trong file "device_list.csv"
(Điều kiện là thiết bị Juniper cần kết nối đã được cấu hình SSH)
Kết quả tìm được in ra màn hình và lưu vào file "Show_arp_Ketqua_192.168.0.1.csv"
Câu lệnh chính dùng trong bài:
- show arp hostname < địa chỉ ip cần tìm>
- show ethernet-switching table <địa chỉ mac cần tìm>
'''
import netmiko # import thư viện netmiko
import os
# Thông tin thiết bị cần SSH vào (định nghĩa dictionnary)
Sw_1 = {
"host":"192.168.0.1",
"username":"admin",
"password":"admin1234@core",
"device_type":"juniper_junos"
}
print("Connecting to a host: " + Sw_1["host"] + "...") # Hiển thị thông báo kết nối tới
# dùng hàm ConnectHandler trong thư viện netmiko để kết nối với Sw_1 với các thông tin đã định nghĩa trong dictionnary
net_connect = netmiko.ConnectHandler(**Sw_1)
print("Connected successfully\n")
with open ("device_list.csv","r") as rfile: # mở file
keys = rfile.readline() # lấy dòng đầu tiên
values = rfile.read() # các dòng còn lại là giá trị cần gán vào dict
# print(keys)
# print(values)
'''
để remove xuống dòng (newline) chúng ta có thể dùng
print(keys,end="")
'''
file_ketqua = "Show_arp_Ketqua_" + Sw_1["host"] + ".csv" # định nghĩa tên file cần ghi kết quả
file_header = keys.rstrip() + ",Vlan,Mac Address,MAC Flags,Logical Interface\n" # bỏ newline (\n) ở cuối dòng và nối thêm chuỗi để ghi vào file chuẩn bị để chứa kết quả show mac address và chèn newline vào cuối
f = open(file_ketqua,"w")
# print(file_header)
f.write(file_header)
f.flush() # thực hiện ghi
f.close() # đóng file để giải phóng bộ nhớ
print ("*" * 20 + "KET QUA" + "*" * 20)
for values in values.splitlines(): # trả về một chuỗi tương ứng là một dòng trong biến values
values = values.split(",") # mỗi dòng chuyển thành list
ip_addr = values[0] # giá trị của cột đầu tiên là địa chỉ IP cần lấy ra
ip_description = values[1]
# print(ip_addr)
# print(ip_description)
# print(values)
print("*" + ip_addr + ":") # In ra IP đang cần show
net_connect.send_command("ping" + " " + ip_addr + " " + "count 4") # ping (ping 4 gói) địa chỉ IP cần kiểm tra để switch cập nhật vào bảng MAC
show_arp = "show arp" + " " + "hostname" + " " + ip_addr
show_arp = net_connect.send_command(show_arp) # thực hiện lênh show arp với chính IP cần tìm
#print (show_arp)
# In ra dòng thứ nhì trong chuỗi
# print (show_arp.splitlines()[1])
# lấy dòng thứ nhì và phân ra từng cụm
fields = show_arp.splitlines()[1].split()
# lấy cụm đầu tiên (là địa chỉ MAC) tính từ trái sang
mac_addr = fields[0]
# print (mac_addr)
show_mac_addr = "show ethernet-switching table" + " " + mac_addr
show_mac_addr = net_connect.send_command(show_mac_addr) # thực hiện lệnh show
print(show_mac_addr)
show_mac_addr = show_mac_addr.splitlines()[8].split() # lấy dòng thứ 8 chuyển thành list
#print(show_mac_addr) # In kết quả show ra màn hình
print() # In ra dòng trắng
#print(type(show_mac_addr))
#print(type(values))
for i in [6,5,3]:
del show_mac_addr[i] # thực hiện xóa các phần tử không cần lấy
show_mac_addr = values + show_mac_addr # thực hiện nối thông tin ban đầu và kết quả
#print(show_mac_addr)
show_mac_addr = ",".join(show_mac_addr) + "\n" # convert list sang string và thêm "," vào giữa mỗi cụm
f = open(file_ketqua,"a")
f.write(show_mac_addr) # thực hiện ghi thêm kết quả vào file kết quả
path = os.getcwd() # lấy đường dẫn hiện tại
print("*" * 20 + "KẾT QUẢ ĐƯỢC LƯU TẠI" + "*" * 20)
print(r"{}".format(path))
print(file_ketqua)
print("*" * 60 + "\n")
3. Kết quả:
Connecting to a host: 192.168.0.1...Connected successfully********************KET QUA*********************172.16.125.11:MAC flags (S - static MAC, D - dynamic MAC, L - locally learned, P - Persistent static, C - Control MACSE - statistics enabled, NM - non configured MAC, R - remote PE MAC, O - ovsdb MAC)Ethernet switching table : 109 entries, 109 learnedRouting instance : default-switchVlan MAC MAC Age Logical NH RTRname address flags interface Index IDvlan-125 c0:74:ad:32:2d:3c D - ge-1/0/1.0 0 0*172.16.126.11:MAC flags (S - static MAC, D - dynamic MAC, L - locally learned, P - Persistent static, C - Control MACSE - statistics enabled, NM - non configured MAC, R - remote PE MAC, O - ovsdb MAC)Ethernet switching table : 109 entries, 109 learnedRouting instance : default-switchVlan MAC MAC Age Logical NH RTRname address flags interface Index IDvlan-126 d4:f5:ef:09:c0:1e D - ge-1/0/3.0 0 0********************KẾT QUẢ ĐƯỢC LƯU TẠI********************C:\vck\LABShow_arp_Ketqua_192.168.0.1.csv************************************************************[Finished in 17.5s]
Nội dung của file Show_arp_Ketqua_192.168.0.1.csv có dạng