目录
- 简介
- 安装 Paramiko
- 连接到远程服务器
- 执行远程命令
- 文件传输
- 示例
简介
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 timedef 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_clientdef ssh_vim(ssh_client, path):# 执行 vim 命令,并获取输入、输出和错误流stdin1, stdout1, stderr1 = ssh_client.exec_command(f'vim {path}')# 进入插入模式stdin1.write('i')# 插入文本stdin1.write('Hello World!')# 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)# 上传文件sftp_put(ssh_client, local_path, remote_path)# 下载文件sftp_get(ssh_client, remote_path, local_path)# 关闭 SSH 连接ssh_client.close()