Sunday, January 19, 2025

[Python] Lesson 66 – Paramiko module

-

Paramiko là một thư viện Python cung cấp các giao diện cho SSH, Telnet, và SCP. Thư viện này cho phép thực hiện các tác vụ quản lý máy chủ từ xa thông qua giao thức SSH.

Với Paramiko, bạn có thể kết nối tới các máy chủ từ xa và thực hiện các tác vụ như tải xuống, tải lên và thực thi các tập lệnh từ xa.

Các tính năng chính của Paramiko bao gồm:

  • SSH client và server
  • SFTP client và server
  • SCP client
  • Tương thích với Python 2.x và 3.x

Để sử dụng thư viện Paramiko, bạn cần cài đặt nó thông qua pip:

pip install paramiko

Sau đó, để sử dụng thư viện, bạn cần import nó vào trong script Python của mình:

import paramiko

Dưới đây là một số tips cho việc sử dụng Paramiko:

Kết nối đến máy chủ SSH:

import paramiko

# Tạo một client SSH
ssh = paramiko.SSHClient()

# Kích hoạt chính sách xử lý khóa host bị thiếu
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# Kết nối đến máy chủ
ssh.connect(hostname='example.com', port=22, username='username', password='password')

Gửi lệnh SSH đến máy chủ:

# Tạo một kênh SSH
channel = ssh.invoke_shell()

# Gửi một lệnh đến máy chủ
channel.send('ls\n')

# Đọc kết quả trả về
result = channel.recv(1024).decode('utf-8')
print(result)

Đóng kết nối SSH:

# Đóng kết nối SSH
ssh.close()

Đăng nhập vào máy chủ bằng khóa SSH:

# Tạo một client SSH
ssh = paramiko.SSHClient()

# Kích hoạt chính sách xử lý khóa host bị thiếu
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# Load khóa SSH
key = paramiko.RSAKey.from_private_key_file('/path/to/key.pem')

# Kết nối đến máy chủ bằng khóa SSH
ssh.connect(hostname='example.com', port=22, username='username', pkey=key)

Sử dụng SFTP để tải lên và tải xuống tập tin:

# Tạo một client SFTP
sftp = ssh.open_sftp()

# Tải xuống tập tin từ máy chủ
sftp.get('/remote/path/to/file', '/local/path/to/file')

# Tải lên tập tin lên máy chủ
sftp.put('/local/path/to/file', '/remote/path/to/file')

# Đóng kết nối SFTP
sftp.close()

Xử lý lỗi và ngoại lệ:

try:
    ssh.connect(hostname='example.com', port=22, username='username', password='password')
except paramiko.AuthenticationException:
    print("Lỗi xác thực")
except paramiko.SSHException as sshException:
    print("Không thể kết nối tới máy chủ SSH: %s" % sshException)
except paramiko.Exception as e:
    print("Lỗi không xác định: %s" % e)

Sử dụng tunnel SSH để truy cập máy chủ không thể truy cập trực tiếp:

# Tạo một client SSH
ssh = paramiko.SSHClient()

# Kích hoạt chính sách xử lý khóa host bị thiếu
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# Kết nối đến máy chủ trung gian (tunnel)
ssh.connect(hostname='tunnel.example.com', port=22, username='username', password='password')

# Tạo một đường hầm SSH từ máy tính của bạn đến máy chủ trung gian
tunnel = ssh.get_transport().open_forwarded_tcpip('localhost', 12345, 'destination.example.com', 22)

# Tạo một client SSH mới để kết nối đến máy chủ đích qua đường hầm SSH
ssh_dest = paramiko.SSHClient()
ssh_dest.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_dest.connect(hostname='localhost', port=12345, username='username', password='password')

Các ví dụ trên chỉ là một số trong số các tính năng của Paramiko. Ngoài ra, Paramiko cũng hỗ trợ nhiều tính năng khác như đọc ghi file từ xa, tạo bản sao của máy chủ, sử dụng các thuật toán mật mã khác nhau và nhiều hơn nữa.

Ví dụ 1:

Một ví dụ thực tế về việc sử dụng paramiko module trong quản trị hệ thống Linux là khi bạn cần kết nối và điều khiển một remote server Linux từ một máy tính khác. Ví dụ này sẽ minh họa cách sử dụng paramiko để kết nối và thực hiện một vài thao tác cơ bản trên remote server, như tạo thư mục, tải xuống file và chạy một command trên remote server.

Đầu tiên, chúng ta cần cài đặt paramiko module và import nó vào script Python:

import paramiko

Sau đó, ta sẽ tạo một kết nối SSH với remote server thông qua địa chỉ IP của server, tên đăng nhập và mật khẩu:

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.1.100', username='admin', password='password')

Ở đây, ta tạo một đối tượng SSHClient và set_missing_host_key_policy để đảm bảo kết nối an toàn với server. Sau đó, ta sử dụng hàm connect để kết nối tới server với địa chỉ IP là 192.168.1.100, tên đăng nhập là admin và mật khẩu là password.

Đoạn mã ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) được sử dụng trong Python và paramiko library để thiết lập chính sách xử lý khóa host bị thiếu.

Trong quá trình kết nối SSH, máy tính của bạn sẽ kiểm tra khóa host để đảm bảo rằng bạn đang kết nối với máy chủ đúng và tránh bị tấn công giả mạo. Nếu khóa host thiếu hoặc không trùng khớp, máy tính của bạn sẽ yêu cầu bạn xác nhận khóa host mới trước khi kết nối được thiết lập.

Chính sách xử lý khóa host bị thiếu được thiết lập để quyết định hành động cần thực hiện khi một khóa host thiếu. Trong trường hợp này, paramiko.AutoAddPolicy() được sử dụng để tự động thêm khóa host mới vào danh sách khóa host và cho phép tiếp tục kết nối mà không yêu cầu xác nhận thủ công.

Tuy nhiên, việc sử dụng chính sách này có thể tiềm ẩn một số rủi ro an ninh, vì khóa host mới có thể được thêm vào danh sách khóa host mà không được xác minh một cách chính xác. Do đó, việc sử dụng chính sách này nên được cân nhắc cẩn thận và áp dụng trên các môi trường không đòi hỏi tính bảo mật cao hoặc đã biết chính xác danh sách khóa host được sử dụng.

Tiếp theo, ta sẽ tạo một thư mục mới trên remote server:

stdin, stdout, stderr = ssh.exec_command('mkdir /path/to/new/directory')

Ở đây, ta sử dụng exec_command để thực thi lệnh mkdir trên remote server, và sau đó lưu kết quả của lệnh đó vào các biến stdin, stdout và stderr.

Tiếp theo, ta sẽ tải xuống một file từ remote server:

ftp = ssh.open_sftp()
ftp.get('/path/to/remote/file', '/path/to/local/file')
ftp.close()

Ở đây, ta sử dụng open_sftp để tạo một kết nối sftp đến remote server và sau đó sử dụng hàm get để tải xuống file từ remote server đến local machine.

Cuối cùng, ta sẽ chạy một command trên remote server và lấy kết quả trả về:

stdin, stdout, stderr = ssh.exec_command('ls -l')
output = stdout.read().decode('utf-8')
print(output)

Ở đây, ta sử dụng exec_command để thực thi lệnh ls -l trên remote server và lưu kết quả trả về vào stdout. Sau đó, ta sử dụng hàm read để lấy kết quả từ stdout và decode nó sang dạng utf-8 để hiển thị.

Ví dụ 2:

Để đặt địa chỉ IP cho một thiết bị Cisco bằng Paramiko, bạn cần sử dụng các lệnh CLI của Cisco thông qua SSH. Để làm điều này, bạn có thể sử dụng thư viện Paramiko trong Python để thực hiện các kết nối SSH đến thiết bị Cisco và gửi các lệnh CLI.

Ví dụ, để đặt địa chỉ IP cho một interface trên một thiết bị Cisco bằng Paramiko, bạn có thể sử dụng mã sau:

import paramiko

# Thông tin đăng nhập SSH
hostname = '192.168.1.1'
username = 'admin'
password = 'password'

# Kết nối SSH đến thiết bị Cisco
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=hostname, username=username, password=password)

# Gửi lệnh CLI để đặt địa chỉ IP
interface_name = 'GigabitEthernet0/0'
ip_address = '192.168.2.1'
subnet_mask = '255.255.255.0'

command = f'configure terminal\ninterface {interface_name}\nip address {ip_address} {subnet_mask}\nno shutdown\nend\n'
stdin, stdout, stderr = ssh.exec_command(command)
output = stdout.read().decode()

# Đóng kết nối SSH
ssh.close()

Trong ví dụ này, chúng ta sử dụng Paramiko để kết nối SSH đến thiết bị Cisco với thông tin đăng nhập cần thiết. Sau đó, chúng ta gửi lệnh CLI để đặt địa chỉ IP cho interface được chỉ định. Kết quả trả về từ lệnh CLI được lưu trữ trong biến output. Cuối cùng, chúng ta đóng kết nối SSH.

Ví dụ 3:

Có thể sử dụng 1 session SSH để thực thi nhiều lệnh và cho ra nhiều kết quả. Sau khi thiết lập kết nối SSH, ta có thể sử dụng phương thức exec_command của đối tượng SSHClient để thực thi các lệnh và nhận kết quả trả về.

Dưới đây là một ví dụ minh họa:

import paramiko

# Thiết lập kết nối SSH
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.1.1', username='admin', password='password')

# Thực thi lệnh và nhận kết quả trả về
stdin, stdout, stderr = ssh.exec_command('show interfaces')
output = stdout.read().decode('utf-8')
print(output)

# Thực thi lệnh khác và nhận kết quả trả về
stdin, stdout, stderr = ssh.exec_command('show running-config')
output = stdout.read().decode('utf-8')
print(output)

# Đóng kết nối SSH
ssh.close()

Trong ví dụ này, ta đã thiết lập kết nối SSH với thiết bị có địa chỉ IP là 192.168.1.1, sử dụng tài khoản admin và mật khẩu password. Sau đó, ta đã thực thi hai lệnh là show interfacesshow running-config bằng cách sử dụng phương thức exec_command. Kết quả trả về của mỗi lệnh được lưu vào biến output và in ra màn hình. Cuối cùng, ta đã đóng kết nối SSH bằng phương thức close.

Ví dụ 3:

Để thực hiện check ping trên Fortigate và lấy kết quả trả về, ta có thể sử dụng thư viện paramiko của Python như sau:

import paramiko

# Thiết lập kết nối SSH tới Fortigate
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('fortigate_ip', username='admin', password='password')

# Thực thi lệnh ping và lấy kết quả trả về
ping_commands = ['execute ping-options repeat-count 4', 'execute ping 8.8.8.8', 'execute ping 8.8.4.4', 'execute ping 1.1.1.1']
for cmd in ping_commands:
    stdin, stdout, stderr = ssh.exec_command(cmd)
    output = stdout.read().decode()
    print(output)

# Đóng kết nối SSH
ssh.close()

Trong đoạn code trên, ta sử dụng phương thức exec_command() của đối tượng SSHClient để thực thi lệnh ping trên Fortigate. Kết quả trả về từ việc thực thi lệnh được lấy bằng cách đọc đối tượng stdout trả về bởi exec_command(). Sau đó, ta đóng kết nối SSH để giải phóng tài nguyên và trả về kết quả của từng lệnh ping.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories