python——paramiko详解

2023-05-16

目录

一、SSHClient类

ssh远程连接服务器 connet()

远程主机没有本地主机密钥或HostKeys对象时的连接方法,需要配置set_missing_host_key_policy(policy)

远程执行命令

在远程服务器上生成新的交互式shell

关闭ssh连接

open_sftp()

 load_system_host_keys方法

SFTPClient类

SFTPClient类常用方法

from_transport方法

get方法

其它方法

示例


paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。paramiko支持Linux, Solaris, BSD, MacOS X, Windows等平台通过SSH从一个平台连接到另外一个平台。利用该模块,可以方便的进行ssh连接和sftp协议进行sftp文件传输。

一、SSHClient类

  • SSHClient的作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。

# Paramiko中的几个基础名词:

1、Channel:是一种类Socket,一种安全的SSH传输通道;
2、Transport:是一种加密的会话,使用时会同步创建了一个加密的Tunnels(通道),这个Tunnels叫做Channel;
3、Session:是client与Server保持连接的对象,用connect()
/start_client()/start_server()开始会话。

与 SSH 服务器的会话的高级表示。此类包装TransportChannelSFTPClient以处理身份验证和打开通道的大多数方面。一个典型的用例是:

client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect('ssh.example.com')
stdin, stdout, stderr = client.exec_command('ls -l')

ssh远程连接服务器 connet()

connect(hostname, port=22, 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)

参数说明:

hostname(str类型),连接的目标主机地址;
port(int类型),连接目标主机的端口,默认为22;
username(str类型),校验的用户名(默认为当前的本地用户名);
password(str类型),密码用于身份校验或解锁私钥;
pkey(Pkey类型),私钥方式用于身份验证;
key_filename(str or list(str)类型),一个文件名或文件名列表,用于私钥的身份验证;
timeout(float类型),一个可选的超时时间(以秒为单位)的TCP连接;
allow_agent(bool类型),设置为False时用于禁用连接到SSH代理;
look_for_keys(bool类型),设置为False时用于来禁用在~/.ssh中搜索私钥文件;
compress(bool类型),设置为True时打开压缩。

import paramiko
ssh = paramiko.SSHClient()
ssh.connect(ip,22,username,passwd,timeout=5)

此处ip、username、passwd都作为变量;

远程主机没有本地主机密钥或HostKeys对象时的连接方法,需要配置set_missing_host_key_policy(policy)

参数常见取值有3种,分别如下:

AutoAddPolicy:自动添加主机名及主机密钥到本地的known_hosts,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认。最为常用。
WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接。
RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

远程执行命令

该命令的输入与输出流为标准输入(stdin)、输出(stdout)、错误(stderr)的Python文件对像

命令执行完毕后,通道将关闭,不能再使用。如果您想执行另一个命令,您必须打开一个新频道。

exec_command(command, bufsize=-1, timeout=None, get_pty=False, environment=None)

参数说明:

  • command(str类型),执行的命令串;
  • bufsize(int类型),文件缓冲区大小,默认为-1(不限制)

get_ptyterm='vt100' , width=80 , height=24 , width_pixels=0 , height_pixels=0 )

在远程服务器上生成新的交互式shell

invoke_shell(term='vt100', width=80, height=24, width_pixels=0, height_pixels=0, environment=None)

在此频道上请求交互式 shell 会话。如果服务器允许,则通道将直接连接到 shell 的 stdin、stdout 和 stderr。

通常您会在此之前调用get_pyt,在这种情况下,shell 将通过 pty 进行操作,并且通道将连接到 pty 的 stdin 和 stdout。

当shell退出时,通道将被关闭并且不能被重用。如果您想打开另一个 shell,您必须打开一个新频道。

例如:

在SSH server端创建一个交互式的shell,且可以按自己的需求配置伪终端,可以在invoke_shell()函数中添加参数配置

chan = ssh.invoke_shell()

chan.send(cmd) #利用send函数发送cmd到SSH server,添加做回车来执行shell命令(cmd中需要有\n命令才能执行)。注意不同的情况,如果执行完telnet命令后,telnet的换行符是\r\n

通过recv函数获取回显 chan.recv(bufsize)

一般回显数据较多,需要通过while循环读取回显数据

关闭ssh连接

ssh.close()

open_sftp()

在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象。

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

 load_system_host_keys方法

加载本地公钥校验文件,默认为~/.ssh/known_host,非默认路径需要手工指定。(~/.ssh/known_hosts的作用:当ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告)

load_system_host_keys(self,filename=None)

filename(str类型),指定远程主机公钥记录文件。

SFTPClient类

SFTPClient作为一个SFTP客户端对象,根据SSH传输协议的sftp会话,实现远程文件操作,比如文件上传、下载、权限、状态等操作。

SFTPClient类常用方法

from_transport方法

创建一个已连通的SFTP客户端通道。
方法定义:
from_transport(cls,t)
参数说明:
t(transport),一个已通过验证的传输对象。
示例1
import paramiko

t = paramiko.Transport(('192.168.56.132',22))
t.connect(username='root',password='1234567')
sftp = paramiko.SFTPClient.from_transport(t)

这里from_transport()的入参还有其它方法获得
示例2
sshClient = paramiko.SSHClient()
sshClient.set_missing_host_key_policy(paramiko.AutoAddPolicy())
sshClient.connect(ip, port, user, pwd)
sftp = paramiko.SFTPClient.from_transport(sshClient.get_transport())

get方法

从远程SFTP服务端下载文件到本地。

方法定义:
        get(remotepath, localpath, callback=None)
参数说明:
        remotepath(str类型),需要下载的远程文件(源);
        callback(funcation(int,int)),获取已接收的字节数及总和传输字节数,以便回调函数调用,默认为None.

示例说明:

remotepath = '/data/logs/access.log'
localpath = '/home/access.log'
sftp.get(remotepath,localpath)

其它方法

SFTPClient类其它常用方法说明:

  • mkdir,在SFTP服务端创建目录,如sftp.mkdir("/home/userdir",mode=0777),默认模式是0777(八进制),在某些系统上,mode被忽略。在使用它的地方,当前的umask值首先被屏蔽掉。
  • remove,删除SFTP服务端指定目录,如sftp.remove("/home/userdir")。
  • rename,重命名SFTP服务端文件或目录,如sftp.rename("/home/test.sh","/home/testfile.sh")
  • stat,获取远程SFTP服务端指定文件信息,如sftp.stat("/home/testfile.sh")。
  • listdir,获取远程SFTP服务端指定目录列表,以Python的列表(List)形式返回,如sftp.listdir("/home")。

示例

class Connection:
    def connect(self, ip, port, user, pwd):
        self.ip = ip
        self.port = port
        self.user = user
        self.pwd = pwd
        self.sshClient = paramiko.SSHClient()
        self.sshClient.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        if pwd != '':
            self.sshClient.connect(ip, port, user, pwd)
        else:
            try:
                self.sshClient.connect(ip, port, user,pwd,look_for_keys=False,timeout=5.0)
            except paramiko.ssh_exception.AuthenticationException:
                self.sshClient.get_transport().auth_none(user)
        self.sftp = paramiko.SFTPClient.from_transport(self.sshClient.get_transport())

    def push(self, local_file, remote_file):
        self.sftp.put(local_file, remote_file)

    def pull(self, remote_file, local_file):
        self.sftp.get(remote_file, local_file)

    def exe(self, cmd):
        try:
            a = self.sshClient.exec_command(cmd, timeout=60000)
            f_in, f_out, f_err = a
            return f_out.read()
        except Exception as e:
            log(e)
            return 'Exception no return'

    def exe_invoke(self,cmd,end_str=None):
        """
        交互式执行命令,和exe实现功能相同。执行出错的时候可以尝试
        :param cmd:
        :param end_str: 通过该字段判断命令是否结束
        :param delaytime:
        :return:
        """
        try:
            ssh = self.sshClient.get_transport().open_session()
            ssh.get_pty()
            ssh.invoke_shell()
            ssh.send(cmd + '\n')
            ret = ""
            while True:
                out = ssh.recv(1024)
                # print(out.decode('utf-8'))
                ret = ret + out.decode('utf-8').replace('\r','')
                if end_str in out.decode('utf-8'):
                    break
            return ret
        except Exception as e:
            log(e)
            return 'Exception no return'

    def exists(self, path):
        path_d = '/'.join(path.split('/')[:-1])
        path_b = path.split('/')[-1]
        print('---------')
        print(path_d)
        print(path_b)
        ls = self.exe('ls %s' % path_d).decode().split('\n')
        print(ls)
        if path_b in ls:
            return True
        else:
            return False

    def reconect(self):
        print('reconneting')
        try:
            self.close()
        except:
            pass
        finally:
            self.connect(self.ip, self.port, self.user, self.pwd)

    def close(self):
        self.sshClient.close()
        self.sftp.close()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python——paramiko详解 的相关文章

随机推荐

  • 单片机开发 --- 定时/计数器

    单片机开发 定时 计数器 一 定时 计数器概要 51单片机有两组定时器 计数器 xff0c 因为既可以定时 xff0c 又可以计数 xff0c 故称之为定时器 计数器 定时器 计数器和单片机的CPU是相互独立的 定时器 计数器工作的过程是自
  • 第十章——UITableView 和 UITableViewController

    许多 iOS 应用程序向用户显示列表项 xff0c 并允许用户选择 xff0c 删除或重新排列列表项 不管是显示用户地址簿中的人员列表的应用程序还是 App Store 上畅销产品的列表 xff0c 都使用了 UITableView UIT
  • Android getDeviceId流程分析

    1 首先来看getDeviceId frameworks base telephony java android telephony TelephonyManager java span class token keyword public
  • Ubuntu 16.04 + Nvidia 显卡驱动 + Cuda 8.0 (问题总结 + 解决方案)

    前言 前面好一阵子忙于写论文和改论文 xff0c 好久没有做新实验了 xff0c 最近又回到做实验是的节奏 xff0c 这感觉很爽 去年实验室买了两台工作站 xff08 4路Titanx 43 2颗 Xeon CPU E5 2637 v3
  • 3D空间位置计算 — 线与面的交点

    线与面的交点 64 PlanePt xff1a 平面内一点 64 PlaneVector xff1a 平面的法向量 64 LinePt xff1a 直线上一点 64 LineVector xff1a 直线的向量 Point3d s poin
  • python面向对象

    面向对象中的几点概念 xff1a 类 xff1a 用户定义的对象原型 xff08 prototype xff09 xff0c 该原型定义了一组可描述该类任何对象的属性 xff0c 属性是数据成员 xff08 类变量 和 实例变量 xff09
  • cmake 中 Error in configuration process, project files may be invalid

    qt配置opencv时 xff0c 用到cmake xff0c 弹出窗口 Error in configuration process project files may be invalid 错误 xff0c 主窗口显示 CMake Er
  • paddlepaddle(一)文字识别 - PaddleOCR简单使用

    PaddleOCR一步安装即可使用 OCR结果如图 xff1a 步骤 xff1a 可以直接使用pip安装PaddleOCR库 pip install paddleocr 执行代码即可 xff0c 示例 xff1a from paddleoc
  • python 把文件夹及子文件夹内的所有文件移动到指定文件夹中

    python 把文件夹及子文件夹内的所有文件移动到指定文件夹中 1 提取路径下所有文件到指定文件夹下 import shutil import os def move files source dest for root dirs file
  • vscode 中文乱码(解决方法)

    vscode一次自动更新后 xff0c 发现中文乱码了 查看了网上的解答 xff0c 记录一种解决方法 切换右下角任务栏的编码方式 xff0c UFT gt GB2312 或下拉GBK xff0c 如下图 xff1a
  • max_element() 和 min_element()

    找出容器中的最值 vector和数组都可以 一维的数据可以 多维的还没找到方法 xff0c 可能是不行的 完整代码 xff1a include lt iostream gt include lt vector gt include lt a
  • C/C++ 提取字符串中的指定位置(截取字符串、提取字符串)

    版权声明 xff1a 转载需标明该文链接 https blog csdn net zaibeijixing article details 88721195 一 利用C 43 43 自带字符串函数 xff1a int a 61 str fi
  • 树莓派-从入手到使用(一):树莓派入手操作第一步

    新组装的电脑硬盘显卡什么都有 xff0c 把window或linux系统安装在硬盘上就能开机使用了 树莓派没硬盘 xff0c 因此需要加个内存卡当硬盘 xff0c 另外要给这个硬盘上安装系统 xff0c 才能用 本人的是Raspberry
  • jupyter notebook 中运行.py文件

    jupyter notebook页面 xff0c 在需要运行的name py文件目录页面中 xff0c 新建python文件 xff0c 打开 xff0c 在cell中添加如下命令 xff1a run name py 运行该cell即可 根
  • 直方图均衡化及算法步骤

    2019 07 16 xff0c 科学家首次拍摄到一种量子纠缠的照片 量子领域还不懂 xff0c 先不研究 猛一看和今年刚出的黑洞照片倒有几分相似 黑洞照片看起来还是比较清晰地 xff0c 这个是黑白的 xff0c 亮度不均 xff0c 肉
  • 解决mongodb启动报错ERROR: child process failed, exited with error number 14的问题

    在使用mongodb导入数据时 xff0c 数据库无法链接 xff0c 关闭service 后仍然无法启动 可能的原因 xff1a service mongodb restart时启动失败没有正常关闭mongodb引起的 xff0c 比如直
  • 面向对象分析(4):步骤

    面向对象分析通常按照下面的步骤来进行 xff1a xff08 1 xff09 标识对象和类 可以从应用领域开始 xff0c 逐步确定形成整个应用的基础类和对象 这一步需要分析领域中目标系统的责任 xff0c 调查系统的环境 xff0c 从而
  • NTFS for Mac - 免费让 Mac 原生支持NTFS读写

    使用 Mac 电脑的朋友可能都遇过 xff0c 在使用 NTFS 文件格式的移动硬盘或U盘时 xff0c 默认只能以 只读 模式打开 xff0c 也就是说你只能读取复制文件而不能移动 修改 重命名或删除里面的东西 这确实很不便 xff0c
  • C++ 将十六进制字符串转换为二进制字符串

    C 43 43 将十六进制字符串转换为二进制字符串 前言一 源代码 前言 一种简单的方法将十六进制字符串转为二进制字符串 xff0c 不限制十六进制的字节数 一 源代码 传入的十六进制字符串需要转换为大写 xff01 X toupper s
  • python——paramiko详解

    目录 一 SSHClient类 ssh远程连接服务器 connet 远程主机没有本地主机密钥或HostKeys对象时的连接方法 xff0c 需要配置set missing host key policy policy 远程执行命令 在远程服