Differences between revisions 6 and 8 (spanning 2 versions)
Revision 6 as of 2006-10-30 07:21:53
Size: 3596
Editor: amingsc
Comment:
Revision 8 as of 2006-11-08 06:21:36
Size: 5529
Editor: amingsc
Comment:
Deletions are marked like this. Additions are marked like this.
Line 41: Line 41:
== 我的思路: ==
改写telnetlib库,根据telnet RFC完善对telnet协议的支持,实现跟telnet工具一样强大的功能,但是是以python library的方式提供给用户程序调用;这样我们就可以在这个库的基础上实现一个强大的工具来自动远程管理多个服务器;
== 项目状况 ==
已经具有基本功能,由四个脚本构成:mytelnetlib.py,autorshlib.py,autorshx.py,autorsh.py;

== 需要进一步实现的功能 ==
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"这种连续地址;

== 使用说明 ==
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, ChenMing. 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' '...'
Line 45: Line 127:
= 项目日志 =
||<^>[[MonthCalendar]][[BR]][[Include(CPUGnav)]]||<^>'''提要'''[[Include(^PyIdsh/200.*,'项目简报',4,sort=descending,items=13,titlesonly)]]||
-h :帮助
Line 48: Line 129:
= 目标 =
1.通过socket重新实现telnet协议,做一个类似于telnetlib的库idshtelnetlib,但更完善的支持telnet协议,并且方便在远程机器上实现命令的运行/中断/挂起/状态返回等操作;

2.在idshtelnetlib库的基础上实现工具PyIDSh,以通过telnet/rsh/ssh等协议自动远程登陆到用户定制
的多台服务器上执行一系列shell命令或者shell 脚本,从而实现对多个服务器的批处理方式的操作和管理;
Line 61: Line 137:
amingsc amingsc(amingsc<at>gmail.com)

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

TableOfContents ::-- amingsc [DateTime(2006-10-30T06:30:16Z)]

[wiki:self/WoodpeckerProjs 啄木鸟项目::]

(!) [wiki:self/PyIdsh PyIdsh]

1. 缘起

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

  • [wiki:PyCNmail/2005-November/018404.html PythonGO开发计划]

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, ChenMing. 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,设计idshtelnetlib库;

3.开发实现PyIDSh;

3. 成员

amingsc(amingsc<at>gmail.com)

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

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

4. 成果

SVN:9(目前还没有内容0)

  • svn://cvs.woodpecker.org.cn/svn/woodpecker/zqlib/tangle

5. 反馈

项目讨论 Include(/DisCuss)

PyIdsh (last edited 2009-12-25 07:14:51 by localhost)