一些概念
SSH (Secure Shell)
安全外壳协议,是建立在应用层基础上的安全协议,专为远程登录和其他网络服务提供安全性的协议。
SFTP
SSH 文件传输协议 (Secret File Transfer Protocol, SFTP, 安全文件传送协议) 是一种数据流连接,提供文件访问、传输和管理功能的网络传输协议。
SSHClient 类似于Linux 的 ssh 命令,是对 SSH 会话的封装,该类封装了 传输(Transport),通道(Channel)及 SFTPClient 建立的方法(open_sftp)。
SFTPClient 类似于 Linux 的 sftp 命令,是对 SFTP 客户端的封装,用以实现远程文件操作,如上传、下载、修改文件权限。
Paramiko 基础名词
Channel:是一种类 Socket,一种安全的 SSH 传输通道;
Transport:是一种加密会话,使用时会同步创建一个加密的 Tunnels,这个 Tunnels 叫做 Channel;
Session:是 Client(客户机程序) 与 Server(服务器) 保持连接的对象,用 connect()/start_client()/start_server()开始会话。
Paramiko 基本使用
- SSHClient常用的方法介绍
(1) connect():实现远程服务器的连接与认证,对于该方法只有hostname是必传参数。
常用参数
hostname 连接的目标主机
port=SSH_PORT 指定端口
username=None 验证的用户名
password=None 验证的用户密码
pkey=None 私钥方式用于身份验证
key_filename=None 一个文件名或文件列表,指定私钥文件
timeout=None 可选的tcp连接超时时间
allow_agent=True, 是否允许连接到ssh代理,默认为True 允许l
ook_for_keys=True 是否在~/.ssh中搜索私钥文件,默认为True 允许
compress=False, 是否打开压缩
(2) set_missing_host_key_policy():设置远程服务器没有在know_hosts文件中记录时的应对策略。目前支持三种策略:
设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种:
AutoAddPolicy 自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认
WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接
RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项
(3) exec_command():在远程服务器执行Linux命令的方法。
(4) open_sftp():在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象。
来自 https://developer.51cto.com/art/201910/604700.htm
# 需先安装两个模块
# conda install -c conda-forge paramiko
# conda install -c conda-forge scp
import paramiko
from scp import SCPClient
# 建立 SSH 连接
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='192.168.1.1x', port=22, username='name', password='1234567')
# SCPClient 使用 paramiko 传输作为参数
scp = SCPClient(ssh.get_transport())
# 从远端下载 TESTdir 及其所含内容 到 当前主机路径下
scp.get('/home/remote_path/TESTdir', '/home/local_path/', recursive=True)
# 上传 excel2 及所含内容 到 远端主机目录下
scp.put('/home/local_path/excel2', '/home/remote_path/TESTdir', recursive=True)
# 故第一个 path = 要操作的文件/文件夹所在路径
# 第二个 path = 文件/文件夹要去向的地方
scp.close()
ssh.close()
More: https://pypi.org/project/scp/
注:如果要像官网例子中将 recursive=True 置于中间,在实际操作中将会报错如下:
SyntaxError: positional argument follows keyword argument
加个例子
https://blog.csdn.net/dadajuan_plus/article/details/106383296?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control