python登录linux服务器脚本

写一个python登录脚本   需要一个配置文件  里面需要写一个字典  字典里面包含有需要登录机器的账号密码以及IP地址还有端口

#coding: utf-8
import MySQLdb
import sys
import os 
import re
import time
import paramiko
import struct
import fcntl
import select 
import textwrap
import pexpect
import subprocess
import socket
import signal

LOGIN_NAME = 'panzi'
from serverinfo import *

class ServerError(Exception):
    pass

try:
    import termios
    import tty
except ImportError:
    print '\033[1;31mOnly UnixLike supported.\033[0m'
    time.sleep(3)
    sys.exit()

def get_win_size():
    """This function use to get the size of the windows!"""
    if 'TIOCGWINSZ' in dir(termios):
        TIOCGWINSZ = termios.TIOCGWINSZ
    else:
        TIOCGWINSZ = 1074295912L  # Assume
    s = struct.pack('HHHH', 0, 0, 0, 0)
    x = fcntl.ioctl(sys.stdout.fileno(), TIOCGWINSZ, s)
    return struct.unpack('HHHH', x)[0:2]

def posix_shell(chan, username, host):
    """
    Use paramiko channel connect server interactive.
    """
    old_tty = termios.tcgetattr(sys.stdin)
    try:
        tty.setraw(sys.stdin.fileno())
        tty.setcbreak(sys.stdin.fileno())
        chan.settimeout(0.0)
        
        while True:
            try:
                r, w, e = select.select([chan, sys.stdin], [], [])
            except:
                pass

            if chan in r:
                try:
                    x = chan.recv(1024)
                    if len(x) == 0:
                        break
                    sys.stdout.write(x)
                    sys.stdout.flush()
                except socket.timeout:
                    pass

            if sys.stdin in r:
                x = os.read(sys.stdin.fileno(), 1)
                if len(x) == 0:
                    break
                chan.send(x)

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



def set_win_size(sig, data):
    """This function use to set the window size of the terminal!"""
    try:
        win_size = get_win_size()
        channel.resize_pty(height=win_size[0], width=win_size[1])
    except:
        pass

def sigwinch_passthrough(sig, data):
    winsize=get_win_size()
    global foo
    foo.setwinsize(winsize[0],winsize[1])

def print_prompt():
    msg="""
    1) 查看非开放平台机器的服务器 \033[32mE/e\033[0m
    2) 进入页游请输入 \033[32mY/y\033[0m
    3) 进入手游请输入 \033[32mS/s\033[0m
    4) 进入其他机器请输入 \033[32mH/h\033[0m
    5)退出请输入 \033[32mQ/q\033[0m 
    """
    print textwrap.dedent(msg)

def connect(username,password,host,port,login_name):
    ps1 = "PS1='[\u@%s \W]\$ '\n" % host
    login_msg = "clear;echo -e '\\033[32mLogin %s done. Enjoy it.\\033[0m'\n" % host
    
    ssh = paramiko.SSHClient()
    ssh.load_system_host_keys()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        ssh.connect(host, port=port, username=username, password=password, compress=True)
#        ssh.connect(host, port=port, username=username, password=password)
    except paramiko.ssh_exception.AuthenticationException, paramiko.ssh_exception.SSHException:
        raise ServerError('Authentication Error.')
    except socket.error:
        raise ServerError('Connect SSH Socket Port Error, Please Correct it.')
    
    global channel
    win_size = get_win_size()
    channel = ssh.invoke_shell(height=win_size[0], width=win_size[1])
    try:
        signal.signal(signal.SIGWINCH, set_win_size)
    except:
        pass

    # Set PS1 and msg it
    channel.send(ps1)
    channel.send(login_msg)

    # Make ssh interactive tunnel
    posix_shell(channel, login_name, host)

    # Shutdown channel socket
    channel.close()
    ssh.close()


def verify_connect(username, part_ip):
    ip_matched = []
    try:
        hosts_attr = get_user_host(username)
        hosts = hosts_attr.values()
    except ServerError, e:
        color_print(e, 'red')
        return False

    for ip_info in hosts:
        for info in ip_info[1:]:
            if part_ip in info:
                ip_matched.append(ip_info[1])

    ip_matched = list(set(ip_matched))
    if len(ip_matched) > 1:
        for ip in ip_matched:
            print '%-15s -- %s' % (ip, hosts_attr[ip][2])
    elif len(ip_matched) < 1:
        color_print('No Permission or No host.', 'red')
    else:
        username, password, host, port = get_connect_item(username, ip_matched[0])
        connect(username, password, host, port, LOGIN_NAME)

def connectto(username,password,host):
    username=username
    password=password
    ip=host
    global foo
    try:
        foo = pexpect.spawn('/usr/bin/ssh -q -o StrictHostKeyChecking=no %s@%s -p36001' % (username,ip))
        foo.expect('.*ssword:')
        foo.sendline(password)
        signal.signal(signal.SIGWINCH, sigwinch_passthrough)
        size = get_win_size()
        foo.setwinsize(size[0], size[1])
        foo.interact() 
    except socket.error:
        raise ServerError('Connect SSH Socket Port Error, Please Correct it.')
    except Exception,e:
        print e

def connectly(username,password,host,port):
    username=username
    password=password
    ip=host
    port=port
    global foo
    try:
        foo = pexpect.spawn('/usr/bin/ssh -q -o StrictHostKeyChecking=no %s@%s -p%s' % (username,ip,port))
#        foo = pexpect.spawn('/usr/bin/ssh  %s@%s -p%s' % (username,ip,port))
        foo.expect('.*ssword:')
        foo.sendline(password)
        signal.signal(signal.SIGWINCH, sigwinch_passthrough)
        size = get_win_size()
        foo.setwinsize(size[0], size[1])
        foo.interact() 
#    except Exception,e:
#        print e
    except pexpect.EOF:
        raise ServerError('Connect SSH Socket Port Error, Please Correct it.')
    except pexpect.TIMEOUT:
        raise ServerError('Connect SSH TIMEOUT, Please Correct it.')

def connectaa(host):
    ip=host
    try:
        foo = pexpect.spawn('/usr/bin/ssh -q -o %s' % (ip))
        signal.signal(signal.SIGWINCH, sigwinch_passthrough)
        size = get_win_size()
        foo.setwinsize(size[0], size[1])
        foo.interact() 
    except Exception,e:
        print e

zhuan=serverinfo.keys()
aaa=[]
#output= subprocess.call("cat /etc/hosts",shell=True)
output= subprocess.check_output(["cat","/etc/hosts"])
p=re.findall(r'[^#]\w\w\w\w*', output)
for i in p:
    aaa.append(i.strip())

if __name__ == '__main__':
    print_prompt() 
    try:
        while True:
            try:
                option = raw_input("输入E/e查看非开放平台服务器或者输入(Y/y|S/s|H/h)进入开放平台服务器: ")
            except EOFError:
                print
                continue
            if option in ['E','e']:
                try:
                    print_prompt()
                    output= subprocess.call("cat /etc/hosts",shell=True)
                    print output
                    while True:
                        try:
                            zone = raw_input("请输入你需要进入的服务器简称或者输入E/e查看列表:")
                        except EOFError:
                            print 
                            continue
                        if zone in aaa:
                            if zone in zhuan:
                                port=serverinfo[zone]['port']
                            else:
                                port=serverinfo['ly']['port']
                            host=zone
                            username=serverinfo['ly']['username']
                            if zone == "xkxbs":
                                password=serverinfo['xkxbs']['password']
                            else:
                                password=serverinfo['ly']['password']
                            connectly(username, password, host, port)
                        elif zone in ['e','E']:
                            print  output
                        elif zone in ['q','Q', 'exit']:
                            sys.exit()

                except Exception,e:
                    print e
            elif option in ['Y','y']:
                try:
                    username=serverinfo['ytyy']['username']
                    print username
                    password=serverinfo['ytyy']['password']
                    host=serverinfo['ytyy']['host']
                    connectto(username,password,host)
                except Exception,e:
                    print e
            elif option in ['S','s']:
                try:
                    username=serverinfo['ytsy']['username']
                    password=serverinfo['ytsy']['password']
                    host=serverinfo['ytsy']['host']                    
                    connectto(username,password,host)
                except Exception,e:
                    print e
            elif option in ['H','h']:
                try:
                    username=serverinfo['txsh']['username']
                    password=serverinfo['txsh']['password']
                    host=serverinfo['txsh']['host']
                    connectto(username,password,host)
                except Exception,e:
                    print e
            elif option in ['Q', 'q', 'exit']:
                sys.exit()
    except IndexError:
        pass


你可能感兴趣的:(python登录linux服务器脚本)