PyAutoRSH -- telnet/ssh/rsh多协议远程服务器操作管理

::-- amingsc [2006-10-30 06:30:16]

1. 缘起

在工作中经常会遇到需要登陆到多个服务器上去执行一些操作,而且许多操作都是相同或相似的,为了避免这种重复性工作的强度,而想开放一个工具来实现这个自动化的过程.

1.1. 已有项目:

根据我搜集的资料来看,目前主要有两种实现方式:

一是用pexpect控制telnet工具来实现; 典型的项目有pydsh (on sourceforge),还 有一些非python的项目也是这种方式实现的;

二是通过telnetlib库实现,有很多小程序都这么做的, 在*limdou*的blog上有提到 这种实现方式哈!

1.2. 已有项目存在的问题:

第一种方法: 通过判断prompt符号来判断进程是否结束,这种方式不可靠,因为如果 进程输出的消息里面包含有相同的输出则产生错误;不能终止远端进程;不方便获取 进程的退出状态;效率低下;

第二种方法: telnetlib对telnet协议的实现很原始,我大概看了一些telnet RFC, 说的是telnet server会在进程结束的时候发送<ARC GA>指令通知client程序执行 完毕,但是telnetlib还是必须采用prompt(命令提示符)判断的方式来判断进程的结 束; telnet client可以向server发送<ARC IP>指令终止进程的运行,但telnetlib 是没有实现的;等等还有好多内容;操作系统中附带的各个telnet工具的功能是强大 的,但是都没有api供用户程序对它进行控制;

1.3. 项目状况

已经具有基本功能,由四个脚本构成:mytelnetlib.py,autorshlib.py,autorshx.py,autorsh.py;

1.4. 需要进一步实现的功能

1,目前判断进程在服务器运行状态的方法为判断回显的命令提示符(一般为$#%),这种方式本身是不科学的,因为如果进程的输出消息中含有类似的文本则可能导致误判,造成错误;应该改成判断服务器是否发送指令<ARC,GA>来判断进程是否结束;

2,telnet协议的实现(mytelnetlib.py)是直接由python的标准库telnetlib修改来的,它采用的是栈分析(stack analyse)的方法实现的,效率较低,可以改成状态机(state machine)的方式实现;

3,目前只支持telnet协议,应该扩展到ssh协议,以提高安全性;

4,有些服务器限制不能以root登陆,只能先以其他帐号登陆然后su成root,系统还未实现这个功能;

5,不同os和版本的登陆提示符、密码提示符、命令提示符等符号是不同的,可能是中文、英文等各种文字及其混合,这在服务器端可以定制,所以情况复杂,目前只对有限的情况进行了实现见autorshlib.py);

6,从服务器获取上一条命令状态,即是否发生错误,的方法是执行命令echo $?,这仅仅是在sh、ksh、bash上有效的,对csh可能不适合,这需要修改;

7, host列表还没有对地址实现扩展功能,就是说不能解析“172.0.0.1-254"这种连续地址;

1.5. 使用说明

python autorsh.py -H hostlist.txt -c commands.txt [-o res.xml] [-e error.log]

-H hostlist.txt:

主机信息列表文件,格式

ip地址; 端口; 用户名; 密码; 操作系统名称; 操作系统版本

(以#开始的行为comment)

-c commands.txt:

命令列表文件,格式为

#comment

[ALL]

hostname=uname -n

boottime=who -b

#[ALL]适合所有操作系统

[AIX]

swapsize=lsps -a

#[AIX]表示适合AIX系统

[SUNOS:(5.6,5.7,5.8)]:[HP-UX]

mounts=df -k

#[SUNOS:(5.6,5.7,5.8)]表示适合Solaris的5.6,5.7,5.8版本

#[HP-UX]表示适合连续定义的两种情况

-o res.xml:(缺省以二维表格的形式输出到屏幕)

结果输出文件,格式为

XML格式

  • <?xml version="1.0" encoding="UTF-8" ?>

    <!-- Copyright (c) 2006 Travelsky Company, amingsc. All Rights Reserved.-->

<autorsh.output>

  • <result>

    <entity host="10.6.168.1">

    • <field caption="host">127.0.0.1</field>

      <field caption="hostname">server1</field>

      <field caption="boottime">2006 9 18</field>

    </entity>

  • ......
  • </autorsh.output>

-e error.log:(缺省输出到屏幕)

错误日志文件,格式为:

#HOST ERR_MESSAGE

'172.0.0.1' timeout

'10.6.168.1' '...'

-h :帮助

2. 计划

1.搜集相似的项目/代码,整理思路;

2.阅读telnetRFC,完善mytelnetlib库;

3.开发实现PyAutoRSH;

3. 成员

amingsc(amingsc<at>gmail.com)

欢迎更多的朋友参与合作!

欢迎更多的朋友提出您宝贵的意见和建议!

4. 下载

http://cvs.woodpecker.org.cn/svn/woodpecker/zqlib/tangle/amingsc/PyAutoRSH/branches/package/PyAutoRSH.rar

5. SVN访问

6. 反馈

项目讨论