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‘, ‘123456‘) #通过密码认证

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‘, ‘123456‘) #通过密码认证

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‘, ‘123456‘) #通过密码认证

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

时间: 2024-11-08 21:40:10

paramiko模块-2的相关文章

paramiko模块

paramiko模块 下载安装 # pycrypto,由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto # 下载安装 pycrypto wget http://files.cnblogs.com/files/wupeiqi/pycrypto-2.6.1.tar.gz tar -xvf pycrypto-2.6.1.tar.gz cd pycrypto-2.6.1 python setup.py build python setup.py install # 进

python-----堡垒机前戏paramiko模块

堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.con

python之paramiko模块

python paramiko模块 1.安装 1225 ./configure #在解压后的python2.7.9的目录下 1226 make 1227 make install 1228 cd /usr/local/ 1229 ls 1230 cd bin 1231 ls 1232 ./python 1233 python 1234 cd /usr/bin 1235 ls 1236 ll python* 1237 mv ./python ./python26 1238 ln -s /usr/l

linux系统上安装paramiko模块

Linux系统上安装paramiko模块要求python要是2.7以上的,所以在安装模块之前应该安装python2.7(这里的安装过程略去) 在安装setuptools的时候突然报错了,RuntimeError:Compression requires the (missing) zlib module原因是因为没有安装zilb和zlib-devel包. yum install zlib yum installzlib-devel 安装完成后,重新编译 python2.7[不需要删除,只需要重新

python实战第一天-paramiko模块并练习

操作系统 Ubuntu 15.10 IDE & editor JetBrains PyCharm 5.0.2 ipython3 Python版本 python-3.4.3 安装paramiko pip3 install paramiko [email protected]:~$ pip3 install paramiko Collecting paramiko Downloading paramiko-1.16.0-py2.py3-none-any.whl (169kB) 100% |█████

paramiko模块执行linux下nohup卡住的问题。

今天做一个自动化部署的时候发现,服务端通过python的paramiko模块推命令的时候卡住了,没反映了.入下图: 我客户端那边是执行一个shell脚本,脚本里用nohup来启一个python脚本(执行jar包也一样样). 排查发现执行后光标是不能跳刀终端的起始位置的,(就是$或者#后面),需要敲一个回车才行.因为nohup启动脚本或者程序时如果默认不重定向到指定文件的话,默认或有一个错误输出.所以,我们在执行nohup的时候加上重定向到nohup.out中即可(错误输出最好也重定向到标准输出)

堡垒机--paramiko模块

做堡垒机之前,来了解一下paramiko模块. 实际上底层封装的SSH. SSHclient(1) import paramiko #实例化一个ssh ssh = paramiko.SSHClient() #设置主机不在khost_key中也能连接 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #创建连接 ssh.connect(hostname='192.168.12.100',port=22,username='root'

Python paramiko 模块

paramiko模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='host', port=po

python小白-day9 数据库操作与Paramiko模块

paramiko模块 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostna

Win7下Python2.7环境安装paramiko模块(转)

Win7下Python2.7环境安装paramiko模块,经过安装并测试成功,整理文档如下: 1.下载安装Windows版本的Python2.7,我默认装在C:\Python27 我的python已经安装,这里不做python2.7的安装步骤的详解 2.下载PyCrypto2.6 for Python 2.7 64bit 地址为: http://www.voidspace.org.uk/python/modules.shtml#pycrypto 以管理员权限执行安装程序,一路Next即可 3.下