python的paramiko模块的使用

Paramiko 是一个用 Python 语言编写的 SSHv2 协议客户端,它提供了基于 SSH 协议进行远程服务器连接和文件传输的功能。下面是 Paramiko 的一些详细使用方法:

安装

使用 pip 工具进行安装:

1
pip install paramiko

基本用法

连接远程服务器

1
2
3
4
5
6
7
8
9
10
11
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许自动添加新主机到本地 ~/.ssh/known_hosts 文件中

ssh.connect(hostname='server_ip', port=22, username='username', password='password')

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

ssh.close()

使用密钥文件连接远程服务器

1
2
3
4
5
6
7
8
9
10
11
12
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许自动添加新主机到本地 ~/.ssh/known_hosts 文件中

key = paramiko.RSAKey.from_private_key_file('/path/to/key.pem')
ssh.connect(hostname='server_ip', port=22, username='username', pkey=key)

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

ssh.close()

上传文件到远程服务器

1
2
3
4
5
6
7
8
9
10
11
12
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许自动添加新主机到本地 ~/.ssh/known_hosts 文件中

ssh.connect(hostname='server_ip', port=22, username='username', password='password')

sftp = ssh.open_sftp()
sftp.put('/path/to/local/file.txt', '/path/to/remote/file.txt')

sftp.close()
ssh.close()

从远程服务器下载文件

1
2
3
4
5
6
7
8
9
10
11
12
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许自动添加新主机到本地 ~/.ssh/known_hosts 文件中

ssh.connect(hostname='server_ip', port=22, username='username', password='password')

sftp = ssh.open_sftp()
sftp.get('/path/to/remote/file.txt', '/path/to/local/file.txt')

sftp.close()
ssh.close()

进阶用法

通过 SSH 隧道连接数据库

```python
import paramiko
import pymysql

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许自动添加新主机到本地 ~/.ssh/known_hosts 文件中

ssh.connect(hostname=’ssh_server_ip’, port=22, username=’ssh_username’, password=’ssh_password’)

建立 SSH 隧道连接数据库

transport = ssh.get_transport()
local_port = 3306
remote_addr = (‘db_server_ip’, 3306)
destination_addr = (‘localhost’, local_port)
transport.request_port_forward(*destination_addr, remote_addr)

连接本地 MySQL 数据库

conn = pymysql.connect(host=’localhost’, port=local_port, user=’mysql_username’, password=’mysql_password’, database=’mysql_db’)

执行 SQL 查询

cur = conn.cursor()
cur.execute(‘SELECT * FROM mysql.user’)
result = cur.fetchall()
print(result)

cur.close()
conn