简介
Paramiko 是一个基于 Python 的 SSH 客户端库,它提供了在网络上安全传输文件和执行远程命令的功能。本教程将介绍 Paramiko 的基本用法,包括连接到远程服务器、执行命令、文件传输等常见操作。
安装 Paramiko
可以使用 pip 命令安装 Paramiko:
pip install paramiko
连接到远程服务器
创建一个 SSHClient 对象,使用 connect() 方法连接到远程服务器:
# 创建 SSHClient 实例
ssh_client = paramiko.SSHClient()
# 允许连接不在 known_hosts 文件中的主机
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接到远程服务器
ssh_client.connect(hostname, port, username, password)
执行远程命令
使用 exec_command() 方法执行远程命令,并获取输入、输出和错误流:
# 执行远程命令
stdin, stdout, stderr = ssh_client.exec_command(command)
# 向执行命令写入信息(一般交互式命令会用到)
stdin.write(content)
# 读取执行命令的输出信息
output = stdout.read().decode()
# 读取执行命令的报错信息
error = stderr.read().decode()
文件传输
创建一个 SFTPClient 对象,使用 put() 和 get() 方法上传和下载文件:
# 创建 SFTPClient 实例
sftp_client = ssh_client.open_sftp()
# 上传文件
sftp_client.put(local_path, remote_path)
# 下载文件
sftp_client.get(remote_path, local_path)
示例
下面是一个完整示例,演示了 Paramiko 的基本用法,包括连接到远程服务器、执行命令、文件传输等常见操作:
import paramiko
import time
def ssh_connect(hostname, port, username, password):
# 创建 SSHClient 实例
ssh_client = paramiko.SSHClient()
# 允许连接不在 known_hosts 文件中的主机
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接到远程服务器
ssh_client.connect(hostname, port, username, password)
return ssh_client
def ssh_vim(ssh_client, path, text):
# 执行 vim 命令,并获取输入、输出和错误流
stdin1, stdout1, stderr1 = ssh_client.exec_command(f'vim {path}')
# 进入插入模式
stdin1.write('i')
# 插入文本
stdin1.write(text)
# esc 键,退出插入模式
stdin1.write('\x1b')
# 保持并退出
stdin1.write(':wq\n')
# 关闭执行命令的输入流
stdin1.close()
# 等待 3 秒后,再查看文件内容,太快可能获取不到最新的文件内容
time.sleep(3)
# 执行 cat 命令,并获取输入、输出和错误流
stdin2, stdout2, stderr2 = ssh_client.exec_command(f'cat {path}')
# 读取执行命令的输出信息和错误信息,并输出到控制台
print(stdout2.read().decode(), stderr2.read().decode())
def sftp_put(ssh_client, local_path, remote_path):
# 创建 SFTPClient 实例
sftp_client = ssh_client.open_sftp()
# 上传文件
sftp_client.put(local_path, remote_path)
# 关闭 SFTP 连接
sftp_client.close()
def sftp_get(ssh_client, remote_path, local_path):
# 创建 SFTPClient 实例
sftp_client = ssh_client.open_sftp()
# 下载文件
sftp_client.get(remote_path, local_path)
# 关闭 SFTP 连接
sftp_client.close()
if __name__ == '__main__':
# 连接到远程服务器
ssh_client = ssh_connect(hostname, port, username, password)
# 执行 vim 命令
ssh_vim(ssh_client, path, text)
# 上传文件
sftp_put(ssh_client, local_path, remote_path)
# 下载文件
sftp_get(ssh_client, remote_path, local_path)
# 关闭 SSH 连接
ssh_client.close()