/*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ụ #007 - Python List/List, Loop For Enumerate, Append, Extend, Insert-Vòng Lặp, Cách Thêm/Nối Phần Tử Trong Python

Yêu cầu:
1. Thực hiện in List trong python
2. In list với Loop và enumerate
3. List, String format, F-string
4. Các cách thêm/nối list và Append, Extend, Insert

Thực hiện:

1. Thực hiện in List trong python

  • Ví dụ 1:
Code:
ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
print()
print("Chieu dai cua list: ", len(ip_list)) # in ra chiều dài của list
print (ip_list[0]) # index 0: kết quả sẽ là "192.168.1.10"
print (ip_list[1]) # index 1 kết quả sẽ là "192.168.1.11"
print (ip_list[2]) # index 2 kết quả sẽ là "192.168.1.12"

Noted: Trong list Index và value tạo nên Item, ở ví dụ trên ta có 3 item với các giá trị dương đương như bảng
Bảng cấu trúc của list

    • Hoặc in tất cả các items của list kết hợp với Loop - For
Code:
ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
print()
print("Chieu dai cua list: ", len(ip_list)) # in ra chiều dài của list
for items in ip_list: # đọc cho đến hết list
	print (items) 


Kết quả:
C:\python>python Demo.py
Chieu dai cua list:  3
192.168.1.10
192.168.1.11
192.168.1.12

C:\python>

 

  • Ví dụ 2:
ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12", "10.12.1.1"]
kq = [i for i in ip_list if "10." in i] # lấy ra vị trị thứ i của list, nếu "10." có trong vị trí đó
print(kq)
Kết quả:
C:\python>python Demo.py
['10.12.1.1']

  • Ví dụ 3:
string = "Hello 12345 World"
numbers = [x for x in string if x.isdigit()] # trả về một list kết quả nếu ký tự trong chuỗi là số thì
print (numbers)

C:\python>python Demo.py
['1', '2', '3', '4', '5']

  • Ví dụ 4:
'''
vòng for y sẽ chạy trước
có nghĩa chương trình sẽ chạy là:
10 + 20
10 + 40
10 + 60
30 + 20
30 + 40
...
...
'''
a=[x+y for x in [10,30,50] for y in [20,40,60]] 
print (a)

C:\python>python Demo.py
[30, 50, 70, 50, 70, 90, 70, 90, 110]

2. In list với Loop và enumerate
    Code:
    ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
    print()
    
    for items in enumerate(ip_list): # đọc cho đến hết list
    	print (items)  # kết quả trả về bao gồm index và giá trị theo từng cặp.
    

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

    (0, '192.168.1.10')
    (1, '192.168.1.11')
    (2, '192.168.1.12')

    C:\python>

    • Ví dụ khác:
    Code:
    ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
    print()
    
    var_index=[]
    var_value=[]
    for x, y in enumerate(ip_list):
    	var_index.append(x) # nối list index
    	var_value.append(y) # nối list value
    '''
    in ra thành list
    list thứ nhất là index
    list thứ hai là value
    '''
    print(var_index)
    print(var_value)
    

    Kết quả:
    C:\python>python Demo.py
    [0, 1, 2]
    ['192.168.1.10', '192.168.1.11', '192.168.1.12']

    C:\python>

    3. List, String format, F-string
      Ví dụ:

      Code:
      hostname = ["R_HaNoi", "R_DaNang", "R_HoChiMinh"]
      ip_addr = ["10.0.0.1", "172.16.1.2","192.168.1.3"]
      item =["Devices", "Management IP", "-"]
      
      #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ả:


      4. Các cách thêm/nối list và Append, Extend, Insert
      • List-Extend: Thêm list mới vào list list đã có (thừa kế dữ liệu của list cũ)
      Code:
      ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
      print()
      print(ip_list)
      ip_list.extend(["8.8.8.8", "4.4.4.4"]) # thêm giá trị vào cuối list
      print(ip_list)
      

      Kết quả:
      C:\python>python Demo.py
      ['192.168.1.10', '192.168.1.11', '192.168.1.12']
      ['192.168.1.10', '192.168.1.11', '192.168.1.12', '8.8.8.8', '4.4.4.4']

      C:\python>

      • List-Append: Thêm phân tử vào cuối của list 
      Code:
      ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
      print()
      print(ip_list)
      ip_list.append("10.10.10.10") # thêm giá trị vào cuối list
      print(ip_list)
      

      Kết quả:
      C:\python>python Demo.py
      ['192.168.1.10', '192.168.1.11', '192.168.1.12']
      ['192.168.1.10', '192.168.1.11', '192.168.1.12', '10.10.10.10']

      C:\python>

      • List-Insert: Thêm phần tử vào một vị trí (index) của list, các phần từ vị trí được thêm vào sẽ được đẩy lùi về sau
      Code:
      ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
      print()
      print(ip_list)
      ip_list.insert(1,"20.20.20.20") # thêm vào vị trí thứ 2 của list với giá trị là: "20.20.20.20"
      print(ip_list)
      

      Kết quả:
      C:\python>python Demo.py
      ['192.168.1.10', '192.168.1.11', '192.168.1.12']
      ['192.168.1.10', '20.20.20.20', '192.168.1.11', '192.168.1.12']

      C:\python>

      • Cộng list
      Code:
      ip_list = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
      ip_netpub = ["8.8.8.8","8.8.4.4","203.113.131.1","1.1.1.1"]
      cong_list = ip_list + ip_netpub # thực hiện cộng 2 list
      print()
      print(cong_list)
      

      Kết quả:
      C:\python>python Demo.py
      ['192.168.1.10', '192.168.1.11', '192.168.1.12', '8.8.8.8', '8.8.4.4', '203.113.131.1', '1.1.1.1']

      C:\python>


      Xong!

      Zabbix, Cấu Hình Zabbix Cơ Bản / ICMP Template - Monitoring Map 1/5

      Yêu cầu
      1. Định nghĩa Icon
      2. Tạo Group Host
      3. Tạo ICMP monitor host
      4. Kỹ thuật Import host từ file .XML
      5. Map Network on Zabbix
      6. Tạo User mới cho Zabbix

      Xem cách cài đặt Zabbix trước khi xem bài này.

      Thực hiện
      1. Định nghĩa Icon

      Chèn biểu tượng cần thể hiện cho host. Thực ra Zabbix đã có sẳn thư viện Icon rồi, tuy nhiên chúng tôi muốn giới thiệu cho các bạn để khi vẽ sơ đồ mạng sẽ có nhiều lựa chọn hơn trong việc lựa chọn Icon cho mình.

      Chúng tôi chỉ thực hiện thêm 6 biểu tượng nhằm mục đích tham khảo.

      2. Tạo Group Host

      Tạo group có tên là: vck_ICMP Group

      3. Tạo ICMP monitor host

      Thêm host có IP 8.8.8.8 cần giám sát IMCP và host 8.8.8.8 thuộc group vừa tạo trên là vck_ICMP Group, ta thực hiện như hình

      Kết quả sau khi thêm host mới

      Tương tự vậy chúng ta có thể add nhiều host cần giám sát theo yêu cầu vào zabbix.
      Hoặc chọn Full Clone để nhân bản một host, ví dụ 8.8.4.4


      Tuy nhiên chúng ta cũng có thể thêm một hoặc host vào zabbix bằng cách import.

      Trước tiên chúng ta export 1 host ra file .XML và mở nó lên.

      Nhân xét: Chúng ta thấy rằng host 8.8.8.8 vừa định vừa tạo được định nghĩa từ dòng 11 đến dòng 32, nếu muốn thêm một hay nhiều host vào file này chúng ta chỉ việc copy nội dung trong từ dòng 11 đến dòng 32 chỉnh sửa thông tin các dòng 12, 13, 14, 17, 22 và 27 cho hợp lý rồi dán vào tab <hosts> </hosts> rồi import vào là được.

      4. Kỹ thuật Import host từ file .XML
      Tham khảo cách chỉnh sửa file .XML bằng kỹ thuật Merge Mail  sau khi chỉnh sửa xong chọn Configuration -> Hosts -> Choose File  để trỏ đến file XML vừa chỉnh sửa -> Import

      Import thành công

      Kết quả sau khi import từ file XML.

      5. Map Network on Zabbix

      Vào Monitoring -> Maps -> Create Map -> Điền tên, chiều cao, chiều rộng của Map, và chọn user được phép xem Map này (trong trường hợp này chúng tôi chọn user Admin) -> Add.

      Chọn vào tên Map of ICMP (tên vừa tạo ở bước trên) -> edit map -> add Map element, và điền thông tin như hình
      Giải thích:
      • {HOST.NAME}, {HOST.CONN}: biến tự động lấy thông tin của host ở trong phần định host ở các mục trên
      • host ICMP Net 8.8.8.8: host cần vẽ và sẽ được thể hiện trong Map
      • Icons Default: là hình chúng ta muốn thể hiện trên Map đang ở trạng thái monitor thành công
      • Icons Problem: là hình thể hiện trạng thái monitor KHÔNG thành công (phần định nghĩa Icon ở mục trên)

      Tương tự add thêm Map element cho Route ISP với các Icon chúng ta đã định nghĩa mở các mục trên

      Nhấn chọn 2 Icon -> Add Link để tạo đường kết nối 2 icon này (chúng ta có thể chọn màu và kiểu đường nối trong phần edit)

      Tương tự chúng ta có thể thêm nhiều thiết bị cần monitor được thể hiện trên Map và chọn các đường link cho đúng với sơ đồ của mình

      Bây giờ chúng ta đã có 1 map đơn giản với các icon như hình dưới. (chú ý nếu trạng thái monitor thành công thì có thêm chữ OK, ngược lại sẽ có hình như Icons Problem đã chọn và đã giải thích ở trên.)

      6. Tạo User mới cho Zabbix

      Administration -> Users -> Create User -> điền thông tin, chọn phân quyền cho user theo yêu cầu của các bạn -> Add
      Đăng nhập để kiểm tra nhé.

      Hy vọng đến đây sẽ giúp các bạn phần nào có cơ sở để tìm hiểu zabbix rộng hơn. Hẹn các bạn trong các bài sau.

      Xong!


      Zabbix, Cấu Hình Zabbix Cơ Bản / ICMP Template - Monitoring Map 1/5

      Yêu cầu
      1. Định nghĩa Icon
      2. Tạo Group Host
      3. Tạo ICMP monitor host
      4. Kỹ thuật Import host từ file .XML
      5. Map Network on Zabbix
      6. Tạo User mới cho Zabbix

      Xem cách cài đặt Zabbix trước khi xem bài này.

      Thực hiện
      1. Định nghĩa Icon

      Chèn biểu tượng cần thể hiện cho host. Thực ra Zabbix đã có sẳn thư viện Icon rồi, tuy nhiên chúng tôi muốn giới thiệu cho các bạn để khi vẽ sơ đồ mạng sẽ có nhiều lựa chọn hơn trong việc lựa chọn Icon cho mình.

      Chúng tôi chỉ thực hiện thêm 6 biểu tượng nhằm mục đích tham khảo.

      2. Tạo Group Host

      Tạo group có tên là: vck_ICMP Group

      3. Tạo ICMP monitor host

      Thêm host có IP 8.8.8.8 cần giám sát IMCP và host 8.8.8.8 thuộc group vừa tạo trên là vck_ICMP Group, ta thực hiện như hình

      Kết quả sau khi thêm host mới

      Tương tự vậy chúng ta có thể add nhiều host cần giám sát theo yêu cầu vào zabbix.
      Hoặc chọn Full Clone để nhân bản một host, ví dụ 8.8.4.4


      Tuy nhiên chúng ta cũng có thể thêm một hoặc host vào zabbix bằng cách import.

      Trước tiên chúng ta export 1 host ra file .XML và mở nó lên.

      Nhân xét: Chúng ta thấy rằng host 8.8.8.8 vừa định vừa tạo được định nghĩa từ dòng 11 đến dòng 32, nếu muốn thêm một hay nhiều host vào file này chúng ta chỉ việc copy nội dung trong từ dòng 11 đến dòng 32 chỉnh sửa thông tin các dòng 12, 13, 14, 17, 22 và 27 cho hợp lý rồi dán vào tab <hosts> </hosts> rồi import vào là được.

      4. Kỹ thuật Import host từ file .XML
      Tham khảo cách chỉnh sửa file .XML bằng kỹ thuật Merge Mail  sau khi chỉnh sửa xong chọn Configuration -> Hosts -> Choose File  để trỏ đến file XML vừa chỉnh sửa -> Import

      Import thành công

      Kết quả sau khi import từ file XML.

      5. Map Network on Zabbix

      Vào Monitoring -> Maps -> Create Map -> Điền tên, chiều cao, chiều rộng của Map, và chọn user được phép xem Map này (trong trường hợp này chúng tôi chọn user Admin) -> Add.

      Chọn vào tên Map of ICMP (tên vừa tạo ở bước trên) -> edit map -> add Map element, và điền thông tin như hình
      Giải thích:
      • {HOST.NAME}, {HOST.CONN}: biến tự động lấy thông tin của host ở trong phần định host ở các mục trên
      • host ICMP Net 8.8.8.8: host cần vẽ và sẽ được thể hiện trong Map
      • Icons Default: là hình chúng ta muốn thể hiện trên Map đang ở trạng thái monitor thành công
      • Icons Problem: là hình thể hiện trạng thái monitor KHÔNG thành công (phần định nghĩa Icon ở mục trên)

      Tương tự add thêm Map element cho Route ISP với các Icon chúng ta đã định nghĩa mở các mục trên

      Nhấn chọn 2 Icon -> Add Link để tạo đường kết nối 2 icon này (chúng ta có thể chọn màu và kiểu đường nối trong phần edit)

      Tương tự chúng ta có thể thêm nhiều thiết bị cần monitor được thể hiện trên Map và chọn các đường link cho đúng với sơ đồ của mình

      Bây giờ chúng ta đã có 1 map đơn giản với các icon như hình dưới. (chú ý nếu trạng thái monitor thành công thì có thêm chữ OK, ngược lại sẽ có hình như Icons Problem đã chọn và đã giải thích ở trên.)

      6. Tạo User mới cho Zabbix

      Administration -> Users -> Create User -> điền thông tin, chọn phân quyền cho user theo yêu cầu của các bạn -> Add
      Đăng nhập để kiểm tra nhé.

      Hy vọng đến đây sẽ giúp các bạn phần nào có cơ sở để tìm hiểu zabbix rộng hơn. Hẹn các bạn trong các bài sau.

      Xong!

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

       1. CDP - Cisco Discovery Protocol: là giao thức độc quyền của Cisco cho phép thu thập thông tin các thiết bị kết nối trực tiếp (thiết bị láng giềng) với nó. CDP được enable mặc định trên các thiết bị của cisco và hoạt động ở lớp data-links, cứ 60s/lần thiết bị sẽ gửi (trạng thái cổng up/up) thông tin của mình cho thiết bị láng giềng, thời gian holdtime là 180s.

      CDP giúp cho chúng ta biết được các thông tin của thiết bị láng giềng:

      • Device ID: Hostname của thiết bị láng giềng
      • Local Interface: Cổng nào đang được sử dụng để kết nối đến láng giềng
      • Outgoing Port: Láng giềng đang dùng cổng nào để kết nối với mình
      • Capability: Láng giềng có khả năng gì (Router, Switch, IGMP - giao thức sử dụng trong kỹ thuật Multicast)
      • Platform: Chuẩn loại thiết bị của láng giềng. Ví dụ: Router 2811, switch 2960
      • IP Address: IP của láng giềng
      • IOS: Hệ điều hành đang sử dụng

      Các câu lệnh hay dùng:

        • show cdp neighbors: Xem thông tin về láng giềng
        • show cdp neighbors detail: Xem thông tin chi tiết về láng giềng
        • show cdp entry *
        • [no] cdp run: Bật/tắt CDP trên thiết bị
        • [no] cdp enable: Bật/tắt CDP trên interface (vào interface)
        • show cdp interface <interface>: biết trạng thái cổng, thời gian gửi gói tin, holdtime.


      2.  LLDP - Link Layer Discovery Protocol: Hoạt động ở layer 2 - data links đây là giao thức chuẩn

      Thiết bị cisco hỗ trợ chuẩn IEEE 802.1ab sử dụng cho LLDP nó cho phép quảng quá thông tin giữa các thiết non-cisco.

      Nếu thiết bị có hỗ trợ LLDP sẽ gửi và nhận thông tin của các thiết bị láng giềng kết nối trực tiếp. Các thuộc tính của LLDP là: Type, Lenght, Value (TLVs).

      • Port descripion TLV
      • System name TLV
      • System description TLV
      • System capabilities TLV
      • Management Address TLV

      Một số thiết bị đầu cuối như IP Phones có thể sử dụng LLDP để gán VLAN hoặc yêu cầu PoE (Power over Ethernet). LLDP-MED (Media Endpoint Discovery) là cải tiến của LLDP

      Tùy theo từng thiết bị, IOS version mà LLDP được enable hay disable mặt định

      Nhờ các thông tin của CDP và LLDP giúp chúng ta có thể vẽ lại/dựng lại sơ đồ mạng - Network Map qua các dòng lệnh show.

      Câu lệnh tương tự CDP, chỉ thay cdp thành lldp


      Xem lab về CDP và LLDP ở đây


      Xong!


      Học Python Qua Ví Dụ #006 - Python File Handle/Xử Lý File Trong Python

      Yêu cầu:
      1. Mở, đọc file và in nội dung file ra màn hình - Read
      2. Mở và tự động đóng file sau khi đọc
      3. Tạo và ghi file - Write
      4. Ghi thêm dữ liệu vào file - Append

      Thực hiện:
      1. Mở, đọc file và in nội dung file ra màn hình - Read
      • Soạn ile DATA.txt có nội dung như dưới:
      • Thực hiện mở và đọc tất cả các dòng trong file, in ra màn hình:
      Code:
      f = open("DATA.txt","r") # r - read đọc, nếu file CÓ TỒN TẠI thì sẽ mở ra và đọc, nếu KHÔNG có sẽ lỗi 
      print(f.read()) # đọc hết file
      f.close() # đóng để giải phóng bộ nhớ
      

      Noted:Với code trên nếu không tìm thấy file sẽ chương trình sẽ bị lỗi và không thực hiện các lệnh bên dưới.

      Kết quả:
      C:\python>python Demo.py
      Interface                          IP-Address         OK?     Method        Status                Protocol
      FastEthernet0/0              192.168.122.11  YES     NVRAM          up                    up
      Serial0/0                          unassigned        YES     NVRAM         administratively down down
      FastEthernet0/1              unassigned         YES     NVRAM        administratively down down
      Serial0/1                          unassigned        YES     NVRAM        administratively down down
      FastEthernet1/0              unassigned         YES     NVRAM        administratively down down
      FastEthernet2/0              unassigned         YES     NVRAM        administratively down down
      Loopback1                     10.10.10.1           YES     NVRAM          up                    up
      Loopback2                     10.10.10.2           YES     NVRAM          up                    up



      C:\python>

      • Hoặc đọc từng dòng từng dòng một trong file

      Code:
      f = open("DATA.txt","r") # r - read đọc, nếu file CÓ TỒN TẠI thì sẽ mở ra và đọc, nếu KHÔNG có sẽ lỗi 
      print(f.readline()) # đọc từng dòng
      print(f.readline())
      print(f.readline())
      print(f.readline())
      f.close() # đóng để giải phóng bộ nhớ
      

      Kết quả:
      C:\python>python Demo.py
      Interface                          IP-Address         OK?     Method        Status                Protocol
      FastEthernet0/0              192.168.122.11  YES     NVRAM          up                    up
      Serial0/0                          unassigned        YES     NVRAM         administratively down down

      Kết quả trên cho thấy là nếu muốn đọc 4 dòng thì chúng ta phải dùng 4 dòng print(f.readline()) (vì có dòng trên cùng là dòng trắng trên cùng nên chúng ta thấy chỉ 3 dòng) cứ mỗi lần đọc như vậy con trỏ đọc/ghi seek() sẽ trượt, nếu chúng chúng ta muốn truy xuất lấy lại dữ liệu từ đầu file có 2 cách:

      - Cách 1: đóng file và mở lại
      - Cách 2: đưa con trỏ seek() về đầu file bằng lệnh f.seek(0)

      • Hoặc đọc từng dòng và đọc cho đến khi hết file.
      Code:
      f = open("DATA.txt","r") # r - read đọc, nếu file CÓ TỒN TẠI thì sẽ mở ra và đọc, nếu KHÔNG có sẽ lỗi 
      for pl in f: # đọc cho đến hết file
      	#print(pl) # kết quả sẽ chèn thêm dòng trắng sau mỗi dòng kết quả
      	print(pl, end="") # xóa bỏ dòng trắng
      f.close() # đóng để giải phóng bộ nhớ
      

      Kết quả:

      2. Mở và tự động đóng file sau khi đọc.

      Code:
      '''
      Cách mở file tự động đóng
      nó sẽ tự động đóng khi kết thúc khối lệnh trong with
      '''
      with open("DATA.txt","r") as f:
      	output = f.read()
      print(output)
      

      Kết quả:
      C:\python>python Demo.py
      Interface                          IP-Address         OK?     Method        Status                Protocol
      FastEthernet0/0              192.168.122.11  YES     NVRAM          up                    up
      Serial0/0                          unassigned        YES     NVRAM         administratively down down
      FastEthernet0/1              unassigned         YES     NVRAM        administratively down down
      Serial0/1                          unassigned        YES     NVRAM        administratively down down
      FastEthernet1/0              unassigned         YES     NVRAM        administratively down down
      FastEthernet2/0              unassigned         YES     NVRAM        administratively down down
      Loopback1                     10.10.10.1           YES     NVRAM          up                    up
      Loopback2                     10.10.10.2           YES     NVRAM          up                    up



      C:\python>

      3. Tạo và ghi file - Write

      • Nếu file GhiDATA.txt chưa có thì tạo file mới với tên GhiDATA.txt
      • Nếu file đã có thì ghi đè nội dung lên file này

      Code:
      '''
      "w" - Write
      - Nếu file chưa có thì tạo file mới, 
      - Nếu file đã tồn tại rồi thì xóa và ghi đè lên nội dung cũ
      '''
      f = open("GhiDATA.txt","w") 
      f.write("Ghi lan thu 1\n")
      f.write("Ghi lan thu 2\n")
      f.write("...\n")
      f.write("...\n")
      f.write("Ghi lan thu n")
      
      f.flush() # thực hiện ghi nội dung vào file
      f.close() # nếu không có dòng "f.flush()", khi đóng file thì python thực hiện flush trước khi đóng.
      '''
      Đọc file mới ghi
      '''
      f = open("GhiDATA.txt","r")
      print(f.read())
      f.close()
      
      Kết quả:
      C:\python>python Demo.py
      Ghi lan thu 1
      Ghi lan thu 2
      ...
      ...
      Ghi lan thu n

      C:\python>


      4. Ghi thêm dữ liệu vào file - Append
      • Nếu file GhiDATA.txt chưa có thì tạo file mới với tên GhiDATA.txt
      • Nếu file đã có thì chèn/thêm nội dung cần ghi vào cuối file

      Code:
      '''
      "a" - Append
      - Nếu file chưa có thì tạo file mới, 
      - Nếu file đã tồn tại mở và GHI THÊM vào cuối nội dung của file
      '''
      f = open("GhiDATA.txt","a") 
      f.write("\n")
      f.write("GHI THEM VAO FILE\n")
      f.write("Tiep tuc GHI THEM \n")
      
      f.flush() # thực hiện ghi nội dung vào file
      f.close() # nếu không có dòng "f.flush()", khi đóng file thì python thực hiện flush trước khi đóng.
      '''
      Đọc file mới ghi
      '''
      f = open("GhiDATA.txt","r")
      print(f.read())
      f.close()
      

      Kết quả:
      C:\python>python Demo.py
      Ghi lan thu 1
      Ghi lan thu 2
      ...
      ...
      Ghi lan thu n
      GHI THEM VAO FILE
      Tiep tuc GHI THEM


      C:\python>

      Xong!

      CentOS, Cài Đặt Ngày Giờ Trên CentOS

      Yêu cầu:
      1. Cài đặt thủ công
      2. Cài đặt thông qua NTP - Network Time Protocol

      Thực hiện:

      1. Cài đặt thủ công
      • Kiểm tra trước khi cài đặt
      [root@CentOS ~]# timedatectl status
            Local time: Wed 2020-06-17 08:15:01 IST
        Universal time: Wed 2020-06-17 01:15:01 UTC
              RTC time: Wed 2020-06-17 01:15:01
             Time zone: Asia/Kolkata (IST, +0530)
           NTP enabled: no
      NTP synchronized: no
       RTC in local TZ: no
            DST active: n/a
      [root@CentOS ~]# 

      Noted: Trước khi chỉnh ngày giờ chúng ta nên chỉnh Time zone trước sau đó đến Local time sau

      Để biết danh sách các Time zone chúng tôi dùng lệnh timedatectl list-timezones, hoặc chi tiết hơn timedatectl list-timezones | grep Ho_Chi_Minh

      [root@CentOS ~]# timedatectl list-timezones | grep Ho_Chi_Minh
      Asia/Ho_Chi_Minh

      •  Cài đặt Time zone là Asia/Ho_Chi_Minh
      [root@CentOS ~]# timedatectl set-timezone Asia/Ho_Chi_Minh
      [root@CentOS ~]# 

      • Cài đặt ngày giờ:
      Sử dụng câu lệnh có dạng timedatectl set-time 'YYYY-MM-DD HH:MM:SS'
      [root@CentOS ~]# timedatectl set-time '2020-06-17 09:19:50'
      [root@CentOS ~]# 

      • Kiểm tra sau khi cài đặt
      [root@CentOS ~]# timedatectl status 
            Local time: Sat 2020-06-17 09:21:06 +07
        Universal time: Sat 2020-06-17 02:21:06 UTC
              RTC time: Sat 2020-06-17 02:21:07
             Time zone: Asia/Ho_Chi_Minh (+07, +0700)
           NTP enabled: no
      NTP synchronized: no
       RTC in local TZ: no
            DST active: n/a
      [root@CentOS ~]#

      2. Cài đặt thông qua NTP - Network Time Protocol
      • Kiểm tra trước khi cài đặt
      [root@CentOS ~]# timedatectl status
            Local time: Wed 2020-06-17 09:48:56 +07
        Universal time: Wed 2020-06-17 02:48:56 UTC
              RTC time: Wed 2020-06-17 02:48:56
             Time zone: Asia/Ho_Chi_Minh (+07, +0700)
           NTP enabled: no
      NTP synchronized: no

       RTC in local TZ: no
            DST active: n/a
      [root@CentOS ~]# 

      • Cài đặt NTP server
      [root@CentOS ~]# sudo yum -y install ntp
      Loaded plugins: fastestmirror, langpacks
      Loading mirror speeds from cached hostfile
      epel/x86_64/metalink                                                                                       | 8.3 kB  00:00:00   
       * base: mirrors.viethosting.com
       * centos-sclo-rh: mirrors.viethosting.com
       * centos-sclo-sclo: mirrors.viethosting.com
       * epel: mirrors.thzhost.com
       * extras: mirrors.viethosting.com
       * remi-php72: mirrors.thzhost.com
       * remi-safe: mirrors.thzhost.com
       * updates: mirrors.viethosting.com
      base                                                                                                       | 3.6 kB  00:00:00   
      centos-sclo-rh                                                                                             | 3.0 kB  00:00:00   
      centos-sclo-sclo                                                                                           | 3.0 kB  00:00:00   
      epel                                                                                                       | 5.3 kB  00:00:00   
      extras                                                                                                     | 2.9 kB  00:00:00   
      remi-php72                                                                                                 | 3.0 kB  00:00:00   
      remi-safe                                                                                                  | 3.0 kB  00:00:00   
      updates                                                                                                    | 2.9 kB  00:00:00   
      zabbix                                                                                                     | 2.9 kB  00:00:00   
      zabbix-frontend                                                                                            | 2.9 kB  00:00:00   
      zabbix-non-supported                                                                                       |  951 B  00:00:00   
      (1/3): updates/7/x86_64/primary_db                                                                         | 2.1 MB  00:00:00   
      (2/3): epel/x86_64/updateinfo                                                                              | 1.0 MB  00:00:01   
      (3/3): epel/x86_64/primary_db                                                                              | 6.8 MB  00:00:15   
      Resolving Dependencies
      --> Running transaction check
      ---> Package ntp.x86_64 0:4.2.6p5-28.el7.centos will be updated
      ---> Package ntp.x86_64 0:4.2.6p5-29.el7.centos will be an update
      --> Processing Dependency: ntpdate = 4.2.6p5-29.el7.centos for package: ntp-4.2.6p5-29.el7.centos.x86_64
      --> Running transaction check
      ---> Package ntpdate.x86_64 0:4.2.6p5-28.el7.centos will be updated
      ---> Package ntpdate.x86_64 0:4.2.6p5-29.el7.centos will be an update
      --> Finished Dependency Resolution
      Dependencies Resolved
      ==================================================================================================================================
       Package                     Arch                       Version                                    Repository                Size
      ==================================================================================================================================
      Updating:
       ntp                         x86_64                     4.2.6p5-29.el7.centos                      base                     548 k
      Updating for dependencies:
       ntpdate                     x86_64                     4.2.6p5-29.el7.centos                      base                      86 k
      Transaction Summary
      ==================================================================================================================================
      Upgrade  1 Package (+1 Dependent package)
      Total size: 635 k
      Downloading packages:
      Running transaction check
      Running transaction test
      Transaction test succeeded
      Running transaction
        Updating   : ntpdate-4.2.6p5-29.el7.centos.x86_64                                                                           1/4
        Updating   : ntp-4.2.6p5-29.el7.centos.x86_64                                                                               2/4
        Cleanup    : ntp-4.2.6p5-28.el7.centos.x86_64                                                                               3/4
        Cleanup    : ntpdate-4.2.6p5-28.el7.centos.x86_64                                                                           4/4
        Verifying  : ntp-4.2.6p5-29.el7.centos.x86_64                                                                               1/4
        Verifying  : ntpdate-4.2.6p5-29.el7.centos.x86_64                                                                           2/4
        Verifying  : ntpdate-4.2.6p5-28.el7.centos.x86_64                                                                           3/4
        Verifying  : ntp-4.2.6p5-28.el7.centos.x86_64                                                                               4/4
      Updated:
        ntp.x86_64 0:4.2.6p5-29.el7.centos                                                                                           
      Dependency Updated:
        ntpdate.x86_64 0:4.2.6p5-29.el7.centos                                                                                       
      Complete!
      [root@CentOS ~]# 

      • Sửa file /etc/ntp.conf với thông tin server NTP cần đồng bộ. Trong lab này chúng tôi chọn server là time.google.com
      [root@CentOS ~]# sudo vim /etc/ntp.conf
      {...}
      # Use public servers from the pool.ntp.org project.
      # Please consider joining the pool (http://www.pool.ntp.org/join.html).
      server  216.239.35.12
      server time.google.com

      #server 0.centos.pool.ntp.org iburst
      #server 1.centos.pool.ntp.org iburst
      #server 2.centos.pool.ntp.org iburst
      #server 3.centos.pool.ntp.org iburst
      {...}

      Noted: Nhấn i để sửa -> nhấn Esc :wq -> Enter để lưu lại thay đổi và thoát khỏi vim. Đảm bảo KHÔNG CÓ dấu thăng "#" phía trước.
      • Bật tính năng đồng bộ NTP và khởi động lại service
      sudo timedatectl set-ntp yes
      sudo systemctl start ntpd.service

      • Kiểm tra
      [root@CentOS ~]# timedatectl status 
            Local time: Wed 2020-06-17 11:09:11 +07
        Universal time: Wed 2020-06-17 04:09:11 UTC
              RTC time: Wed 2020-06-17 04:09:11
             Time zone: Asia/Ho_Chi_Minh (+07, +0700)
           NTP enabled: yes
      NTP synchronized: yes
       RTC in local TZ: no
            DST active: n/a
      [root@CentOS ~]#

      Xong!
      /*header slide*/