一, 什么是 paramiko
要想明白什么是 paramiko, 要先明白 SSH 协议.
二, 什么是 SSH 协议
SSH 全称是 Secure Shell (翻译: 安全的外壳), 根据字面意思就可以知道是和安全相关的协议, 官方说法是 IETF 制定的在应用层基础上的安全网络协议. 专门为了远程登录会话提供的安全协议. 由于 SSH 传输数据都是压缩过的, 所以在传输速度上会加快, 目前 SSH 协议已经成为 Linux 系统的标准配置.(具体的 SSH 协议的安全机制和实现原理请各位小伙伴们自行百度)
三, paramiko 介绍
看完第二部分小伙伴们应该已经明白了什么是 SSH, 而 paramiko 是 python 的一个库, 使用 paramiko 我们可以直接使用 Python 代码对远程服务器进行操作 (不用面对冰冷的命令窗口, 就是舒服), 这样就不用直接使用 SSH 命令操作!!!
四, paramiko 核心组件介绍
1. SSHClient: 主要是用于执行远程命令
2. SFTPClient: 作用类似于 Linux 的 sftp 命令, 用来实现远程操作文件, 对文件上传, 下载和修改文件权限
五, SSHClient 的介绍
1. 常用的方法有以下几种: connect(): 主要是用于实现和远程服务器的连接与认证
需要的参数如下:
- def connect(
- self,
- hostname,
- port=SSH_PORT,
- username=None,
- password=None,
- pkey=None,
- key_filename=None,
- timeout=None,
- allow_agent=True,
- look_for_keys=True,
- compress=False,
- sock=None,
- gss_auth=False,
- gss_kex=False,
- gss_deleg_creds=True,
- gss_host=None,
- banner_timeout=None,
- auth_timeout=None,
- gss_trust_dns=True,
- passphrase=None,
- disabled_algorithms=None,
- ):
从源码种可以看出 hostname 是必须要填写的参数, 用来指定要连接的主机, port 是要连接的端口, 一般默认为 22,username 为用户名, password 为密码, pkey 则是私钥方式去验证身份, key_filename 则是指定私钥文件地址. 主要的是这几个参数.
2. set_missing_host_key_policy(): 设置远程服务器没有在 know_hosts 文件中记录时的应对策略. 策略目前有三种
AutoAddPolicy 自动添加主机名及主机密钥到本地 HostKeys 对象, 不依赖 load_system_host_key 的配置. 即新建立 SSH 连接时不需要再输入 yes 或 no 进行确认
WarningPolicy 用于记录一个未知的主机密钥的 python 警告. 并接受, 功能上和 AutoAddPolicy 类似, 但是会提示是新连接
RejectPolicy 自动拒绝未知的主机名和密钥, 依赖 load_system_host_key 的配置. 此为默认选项
3. exec_command() : 用于远程执行命令
4.open_sftp() : 在当前 SSH 会话基础上创建一个 sftp 会话. 会返回一个 sftpclient 对象
六, sshclient 的用法举例:
- import paramiko
- # 第一步实例化 SSHClient, 获取对象
- client=paramiko.SSHClient()
- # 设置自动添加策略, 不添加的话如果不在本地 know_hosts 文件记录的主机则无法连接
- client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- # 连接远程主机,
- client.connect(hostname='你要连接的 ip', port=22, username='你的用户名', password='你的用户密码')
- # 建立通道并执行命令 stdout 为正确的输出 stderr 为错误的输出
- stdin,stdout,stderr=client.exec_command('df -h')
- client.close()
2. 密钥连接方式
- # 获取密钥位置
- private=paramiko.RSAKey.from_private_key_file('/Users/ch/.ssh/id_rsa')
- # 实例化 SSHClient
- client = paramiko.SSHClient()
- # 自动添加策略, 保存服务器的主机名和密钥信息, 如果不添加, 那么不再本地 know_hosts 文件中记录的主机将无法连接
- client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- # 连接 SSH 服务端, 以用户名和密码进行认证
- client.connect(hostname='10.0.0.1',port=22,username='root',pkey=private)
七 ,SFTPClient 常用方法的介绍
from_transport(cls,t) 创建一个已连通的 SFTP 客户端通道
- put(localpath, remotepath, callback
- =None, confirm=True
) 将本地文件上传到服务器 参数 confirm: 是否调用 stat() 方法检查文件状态, 返回 ls
-l 的结果
- get(remotepath, localpath, callback
- =None
) 从服务器下载文件到本地
mkdir() 在服务器上创建目录
remove() 在服务器上删除目录
rename() 在服务器上重命名目录
stat() 查看服务器文件状态
listdir() 列出服务器目录下的文件
用法举例:
- import paramiko
- # 获取 Transport 实例
- tran = paramiko.Transport(('10.0.0.3', 22))
- # 连接 SSH 服务端, 使用 password
- tran.connect(username="root", password='123456')
- # 或使用
- # 配置私人密钥文件位置
- private = paramiko.RSAKey.from_private_key_file('/Users/root/.ssh/id_rsa')
- # 连接 SSH 服务端, 使用 pkey 指定私钥
- tran.connect(username="root", pkey=private)
- # 获取 SFTP 实例
- sftp = paramiko.SFTPClient.from_transport(tran)
- # 设置上传的本地 / 远程文件路径
- localpath = "/Users/root/Downloads/1.txt"
- remotepath = "/tmp/1.txt"
- # 执行上传动作
- sftp.put(localpath, remotepath)
- # 执行下载动作
- sftp.get(remotepath, localpath)
- tran.close()
文章参考:
欢迎大家进入 QQ 群讨论关于 Python 的问题: 515458373
来源: http://www.bubuko.com/infodetail-3334272.html