一、基础功能介绍

# 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. MySQL 用户权限相关命令

    ##1.创建用户: create user test identified by '123456';##identified后面跟密码 ##2.查询所有用户: select user from mys ...

  2. 二叉搜索树、平衡二叉树、红黑树、B树、B+树

    完全二叉树: 空树不是完全二叉树,叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部.如果遇到一个结点,左孩子不为空,右孩子为空:或者左右孩子都为空:则该节点之后的队列中的结点都为叶子 ...

  3. Apifox(2)快速上手apifox

    快速上手 使用场景 Apifox 是接口管理.开发.测试全流程集成工具,使用受众为整个研发技术团队,主要使用者为前端开发.后端开发和测试人员. 前端开发 接口文档管理 接口数据 Mock 接口调试 前 ...

  4. TSN(Time-Sensitive Networking)协议导读

    前言 上一个主题我们介绍了TSN的发展历史和协议族现状,它为建立统一的确定性网络传输基础设施提供了有力保障. TSN是一套协议标准,以保证确定性信息在标准以太网的不同场景下的顺利传输.TSN协议族本身 ...

  5. [BUUCTF]REVERSE——Java逆向解密

    Java逆向解密 附件 步骤: 根据题目提示是java语言编写的程序,用jd-gui反编译一下 百度了一些java里的函数后读懂了这段程序的意思,将我们输入的字符串依次+'@',然后跟32异或,得到K ...

  6. java 数据类型:枚举类enum、对比方法compreTo()、获取名字.name()、获取对应值的枚举类Enum.valueOf()、包含构造方法和抽象方法的enum;实现接口;

    问题引入 为了将某一数据类型的值限定在可选的合理范围内,比如季节只有四个:春夏秋冬. 什么是枚举类 Java5之后新增了enum关键字(他与class,interface关键字地位相同)用来定义枚举类 ...

  7. Django的安全机制 CSRF 跨站请求访问

    跨站请求伪造 一.简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防 ...

  8. Spring学习(二)三种方式的依赖注入

    1.前言 上一篇讲到第一个Spring项目的创建.以及bean的注入.当然.注入的方式一共有三种.本文将展开细说. 1.set注入:本质是通过set方法赋值 1.创建老师类和课程类 1.Course ...

  9. 使用JS对字符串进行MD5加密

    md5.js /* * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message * Digest Algorith ...

  10. 【九度OJ】题目1199:找位置 解题报告

    [九度OJ]题目1199:找位置 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1199 题目描述: 对给定的一个字符串,找出有重复的 ...