一、基础功能介绍

# coding=utf-8
import paramiko
from time import sleep # 建立通信
transport = paramiko.Transport(('192.168.0.7', 22))
print(transport) # <paramiko.Transport at 0x5745ed0 (unconnected)> # 建立连接
transport.connect(username='root', password='123456')
print(transport) # <paramiko.Transport at 0x5745ed0 (cipher aes128-ctr, 128 bits) (active; 0 open channel(s))>
# 注意 active 此时为0 # 开启一个信道
channel = transport.open_session()
print(channel) # <paramiko.Channel 0 (open) window=0 -> <paramiko.Transport at 0x5745ed0 (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>
# 调用open_session后,active为1,表示已打开channel。此时只能下发命令,收不到回显 # 设置信道获取信息的超时时间。因为在调用 channel.recv(65535) 方法时 会阻塞执行,不设置就会卡死。
channel.timeout = 10 # 开启终端,进入交互模式
channel.get_pty()
channel.invoke_shell() sleep(2) # 是为了一次能显示完所有回显,如果不等待2秒,获取的回显可能不完整。 # 检查通道是否有数据。若没有,则返回False,注意:不能用来判断已回显完。当下发命令后,执行出现卡顿,在卡顿期间信道是没有数据的。
channelStatus = channel.recv_ready()
print(channelStatus) # 此时返回True # 获取返回的数据。此时返回的是登陆信息。注意:当信道没有数据是,若直接获取,则会处于阻塞状态
backMsg = channel.recv(65535).decode('utf-8') # 使用recv读取in-buffer内容,65535表示预读取内容大小,若该值小于in-buffer值,则会读取不完全
print(backMsg) # 下发命令,命令后需追加\n表示发送命令
channel.send("10.27.0.7 \r")
sleep(2)
backMsg = channel.recv(65535).decode('utf-8')
print(backMsg) channel.send("mysql22001 \r")
sleep(2)
backMsg = channel.recv(65535).decode('utf-8')
print(backMsg) channel.send("quit; \r")
sleep(2)
backMsg = channel.recv(65535).decode('utf-8')
print(backMsg) # 关闭信道
channel.close() # 关闭连接
transport.close()

二、简单封装

import paramiko
import time class SSH(object): def __init__(self):
self.__transport = None
self.__channel = None
self.__default_end_check_infos = ["[root@"] def connect(self, host, port, username, password, **kwargs):
# 建立通信
self.__transport = paramiko.Transport((host, port)) # 建立连接
self.__transport.connect(username=username, password=password) # 开启一个信道
self.__channel = self.__transport.open_session()
self.__channel.timeout = 10 # 开启终端,进入交互模式
self.__channel.get_pty()
self.__channel.invoke_shell()
return self.__echo(**kwargs) def disconnect(self):
self.__channel.close()
self.__transport.close() def exec_cmd(self, cmd, **kwargs):
self.__channel.send("%s \r" % cmd)
return self.__echo(**kwargs) def set_echo_end_check_info(self, end_check_info=None):
""" 设置回显校验信息 """
if end_check_info is not None:
if isinstance(end_check_info, str):
self.__default_end_check_infos.append(end_check_info)
if isinstance(end_check_info, list):
self.__default_end_check_infos = self.__default_end_check_infos + end_check_info
return self.__default_end_check_infos def __echo(self, timeout=10, interval=0.5):
""" 获取回显 """
t0 = time.time()
echo = ""
while time.time()-t0 < timeout:
if self.__channel.recv_ready() is True:
_echo = self.__channel.recv(65535).decode('utf-8')
echo += _echo
for end_check_info in self.__default_end_check_infos:
if end_check_info in echo:
print(echo)
time.sleep(0.5)
return echo
time.sleep(interval)
self.disconnect()
raise RuntimeError("获取预期回显超时!") if __name__ == '__main__':
ssh_session = SSH()
ssh_session.set_echo_end_check_info(["Opt>"])
ssh_session.set_echo_end_check_info("MySQL")
ssh_session.connect('192.168.0.7', 22, 'root', '123456')
ssh_session.exec_cmd("10.27.0.7")
ssh_session.exec_cmd("mysql22001")
ssh_session.exec_cmd("quit;")
ssh_session.disconnect()

执行结果:

Python_paramiko-与linux交互的更多相关文章

  1. SCP服务实现Linux交互

    SCP服务实现Linux交互 在实际工作中,我们可以使用scp服务器进行Linux与Linux之间的信息交互. 基本指令: scp         本地文件     远程文件 scp          ...

  2. 关于Linux 交互(用户操作接口)

    Linux 系统提供两种基本接口给用户操作:命令行,图形界面. 不同接口也有相应的访问终端. 一.命令行 Command Line Linux系统命令行,一般指 Shell. Shell 接受经键盘输 ...

  3. linux交互执行命令,expect

    转载 http://donex.blog.51cto.com/2005970/834467 原文比较乱,只能参考 本地交互执行: 1. 修改shell#!/usr/bin/expectset USER ...

  4. ant使用ssh和linux交互 如:上传文件

    http://jiajun.iteye.com/blog/741001 http://blog.csdn.net/xymyeah/article/details/4098073 http://blog ...

  5. java使用jsch连接linux

    由于项目需要使用java来linux进行管理,近一番查找,发现第三方jar包 jsch 可以轻松实现对linux的管理,(相关文档及例子请访问官网www.jcraft.com),故引进. 在网上搜索了 ...

  6. Windows10上使用Linux子系统(WSL)

    Linux的Windows子系统让开发人员可以直接在Windows上运行Linux环境(包括大多数命令行工具,实用程序和应用程序),而无需建立在虚拟机的开销之上,整个系统共200多M,但包含了你能用到 ...

  7. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  8. linux下read命令详解

    要与Linux交互,脚本获取键盘输入的结果是必不可少的,read可以读取键盘输入的字符. read [-rs] [-a ARRAY] [-d delim] [-n nchars] [-N nchars ...

  9. linux操作系统5 shell编程

    知识内容: 1.shell编程预备知识 2.shell变量 3.表达式与运算符 4.分支循环语句 5.函数 一.shell编程预备知识 1.什么是shell编程 shell是与linux交互的基本工具 ...

  10. Linux Shell脚本简介

    Shell 诞生于 Unix,是与 Unix/Linux 交互的工具,单独地学习 Shell 是没有意义的,请先参考Unix/Linux入门教程,了解 Unix/Lunix 基础. 近几年来,Shel ...

随机推荐

  1. centos7.4 64位安装 redis-4.0.0

    1.  下载 redis 包 链接:https://pan.baidu.com/s/1g1UE_GTreXoD9uOXB7G3HA 提取码:ug8p 2. 安装gcc.ruby .rubygems等环 ...

  2. 【Linux】【Services】【Web】Haproxy

    1. 概念 1.1. 官方网站 http://www.haproxy.org/ 2. 安装 yum安装 yum -y install haproxy keepalived 配置haproxy日志,修改 ...

  3. spring cloud config center Git SSH configuration

    Git SSH configuration using properties By default, the JGit library used by Spring Cloud Config Serv ...

  4. springmvc中的异常处理方法

    //1.自定义异常处理类       2.编写异常处理器    3.配置异常处理器 package com.hope.exception;/** * 异常处理类 * @author newcityma ...

  5. Snort 入侵检测系统

    Snort 入侵检测系统 一.实验目的 1.掌握snort IDS工作原理 2.应用snort 三种方式工作 二.实验环境 系统环境:Windows环境, kali环境 三.实验原理 1.snort ...

  6. Jsp/servlet分页五要素

    分页5要素: * 1)pageIndex 当前页 * 2)startIndex 从第几条数据开始 * 3)countAll 总条目数 * 4)pageSize 每页大小 * 5)pageCount 总 ...

  7. vue文件上传及压缩(canvas实现压缩)

    // 读取文件结果 afterRead(files) { let that = this; let file = files.file; if (file === undefined) { retur ...

  8. KubeCon 2021|使用 eBPF 代替 iptables 优化服务网格数据面性能

    作者 刘旭,腾讯云高级工程师,专注容器云原生领域,有多年大规模 Kubernetes 集群管理及微服务治理经验,现负责腾讯云服务网格 TCM 数据面产品架构设计和研发工作. 引言 目前以 Istio[ ...

  9. mobile app 与server通信的四种方式

    Have you ever wondered how the information gets into the application installed in your mobile device ...

  10. (转)synchronize线程同步例子

    在CSDN开了博客后,一直也没在上面发布过文章,直到前一段时间与一位前辈的对话,才发现技术博客的重要,立志要把CSDN的博客建好.但一直没有找到好的开篇的主题,今天再看JAVA线程互斥.同步的时候又有 ...