目录
- 概述
- 实践
- 安装
- paramiko
- paramiko包括两个核心的组件
- paramiko有几个基础的名词
- SSHClient使用
- 常用方法
- 例子
- 例子2
- SFTPClient类
- 案例
- 结束
概述
paramiko是实现远程控制
实践
安装
pip install paramiko
paramiko
SSH是一个协议,paramiko是使用SSHv2协议(底层使用的是cryptography)的一个第三方的库
paramiko包括两个核心的组件
SSHClient:它的作用类似于Linux的SSH命令,是对SSH会话的一个类的封装,这个类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通过用于执行远程命令。
SFTPClient:它的作用类似Linux的SFTP命令,是对SFTP客户端的一个类的封装。主要是实现对远程文件的操作,上传,下载,修改文件权限等操作。
paramiko有几个基础的名词
Transport:是一种加密的会话,使用时会同步创建一个加密的Tunnels(通道),这个Tunnels叫Channel
Channel:是类似Socket,一种安全的SSH通道
Session:是client和server保持连接的对象。实现方式是connect —> start_client —> start_server 开始会话。
SSHClient使用
常用方法
方法
-
connect() - 实现远程服务器的连接与认证,hostname是必传的参数
connect(self, hostname, port=22, username=None, password=None, pkey=None, key_filename=None, timeout=None, allow_agent=True, look_for_keys=True, compress=False)
-
参数说明:
- hostname(str类型):连接目标主机IP地址或主机名
- port(int类型):连接目标主机的端口,默认为22
- username(str类型):校验的用户名(默认为当前的本地用户名)
- password(str类型):密码用于身份校验或解锁私钥
- pkey:私钥方式用于身份验证
- key_filename(str or list(str)类型):一个文件名或文件名的列表,用于私钥的身份验证
- timeout(float类型):一个可选的超时时间(以秒为单位)的TCP连接
- allow_agent(bool类型):设置为False时用于禁用连接到SSH代理
- look_for_keys(bool类型):设置为False时用来禁用在~./ssh中搜索秘钥文件
- compress(bool类型):设置为True时打开压缩
-
set_missing_host_key_policy(policy) - 设置连接远程主机没有本地主机秘钥或HostKeys对象时的策略,目前支持如下三种方式
- AutoAddPolicy:自动添加主机名及主机秘钥到本地HostKeys对象,并将其保存,不依赖
- load_system_host_keys,即使~/.ssh/known_hosts不存在也不影响
- RejectPolicy(默认):自动拒绝未知的主机名或秘钥,依赖load_system_host_keys()配置
- WarningPolicy:用于记录一个未知的主机秘钥的Python警告,并接受它,功能上与
- AutoAddPolicy相似,但未知主机会有告警
-
exec_command() - 在远程服务器上执行Linux命令的方法
-
open_sftp() - 在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象
-
load_system_host_keys() - 加载本地公钥校验文件,默认为~/.ssh/known_hosts,非默认路径需要收工指定
例子
# ssh 连接案例
import paramiko
hostname = "10.xx.12.18"
port = 22
username = "root"
password = "xxx@xxx#2O23"
try:
# 实例化 SSHClient
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
print("*** Connecting ...")
# 连接ssh服务器,用户名密码认证
client.connect(hostname, port, username, password)
# 执行命令,stdout为正确输出,stderr为错误输出
stdin, stdout, stderr = client.exec_command("df -h")
# 打印
print(stdout.read().decode("utf-8"))
# 关闭连接
client.close()
except Exception as e:
client.close()
print(e)
例子2
import paramiko
def main():
tran = paramiko.Transport(('10.57.12.18', 22)) # 获取Transport实例
tran.connect(username="root", password='Dsh@LuxShare#2O23') # 连接SSH服务端
# 实例化SSHClient
client = paramiko.SSHClient()
client._transport = tran
# 打开一个Chanent并执行命令
stdin, stdout, stderr = client.exec_command('df -h')
# stdout 为正确输出,stderr为错误输出,同时是有1个变量有值
# 打印结果
print(stdout.read().decode('utf8'))
tran.close() # 关闭
if __name__ == '__main__':
main()
SFTPClient类
SFTPClient作为一个SFTP客户端对象,根据SSH传输协议的sftp会话,实现远程操作,比如文件上传,下载,权限,状态等,端口就是SSH端口
方法
- from_transport():创建一个已连通的SFTP客户端通道
- put():上传本地文件到远程服务器
- get():从远程服务器下载文件到本地
- mkdir():在远程服务器上创建目录
- remove():删除远程服务器中的文件
- rmdir():删除远程服务器中的目录
- rename():重命名远程服务器中的文件或目录
- stat():获取远程服务器中文件的详细信息
- listdir():列出远程服务器中指定目录下的内容
案例
import paramiko
def main():
tran = paramiko.Transport(('10.xx.12.18', 22)) # 获取Transport实例
tran.connect(username="root", password='xxx@xxx#2O23') # 连接SSH服务端
sftp_client = paramiko.SFTPClient.from_transport(tran) # 实例化SFTPClient对象
# 设置上传的本地/远程文件路径
local_path = "/Users/hyl/Desktop/jk/python/example.txt"
remote_path = "/root/example.txt"
local_path2 = "/Users/hyl/Desktop/jk/python/demo.sh"
remote_path2 = "/root/demo.sh"
sftp_client.put(local_path, remote_path) # 上传
print("上传成功")
sftp_client.get(remote_path2, local_path2) # 下载
print("下载成功")
tran.close() # 关闭
if __name__ == '__main__':
main()