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. 下载
5. SVN访问
- svn://cvs.woodpecker.org.cn/svn/woodpecker/zqlib/tangle/amingsc/PyAutoRSH/
http://cvs.woodpecker.org.cn/svn/woodpecker/zqlib/tangle/amingsc/PyAutoRSH/
6. 反馈
项目讨论