Python

用paramiko 写个简单的SSH堡垒机

2018-08-21  本文已影响30人  wsf535

代码如下

#!/usr/bin/env python
# -*-coding=utf-8-*-
import paramiko
import sys
import socket
#windows没有termios的包
try:
    import termios
    import tty
    has_termios = True
except ImportError:
    has_termios = False

def interactive_shell(chan):
    if has_termios:
        posix_shell(chan)
    else:
        windows_shell(chan)


def posix_shell(chan):
    import select

    oldtty = termios.tcgetattr(sys.stdin)
    try:
        tty.setraw(sys.stdin.fileno())
        tty.setcbreak(sys.stdin.fileno())
        chan.settimeout(0.0)
        f = open('handle.log','a+')
        tab_flag = False
        while True:
            r, w, e = select.select([chan, sys.stdin], [], [])
            if chan in r:
                try:
                    x = chan.recv(1024)
                    if len(x) == 0:
                        sys.stdout.write('\r\n*** EOF\r\n')
                        break
                    if tab_flag:
                        if x.startswith('\r\n'):
                            pass
                        else:
                            f.write(x)
                            f.flush()
                        tab_flag = False
                    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_flag = True
                else:
                    f.write(x)
                    f.flush()
                chan.send(x)

    finally:
        termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)


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

def run():
    # 获取当前登录用户
    host_list = [
        {'host': "192.168.16.135",'hostname':'testserver1', 'username': 'root', 'pwd': "abcd1234"},
        {'host': "192.168.16.136",'hostname':'testserver2','username': 'root', 'pwd': "abcd1234"},
    ]
    print "seq  hostname    ip_address"
    for i,item in enumerate(host_list,1):
        print i,item['hostname'],item['host']
    num = raw_input('序号:')
    sel_host = host_list[int(num)-1]
    hostname = sel_host['host']
    username = sel_host['username']
    pwd = sel_host['pwd']
    tran = paramiko.Transport((hostname, 22,))
    tran.start_client()
    tran.auth_password(username, pwd)
    chan = tran.open_session()
    chan.get_pty()
    chan.invoke_shell()
    interactive_shell(chan)
    chan.close()
    tran.close()

if __name__ == '__main__':
    run()

测试效果:
1、运行脚本:


1

2、选择服务器,进入服务器后执行命令


2
上一篇下一篇

猜你喜欢

热点阅读