python的paramiko模块
一. 简介
ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography)。
有了Paramiko以后,我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对远程服务器进行操作。
由于paramiko属于第三方库,所以需要使用如下命令先行安装:
pip3 install paramiko
paramiko包含两个核心组件:SSHClient和SFTPClient。
- SSHClient的作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。
- SFTPClient的作用类似与Linux的sftp命令,是对SFTP客户端的封装,用以实现远程文件操作,如文件上传、下载、修改文件权限等操作。
# Paramiko中的几个基础名词: 1、Channel:是一种类Socket,一种安全的SSH传输通道; 2、Transport:是一种加密的会话,使用时会同步创建了一个加密的Tunnels(通道),这个Tunnels叫做Channel; 3、Session:是client与Server保持连接的对象,用connect()/start_client()/start_server()开始会话。
二. 基本使用
2.1 基于用户名密码:
import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='192.168.153.132', port=22, username='root', password='1234') # 执行命令 stdin, stdout, stderr = ssh.exec_command('df -h') # 获取命令结果 result = stdout.read() # 关闭连接 ssh.close() print(result)
2.2 基于公钥和私钥
""" 连接服务器的两种方法: - 用户名和密码 - 公钥和私钥(公司) - 在自己电脑生成一对密钥(公钥+私钥),命令:ssh-keygen (powershell) 私钥:/c/Users/oldboy/.ssh/id_rsa. 公钥:/c/Users/oldboy/.ssh/id_rsa.pub - 查看公钥私钥 cd ~/.ssh - 将自己的公钥放到服务器上。 ssh-copy-id -i 本地公钥路径 用户名@服务器IP """ import paramiko private_key = paramiko.RSAKey.from_private_key_file(r'c:/Users/Administrator.DESKTOP-2F1QLD1/.ssh/id_rsa') # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='192.168.153.132', port=22, username='root', pkey=private_key) # 执行命令 stdin, stdout, stderr = ssh.exec_command('df -h') # 获取命令结果 result = stdout.read() # 关闭连接 ssh.close() print(result.decode('utf-8'))
2.3 paramiko下载上传文件
import paramiko transport = paramiko.Transport(('192.168.153.132', 22))
# 也可以通过pkey指定私钥 transport.connect(username='root',password='1234') sftp = paramiko.SFTPClient.from_transport(transport) # 将location.py 上传至服务器 /tmp/test.py # sftp.put('hello.txt', '/tmp/hello.txt') # 将remove_path 下载到本地 local_path sftp.get('/tmp/hello.txt', 'newhello.txt') transport.close()