Python_paramiko-与linux交互
一、基础功能介绍
# 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交互的更多相关文章
- SCP服务实现Linux交互
SCP服务实现Linux交互 在实际工作中,我们可以使用scp服务器进行Linux与Linux之间的信息交互. 基本指令: scp 本地文件 远程文件 scp ...
- 关于Linux 交互(用户操作接口)
Linux 系统提供两种基本接口给用户操作:命令行,图形界面. 不同接口也有相应的访问终端. 一.命令行 Command Line Linux系统命令行,一般指 Shell. Shell 接受经键盘输 ...
- linux交互执行命令,expect
转载 http://donex.blog.51cto.com/2005970/834467 原文比较乱,只能参考 本地交互执行: 1. 修改shell#!/usr/bin/expectset USER ...
- ant使用ssh和linux交互 如:上传文件
http://jiajun.iteye.com/blog/741001 http://blog.csdn.net/xymyeah/article/details/4098073 http://blog ...
- java使用jsch连接linux
由于项目需要使用java来linux进行管理,近一番查找,发现第三方jar包 jsch 可以轻松实现对linux的管理,(相关文档及例子请访问官网www.jcraft.com),故引进. 在网上搜索了 ...
- Windows10上使用Linux子系统(WSL)
Linux的Windows子系统让开发人员可以直接在Windows上运行Linux环境(包括大多数命令行工具,实用程序和应用程序),而无需建立在虚拟机的开销之上,整个系统共200多M,但包含了你能用到 ...
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
- linux下read命令详解
要与Linux交互,脚本获取键盘输入的结果是必不可少的,read可以读取键盘输入的字符. read [-rs] [-a ARRAY] [-d delim] [-n nchars] [-N nchars ...
- linux操作系统5 shell编程
知识内容: 1.shell编程预备知识 2.shell变量 3.表达式与运算符 4.分支循环语句 5.函数 一.shell编程预备知识 1.什么是shell编程 shell是与linux交互的基本工具 ...
- Linux Shell脚本简介
Shell 诞生于 Unix,是与 Unix/Linux 交互的工具,单独地学习 Shell 是没有意义的,请先参考Unix/Linux入门教程,了解 Unix/Lunix 基础. 近几年来,Shel ...
随机推荐
- Kafaka相关命令
开启zookeeper命令(备注:先进入zookeeper的bin目录) ./zkServer.sh start 关闭zookeeper命令(备注:先进入zookeeper的bin目录) ./zkSe ...
- 动态规划系列(零)—— 动态规划(Dynamic Programming)总结
动态规划三要素:重叠⼦问题.最优⼦结构.状态转移⽅程. 动态规划的三个需要明确的点就是「状态」「选择」和「base case」,对应着回溯算法中走过的「路径」,当前的「选择列表」和「结束条件」. 某种 ...
- Apache Log4j2远程代码执行漏洞攻击,华为云安全支持检测拦截
近日,华为云安全团队关注到Apache Log4j2 的远程代码执行最新漏洞.Apache Log4j2是一款业界广泛使用的基于Java的日志工具,该组件使用范围广泛,利用门槛低,漏洞危害极大.华为云 ...
- 全网最详细的AbstractQueuedSynchronizer(AQS)源码剖析(二)资源的获取和释放
上期的<全网最详细的AbstractQueuedSynchronizer(AQS)源码剖析(一)AQS基础>中介绍了什么是AQS,以及AQS的基本结构.有了这些概念做铺垫之后,我们就可以正 ...
- hibernate多对多单向(双向)关系映射
n-n(多对多)的关联关系必须通过连接表实现.下面以商品种类和商品之间的关系,即一个商品种类下面可以有多种商品,一种商品又可以属于多个商品种类,分别介绍单向的n-n关联关系和双向的n-n关联关系. 单 ...
- 罗德与施瓦茨公司和TSN Systems公司为车载以太网提供纳秒级精度延时测量
前言 随着毫米波雷达.激光雷达和摄像头等传感器的大量出现,并要求海量的传感器数据在几毫秒内传输完成并处理,使得网络延迟问题变得越发重要.测试和测量的专家Rohde&Schwarz(以下简称R& ...
- 从 CPython 源码角度看 Python 垃圾回收机制
环状双向链表 refchain 在 Python 程序中创建的任何对象都会被放到 refchain 链表中,当创建一个 Python 对象时,内部实际上创建了一些基本的数据: 上一个对象 下一个对象 ...
- UMDCTF 2021
6道pwn题,4道可以做.剩下一道题是arm架构,一道题是内核,溜了溜了. Jump_Not_Easy 1 from pwn import * 2 3 p = process('./pwn') 4 e ...
- [BUUCTF]REVERSE——SimpleRev
SimpleRev 附件 步骤: 例行查壳儿,,无壳,64位程序 64位ida载入,看main函数 关键代码段在Decry函数里 unsigned __int64 Decry() { char v1; ...
- Windwos堆管理体系以及溢出利用
<0day安全>学习笔记,主要讨论WIndows2000~WIndowsSP1平台的堆管理策略. 0X01 堆与栈的区别 栈空间是在程序设计时已经规定好怎么使用,使用多少内存空间.典型的栈 ...