##language:zh #pragma section-numbers on '''PyAutoRSH -- telnet/ssh/rsh多协议远程服务器操作管理''' ## 默许导航,请保留 <> ::-- amingsc [<>] ##||项目表情|| (!) '''概念/筹备/设计ing'''|| {o} '''编写/开发/组织ing'''|| {*} '''试用/推行ing'''|| {OK} '''发行/应用ed'''|| |-) '''停顿''' || ## 选用项目表情标识项目的当前状况 ||[[self:WoodpeckerProjs|啄木鸟项目::]]|| (!) '''[[self:PyAutoRSH|PyAutoRSH]]'''|| ## {o} '''[wiki:self/UrProjOthers 关联项目]'''|| = 缘起 = '''在工作中经常会遇到需要登陆到多个服务器上去执行一些操作,而且许多操作都是相同或相似的,为了避免这种重复性工作的强度,而想开放一个工具来实现这个自动化的过程.''' ## 一般是由列表中的邮件讨论引发的,所以可以使用 PyCNmail 的InterWiki 链接指向原始邮件 比如说: * '''[[PyCNmail:2005-November/018404.html|PythonGO开发计划]]''' == 已有项目: == 根据我搜集的资料来看,目前主要有两种实现方式: 一是用pexpect控制telnet工具来实现; 典型的项目有pydsh (on sourceforge),还 有一些非python的项目也是这种方式实现的; 二是通过telnetlib库实现,有很多小程序都这么做的, 在*limdou*的blog上有提到 这种实现方式哈! == 已有项目存在的问题: == 第一种方法: 通过判断prompt符号来判断进程是否结束,这种方式不可靠,因为如果 进程输出的消息里面包含有相同的输出则产生错误;不能终止远端进程;不方便获取 进程的退出状态;效率低下; 第二种方法: telnetlib对telnet协议的实现很原始,我大概看了一些telnet RFC, 说的是telnet server会在进程结束的时候发送指令通知client程序执行 完毕,但是telnetlib还是必须采用prompt(命令提示符)判断的方式来判断进程的结 束; telnet client可以向server发送指令终止进程的运行,但telnetlib 是没有实现的;等等还有好多内容;操作系统中附带的各个telnet工具的功能是强大 的,但是都没有api供用户程序对它进行控制; == 项目状况 == 已经具有基本功能,由四个脚本构成:mytelnetlib.py,autorshlib.py,autorshx.py,autorsh.py; == 需要进一步实现的功能 == 1,目前判断进程在服务器运行状态的方法为判断回显的命令提示符(一般为$#%),这种方式本身是不科学的,因为如果进程的输出消息中含有类似的文本则可能导致误判,造成错误;应该改成判断服务器是否发送指令来判断进程是否结束; 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"这种连续地址; == 使用说明 == 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格式 127.0.0.1 server1 2006 9 18 ....... -e error.log:(缺省输出到屏幕) 错误日志文件,格式为: #HOST ERR_MESSAGE '172.0.0.1' timeout '10.6.168.1' '...' -h :帮助 = 计划 = 1.搜集相似的项目/代码,整理思路; 2.阅读telnetRFC,完善mytelnetlib库; 3.开发实现PyAutoRSH; = 成员 = amingsc(amingscgmail.com) 欢迎更多的朋友参与合作! 欢迎更多的朋友提出您宝贵的意见和建议! = 下载 = http://cvs.woodpecker.org.cn/svn/woodpecker/zqlib/tangle/amingsc/PyAutoRSH/branches/package/PyAutoRSH.rar = SVN访问 = svn://cvs.woodpecker.org.cn/svn/woodpecker/zqlib/tangle/amingsc/PyAutoRSH/ http://cvs.woodpecker.org.cn/svn/woodpecker/zqlib/tangle/amingsc/PyAutoRSH/ = 反馈 = '''项目讨论''' <>