如何用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的更多相关文章

  1. paramiko模块的安装

    1.找到自己python安装的目录(默认路径:C:\Users\zhangliyuan\AppData\Local\Programs\Python\Python35) 注:cmd中所有命令 2.进入S ...

  2. python远程连接paramiko 模块和堡垒机实现

    paramiko使用 paramiko模块是基于python实现了SSH2远程安全连接,支持认证和密钥方式,可以实现远程连接.命令执行.文件传输.中间SSH代理功能 安装 pip install pa ...

  3. 利用paramiko模块实现堡垒机+审计功能

    paramiko模块是一个远程连接服务器,全真模拟ssh2协议的python模块,借助paramiko源码包中的demos目录下:demo.py和interactive.py两个模块实现简单的堡垒机+ ...

  4. 在Windows和Linux上安装paramiko模块以及easy_install的安装方法

    一.paramiko模块有什么用? paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.由于使用的是python这样的能够跨平台运行的语言 ...

  5. paramiko模块

    安装: # pycrypto,由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto (1) wget http://ftp.dlitz.net/pub/dlitz/cr ...

  6. Win7下Python2.7环境安装paramiko模块

    Win7下Python2.7环境安装paramiko模块,经过安装并测试成功,整理文档如下: 1.下载安装Windows版本的Python2.7,我默认装在C:\Python27 我的python已经 ...

  7. Python Paramiko模块与MySQL数据库操作

    Paramiko模块批量管理:通过调用ssh协议进行远程机器的批量命令执行. 要使用paramiko模块那就必须先安装这个第三方模块,仅需要在本地上安装相应的软件(python以及PyCrypto), ...

  8. paramiko模块,线程,进程

    关于paramiko模块 paramiko是基于Python实现的ssh2远程安全连接,支持认证及密钥方式远程执行命令.文件传输,中间ssh代理等 paramiko的安装: 安装好之后,用parami ...

  9. Python paramiko 模块

    paramiko模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: import paramiko # 创建SSH对象 ssh ...

随机推荐

  1. 【巩固】Bootstrap笔记三

    这段笔记介绍了bootstrp中以下几点应用点: 警告框的使用 面板功能 运用chart.js制作图表 进度条的制作 媒体对象的制作 有一个元素如果有属性alert-dismissible" ...

  2. linux下tomcat的安装和配置

    安装前要求: 1. 安装java环境. 2. 配置java环境变量 开始了: 1. 在官网下载tomcat:http://tomcat.apache.org/ 2. linux环境选择.zip或者.t ...

  3. 错误: 未能从 xmlsocket://127.0.0.1:5840 中加载策略文件

    看看你是否使用了MonsterDebugger,如果是这样的话, 因为那个 MonsterDebugger 没有启动 删掉MonsterDebugger的代码吧

  4. C#如何获取CPU处理器核心数量 z

    有几条不同的处理器信息,您可以获得有关的信息:物理处理器数量.核心数量和逻辑处理器数量,这些可以不同.两颗双核超线程(启用)处理器的机器情况下有:2个物理处理器.4个核心和8个逻辑处理器. 逻辑处理器 ...

  5. Windows消息机制知识点总结

    1.windows消息类型 以下四种,前三种是系统消息,范围在[0x0000, 0x03ff],第四种是用户自定义消息. 1.1 窗口消息 与窗口的内部运作有关,如创建窗口,绘制窗口,销毁窗口等.可以 ...

  6. Erlang初学

    这篇文章主要介绍了Erlang初学:Erlang的一些特点和个人理解总结,本文总结了函数式编程.一切都是常量.轻量进程.进程端口映射及典型缺点等内容,需要的朋友可以参考下 我对 Erlang 编程理念 ...

  7. C#获取网页内容的三种方式

    C#通常有三种方法获取网页内容,使用WebClient.WebBrowser或者HttpWebRequest/HttpWebResponse... 方法一:使用WebClient (引用自:http: ...

  8. vs2012中添加lib,.h文件方法(原)

    项目.属性.C/C++.附加包含目录:填写附加头文件(*.h)所在目录 分号间隔多项项目.属性.链接器.附加库目录:填写附加依赖库(*.lib)所在目录 分号间隔多项项目.属性.链接器(点前面的+展开 ...

  9. Android狂记忆

    虽然说技术人员偏爱实战,而不屑理论或记忆,但实战之前,若是记忆一些知识,开发起来将会如虎添翼,不说了,开始狂记吧! Android 系统包说明: android.app  :提供高层的程序模型.提供基 ...

  10. Qt编程之mapx组件编程

    今天利用组件打包程序写了一些小例子,给大家贴出来,顺便提高一下记忆. 上一篇介绍了直接使用控件和使用控件打包程序对控件进行编程的方法.个人感觉后者编程更方便.不说废话了: 头文件中所需要的类型指针对象 ...