paramiko模块

2022/8/1 23:24:26

本文主要是介绍paramiko模块,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

paramiko是什么

paramiko包含两个核心组件:SSHClient和SFTPClient。

  • SSHClient的作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。
  • SFTPClient的作用类似与Linux的sftp命令,是对SFTP客户端的封装,用以实现远程文件操作,如文件上传、下载、修改文件权限等操作。

paramiko的基本使用

1.SSHClient常用的方法介绍

import paramiko
ssh = paramiko.SSHClient()
# 第一次连接的时候一般都会提示yes/no,这是因为远程服务器没有在know_hosts文件中记录时的应对策略
# set_missing_host_key_policy()设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种:
# AutoAddPolicy 自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认
# WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接
# RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项 
# 我一般使用第一种方式
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 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, 是否打开压缩
ssh = connect(hostname='192.168.153.32' ,port='22', username='root', password='mypassword')

# exec_command():在远程服务器执行Linux命令的方法,他会返回一个元祖一共有三个值
# stdin
# stdout返回的是执行结果,如果执行失败stdout返回None
# stderr返回的是错误信息,如果命令执行成功stderr返回的是None
# stdout和stderr返回的都是字节,我们需要decode解码一下
stdin, stdout, stderr = ssh.exec_command('ls')
print(stdout.read().decode('utf-8'))

# open_sftp():在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象。
# 利用SSHClient对象的open_sftp()方法,可以直接返回一个基于当前连接的sftp对象,可以进行文件的上传等操作.
sftp = client.open_sftp() 
sftp.put('test.txt','text.txt') 

由于工作需要自己封装了一个工具类,提供远程操作服务器,与上传文件。

import paramiko

class Ssh(object):
    def __init__(self, ip, username="root", password=None, private_key_path=None, port=22):
        # key = paramiko.RSAKey.from_private_key_file(private_key_path)
        self.ssh = paramiko.SSHClient()
        self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        self.ssh.connect(hostname=ip, port=port, username=username, password=password,key_filename=private_key_path)
        # self.t = paramiko.Transport((ip,port))
        # self.t.connect(username='root',pkey=key)
        # self.sftp = paramiko.SFTPClient.from_transport(self.t)
    
    def cmd(self,cmd):
        _,stdout,stderr = self.ssh.exec_command(cmd)
        msg = stdout.read().decode()
        err = stderr.read().decode()
        data = {
            "code": 0,
            "msg": ""
        }
        if len(err) != 0:
            data['code'] = 1
            data['msg'] = err
        else:
            data['code'] = 0
            data['msg'] = msg
        return data
    
    def put(self, src, desc):
        try:
            sftp = self.ssh.open_sftp()
            sftp.put(src,desc)
        except Exception as e:
            return e

ssh = Ssh(ip="192.168.153.32", private_key_path="C:\\Users\\Administrator\\.testssh\\linux_fyh_rsa", port=22)
# print(ssh.put("C:\\Users\\Administrator\\Desktop\\sh_auto\\test\\ssh_linux.py",'/root/ssh_linux.py'))
print(ssh.cmd('ls'))


这篇关于paramiko模块的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程