pexpect写的一个ssh自动登录脚本

最近终于用上了MAC,不得不说它真是一个伟大的产品,让人赞叹不已。不管到哪个平台,运维人员第一时间要用的肯定是远程登录工具xshell、SecureCRT等。刚开始抱着要支持正版的态度,我没用SecureCRT,而xshell又不支持MAC平台。于是,就有了这个简单的ssh自动登录脚本。

一:简介

1 脚本的具体原理是:

1.pexpect 是expect的一个python实现,用过shell下expect的兄弟知道这就是一个与终端交互的软件。
2.使用pexpect的spawn类产生一个子进程,expect控制子进程实现自动输入账号密码登录到远程服务器,然后再使用interact把子进程的控制权交给主进程。
3.具体过程,我理解的是:用户运行脚本,产生一个主进程,主进程fork出一个子进程,使用expect与子进程交互,使子程序ssh登录到远端服务器,然后再使用interact交出控制权给主进程,用户继续和主进程交互来控制子进程。
4.理解如有错误,敬请指正。

二:使用

1.直接看下脚本,得益于python的简洁,这种小脚本,都不需要太多的代码:

#!/usr/bin/env python2.7
#coding: utf-8

###参考资料###
#https://www.ibm.com/developerworks/cn/linux/l-cn-pexpect1/
#http://www.ibm.com/developerworks/cn/linux/l-cn-pexpect2/index.html
#http://www.noah.org/wiki/pexpect

import os
import sys
import traceback
import pexpect

SERVER = {
        "master":["22","root","192.168.188.130","budong"],
        "slave":["22","root","192.168.188.131","budong"],
         }

def auto_connect():
    """SSH自动登录脚本"""
    if len(sys.argv) == 2:
        remote_server = sys.argv[1]
    else:
        print "使用方法:\n./pexpect_ssh.py 主机别名"
        sys.exit(1)

    if remote_server in SERVER:
        SSH = "ssh -p %s %s@%s " % (SERVER[remote_server][0],SERVER[remote_server][1],SERVER[remote_server][2])
    else:
        print "您输入了一个错误的主机别名"
        sys.exit(1)

    try:
        child = pexpect.spawn(SSH)
        index = child.expect(['password:','continue connecting (yes/no)?',pexpect.EOF, pexpect.TIMEOUT])
        if index == 0:
            child.sendline(SERVER[remote_server][3])
            child.interact()
        elif index == 1:
            child.sendline('yes')
            child.expect(['password:'])
            child.sendline(SERVER[remote_server][3])
            child.interact()
        elif index == 2:
            print "子程序异常,退出!"
            child.close()
        elif index == 3:
            print "连接超时"
    except:
        traceback.print_exc()

if __name__ == '__main__':
    auto_connect()

2.实验下,看看效果:

budong@budongdeMacBook-Pro:~$ ./pexpect_ssh.py master

Last login: Wed May  7 16:35:36 2014 from 192.168.188.1
[root@puppet ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:50:56:3A:12:F6
          inet addr:192.168.188.130  Bcast:192.168.188.255  Mask:255.255.255.0
          inet6 addr: fe80::250:56ff:fe3a:12f6/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:47855 errors:0 dropped:0 overruns:0 frame:0
          TX packets:29988 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:36979984 (35.2 MiB)  TX bytes:5353161 (5.1 MiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:510 errors:0 dropped:0 overruns:0 frame:0
          TX packets:510 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:27294 (26.6 KiB)  TX bytes:27294 (26.6 KiB)

[root@puppet ~]#

三:是时候结束了

自言自语:

好久没有过来更新博客了,惭愧之心与日俱增,当初说好的至少做到每个月写一篇,对自己近期的学习要有个回顾和总结,好习惯就要坚持下去,给自己加油吧。恩,对了,再多说几句,这个脚本我现在已经不用了,正式投入SecureCRT的怀抱,当然用的是盗版。Pexpect这个东西,我真没觉得有什么用,为什么要和ssh、telnet、ftp等交互?直接写个简单的客户端脚本来实现不是更简单可行吗?因此,还是放弃这个东西,去使用更优秀的工具吧。

参考资料:

IBM 文档:https://www.ibm.com/developerworks/cn/linux/l-cn-pexpect1/

IBM 文档:http://www.ibm.com/developerworks/cn/linux/l-cn-pexpect2/index.html

官方 wiki:http://www.noah.org/wiki/pexpect