/*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===*/

Basic Shell Commands In Linux/Ubuntu/CentOS - Các Lệnh Shell Cơ Bản Trong Linux - Ubuntu

Mục lục:

1. Mở terminal trong Linux

2. Trợ giúp trong linux

3. Các phím tắt cơ bản

4. Các lệnh cơ bản

5. Các biến môi trường


Nội dung:

1. Mở terminal trong Linux



2. Trợ giúp trong linux
  • Man page: Để xem các tùy chọn các lệnh cụ thể, 
Ví dụ: man ls 
Trong đó: 
- man: là từ khóa
- ls: là lệnh cần xem các tùy chọn
  • --help:
Ví dụ: ls --help. muốn xem các tùy chọn của lệnh ls


3. Các phím tắt cơ bản
  • Tab: Hoàn thành dòng lệnh
  • Tab + Tab: hiện thị/liệt kê tất cả các lệnh có liên qua đến từ vừa gõ
Ví dụ: gõ pin và nhấn Tab 2 lần sẽ cho kết quả như hình

  • CTRL + L: clear terminal
  • CTRL + D: logout
  • CTRL + K: xóa về phải đến hết dòng
  • CTRL + U: xóa về trái đến hết dòng
  • CTRL + W: xóa trái "word"
  • CTRL + Y: paste sau khi U, K, W
  • CTRL + P: command vừa chạy trước đó
  • CTRL + N: command vừa chạy sau đó
  • CTRL + A: về đầu dòng lệnh
  • CTRL + E: về cuối dòng lệnh
  • CTRL + E: Reserve history command search
  • SHIFT Page Up/Down: up/down terminal
  • !!: thực thi dòng lệnh cuối cùng

4. Các lệnh cơ bản

Lệnh Giải Thích Ví Dụ
echo In ra nội dung những gì đứng sau nó, có thể là chuỗi hoặc là biến giá trị echo "hello world"
ls liệt kê các thư mục
pwd hiển thị đường dẫn đến thư mục đang hoạt động
cd thay đổi thư mục
lùi ra một cấp so với thư mục hiện tại cd ..
vào thư mục vidu cd vidu
clear xóa màn hình
history hiển thị các lệnh đã dùng trước đó
hiển thị 10 trước đó history 10
uname hiển thị phiên bản hệ điều hành uname -a
alias cơ bản là một shortcut/bí danh, có thể thay thế cho 1 lệnh hoặc tập lệnh alias vck="sudo apt-get update"
sau khi tạo alias xong, để thực thi lệnh/tập lệnh đã khai báo chúng ta chỉ cần gọi tên của alias vừa định nghĩa vck
unalias xóa alias unalias vck
ifconfig có thể biết được địa chỉ ip hiện tại của thiết bị
whoami hiển thị user hiện tại
adduser thêm user mới adduser vck311
passwd đổi password cho user passwd vck311
sudo thực thi câu lệnh với quyền cao nhất, đó là quyền root (khi thực hiện hệ thống yêu cầu nhập password) sudo adduser vck311
shutdown tắt máy tính sudo shutdown -h now
reboot khởi động lại máy tính

5. Các biến môi trường

Lệnh Giải Thích Ví Dụ
printenv hiển thị toàn bộ hoặc một phần các biến môi trường
env chạy chương trình trong 1 môi trường với các biến tùy chỉnh
set hiển thị tên/giá trị của Shell. Thay đổi các thuộc tính của Shell

Xong!

Học Python Qua Ví Dụ #023 - Jinja2 Template / Jinja2 Template For Loop

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


  • Ví dụ 1:

import jinja2

vlan_dict = {				# định nghĩa dictionary có
    "vlan_id": 100,			# giá trị 100 (vlan 100)
    "vlan_name": "Thietbi",	# tên của vlan là "Thietbi"
}

# định nghĩa chuỗi
vlan_template = """			
vlan {{ vlan_id }}
   name {{ vlan_name }}
"""
'''
thực hiện nối các giá trị của dictionary vào chuỗi, 
nối giá trị vào các key nằm giữa 2 cặp dấu {{}}
'''
template = jinja2.Template(vlan_template)
print(template.render(vlan_dict))	


Kết quả:

vlan 100

   name Thietbi

[Finished in 0.2s]



  • Ví dụ 2 (for loop):

import jinja2

my_vlans = {			# định nghĩa dictionary có nhiều cặp giá trị
    "501": "blue501",
    "502": "blue502",
    "503": "blue503",
    "504": "blue504",
    "505": "blue505",
    "506": "blue506",
    "507": "blue507",
    "508": "blue508",
}
template_vars = {"vlans": my_vlans} # định nghĩa thêm một dictionary nữa, giá trị của dictionnary này là một dictionnary

# tạo vòng lặp lấy từng cặp key và giá trị gán vào vlan_id và vlan_name
# dấu - phía sau % là dùng bỏ dòng trắng khi xuất ra template
vlan_template = """
{%- for vlan_id, vlan_name in vlans.items() %}	
vlan {{ vlan_id }}
   name {{ vlan_name }}
{%- endfor %}
"""

# thực hiện nối
template = jinja2.Template(vlan_template)
print(template.render(template_vars))

Kết quả:
vlan 501
   name blue501
vlan 502
   name blue502
vlan 503
   name blue503
vlan 504
   name blue504
vlan 505
   name blue505
vlan 506
   name blue506
vlan 507
   name blue507
vlan 508
   name blue508
[Finished in 0.2s]


Xong!

Network Automation #003 - Netmiko Backup VLAN Configuration on Cisco IOS Switch

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


Sơ đồ lab:


Yêu cầu:

Dùng thư viện netmiko để SSH vào và thực hiện backup cấu vlan trên switch


Chuẩn bị:

        Sw:

enable
conf t
hostname Sw1
ip domain name netmiko.lab

username admin privilege 15 password admin1234@sw1

line vty 0 4
login local
transport input ssh
crypto key generate rsa general-keys modulus 1024
ip ssh version 2

interface vlan 1
no shutdown
ip address 192.168.0.8 255.255.255.0
exit

vlan 10-20
do wri


Thực hiện:

from netmiko import ConnectHandler 
from datetime import datetime

bk_device = { 
	"host":"192.168.0.8",
	"username":"admin",
	"password":"admin1234@sw1",
	"device_type":"cisco_ios" 
	}

tftpserver = "192.168.0.48" 

def cisco_ios_sw(txt): # định nghĩa hàm backup VLAN cho switch cisco ios
	
	cmd = "copy vlan.dat tftp:"
	filename = txt + "vlan.dat"
	
	net_connect = ConnectHandler(**bk_device)

	output = net_connect.send_command_timing(cmd)
	if "Address or name of remote host []" in  output:
		output += net_connect.send_command_timing(tftpserver)
	if "Destination filename" in output:
		output += net_connect.send_command_timing(filename)

	print(output)
	print("-" * 80)	


print(f"Dang ket noi vao IP:'{bk_device['host']}' voi Username: '{bk_device['username']}'")	

now = datetime.now().strftime("%Y-%b-%d_%H%M%S")
filename = now + "_" + bk_device["device_type"] + "_" + bk_device["host"] 

cisco_ios_sw(filename)


  • Kết quả:

C:\python>python Demo.py

Dang ket noi vao IP:'192.168.0.8' voi Username: 'admin'

Address or name of remote host []? Destination filename [vlan.dat]? !!

2076 bytes copied in 0.025 secs (83040 bytes/sec)

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

C:\python>


Xong!

Học Python Qua Ví Dụ #022 - Module Trong PyThon

Cũng giống như Function, Module cho phép tái sử dụng code lại nhiều lần. Với Function thì các hàm phải được định nghĩa trước đó và sau đó gọi hàm ra mà dùng. Với Module nó bao gồm các lớp (class), các hàm (function), các biến,...mà chúng ta đã gom/phân thành từng module. Khi sử dụng nó chúng ta chỉ cần IMPORT nó vào mà sử dụng KHÔNG CẦN phải viết lại.

Ví dụ chúng ta có file vck_func.py với nội dung:

import re
def MAC_Win2Cisco(mac_addr): 
	'''
	chuyển định dạng MAC address của Windows sang định dạng Cisco
	Dữ liệu đầu VÀO có dạng "11:22:33:44:55:66" HOẶC "11-22-33-44-55-66"
	KẾT QUẢ:"1122.3344.5566"
		
	'''
	mac_addr = re.sub("[-:]","",mac_addr)
	new_mac = []
	while len(mac_addr) > 0:
		entry = mac_addr [:4]
		mac_addr = mac_addr [4:]
		new_mac.append(entry) 

	new_mac = ".".join(new_mac)
	return new_mac


def MAC_Cisco2Win(mac_addr): 
	'''
	Chuyển định dạng MAC address của cisco sang windows
	Dữ liệu vào:"1122.3344.5566"
	KẾT QUẢ: "11:22:33:44:55:66"
	'''
	mac_addr = re.sub("[.]","",mac_addr)
	new_mac = []
	while len(mac_addr) > 0:
		entry = mac_addr [:2]
		mac_addr = mac_addr [2:]
		new_mac.append(entry) 

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

def ipv4_chk(ip_addr):
	'''
	Kiểm tra ip nhập vào có hợp lệ không
	IP hợp lệ phải có 4 otects
	Mỗi otect phải là số trong khoảng [0-255]
	'''	
	octets = ip_addr.split(".")
	if len(octets) != 4:
		return False
	
	for x in octets:
		if not x.isdigit() or int(x) < 0 or int(x) > 255:
			return False
		return True	


Để sử dụng các hàm trên chúng ta thực hiện:

  • Import vck_func 
  • Dùng hàm dir để xem trong file vck_func có những hàm nào

import vck_func
		
print(dir(vck_func))


kết quả:

C:\python>python Demo.py

['MAC_Cisco2Win', 'MAC_Win2Cisco', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'ipv4_chk', 're']

C:\python>


phần highlight màu vàng là các hàm chúng ta đã định nghĩa trong file vck_func.py

  • Ví dụ sử dụng hàm MAC_Win2Cisco

Cách 1: gọi gián tiếp, cú pháp import <tên file thư viện cần import>

Code:

import vck_func

Mac_Cisco = vck_func.MAC_Win2Cisco("aa:cc:bb:dd:ee:ff")
	
print(Mac_Cisco)


Kết quả:

C:\python>python Demo.py

aacc.bbdd.eeff

C:\python>


Cách 2: Gọi trực tiếp, cú pháp from  <tên file thư viện cần import> import <tên hàm, hoặc class>

from vck_func import MAC_Win2Cisco

Mac_Cisco = MAC_Win2Cisco("aa:cc:bb:dd:ee:ff")
	
print(Mac_Cisco)


Tùy từng trường hợp mà chúng ta có thể dùng cách 1 hoặc cách 2

Xong!

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!
/*header slide*/