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. B样条曲线 及 B样条曲面
  2. Redis和消息队列使用实战
  3. 同一AppDomain内的SharpGL的FrameBuffer会相互影响?
  4. pyhon字典后跟中括号
  5. Java数据结构和算法:HashMap的实现原理
  6. 【Python教程】python函数后面有多个括号的作用
  7. 故障转移集群仲裁盘_MongoDB负载均衡、故障转移及海量数据应对方案
  8. TMG自动发现功能配置正常,但客户端却检测不到TMG服务器。
  9. 让你的模型acc更上一层楼:模型trick和数据方法总结
  10. PHP 使用session实现购物车效果(点击按钮添加数据,根据数据生成列表,删除选中的商品,点击按钮时计算金额)
  11. pandas输出到excel_精通Pandas,从零基础到中级运用,看这一篇就够了
  12. javascript学习心得
  13. 52 jQuery-使用fadeIn()和fadeOut()方法实现淡入淡出效果
  14. 山东境内的自驾游景点一览表
  15. 【饥饿游戏搜索算法】基于饥饿游戏搜索算法求解单目标优化问题(HGS)含Matlab源码
  16. Redis 6.0删除节点
  17. 老男孩教育100道面试题
  18. TypeScript免费视频图文教程(2W字)
  19. FLT_MAX 和 FLT_MIN的定义
  20. 入门级Python代码实时获取股市数据

热门文章

  1. 数据 3 分钟 | TiDB 5.0 正式发布、Graph + AI 2021 全球峰会即将召开、2020 年图灵奖公布...
  2. 2场直播丨Oracle数据库SQL执行计划的取得和解析、一次特殊的 Oralce 硬解析性能问题的技术分享...
  3. 抢鲜体验:openGauss 安装编译过程要点及问题解决
  4. BethuneX:DBA最信赖的监控和智能巡检平台
  5. “互联网+”大赛之AI创新应用赛题攻略:大胆脑洞,共绘智慧生活蓝图
  6. 疫情当前,华为云数据库携手WeLink保障企业云上办公数据稳定可靠
  7. 对于Python函数与方法,你可能存在些误解
  8. 工业机器人实训耗材_工业机器人实训室
  9. 设计模式笔记二十二:空对象模式
  10. Conversion of Continuous-Valued Deep Networks to Efficient Event-Driven Networks for Image