paramiko模块-2
如何用paramiko模块模拟登入服务器,并记录操作日志,起到审计的作用?
各个client ---(连接跳转机)--->(跳转机)------>各自的目标服务器。
目前我们公司的跳转机,只有跳转的功能(外网--->内网),没有其他功能。
可以用如下的demo进行日志记录等操作:
脚本登入服务器:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import paramiko
import os
import sys
import select
import socket tran = paramiko.Transport(('10.1.1.10', 22,))
tran.start_client() '''
#使用密钥认证
default_path = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
key = paramiko.RSAKey.from_private_key_file(default_path)
tran.auth_publickey('lbsweb', key) '''
tran.auth_password('ganzl', '') #通过密码认证 chan = tran.open_session()# 打开一个通道
chan.get_pty()# 获取一个终端
chan.invoke_shell()# 激活器 '''
chan创建的通道,用于接收服务器返回信息
利用sys.stdin,肆意妄为执行操作,用户在终端输入内容,并将内容发送至远程服务器
远程服务器执行命令,并将结果返回,用户终端显示内容.
'''
while True:
readable, writeable, error = select.select([chan, sys.stdin, ],[],[],1) # sys.stdin 处理用户输入
#只要发生变化,chan或者stdin或者都变化
if chan in readable: #远端有变化后捕获到
try:
x = chan.recv(1024) #Transport的对象调用的start_client方法,就是sorcket,看这个start_client方法。
if len(x) == 0:
print '\r\n*** EOF\r\n',
break
sys.stdout.write(x)#把内容输入到终端上显示
sys.stdout.flush()
except socket.timeout:
pass
if sys.stdin in readable: #当终端有输入捕获到之后
inp = sys.stdin.readline() #把用户的那一行输入
chan.sendall(inp) #发送命令至远端 chan.close()
tran.close()
脚本登入服务器并写日志:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import paramiko
import os
import sys
import select
import socket tran = paramiko.Transport(('10.1.1.10', 22,))
tran.start_client()
'''
#使用密钥认证
default_path = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
key = paramiko.RSAKey.from_private_key_file(default_path)
tran.auth_publickey('lbsweb', key)
'''
tran.auth_password('ganzl', '') #通过密码认证 chan = tran.open_session()# 打开一个通道
chan.get_pty()# 获取一个终端
chan.invoke_shell()# 激活器
file_log = open('log','a')
'''
chan创建的通道,用于接收服务器返回信息
利用sys.stdin,肆意妄为执行操作,用户在终端输入内容,并将内容发送至远程服务器
远程服务器执行命令,并将结果返回,用户终端显示内容.
'''
while True:
readable, writeable, error = select.select([chan, sys.stdin, ],[],[],1) # sys.stdin 处理用户输入
#只要发生变化,chan或者stdin或者都变化
if chan in readable: #远端有变化后捕获到
try:
x = chan.recv(1024) #Transport的对象调用的start_client方法,就是sorcket,看这个start_client方法。
if len(x) == 0:
print '\r\n*** EOF\r\n',
break
sys.stdout.write(x)#把内容输入到终端上显示
sys.stdout.flush()
except socket.timeout:
pass
if sys.stdin in readable: #当终端有输入捕获到之后
inp = sys.stdin.readline() #把用户的那一行输入
file_log.write(inp)
chan.sendall(inp) #发送命令至远端 file_log.close()
chan.close()
tran.close()
脚本登入服务器,并且能操作[tab]等特殊键:(我的环境下日志写入有问题 python --version:Python 2.6.6)
这个修改终端模式,会不会对写日志有影响,再学习实验!!!待完善。
#!/usr/bin/env python
#-*- coding:utf-8 -*- import paramiko
import os
import sys
import select
import socket
import termios
import tty tran = paramiko.Transport(('10.1.1.10', 22,))
tran.start_client()
'''
#使用密钥认证
default_path = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
key = paramiko.RSAKey.from_private_key_file(default_path)
tran.auth_publickey('lbsweb', key)
'''
tran.auth_password('ganzl', '') #通过密码认证 chan = tran.open_session()# 打开一个通道
chan.get_pty()# 获取一个终端
chan.invoke_shell()# 激活器 # 获取原tty属性
oldtty = termios.tcgetattr(sys.stdin)
try:
# 为tty设置新属性
# 默认当前tty设备属性:
# 输入一行回车,执行
# CTRL+C 进程退出,遇到特殊字符,特殊处理。 # 这是为原始模式,不认识所有特殊符号
# 放置特殊字符应用在当前终端,如此设置,将所有的用户输入均发送到远程服务器
tty.setraw(sys.stdin.fileno()) #把远端更换为LINUX原始模式
chan.settimeout(0.0)
file_log = open('log','a')
while True:
# 监视 用户输入 和 远程服务器返回数据(socket)
# 阻塞,直到句柄可读
r, w, e = select.select([chan, sys.stdin], [], [], 1)
if chan in r:
try:
x = chan.recv(1024)
if len(x) == 0:
file_log.close()
print '\r\n*** EOF\r\n',
break
sys.stdout.write(x)
sys.stdout.flush()
except socket.timeout:
pass
if sys.stdin in r:
x = sys.stdin.read(1)
if len(x) == 0:
break
if x == '\t': #判断用户的是否为tab如果为tab将不记录
pass
else:
file_log.write(x)#如果用户输入的命令保存至日志
chan.send(x) finally:
# 重新设置终端属性
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
chan.close()
tran.close()
windows下的操作:(我暂时用不到,等学到web操作终端的时候再回头看。)
def windows_shell(chan):
import threading sys.stdout.write("Line-buffered terminal emulation. Press F6 or ^Z to send EOF.\r\n\r\n") def writeall(sock):
while True:
data = sock.recv(256)
if not data:
sys.stdout.write('\r\n*** EOF ***\r\n\r\n')
sys.stdout.flush()
break
sys.stdout.write(data)
sys.stdout.flush() writer = threading.Thread(target=writeall, args=(chan,))
writer.start() try:
while True:
d = sys.stdin.read(1)
if not d:
break
chan.send(d)
except EOFError:
# user hit ^Z or F6
pass
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import paramiko
import sys
import threading tran = paramiko.Transport(('10.1.1.10'', 22,))
tran.start_client()
tran.auth_password('ganzl', '123456!') #通过密码认证
chan = tran.open_session()# 打开一个通道
chan.get_pty()# 获取一个终端
chan.invoke_shell()# 激活器 sys.stdout.write("Line-buffered terminal emulation. Press F6 or ^Z to send EOF.\r\n\r\n") def writeall(sock):
while True:
data = sock.recv(256)
'''
SSH发送数据的也是通过socket进行发送数据的,那么我们就可以使用socket来获取远程机器发送回来的数据。
while循环一直接收数据,sock.recv(256)是阻塞的只有数据过来的时候才会继续走。
'''
if not data:
sys.stdout.write('\r\n*** EOF ***\r\n\r\n')
sys.stdout.flush()
break
sys.stdout.write(data)
sys.stdout.flush() writer = threading.Thread(target=writeall, args=(chan,)) #创建了一个线程,去执行writeall方法,参数为chan(建立的SSH连接)
writer.start() try:
while True: #主线程循环
d = sys.stdin.read(1) #一直监听用户的输入,输入一个发送一个
if not d:
break
chan.send(d)
except EOFError:
# user hit ^Z or F6
pass chan.close()
tran.close()
paramiko操作的更多详细,请看:
http://www.cnblogs.com/wupeiqi/articles/5095821.html
http://pythonpeixun.blog.51cto.com/7195558/1213929
paramiko模块-2的更多相关文章
- paramiko模块的安装
1.找到自己python安装的目录(默认路径:C:\Users\zhangliyuan\AppData\Local\Programs\Python\Python35) 注:cmd中所有命令 2.进入S ...
- python远程连接paramiko 模块和堡垒机实现
paramiko使用 paramiko模块是基于python实现了SSH2远程安全连接,支持认证和密钥方式,可以实现远程连接.命令执行.文件传输.中间SSH代理功能 安装 pip install pa ...
- 利用paramiko模块实现堡垒机+审计功能
paramiko模块是一个远程连接服务器,全真模拟ssh2协议的python模块,借助paramiko源码包中的demos目录下:demo.py和interactive.py两个模块实现简单的堡垒机+ ...
- 在Windows和Linux上安装paramiko模块以及easy_install的安装方法
一.paramiko模块有什么用? paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.由于使用的是python这样的能够跨平台运行的语言 ...
- paramiko模块
安装: # pycrypto,由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto (1) wget http://ftp.dlitz.net/pub/dlitz/cr ...
- Win7下Python2.7环境安装paramiko模块
Win7下Python2.7环境安装paramiko模块,经过安装并测试成功,整理文档如下: 1.下载安装Windows版本的Python2.7,我默认装在C:\Python27 我的python已经 ...
- Python Paramiko模块与MySQL数据库操作
Paramiko模块批量管理:通过调用ssh协议进行远程机器的批量命令执行. 要使用paramiko模块那就必须先安装这个第三方模块,仅需要在本地上安装相应的软件(python以及PyCrypto), ...
- paramiko模块,线程,进程
关于paramiko模块 paramiko是基于Python实现的ssh2远程安全连接,支持认证及密钥方式远程执行命令.文件传输,中间ssh代理等 paramiko的安装: 安装好之后,用parami ...
- Python paramiko 模块
paramiko模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: import paramiko # 创建SSH对象 ssh ...
随机推荐
- 深入理解Session与Cookie
Session与cookie的作用都是为了保持访问用户与后端服务器的交互状态. cookie通过把所有要保存的数据通过HTTP协议的头部从客户端传递到服务端,又从服务端再传回到客户端,所有的数据都存储 ...
- 生成均值文件mean.binaryproto
[感谢:http://www.cnblogs.com/denny402/p/5102328.html] compute_image_mean.bin生成均值文件mean.binaryproto: ca ...
- ubuntu14.04 python自带版本升级
ubuntu14.04 python自带版本升级 sudo add-apt-repository ppa:fkrull/deadsnakes-python2. sudo apt-get update ...
- Knock: 使用压电传感器来检测敲击
原文链接:https://www.arduino.cc/en/Tutorial/Knock 敲击检测 本教程介绍如何使用压电传感器检测振动,比如敲门.桌子或其他固体表面. 压电传感器是一种能够在振动. ...
- Emergency(山东省第一届ACM省赛)
Emergency Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 Kudo’s real name is not Kudo. H ...
- 读取nutch爬取内容方法
读取nutch内容有如下两种方法: 1 通过Nutch api SegmentReader读取. public Content readSegment(String segPath,String ur ...
- 十三、File Translator怎么写
---恢复内容开始--- 1. File Translator可以将信息从maya中导入和导出. 2. 创建一个file translator需要从MPxFileTranslator继承. 3. 函数 ...
- (Hibernate进阶)Hibernate映射——一对一单向关联映射(五)
映射原理 两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应.例如:一个人(Person)只有一张身份证(IdCard).我们看一下这个例子的对象模型,如下图所示: 对象模型 ...
- 12,SFDC 管理员篇 - 页面配置
1, 添加Tab Setup | Create | Tab 通过Tab我们可以为我们新建的表对象添加访问路径 2,创建自定义按钮 我们想在Account 中添加一个自定义按钮,去链接外部页面,也可 ...
- leetcode174. Dungeon Game
// learn from https://discuss.leetcode.com/topic/6912/c-dp-solution ''' class Solution { public: int ...