paramiko模块exec_command()函数是将服务器执行完的结果一次性返回给你;

invoke_shell()函数类似shell终端,可以将执行结果分批次返回,看到任务的执行情况,不会因为执行一个很长的脚本而不知道是否执行成功

exec_command():

invoke_shell()

python 操作ssh--有more用invoke_shell循环获取数据

# 实例化SSHClient
client = paramiko.SSHClient()
# 自动添加策略,保存服务器的主机名和密钥信息
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
loger.debug("hostname=%s username=%s password=%s" %(equ_ip_s,username_s,passwd_s))
# 连接SSH服务端,以用户名和密码进行认证
client.connect(hostname=equ_ip_s, username=username_s, password=passwd_s)
chan = client.invoke_shell()
chan.settimeout(9000)
#  设置结束条件
p = re.compile(r'xxx')
loger.debug("client is %s",client)
loger.debug("cmd is '%s'",cmd)
chan.send(cmd+'\n')
# chan.send(cmd+'\n')
result = ''
result = chan.recv(4096)
#  循环获取数据
while True:chan.send(" ")results = chan.recv(1024000)result += resultsif p.search(results):print len(result)print type(result)chan.send('q')break
# print result
# 拆分获取每行的数据
result2 = re.split(r'\r\n', result)

参考:第二篇:ssh.invoke_shell() 切换root出现的新问题 - FelixApff - 博客园

SSHClient类打包了.Transport,.Channel,.SFTPClient来满足多方面的认证和传输的要求,下面来看看部分用法。

一、类实例化

ssh_client = paramiko.SSHClient()

实例化一个SSHClient类的对象。

实例化的时候做了些什么呢?查看一下paramiko版本2.8.1中的源码:

def __init__(self):"""Create a new SSHClient."""self._system_host_keys = HostKeys()self._host_keys = HostKeys()self._host_keys_filename = Noneself._log_channel = Noneself._policy = RejectPolicy()self._transport = Noneself._agent = None

可以看到构造函数中,对新对象的部分属性进行了初始化,如主机公钥、日志、拒绝策略、传输方式和代理这些。

其中关于公钥,根据在RFC4251中的定义:

   Each server host SHOULD have a host key.  Hosts MAY have multiplehost keys using multiple different algorithms.  Multiple hosts MAYshare the same host key.  If a host has keys at all, it MUST have atleast one key that uses each REQUIRED public key algorithm (DSS[FIPS-186-2]).The server host key is used during key exchange to verify that theclient is really talking to the correct server.  For this to bepossible, the client must have a priori knowledge of the server'spublic host key.

每个服务器都有公钥,在编写链接功能时,在和服务器建立链接之前,要进行准备公钥的操作。

二、自动添加公钥的方法

当链接新的服务器时,我们不一定会准备好了公钥。这时如何处理:

ssh_client.set_missing_host_key_policy()

这个函数可以用来处理针对未知主机时,使用什么样的策略。阅读源码中的注释:

* A **policy** is a "policy class" (or instance thereof), namely somesubclass of `.MissingHostKeyPolicy` such as `.RejectPolicy` (thedefault), `.AutoAddPolicy`, `.WarningPolicy`, or a user-createdsubclass.

可以看出如果不设定的话,默认是拒绝建立链接的。所以我们可以加入以下语句:

ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

这条语句就是当链接到一个未知的主机时设置策略为,自动添加公钥策略。

如果不添加这条语句,则需要注意:链接新的服务器由于没有添加公钥,会产生报错。

三、建立链接

进行建立链接的操作:

ssh_client.connect(hostname=server_ip, port=server_port, username=server_username,password=server_password)

通过用户名和密码的方式登录主机,这种方法比较常用。不过用秘钥登录,则更方便和安全。

paramiko是怎样建立链接的呢?如下:

for af, addr in to_try:try:sock = socket.socket(af, socket.SOCK_STREAM)if timeout is not None:try:sock.settimeout(timeout)except:passretry_on_signal(lambda: sock.connect(addr))# Break out of the loop on successbreakexcept socket.error as e:# Raise anything that isn't a straight up connection error# (such as a resolution error)if e.errno not in (ECONNREFUSED, EHOSTUNREACH):raise# Capture anything else so we know how the run looks once# iteration is complete. Retain info about which attempt# this was.errors[addr] = e

paramiko通过socket库,将重复尝试对主机进行建立链接的操作。

根据retry_on_signal()函数的源码:

def retry_on_signal(function):"""Retries function until it doesn't raise an EINTR error"""while True:try:return function()except EnvironmentError as e:if e.errno != errno.EINTR:raise

当出现除了系统中断以外的异常时,会让程序停止尝试。

四、执行命令

可以选择.exec_command或者.invoke_shell函数执行命令。

def resource_query_get(connection, query_command, pty_status=False):standard_in, standard_out, standard_err = connection.exec_command(query_command, get_pty=pty_status)return standard_out

可以将需要执行的多条命令,作为一个数组循环调用函数,以自动完成预定的任务。

另外,需要注意如sar,top等非即时返回结果的命令,需要加上pty_status=True的参数。pty_status为True时,程序向服务器请求了一个伪终端。例如下面这种情况:

    server_pty_command_list = ["sar -u 2 5 | sed -n '9p' | awk '{print $3}'"]for query_command in server_pty_command_list:record_file(resource_query_get(connection, query_command, True))

我们需要取回CPU使用率的5秒内的平均取样,这条命令需要等待5秒后才会有结果,如果没有把pty_status设置为Ture,就无法取回值。

看下关于pty_status的注释:

Request a pseudo-terminal from the server.  This is usually used right
after creating a client channel, to ask the server to provide some
basic terminal semantics for a shell invoked with `invoke_shell`.
It isn't necessary (or desirable) to call this method if you're going
to execute a single command with `exec_command`.

设计者建议也可以使用invoke_shell函数来完成具有交互需求的功能。所以可以根据实际需要来选择用法,需要即时执行命令返回结果的建议使用exec_command,更复杂的交互需求则建议使用invoke_shell函数完成。

原文链接:https://blog.csdn.net/m0_66158540/article/details/123261304

python paramiko exec_command()和invoke_shell()相关推荐

  1. Python | paramiko的概念及其使用

    本文主要介绍 paramiko 的概念及其使用 1' 2' 3' 4. 本文环境 Centos 7.9, Python 3.7, Paramiko 2.7.2. Last Updated: 2022 ...

  2. python paramiko安装_Python Paramiko模块的安装与使用详解

    一.前言 常见的解决方法都会需要对远程服务器必要的配置,如果远程服务器只有一两台还好说,如果有N台,还需要逐台进行配置,或者需要使用代码进行以上操作时,上面的办法就不太方便了.而使用paramiko可 ...

  3. python paramiko并发_使用Python paramiko模块利用多线程实现ssh并发执行操作

    1.paramiko概述 ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography). 有了Paramiko以 ...

  4. python paramiko使用_python Paramiko使用示例

    Paramiko 是由 Python 语言编写的一个扩展模块,提供了基于 SSHv2 协议 (包括客户端和服务端)的多种功能实现.通常被用来远程控制类 UNIX 系统. Paramiko 可以直接使用 ...

  5. python paramiko invoke_shell_Python,paramiko,invoke_shell和丑陋的字符

    当我运行以下 Python代码时: import workflow import console import paramiko import time strComputer = 'server.c ...

  6. python paramiko长连接_【Python】 SSH连接的paramiko

    paramiko *paramiko需要PyCrypto模块的支持 paramiko支持通过SSH协议进行一些操作,比如远程执行命令,上下传文件等等 用法: ① 远程命令 ssh =paramiko. ...

  7. python paramiko 模块简介(SSH2协议)

    一:简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支 ...

  8. python paramiko并发_Python之paramiko

    一.基础 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.paramiko支持Linux, Solaris, BSD, MacOS X ...

  9. Python paramiko 模块详解与SSH主要功能模拟

    我们知道,通过SSH服务可以远程连接到Linux服务器,查看上面的日志状态,批量配置远程服务器,文件上传,文件下载等,Python的paramiko模块同样实现了这一功能. 首先我们需要安装这一模块, ...

最新文章

  1. 清华开源 Jittor:首个国内高校自研深度学习框架,一键转换 PyTorch
  2. oracle 手动批处理,Oracle 简单备份 批处理(BAT)
  3. 会计转行算法之路(一)会计转程序员
  4. Python学习:使用Python解释器
  5. linux下usb设备节点名不固定,解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点...
  6. oracle获取序列跳号,Oracle sequence跳号知多少
  7. 怎么修改监控服务器的密码,服务器状态监控怎么设置密码
  8. 木兰编程语言重现——儿歌查询实例,引用模块、字符串列表操作
  9. GSM掉话原因(网优的基础知识)
  10. position四个属性值的关系
  11. 大三计算机专业下在哪投实习简历,大三实习生简历通用模板
  12. 计算机考试系统———全套视频
  13. Oracle数据库新增字段
  14. 科普:论文上附有的 arXiv 是干嘛的
  15. iphone已停用连接itunes怎么解锁教程
  16. 八、服务器【Ubuntu】GPU-TeslaP100部署
  17. 对正在准备2022年哈尔滨工程大学计算机类考研复试的考生的一些建议
  18. Android Audio - 支持多个APK同时录音
  19. 双塔模型-语义索引策略 [In-batch Negatives]
  20. 基于Echarts的销售企业经营数据分析-散点图

热门文章

  1. 【ACDU】国产数据库有奖征文活动开始啦!发原创奖京东卡,最高可领1000元!...
  2. MySQL数据库之互联网常用架构方案(全)
  3. 替换Oracle,从阿里巴巴到亚马逊-他们在逃离什么?
  4. 解读年度数据库性能:PostgreSQL的日志文件和数据加载
  5. 盘点2018:数据和云最受欢迎的十大精品文章
  6. 那些年,我们处理过的SQL问题
  7. 带你读AI论文:基于Transformer的直线段检测
  8. LiteOS内核源码分析:任务LOS_Schedule
  9. 来不及解释!Linux常用命令大全,先收藏再说
  10. 案例解析丨Spark Hive自定义函数应用