/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/

Học Python Qua Ví Dụ #021 - Function/Hàm Trong PyThon

Functon/Hàm: Thay vì chúng ta sử dụng các hàm đã được định nghĩa của python thì bây giờ chúng ta có thể TỰ ĐỊNH NGHĨA ra các hàm riêng cho mình. Hàm có tác dụng vô cùng quan trọng là tránh việc phải lặp lại nhiều lần một đoạn code để thực thi những tác vụ tương tự nhau, giúp code gọn hơn và có thể tái sử dụng. 


  • Ví dụ SSH Connection

Code:

def ssh_conn(ip_addr, username, password):
    print("-" * 30)
    print("IP Addr: {}".format(ip_addr))
    print("Username: {}".format(username))
    print("Password: {}".format(password))
    print("-" * 30)

'''
Với cách gọi này hàm ssh_conn sẽ hành xử là gán THEO THỨ TỰ từ trái sang -> phải:
- giá trị: "192.168.1.1" sẽ gán vào biến ip_addr
- giá trị:"admin" sẽ gán vào biến username
- giá trị: "cisco123" sẽ gán vào biến password
'''
ssh_conn("192.168.1.1", "admin", "cisco123")

'''
khai báo biến KHÔNG cần theo THỨ TỰ, nó sẽ tìm đúng biến mà gán vào
'''
ssh_conn(username="admin", ip_addr="192.168.1.1", password="cisco123")

# Cũng có thể gọi theo kiểu KẾT HỢP 2 cách trên
ssh_conn("192.168.1.1", password="cisco123", username="admin1")


Kết quả:

C:\python>python Demo.py

------------------------------

IP Addr: 192.168.1.1

Username: admin

Password: cisco123

------------------------------

------------------------------

IP Addr: 192.168.1.1

Username: admin

Password: cisco123

------------------------------

------------------------------

IP Addr: 192.168.1.1

Username: admin1

Password: cisco123

------------------------------


C:\python>python Demo.py

------------------------------

IP Addr: 192.168.1.1

Username: admin

Password: cisco123

------------------------------

------------------------------

IP Addr: 192.168.1.1

Username: admin

Password: cisco123

------------------------------

------------------------------

IP Addr: 192.168.1.1

Username: admin1

Password: cisco123

------------------------------


C:\python>


  • Ví dụ SSH Connection 2

Code:

def ssh_conn2(ip_addr, username, password, device_type="cisco_ios"):
    print("-" * 30)
    print("IP Addr: {}".format(ip_addr))
    print("Username: {}".format(username))
    print("Password: {}".format(password))
    print("Platform: {}".format(device_type))
    print("-" * 30)


ssh_conn2(
    "192.168.1.1", password="cisco123", username="admin1", device_type="cisco_nxos"
)

'''
Khi gọi hàm nếu không truyền giá trị của device_type vào thì nó sẽ lấy giá trị mặc định
Trong trường hợp này giái trị mặc định là: device_type="cisco_ios"
'''
ssh_conn2("192.168.1.1", password="cisco123", username="admin1")


'''
Chúng ta có thể định nghĩa Dictionary rồi gọi thông qua các key và value của dictionary
'''
my_device = {
    "ip_addr": "172.16.1.1",
    "device_type": "cisco_xr",
    "username": "admin",
    "password": "cisco123",
}
# hai dấu ** ngầm ý là cho phép truyền key và value của my_device vào hàm ssh_conn2
ssh_conn2(**my_device)


Kết quả:

C:\python>python Demo.py
------------------------------

IP Addr: 192.168.1.1

Username: admin1

Password: cisco123

Platform: cisco_nxos

------------------------------

------------------------------

IP Addr: 192.168.1.1

Username: admin1

Password: cisco123

Platform: cisco_ios

------------------------------

------------------------------

IP Addr: 172.16.1.1

Username: admin

Password: cisco123

Platform: cisco_xr

------------------------------


C:\python>


Tham khảo hàm trả về nhiều giá trị 

Xong!

Học Python Qua Ví Dụ #020 - Set Trong Python

 Các hành động trong Set:

Toán Tử

Ký Hiệu

Mô Tả

Union

|

Kết hợp/ lấy tất cả các Set

Intersection

&

Chỉ lấy phần giao nhau

Symmetric Difference

^

KHÔNG lấy phần giao nhau

Difference

-

Chỉ lấy phần TỒN TẠI set_1 mà không tồn tại ở set_2


Hình các hành động trong Set

Ví dụ:
Code:
'''
Có 3 list được định nghĩa với các IP như dưới

Yêu cầu: Dùng các hành động của Set để tìm các IP trùng nhau giữa:
1. Hà Nội và Đà Nẵng
2. Hà Nội và Hồ Chí Minh
3. Tất cả các site
4. Lấy IP của Hồ Chí Minh mà không trung với bất kỳ site nào
'''

HaNoi_ips = [
    "10.10.10.1",
    "10.10.20.1",
    "10.10.30.1",
    "10.10.40.1",
    "10.10.50.1",
    "10.10.60.1",
    "10.10.70.1",
    "10.10.80.1",
    "10.10.10.1",
    "10.10.20.1",
    "10.10.70.1",
]

DaNang_ips = [
    "10.10.10.1",
    "10.10.20.1",
    "10.10.30.1",
    "10.10.140.1",
    "10.10.150.1",
    "10.10.160.1",
    "10.10.170.1",
    "10.10.180.1",
]

HoChiMinh_ips = [
    "10.10.10.1",
    "10.10.20.1",
    "10.10.140.1",
    "10.10.150.1",
    "10.10.210.1",
    "10.10.220.1",
    "10.10.230.1",
    "10.10.240.1",
]

HaNoi_ips = set(HaNoi_ips)
DaNang_ips = set(DaNang_ips)
HoChiMinh_ips = set(HoChiMinh_ips)

# 1. Hà Nội và Đà Nẵng (Dùng set intersection)
print()
print("-" * 80)
print(
    "Duplicate IPs Ha Noi va Da Nang:\n\n{}".format(
        HaNoi_ips & DaNang_ips
    )
)
print("-" * 80)

# 2. Hà Nội và Hồ Chí Minh (Dùng set intersection)
print()
print("-" * 80)
print(
    "Duplicate IPs Ha Noi va Ho Chi Minh:\n\n{}".format(
        HaNoi_ips & HoChiMinh_ips
    )
)
print("-" * 80)

# 3. Tất cả các site
print()
print("-" * 80)
print(
    "Duplicate IPs tat ca cac sites:\n\n{}".format(
        HaNoi_ips & DaNang_ips & HoChiMinh_ips
    )
)
print("-" * 80)

# 4. Lấy IP của Hồ Chí Minh mà không trung với bất kỳ site nào
print()
print("-" * 80)
print(
    "Ho Chi Minh IP addresses difference:\n\n{}".format(
        HoChiMinh_ips.difference(HaNoi_ips).difference(DaNang_ips)      
    )
)

# HOẶC
print()
print("-" * 80)
print(
    "Ho Chi Minh IP addresses '-':\n\n{}".format(
        HoChiMinh_ips - DaNang_ips - HaNoi_ips
    )
)
print("-" * 80)
print()


Kết quả
C:\python>python Demo.py

--------------------------------------------------------------------------------
Duplicate IPs Ha Noi va Da Nang:

{'10.10.20.1', '10.10.10.1', '10.10.30.1'}
--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
Duplicate IPs Ha Noi va Ho Chi Minh:

{'10.10.20.1', '10.10.10.1'}
--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
Duplicate IPs tat ca cac sites:

{'10.10.20.1', '10.10.10.1'}
--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
Ho Chi Minh IP addresses difference:

{'10.10.230.1', '10.10.210.1', '10.10.240.1', '10.10.220.1'}

--------------------------------------------------------------------------------
Ho Chi Minh IP addresses '-':

{'10.10.230.1', '10.10.210.1', '10.10.240.1', '10.10.220.1'}
--------------------------------------------------------------------------------


C:\python>

Xong!

Học Python Qua Ví Dụ #019 Bài Tập - Regular Expression

Xem lý thuyết RegEx ở đây

Xem format email ở đây


  • Ví dụ Extract Email:

Code:

'''
Yêu cầu:
Dùng RegEx để lấy ra tất cả các địa chỉ email từ chuỗi txt (kết quả đưa vào list)

'''
import re  

txt = 'Hello from shubhamg+199630@gmail.com to pri.ya@yahoo.co.kr,pr_iya@yahoo.com,priya@yahoo to-ny@yahoo.com.vn about the meeting @2PM'

#regex ="[a-zA-Z0-9!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+"

regex ="[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+" 
email = re.findall(regex, txt)     
  
print(email)


Kết quả:

C:\python>python Demo.py

['shubhamg+199630@gmail.com', 'pri.ya@yahoo.co.kr', 'pr_iya@yahoo.com', 'to-ny@yahoo.com.vn']

C:\python> 


  • Ví dụ Extract IPv4:

Code:

'''
Yêu cầu:
Dùng RegEx để lấy ra tất cả các địa chỉ IPv4 từ chuỗi txt (kết quả đưa vào list)

'''
import re  

txt = '12/30-04:09:41.070967 [**] [1:10000001:1] snort alert [1:0000001] [**] [classification ID: 0] [Priority ID: 0] {ICMP} 192.168.232.2:41676 -> 192.168.248.2:21'

#regex = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' # định dạng IPv4
#regex = r"[a-fA-F0-9]{4}\.[a-fA-F0-9]{4}\.[a-fA-F0-9]{4}" # định dạng địa chỉ MAC
'''
HOẶC
'''
regex = r'\d{1,3}(?:\.\d{1,3}){3}'
IPs = re.findall(regex, txt)        

print(IPs)


Kết quả:

C:\python>python Demo.py

['192.168.232.2', '192.168.248.2']

C:\python>


  • Ví dụ Extract Số điện thoại:

Code:

import re
'''
Lấy ra tất cả các số điện trong chuỗi txt

'''
txt =''' so dien thoai (84)-899-723-572, so thu 2 +84 123.456.789, so thu 3 +84 123 456 789

'''

reg4 = re.compile(r"""(
    (\(\d+\)|\+\d+|\(\+\d+\))? # mã vùng, \+\d+: là dấu cộng, số xuất hiện 1 hoặc nhiều lần; \(\+\d+\): dấu mở ngoặc, dâu cộng, dấu đóng ngoặc; ()?: có thể có hoặc không
    (\-|\.|\s)? # dấu trừ, dấu chấm, dấu cách hoặc không có gì cả
    (\d+)
    (\-|\.|\s)?
    (\d+)
    (\-|\.|\s)?
    (\d+)
)""",re.VERBOSE)
match4 = reg4.findall(txt)
print (type(match4))
match4_phone = [match4[phone][0] for phone in range(len(match4))]
print(match4_phone)


Xong!

Học Python Qua Ví Dụ #018 - Regular Expression Trong Python

1. Regular Expression (RegEx) Funtions:
  • Match: Trả về kết quả THÀNH CÔNG hoặc None với mẫu trong chuỗi có cờ tùy chọn
  • Search: Trả về kết quả THÀNH CÔNG nếu tìm thấy hoặc None nếu không tìm thấy
  • Findall: Trả về danh sách chứa TẤT CẢ các kết quả tìm được
  • Sub: Tìm và thay thế một hoặc nhiều chuỗi nếu tìm thấy
  • Split: Trả về danh sách chứa các chuỗi con

2. Cú pháp pattern sử dụng RegEx trong Python:

Ký Hiệu Mô Tả Biểu Thức Giải Thích Kết Quả
. Bất kỳ ký tự nào
+ MỘT hoặc NHIỀU lần xuất hiện TRƯỚC nó x = re.findall("aix+", txt) Tìm kiếm chuỗi "aix" hoặc "aixxx" có trong chuỗi txt không
* không hoặc NHIỀU lần xuất hiện TRƯỚC nó x = re.findall("aix*", txt) Tìm kiếm chuỗi "ai" hoặc "aix" hoặc "aixxx" có trong chuỗi txt không
? không hoặc MỘT lần xuất hiện TRƯỚC nó x = re.findall("aix?", txt) Tìm kiếm chuỗi "ai" hoặc "aix" có trong chuỗi txt không
^ đại diện cho mẫu ĐỨNG ĐẦU một chuỗi x = re.findall("^aix", txt) Tìm kiếm chuỗi "aix" nếu mẫu đứng ở ĐẦU trong chuỗi txt
$ đại diện cho mẫu KẾT THÚC một chuỗi x = re.findall("aix$", txt) Tìm kiếm chuỗi "aix" nếu mẫu đứng ở CUỐI trong chuỗi txt
\d ký tự là số, tương đương từ 0->9 x = re.findall("\d", txt) Tìm một ký tự số (từ 0 đến 9) trong chuỗi txt
\D Chuỗi không chứa ký tự là số (ngược với \d), giống với [^0-9]
\s ký tự là khoảng trắng, tương đương [\t\n\r\f\v] x = re.findall("\s", txt) Trả về chuỗi CÓ chứa bất kỳ khoảng trắng nào
\S Ngược với \s, chuỗi KHÔNG CHỨA khoảng trắng, giống với [^\t\n\r\f\v] x = re.findall("\S", txt) Trả về chuỗi KHÔNG chứa bất kỳ khoảng trắng nào
[] Tập hợp các ký tự muốn khớp x = re.findall("[a-c]", txt) tìm các ký tự: "a" hoặc "b" hoặc "c" trong chuỗi txt
[^] Tập hợp các ký tự KHÔNG khớp x = re.findall("[^a-c]", txt) tìm các ký tự NGOẠI TRỪ: "a" hoặc "b" hoặc "c" trong chuỗi txt
{n} Tìm chính xác ký tự và n lần xuất hiện của ký tự x = re.findall("a{3}", txt) tìm ký tự "a" nếu nó xuất hiện 3 lần
{n,m} Khớp với ký tự xuất hiện 'n' lần nhưng không quá 'm' x = re.findall("al{2,3}", txt) tìm ký tự "a" và 2 ký tự "l" hoặc 3 ký tự "l" trong chuỗi txt
{n,} Chỉ khớp với ký tự khi nó xuất hiện 'n' lần trở lên re.findall("a{5,}", txt) Tìm và trả về kết quả nếu ký tự "a" xuất hiện ít nhất 5 lần
() Gom nhóm các mẫu lại với nhau
| Hoặc x= re.findall("(a|b|c)xz", txt) tìm kiếm trước xz là ký tự: "a" hoặc "b" hoặc "c"
\w Chuỗi chứa bất kỳ ký tự nào trong nhóm từ a tới Z, từ 0 tới 9 và dấu _ (underscore), giống với [a-zA-Z0-9_]
\W Ngược lại \w
?: Tìm không nhớ \d{1,3}(?:\.\d{1,3}){3} Tìm ký tự đầu tiên là số xuất hiện 1 đến 3 lần, tiếp đến ký tự "." và sau đó là ký tự số và chúng ( dấu chấm và số) phải xuất hiện đúng 3 lần Trả về chuỗi dạng IPv4
\+ là dấu cộng
\( là dấu mở ngoặc
\) là dấu đóng ngoặc
()? Có hoặc không có nhóm ký tự (nhóm ký tự đặt trong dấu ngoặc đơn)



  • Ví dụ re.match:
import re # import module re vào chương trình

'''
định nghĩa chuỗi mẫu có:
- chiều dài là: 5
- ký tự ĐẦU tiên là: a
- 3 ký tự GIỮA là: các ký tự bất kỳ
- ký tự CUỐI cùng là: z
'''
pattern = '^a...z$' 

test_in = input("Nhap vao chuoi: ")
result = re.match(pattern, test_in)
 
if result:
   print("Da TIM THAY chuoi.")
   print(result)
else:
   print("Chuoi nhap vao KHONG CO trong chuoi.")

Nếu chuỗi nhập vào thỏa mãn 4 điều kiện:
  • Chiều dài: 5
  • Ký tự ĐẦU: a
  • 3 ký tự GIỮA: 3 ký tự bất kỳ
  • Ký tự CUỐI:z
thì sẽ cho kết quả TÌM THẤY, ngược lại sẽ không tìm thấy.

  • Ví dụ re.search:
import re

'''
Tìm trong chuỗi txt nếu:
- ĐẦU là chữ: "The"
- GIỮA là CÓ hoặc KHÔNG CÓ bất kỳ ký tự nào
- CUỐI là chữ: "Spain"
'''

txt = "The rain in Spain"
x = re.search("^The.*Spain$", txt)

if x:
  print("Da TIM THAY chuoi!")
  print(x)
  # chỉ in ra nội dung của chuỗi nếu tìm thấy dùng
  print(x.group(0))
else:
  print("KHONG tim thay!")
  print(x)

  • Ví dụ re.findall:
import re

'''
Tìm "ai" trong chuỗi txt, tất cả các lần tìm thấy sẽ lưu vào biến x
Trong trường hợp này kết sẽ là: ['ai', 'ai']
'''
txt = "The rain in pain"
x = re.findall("ai", txt)

if x:
  print("Da TIM THAY chuoi!")
  print(x)
else:
  print("KHONG tim thay!")
  print(x)

  • Ví dụ re.sub:
import re

'''
Tìm khoảng trắng trong chuỗi txt nếu:
- Tìm thấy thì thay thế khoảng trắng bằng số 9
- và chỉ thay thế HAI(2) LẦN

=> KẾT QUẢ: "The9rain9in pain".
Trong chuỗi hiện tại có 3 dấu khoảng trắng nhưng CHỈ THAY 2 khoảng trắng đầu tiên tìm được

'''
txt = "The rain in pain"
x = re.sub("\s", "9", txt, 2)

if x:
  print("Chuoi da THAY THE!")
  print(x)
else:
  print("KHONG tim thay!")
  print(x)

  • Ví dụ re.split:
import re

'''
Tìm khoảng trắng trong chuỗi txt nếu:
- Tìm thấy thì TÁCH chuỗi
- và chỉ tách HAI(2) LẦN

=> KẾT QUẢ: ['The', 'rain', 'in pain'].
Trong chuỗi hiện tại có 3 dấu khoảng trắng nhưng TÁCH 2 khoảng trắng đầu tiên tìm được

'''
txt = "The rain in pain"
x = re.split("\s", txt, 2)

if x:
  print("Chuoi da TACH!")
  print(x)
else:
  print("KHONG tim thay!")
  print(x)


  • Ví dụ khác:

RegEx Mô Tả
\w{4}\.\w{4}\.\w{4} Có dạng 12 ký tự, được chia thành 3 cụm
Mỗi cụm này cách nhau bằng dấu chấm ".", mỗi cụm được phép lấy chính xác 4 ký tự
Các ký tự trong mỗi cụm có thể là: chữ, số, hoặc chữ số đó là ký tự gạch chân
[a-fA-F0-9]{4}\.[a-fA-F0-9]{4}\.[a-fA-F0-9]{4} Có dạng 12 ký tự, được chia thành 3 cụm (Định dạng MAC address trong cisco)
Mỗi cụm này cách nhau bằng dấu chấm ".", mỗi cụm được phép lấy chính xác 4 ký tự
Các ký tự trong mỗi cụm chỉ được phép lấy là:
- Các ký tự từ: a - f
- Các ký tự GHI HOA từ: A - F
- Các số tự nhiên từ: 0 - 9
[a-fA-F0-9]{4}(?:\.[a-fA-F0-9]{4}){2} Kết quả cuối cùng vẫn trả về định dạng MAC Address trong Cisco IOS
Cụm đầu tiên sẽ lấy là [a-fA-F0-9]{4}
Cụm thứ 2 gồm 2 cụm nhỏ tương tự như cụm đầu nhưng:
- Trước đó phải là ký tự dấu chấm "."
- Khi tìm thấy dấu chấm không được ghi nhớ nó (dấu chấm)
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} dạng số, được chia thành 4 cụm, mỗi cụm này cách nhau bằng dấu chấm "."
Các số được phép lặp lại từ 1 đến 3 lần
\d{1,3}(?:\.\d{1,3}){3} Tương tự chúng ta có cách viết rút gọn để lấy chuỗi có dạng địa chỉ IPv4

Xong!

Học Python Qua Ví Dụ #017 Bài Tập - Convert Dictionary To List Trong Python

Ví dụ 1:

Code:
'''
cho Dict dùng for để lấy tất cả các keys, values đưa vào list
print ra màn hình
'''
#DMIP = {key:value}
DMIP = {"Devices" : "Management IP","R_HaNoi" :"10.0.0.1", "R_DaNang" : "172.16.1.2", "R_HoChiMinh" : "192.168.1.3"}

all_key = []
# hoac: for key in DMIP:
for key in DMIP.keys():
	all_key.append(key)

all_value =[]
for value in DMIP.values():
	all_value.append(value)

print(all_key)
print(all_value)


Kết quả:
C:\python>python Demo.py
['Devices', 'R_HaNoi', 'R_DaNang', 'R_HoChiMinh']
['Management IP', '10.0.0.1', '172.16.1.2', '192.168.1.3']

C:\python>

Ví dụ 2:
Code:
'''
cho Dict dùng for để lấy tất cả các keys, values đưa vào list
print ra màn hình
'''
#DMIP = {key:value}
DMIP = {"Devices" : "Management IP","R_HaNoi" :"10.0.0.1", "R_DaNang" : "172.16.1.2", "R_HoChiMinh" : "192.168.1.3"}

all_key = []
all_value =[]
for key, value in DMIP.items():
	all_key.append(key)
	all_value.append(value)

print(all_key)
print(all_value)

Ví dụ 3 (không dùng for):
Code:
#DMIP = {key:value}
DMIP = {"Devices" : "Management IP","R_HaNoi" :"10.0.0.1", "R_DaNang" : "172.16.1.2", "R_HoChiMinh" : "192.168.1.3"}
# lấy tất cả keys và values cho vào list
all_key = list(DMIP.keys())
all_value = list(DMIP.values())

hostname = all_key.copy()
ip_addr = all_value.copy()

# lấy ra phần tử đầu của list hostname và ip_addr đưa vào list mới item
item=[]
item.append(hostname.pop(0))
item.append(ip_addr.pop(0))
item.append("-")

#format
print()
print("{:^50}".format("=====USING FORMAT METHOD OF STRING CLASS====="))
print("{:^20} {:^20}".format(item[0], item[1]))
print("{:^20} {:^20}".format(item[2]*20,item[2]*20))
print("{:>20} {}".format(hostname[0],ip_addr[0]))
print("{:>20} {}".format(hostname[1],ip_addr[1]))
print("{:>20} {}".format(hostname[2],ip_addr[2]))

#f-string
print()
print(f"{'=====USING F-STRING=====':^50}")
print(f"{item[0]:^20}  {item[1]:^20}")
print(f"{item[2]*20:^20}  {item[2]*20:^20}")
print(f"{hostname[0]:>20}  {ip_addr[0]}")
print(f"{hostname[1]:>20}  {ip_addr[1]}")
print(f"{hostname[2]:>20}  {ip_addr[2]}")

Kết quả:


Xong!

Học Python Qua Ví Dụ #016 - Dictionary Trong Python

  • Dictionary là gì
Kiểu dữ liệu lưu trữ trong dictionary gồm các giá trị Key và Value.


Chúng lưu trữ không theo một trận tự hay thứ tự sắp xếp nào cả. Khai báo chúng được định nghĩa bởi cặp dấu {}

Ví dụ:
net_device = {
	"device_type": "ios",
	"ip_addr": "192.168.0.1"
}

  • Thêm/sửa/xóa phần tử trong dictionary
Code:
net_device = {
	"device_type": "ios",
	"ip_addr": "192.168.0.1"
}
print(net_device)

# thêm key vendor có giá trị juniper vào dictionary
net_device ["vendor"] = "juniper"
print(net_device)

# thay đổi giá trị của dict
net_device["ip_addr"] = "192.168.0.254"
print(net_device)

# lấy giá trị ra khỏi dict
net_device.pop("vendor")
print(net_device)


Kết quả
C:\python>python Demo.py

{'device_type': 'ios', 'ip_addr': '192.168.0.1'}

{'device_type': 'ios', 'ip_addr': '192.168.0.1', 'vendor': 'juniper'}

{'device_type': 'ios', 'ip_addr': '192.168.0.254', 'vendor': 'juniper'}

{'device_type': 'ios', 'ip_addr': '192.168.0.254'}

C:\python>

  • Phương thức update trong Dictionary
Code:
net_device = {
	"device_type": "ios",
	"ip_addr": "192.168.0.1",
	"vendor" : "cisco",
}
print(net_device)

net_device_2 = {"model" : "sxr", "vendor" : "juniper"}

# giá trị của net_device_2 sẽ thêm vào net_device
net_device.update(net_device_2)
print(net_device)

Kết quả:
C:\python>python Demo.py

{'device_type': 'ios', 'ip_addr': '192.168.0.1', 'vendor': 'cisco'}
{'device_type': 'ios', 'ip_addr': '192.168.0.1', 'vendor': 'juniper', 'model': 'sxr'}

C:\python>

Với ví dụ trên, giá trị của net_device_2 sẽ được thêm vào net_device, nếu trong net_device đã tồn tại key thì giá trị của net_device_2 sẽ ghi đè lên giá trị của net_device. Đó là lý do giá trị mới của key vendor trong net_device là juniper thay cho cisco

  • Lặp trong dictionary
Code:
net_device = {
	"device_type": "ios",
	"ip_addr": "192.168.0.1",
	"vendor" : "cisco",
	"mode": "881"
}

# in ra danh sách các key trong dictionary
for key in net_device.keys():
	print (key)

print("-" * 20)
# in ra danh sách các giá trong dictionary
for value in net_device.values():
	print (value)

print("-" * 20)
# in ra key, value thông qua items
for key, value in net_device.items():
	print (key)
	print (value)
	print("-" * 20)

Kết quả:
C:\python>python Demo.py
device_type
ip_addr
vendor
mode
--------------------
ios
192.168.0.1
cisco
881
--------------------
device_type
ios
--------------------
ip_addr
192.168.0.1
--------------------
vendor
cisco
--------------------
mode
881
--------------------

C:\python>

  • Merge two dictionary
Với phương thức update giúp chúng ta có thêm giá dictionary và nếu key đã tồn tại trước đó thì giá trị của key đó sẽ bị thay thế bởi giá trị cập nhật sau hay còn gọi là ghi đè. 

Bây giờ chúng ta xây dựng hàm để cập thật thêm giá trị vào dictionary mà không ghi đè (như phương thức update) nếu key đã tồn tại.

Code:
def mergeDict(dict1, dict2):
   
   dict3 = {**dict1, **dict2}						# thực hiện nối 2 dict, nếu trùng key thì giá trị sẽ là giá trị của dict đứng sau (trường hợp này dict2)
   for key, value in dict3.items():					
       if key in dict1 and key in dict2:			# 2 dict có key giống nhau
            dict3[key] = [value , dict1[key]]	    # thêm value của dict1 vào dict 3

   return dict3

dict1 = {'R1': {'Eth0/0': '192.168.11.1 255.255.255.0'}}
dict2 = {'R1': {'Eth0/1': '192.168.12.1 255.255.255.0'}}

dict3 = mergeDict(dict1, dict2)						# gọi hàm merge
print('Dictionary sau khi merge:')
print(dict3)


Kết quả:
C:\python>python Demo.py
Dictionary sau khi merge:
{'R1': [{'Eth0/1': '192.168.12.1 255.255.255.0'}, {'Eth0/0': '192.168.11.1 255.255.255.0'}]}

Để kết quả dễ nhìn hơn chúng ta import thư viện pprint để in ra kết quả.

Code:
def mergeDict(dict1, dict2):
   
   dict3 = {**dict1, **dict2}						# thực hiện nối 2 dict, nếu trùng key thì giá trị sẽ là giá trị của dict đứng sau (trường hợp này dict2)
   
   for key, value in dict3.items():					
       if key in dict1 and key in dict2:			# 2 dict có key giống nhau
            dict3[key] = [value , dict1[key]]	    # thêm value của dict1 vào dict 3

   return dict3


dict1 = {'R1': {'Eth0/0': '192.168.11.1 255.255.255.0'}}
dict2 = {'R1': {'Eth0/1': '192.168.12.1 255.255.255.0'}}

dict3 = mergeDict(dict1, dict2)						# gọi hàm merge
print('Dictionary sau khi merge:')

from pprint import pprint	# import thư viện pprint
pprint(dict3)


Kết quả:
C:\python>python Demo.py
Dictionary sau khi merge:
{'R1': [{'Eth0/1': '192.168.12.1 255.255.255.0'},
        {'Eth0/0': '192.168.11.1 255.255.255.0'}]}

Xong!

Windows, Remote Desktop Protocol (RDP) - Do Not Allow Drive/Clipboard Redirection Policies

Chúng ta điều khiển từ máy tính thông qua các chương trình remote trong đó có Remote Desktop của windows, thông qua đó chúng ta có thể chia sẽ tài nguyên qua lại giữa remote computer và client computer nhờ Remote Desktop Services session. Mặc định Remote Desktop Services session cho phép Drive/Clipboard Redirection.


Chúng ta có thể làm theo hướng như hình rồi remote desktop vào ỗ đĩa của máy chúng ta sẽ xuất hiện trên máy remote.


Với hình trên máy có tên VCK đang remote desktop vào và share 8 ổ đĩa nên trên máy đang bị remote hiện thị thêm các ổ đĩa của máy VCK nên chúng ta thấy chữ ... on VCK

Tham khảo cách mở Remote Destkop ở đây

Tuy nhiên vì lý do nào đó chúng ta muốn chặn việc Redirection Drive/Clipboard Redirection giữa remote computer và client computer.

Có nhiều cách để làm được điều này, tuy nhiên trong bài này chúng tôi hướng dẫn chặn thông qua policy.

Thực hiện chặn Redirection với máy tính bật RDP trên:
  • Win 8.1



  • Windows Server + domain controller:

đường dẫn khác, nhưng cách làm tương tự.
Group Policy Editor -> Computer Configuration\Policies\Administrative Templates\Windows Components\Remote Desktop Services\Remote Desktop Session Host\Device and Resource Redirection.

Làm xong bước này thử lại nhé các bạn, nếu gpupdate /force chưa ép-phê thì khởi động lại máy.

Xong!

Windows, Remote Desktop Protocol (RDP) - Do Not Allow Drive/Clipboard Redirection Policies

Chúng ta điều khiển từ máy tính thông qua các chương trình remote trong đó có Remote Desktop của windows, thông qua đó chúng ta có thể chia sẽ tài nguyên qua lại giữa remote computer và client computer nhờ Remote Desktop Services session. Mặc định Remote Desktop Services session cho phép Drive/Clipboard Redirection.


Chúng ta có thể làm theo hướng như hình rồi remote desktop vào ỗ đĩa của máy chúng ta sẽ xuất hiện trên máy remote.


Với hình trên máy có tên VCK đang remote desktop vào và share 8 ổ đĩa nên trên máy đang bị remote hiện thị thêm các ổ đĩa của máy VCK nên chúng ta thấy chữ ... on VCK

Tham khảo cách mở Remote Destkop ở đây

Tuy nhiên vì lý do nào đó chúng ta muốn chặn việc Redirection Drive/Clipboard Redirection giữa remote computer và client computer.

Có nhiều cách để làm được điều này, tuy nhiên trong bài này chúng tôi hướng dẫn chặn thông qua policy.

Thực hiện chặn Redirection với máy tính bật RDP trên:
  • Win 8.1



  • Windows Server + domain controller:

đường dẫn khác, nhưng cách làm tương tự.
Group Policy Editor -> Computer Configuration\Policies\Administrative Templates\Windows Components\Remote Desktop Services\Remote Desktop Session Host\Device and Resource Redirection.

Làm xong bước này thử lại nhé các bạn, nếu gpupdate /force chưa ép-phê thì khởi động lại máy.

Xong!

Học Python Qua Ví Dụ #015 - Mail Merge/Trộn Mail Căn Bản Trong Python


Nên xem các bài dưới đây trước khi xem bài này

Mail Merge - Trộn Thư là tính năng rất hữu ích của Ms Word, tính năng này giúp chúng ta giảm thiểu thời gian trong các việc như: soạn hợp đồng, in phiếu lương, in giấy mời, thư cám ơn,... Hôm nay chúng ta tìm hiểu cách thực hiện Mail Merge trên python.

Có file Noidung.xlm có nội dung:
Hi: your_name
Your ID: your_id 
Your Password: your_password
Your OTP: your_otp

và file Danhsach.csv có nội dung:

Yêu cầu:
Các trường: your_name, your_id, your_password, your_otp của file Noidung.xlm sẽ thay đổi, mỗi dòng trong file Danhsach.csv sẽ được điền vào các trường tương ứng ở file Noidung.xlm. Kết quả tương tự như hình bên dưới
 

Nhận xét: 
Chúng ta thấy phần nội dung của file Noidung.xlm được lặp lại 6 lần (tùy thuộc vào số lượng dòng trong file Danhsach.csv). Nên file Noidung.xlm sẽ được mở trước sau đó mở file Danhsach.csv và sẽ có sự đi lặp lại khi xử lý file này.

Thực hiện:
Code:

with open ("Noidung.xml","r") as rf:
	noidung = rf.read()

	with open ("danhsach.csv","r") as rf_ds:
		
		for line_ds in rf_ds.readlines():
			fiedls_ds = line_ds.split(",")
			# đảm bảo khi thực hiện mỗi bước nhảy của vòng lặp nội dung file mới là đúng nội dung ban đầu của file Noidung.xml và
			noidung_moi = noidung
			'''
			Thực hiện thay thế
			Nếu thấy các trường:your_name, your_id, your_password, your_otp 
			thì thay thế bằng các trường tương ứng trong file danh sách
			'''
			noidung_moi = noidung_moi.replace("your_name",fiedls_ds[1])
			noidung_moi = noidung_moi.replace("your_id",fiedls_ds[2])
			noidung_moi = noidung_moi.replace("your_password",fiedls_ds[3])
			noidung_moi = noidung_moi.replace("your_otp",fiedls_ds[4])
			print(noidung_moi)			

Kết quả:
C:\python>python Demo.py
Hi: Nguyen Van Troi
Your ID: id2020
Your Password: 112233
Your OTP: aabbcc

Hi: Tran Van Luong
Your ID: id2121
Your Password: 445566
Your OTP: ddeeff

Hi: Truong Viet Hoang
Your ID: id2222
Your Password: 778899
Your OTP: gghhkk

Hi: Cong Vuong
Your ID: id2323
Your Password: 223344
Your OTP: xxyyzz

Hi: Tien Linh
Your ID: id2424
Your Password: 334455
Your OTP: aawwqq

Hi: Van Quyet
Your ID: id2525
Your Password: 556677
Your OTP: ppkkll

C:\python>


Với code trên chúng ta thấy từ dòng 15 đến dòng 18 chúng ta có thể thay bằng vòng lặp và các trường: your_name, your_id, your_password, your_otp có thể đưa vào biến list sẽ thích hợp hơn, và code sẽ gọn hơn.

Code:
# Định nghĩa biến key_word là một list gồm các key word sẽ được thay thế

key_word = ["No.", "your_name", "your_id","your_password", "your_otp"]

with open ("Noidung.xml","r") as rf:
	noidung = rf.read()

	with open ("danhsach.csv","r") as rf_ds:
		
		rf_ds.readline() # Bỏ dòng đầu tiên, vì dòng đầu tiên là dòng tiêu đề
		
		for line_ds in rf_ds.readlines():
			fiedls_ds = line_ds.split(",")
			# đảm bảo khi thực hiện mỗi bước nhảy của vòng lặp nội dung file mới là đúng nội dung ban đầu của file Noidung.xml và
			noidung_moi = noidung
			
			#tạo vòng lặp chạy từ 1 cho đến hết chiều dài của biến key_word
			for i in range(1, len(key_word),1):
				noidung_moi = noidung_moi.replace(key_word[i],fiedls_ds[i])				
			print(noidung_moi))						



Xong!
 

Học Python Qua Ví Dụ #014 Bài Tập - Mail Merge Xử Lý File Trong Python

Yêu Cầu:
Trộn và nối các trường tương ứng trong file ListDevices.csv vào file zbx_export_hosts.xml, cụ thể là mỗi một dòng của file ListDevices.csv điền vào các biến ở các dòng 12, 13, 14, 17, 22 và 27 để tạo file mới có tên zbx_export_hosts_MOI.xml

Nội dung file zbx_export_hosts.xml

Nội dung file ListDevices.csv


Nhận xét: Chúng ta thấy trong file zbx_export_hosts.xml từ dòng 11 cho đến dòng 32 đó là cấu tạo để định nghĩa một host trong file này và cho phép lặp lại. Nên chúng tôi đưa ra đề xuất giải quyết bài toán này là:

1. Tách file ban đầu ra làm 3 file nhỏ: 
- Từ dòng đầu tiên đến dòng thứ 10 là file: zbx_export_hosts_1.xml
- Từ dòng thứ 11 đến dòng thứ 32 là file: zbx_export_hosts_2.xml
- Từ dòng thứ 33 đến hết file là file: zbx_export_hosts_3.xml

2. Thực hiện nối các biến tương ứng theo yêu cầu đề bài và lưu lại với tên file mới là zbx_export_hosts_2EDIT.xml

3. Thực hiện nối 3: zbx_export_hosts_1.xml, zbx_export_hosts_2EDIT.xml, zbx_export_hosts_3.xml thành file zbx_export_hosts_MOI.xml

Thực Hiện:

1. Tách file ban đầu ra làm 3 file nhỏ: 
- Từ dòng đầu tiên đến dòng thứ 10 là file: zbx_export_hosts_1.xml
- Từ dòng thứ 11 đến dòng thứ 32 là file: zbx_export_hosts_2.xml
- Từ dòng thứ 33 đến hết file là file: zbx_export_hosts_3.xml

Code: 
f = open("zbx_export_hosts.xml", "r")
i = 0
cont1 =[]
for pl in f: # đọc cho đến hết file
	if i < 10:
		with open("zbx_export_hosts_1.xml","a") as f1:
			f1.write(pl)
	elif i < 32:
		with open("zbx_export_hosts_2.xml","a") as f2:
			f2.write(pl)
	else:
		with open("zbx_export_hosts_3.xml","a") as f3:
			f3.write(pl)
	i += 1
f.close

2. Thực hiện nối các biến tương ứng theo yêu cầu đề bài và lưu lại với tên file mới là zbx_export_hosts_2EDIT.xml

Code:
'''
định nghĩa list key_word có nội_dung/giá trị là các key word cần thay thế
Vì trong file ListDevices.csv có cột đầu tiên là No. số thứ tự không dùng trong việc thay thế
Nên thêm key No. để biến i trong vòng lặp for dễ hiểu hơn
Key No. sẽ không dùng
'''
key_word = ["No.", "host12","name13","des14","Temp17","Group22","ip_addr27"]

with open ("zbx_export_hosts_2.xml","r") as f:
	noidung = f.read()
	
	with open("ListDevices.csv","r") as fld:
		fld.readline() # bỏ dòng đầu tiên

		for line_dev in fld.readlines(): 
			fiedl_dev = line_dev.split(",")		# tách mỗi dòng thành 1 list	
			noidung_moi = noidung
			for i in range(0,len(key_word),1): 
				
				# thay thế tất cả các key vào nội dung 
				noidung_moi = noidung_moi.replace(key_word[i], fiedl_dev[i])

			# ghi file sau khi thay thế xong, give vào cuối file
			with open ("zbx_export_hosts_2EDIT.xml","a") as wf:
				wf.write(noidung_moi) 


3. Thực hiện nối 3: zbx_export_hosts_1.xml, zbx_export_hosts_2EDIT.xml, zbx_export_hosts_3.xml thành file zbx_export_hosts_MOI.xml

Code:
#định nghĩa list gồm tên của file cần nối vào file mới
files_list = ["zbx_export_hosts_1.xml", "zbx_export_hosts_2EDIT.xml","zbx_export_hosts_3.xml"]

with open ("zbx_export_hosts_MOI.xml","a") as wf:
	for i in range(0,len(files_list),1):
		
        with open (files_list[i],"r") as rf:
			content = rf.read()
			wf.write(content)


Tham khảo file sau khi nối zbx_export_hosts_MOI.xml

Xong!

Học Python Qua Ví Dụ #013 Bài Tập - While, For - Convert MAC Trong Python

Yêu cầu:

1. Convert Cisco to Windows MAC - Có bảng arp yêu cầu lấy ra cột mac address (định dạng cisco: xxxx.xxxx.xxxx) và chuyển sang định dạng MAC của Windows (xx:xx:xx:xx:xx:xx) 
Nội dung list

2. Convert Windows MAC to Cisco MAC

Thực Hiện:

1. Convert Cisco to Windows MAC 
Code:
arp_table = [
 ('10.220.88.1', '0062.ec29.70fe'),
 ('10.220.88.20', 'c89c.1dea.0eb6'),
 ('10.220.88.21', '1c6a.7aaf.576c'),
 ('10.220.88.28', '5254.aba8.9aea'),
 ('10.220.88.29', '5254.abbe.5b7b'),
 ('10.220.88.30', '5254.ab71.e119'),
 ('10.220.88.32', '5254.abc7.26aa'),
 ('10.220.88.33', '5254.ab3a.8d26'),
 ('10.220.88.35', '5254.abfb.af12'),
 ('10.220.88.37', '0001.00ff.0001'),
 ('10.220.88.38', '0002.00ff.0001'),
 ('10.220.88.39', '6464.9be8.08c8'),
 ('10.220.88.40', '001c.c4bf.826a'),
 ('10.220.88.41', '001b.7873.5634')]
for ip_addr, mac_addr in arp_table: 
    mac_addr = mac_addr.split(".")
    mac_addr = "".join(mac_addr)
    mac_addr = mac_addr.upper() # chuyển sang chữ hoa
    print()
    new_mac = []  # khởi tạo list rỗng
    while len(mac_addr) > 0: # khi độ dài của MAC address lớn hơn 0
        entry = mac_addr[:2] # lấy 2 ký tự đầu tiên
        mac_addr = mac_addr[2:] # MAC address mới sẽ là chuỗi ký tự từ vị trí thứ 3 đến hết chuỗi (ở đây chiều dài của mac_addr đã giảm đi 2)
        new_mac.append(entry) # cứ 2 ký tự nối là thành phần của list

    new_mac = ":".join(new_mac)
    print(new_mac)

Kết quả:
C:\python>python Demo.py

00:62:EC:29:70:FE

C8:9C:1D:EA:0E:B6

1C:6A:7A:AF:57:6C

52:54:AB:A8:9A:EA

52:54:AB:BE:5B:7B

52:54:AB:71:E1:19

52:54:AB:C7:26:AA

52:54:AB:3A:8D:26

52:54:AB:FB:AF:12

00:01:00:FF:00:01

00:02:00:FF:00:01

64:64:9B:E8:08:C8

00:1C:C4:BF:82:6A

00:1B:78:73:56:34

C:\python>

2. Convert Windows MAC to Cisco MAC 

Code:
mac_add = "00:62:EC-29-70-FE"
mac_add = mac_add.replace(":","")
mac_add = mac_add.replace("-","").lower()
print()
new_mac = []
while len(mac_add) > 0:
	entry = mac_add [:4]
	mac_add = mac_add [4:]
	new_mac.append(entry) 

new_mac = ".".join(new_mac)
print(new_mac)

Kết quả:
C:\python>python Demo.py

0062.ec29.70fe

C:\python>
 
Xong!

CDP - Cisco Discovery Protocol & LLDP - Link Layer Discovery Protocol - LAB


Sơ đồ lab:


Yêu cầu:

1. Dùng các lệnh show cdp neighbors, show cdp neighbors detail trên R1 để xem thông tin của router láng giềng

2. Dùng các lệnh show cdp neighbors, show cdp entry * trên R2 để xem thông tin các router láng giềng

3. Tắt cdp trên Et0/0 của R1, dùng lệnh show cdp neighbors trên R2 kiểm tra và nhận xét

4. Cấu hình lldp trên R1 và R2, dùng lệnh show lldp neighbors để kiểm tra.


Chuẩn bị:

R1:

enable
conf t
hostname R1

interface Ethernet0/0
description ===Connect to R2 Et0/1===
ip address 192.168.12.1 255.255.255.0
no shutdown
exit
do wri


R2:

enable
conf t
hostname R2

interface Ethernet0/1
description ===Connect to R1 Et0/0===
ip address 192.168.12.2 255.255.255.0
no shutdown
exit
interface Ethernet0/2
description ===Connect to R3 Et0/3===
ip address 192.168.23.2 255.255.255.0
no shutdown
exit
do wri


R3:

enable
conf t
hostname R3

interface Ethernet0/3
description ===Connect to R2 Et0/2===
ip address 192.168.23.3 255.255.255.0
no shutdown
exit
do wri


Thực hiện:

1. Dùng các lệnh show cdp neighbors, show cdp neighbors detail trên R1 để xem thông tin của router láng giềng

R1:

R1>show cdp neighbors 

Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
                  S - Switch, H - Host, I - IGMP, r - Repeater, P - Phone, 
                  D - Remote, C - CVTA, M - Two-port Mac Relay 

Device ID        Local Intrfce     Holdtme    Capability  Platform  Port ID
R2                      Eth 0/0              148              R B       Linux Uni Eth 0/1

Total cdp entries displayed : 1
R1>


Nhận xét: R1 đang dùng port Eth 0/0 nối với port Eth 0/1 của R2Platform: vì là làm trên lab ảo nên chổ này chỉ hiển thị là Linux Uni, nếu là thiết bị thật sẽ chổ này sẽ hiển thị đúng flatform của thiết bị


R1:

R1#show cdp neighbors detail 

-------------------------
Device ID: R2
Entry address(es): 
  IP address: 192.168.12.2
Platform: Linux Unix,  Capabilities: Router Source-Route-Bridge 
Interface: Ethernet0/0,  Port ID (outgoing port): Ethernet0/1
Holdtime : 158 sec

Version :
Cisco IOS Software, Linux Software (I86BI_LINUX-ADVENTERPRISEK9-M), Version 15.4(1)T, DEVELOPMENT TEST SOFTWARE
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2013 by Cisco Systems, Inc.
Compiled Sat 23-Nov-13 03:28 by prod_rel_team

advertisement version: 2
Duplex: half
Management address(es): 
  IP address: 192.168.12.2

Total cdp entries displayed : 1
>
R1#


Nhận xét: Láng giềng R2 có địa chỉ IP là: 192.168.12.2; hệ điều hành đang dùng là: I86BI_LINUX-ADVENTERPRISEK9-M


2. Dùng các lệnh show cdp neighbors, show cdp entry * trên R2 để xem thông tin các router láng giềng

R2#show cdp neighbors 
Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
                  S - Switch, H - Host, I - IGMP, r - Repeater, P - Phone, 
                  D - Remote, C - CVTA, M - Two-port Mac Relay 

Device ID        Local Intrfce     Holdtme    Capability  Platform  Port ID
R3               Eth 0/2           136              R B   Linux Uni Eth 0/3
R1               Eth 0/1           138              R B   Linux Uni Eth 0/0

Total cdp entries displayed : 2
R2#

Có 2 láng giềng kết nối với R2 là: R1 và R3

R2#show cdp entry *
-------------------------
Device ID: R3
Entry address(es): 
  IP address: 192.168.23.3
Platform: Linux Unix,  Capabilities: Router Source-Route-Bridge 
Interface: Ethernet0/2,  Port ID (outgoing port): Ethernet0/3
Holdtime : 175 sec

Version :
Cisco IOS Software, Linux Software (I86BI_LINUX-ADVENTERPRISEK9-M), Version 15.4(1)T, DEVELOPMENT TEST SOFTWARE
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2013 by Cisco Systems, Inc.
Compiled Sat 23-Nov-13 03:28 by prod_rel_team

advertisement version: 2
Duplex: half
Management address(es): 
  IP address: 192.168.23.3

-------------------------
Device ID: R1
Entry address(es): 
  IP address: 192.168.12.1
Platform: Linux Unix,  Capabilities: Router Source-Route-Bridge 
Interface: Ethernet0/1,  Port ID (outgoing port): Ethernet0/0
Holdtime : 174 sec

Version :
Cisco IOS Software, Linux Software (I86BI_LINUX-ADVENTERPRISEK9-M), Version 15.4(1)T, DEVELOPMENT TEST SOFTWARE
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2013 by Cisco Systems, Inc.
Compiled Sat 23-Nov-13 03:28 by prod_rel_team

advertisement version: 2
Duplex: half
Management address(es): 
  IP address: 192.168.12.1

R2# 

Với câu lệnh show cdp entry * chúng ta có thể biết được thông tin chi tiết của tất cả các láng giềng đang kết nối với R2. 

Nếu muốn xem chi tiết của một láng giềng nào đó chúng ta dùng lệnh show cdp entry <Device ID/name>
R2#show cdp entry R3  
-------------------------
Device ID: R3
Entry address(es): 
  IP address: 192.168.23.3
Platform: Linux Unix,  Capabilities: Router Source-Route-Bridge 
Interface: Ethernet0/2,  Port ID (outgoing port): Ethernet0/3
Holdtime : 165 sec

Version :
Cisco IOS Software, Linux Software (I86BI_LINUX-ADVENTERPRISEK9-M), Version 15.4(1)T, DEVELOPMENT TEST SOFTWARE
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2013 by Cisco Systems, Inc.
Compiled Sat 23-Nov-13 03:28 by prod_rel_team

advertisement version: 2
Duplex: half
Management address(es): 
  IP address: 192.168.23.3

R2#

               
3. Tắt cdp trên Et0/0 của R1, dùng lệnh show cdp neighbors trên R2 kiểm tra và nhận xét

R1:
int Et0/0
no cdp enable

Kiểm tra:
R2#show cdp neighbors 
Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
                  S - Switch, H - Host, I - IGMP, r - Repeater, P - Phone, 
                  D - Remote, C - CVTA, M - Two-port Mac Relay 

Device ID        Local Intrfce     Holdtme    Capability  Platform  Port ID
R3               Eth 0/2           173              R B   Linux Uni Eth 0/3

Total cdp entries displayed : 1
R2#

Thông cdp chỉ còn một láng giềng là R3 mà thôi.
Notes: chúng ta phải chờ hết holdtime là 180s cdp mới cập thông tin đúng nhé.

4. Cấu hình lldp trên R1 và R2, dùng lệnh Show lldp neighbors để kiểm tra.

R1, R2:
conf t
lldp run

Kiểm tra:
R2#show lldp neighbors 
Capability codes:
    (R) Router, (B) Bridge, (T) Telephone, (C) DOCSIS Cable Device
    (W) WLAN Access Point, (P) Repeater, (S) Station, (O) Other

Device ID           Local Intf     Hold-time  Capability      Port ID
R1                  Et0/1          120        R               Et0/0

Total entries displayed: 1

R2#

R1#show lldp neighbors 
Capability codes:
    (R) Router, (B) Bridge, (T) Telephone, (C) DOCSIS Cable Device
    (W) WLAN Access Point, (P) Repeater, (S) Station, (O) Other

Device ID           Local Intf     Hold-time  Capability      Port ID
R2                  Et0/0          120        R               Et0/1

Total entries displayed: 1

R1#

Thông tin LLDP trên R1, R2 có có thông tin của nhau.

Với CDP và LLDP có thể giúp chúng ta build lại sơ đồ kết nối của thiết bi.

Xong!

Học Python Qua Ví Dụ #012 Bài Tập - If, For Loops (Continue & Break), While Loop / Điều Kiện IF, Vòng Lặp For (Continue & Break), Vòng Lặp While Trong Python

Yêu Cầu:
1. Đọc file show_vlan.txt và xử lý để lấy ra các trường VLAN ID, VLAN NAME  

Nội dung file show_vlan.txt:

2. Đọc file show_arp.txt và xử lý nếu:

  • Tìm thấy 10.220.88.1 thì int ra "Default gateway IP/Mac" với IP và MAC tương ứng
  • Tìm thấy 10.220.88.30 thì in ra "Arista3 IP/Mac is" với IP và MAC tương ứng

Nội dung fileshow_arp.txt:

3. Đọc file show_lldp_neighbors_detail.txt và xử lý tìm ra nội dung của System Name, và Port ID của thiết bị láng giềng.

Nội dung file show_lldp_neighbors_detail.txt:

Thực Hiện:

1.  Đọc file show_vlan.txt và xử lý để lấy ra các trường VLAN ID, VLAN NAME

Code:
from __future__ import unicode_literals, print_function
from pprint import pprint

vlan_list = []
with open("show_vlan.txt" ,"r") as f: # Mở file lên đọc và tự động đóng file 
    show_vlan = f.read()	# Gán nội dung của file vào biến show_vlan

for line in show_vlan.splitlines(): # trả về một chuỗi tương ứng là một dòng trong biến show_vlan
    '''
    Sẽ bỏ qua các dòng nếu có một trong các điều kiện của if
    '''
    if 'VLAN' in line or '-----' in line or line.startswith('  '):
        continue
    fields = line.split() # tách ra thành list nhỏ, căn cứ vào dấu khoảng trắng
    vlan_id = fields[0] # lấy trường đầu tiên
    vlan_name = fields[1] # lấy trường thứ 2
    vlan_list.append((vlan_id, vlan_name))

print()
pprint(vlan_list)
print()

Kết quả:
C:\python>python Demo.py
[('1', 'default'),
 ('400', 'blue400'),
 ('401', 'blue401'),
 ('402', 'blue402'),
 ('403', 'blue403')]
C:\python>

2. Đọc file show_arp.txt và xử lý để lấy ra các trường IP, MAC.

Code:
from __future__ import unicode_literals, print_function

with open("show_arp.txt") as f:
    show_arp = f.read()

print()
found1, found2 = (False, False) # gán found1 = false, và found2 = false
for line in show_arp.splitlines():
    if 'protocol' in line.lower(): # nếu dòng nào có chữ 'protocol' thì bỏ qua
        continue
    fields = line.split() # chuyển mỗi dòng đọc được thành list
    ip_addr = fields[1] 
    mac_addr = fields[3]
    if ip_addr == '10.220.88.1': # nếu trường thứ 2 là '10.220.88.1'
        print("Default gateway IP/Mac is: {}/{}".format(ip_addr, mac_addr)) # in địa chỉ ip và mac 
        found1 = True  
    elif ip_addr == '10.220.88.30': # nếu trường thứ 2 là '10.220.88.30'
        print("Arista3 IP/Mac is: {}/{}".format(ip_addr, mac_addr)) 
        found2 = True

    if found1 and found2: # nếu cả 2 đã tìm được thì DỪNG không cần thực hiện hết vòng for
        print("Exiting...")
        break

print()

Kết quả:
C:\python>python Demo.py

Default gateway IP/Mac is: 10.220.88.1/0062.ec29.70fe
Arista3 IP/Mac is: 10.220.88.30/5254.ab71.e119
Exiting...


C:\python>

3. Đọc file show_lldp_neighbors_detail.txt và xử lý tìm ra nội dung của System Name, và Port ID của thiết bị láng giềng.

Code:
from __future__ import unicode_literals, print_function

with open("show_lldp_neighbors_detail.txt") as f:
    show_lldp = f.read()

system_name, port_id = (None, None)  # khởi tạo biến ban đầu là rỗng cho system_name và port_id
for line in show_lldp.splitlines():
    if 'System Name: ' in line: # nếu tìm thấy thoát khỏi if
        _, system_name = line.split('System Name: ') # gán biến _ cho trường đầu tiên, gán system_name là trường thứ 2
        break
    elif 'Port id: ' in line: 
        _, port_id = line.split('Port id: ') # tương tự system_name, gán port_id cho trường thứ 2
    
    if port_id and system_name: # nếu port_id và system_name KHÁC RỖNG thì DỪNG
        break

print()
print("System Name: {}".format(system_name))
print("Port ID: {}".format(port_id))
print()

Kết quả:
C:\python>python Demo.py

System Name: twb-sf-hpsw1
Port ID: 15


C:\python>

Xong!

/*header slide*/