2005年02月17日 星期四 16:24
采用telnetlib库,使用某个用户登录到一台Unix机器上,执行某个预设的命令。 telnet登录是交互的过程, 经过我测试,如果不读取unix机器发回来的内容或者读取不完全,则我其后发送过去的命令没有被执行,所以我必须先接收unix机器发回来的内容,才能进行下一步的发送。 请问,如何知道已经登录成功了呢?更进一步的问,当我登录成功了后,我发送了一条命令过去,如何知道执行完毕了呢? 现在我采用的方法是读取到命令行提示符就算成功了,例如 一般unix普通用户是%,root用户是# 但是由于这个提示符是可以改变的,况且如何命令执行的输出串中含有命令提示符的话,会导致在这个提示符这里中断, 这样就有一部分unix机器返回的信息没有接受,按照我上面所说的,之后我发送过去的命令都不会被执行。 所以这种方法并不通用。 请教各位,有没有更好的办法? 下面是我的 brz_telnet.py的代码: # -*- coding: gb2312 -*- # brz_telnet class import telnetlib import os, sys, string class brz_telnet: """ telnet client based on telnetlib """ def __init__( self, server, user, passwd, cmd_prompt='%', login_prompt='login: ', passwd_prompt='Password: ', conn_timeout=5, exec_timeout=20, port=23 ): self.__tn = telnetlib.Telnet() self.__server = server self.__user = user self.__passwd = passwd self.__login_prompt = login_prompt self.__passwd_prompt= passwd_prompt self.__cmd_prompt = cmd_prompt self.__conn_timeout = conn_timeout self.__exec_timeout = exec_timeout self.__port = port self.__cmds = [] self.__msg = ['Debug mesages:\n'] self.__tn.open( self.__server , self.__port ) def printMsg( self ): for msg in self.__msg: print msg def setCmdPrompt( self, cmd_prompt ): self.__cmd_prompt = cmd_prompt def reopen( self ): """ for reopen a closed brz_telnet """ self.__tn = telnetlib.Telnet() self.__tn.open( self.__server , self.__port ) def execute( self , cmd ): """ """ self.__cmds = cmd self.__tn.write( '\n' ) self.__msg.append( self.__tn.read_until( self.__login_prompt, self.__conn_timeout ) ) self.__tn.write( "%s\n" % self.__user ) self.__msg.append( self.__tn.read_until( self.__passwd_prompt, self.__conn_timeout ) ) self.__tn.write( "%s\n" % self.__passwd ) response = self.__tn.read_until( self.__cmd_prompt, self.__conn_timeout ) self.__msg.append( response ) if not string.count( response, self.__cmd_prompt ): print "login failure!" self.printMsg() return 1 for cmd in self.__cmds: self.__tn.write( "%s\n" % cmd ) response = self.__tn.read_until( self.__cmd_prompt , self.__exec_timeout ) if not string.count( response, self.__cmd_prompt ): print "execute %s failure!" % cmd self.printMsg() return 1 def __del__( self ): self.__tn.close() del self.__tn def test(): """test example for class brz_telnet. create a temp file named test_file in /tmp/test directory on remote server. """ IP = "10.71.105.27" USER = "breeze" PASSWD = "breeze" CMD_PROMPT = "%" CMDs = ["touch /tmp/test","touch /tmp/test_file"] obj = brz_telnet( server=IP, user=USER, passwd=PASSWD, cmd_prompt=CMD_PROMPT ) obj.execute( CMDs ) if __name__ == '__main__': test() -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20050217/a37c9fc0/attachment.htm
2005年02月17日 星期四 18:15
我怀疑如果登陆失败的话telnet连接会断开的~~~ --- hw_cg <hw_cg at huawei.com> 的正文: > 采用telnetlib库,使用某个用户登录到一台Unix机器上,执行某个预设的命令。 > > telnet登录是交互的过程, > 经过我测试,如果不读取unix机器发回来的内容或者读取不完全,则我其后发送过去的命令没有被执行,所以我必须先接收unix机器发回来的内容,才能进行下一步的发送。 > 请问,如何知道已经登录成功了呢?更进一步的问,当我登录成功了后,我发送了一条命令过去,如何知道执行完毕了呢? > > > 现在我采用的方法是读取到命令行提示符就算成功了,例如 > 一般unix普通用户是%,root用户是# > 但是由于这个提示符是可以改变的,况且如何命令执行的输出串中含有命令提示符的话,会导致在这个提示符这里中断, > 这样就有一部分unix机器返回的信息没有接受,按照我上面所说的,之后我发送过去的命令都不会被执行。 > 所以这种方法并不通用。 > > 请教各位,有没有更好的办法? > > 下面是我的 brz_telnet.py的代码: > > > > # -*- coding: gb2312 -*- > > # brz_telnet class > > import telnetlib > import os, sys, string > > class brz_telnet: > """ telnet client based on telnetlib """ > > def __init__( self, > server, > user, > passwd, > cmd_prompt='%', > login_prompt='login: ', > passwd_prompt='Password: ', > conn_timeout=5, > exec_timeout=20, > port=23 > ): > self.__tn = telnetlib.Telnet() > self.__server = server > self.__user = user > self.__passwd = passwd > self.__login_prompt = login_prompt > self.__passwd_prompt= passwd_prompt > self.__cmd_prompt = cmd_prompt > self.__conn_timeout = conn_timeout > self.__exec_timeout = exec_timeout > self.__port = port > self.__cmds = [] > self.__msg = ['Debug > mesages:\n'] > > self.__tn.open( self.__server , self.__port > ) > > def printMsg( self ): > for msg in self.__msg: > print msg > > def setCmdPrompt( self, cmd_prompt ): > self.__cmd_prompt = cmd_prompt > > def reopen( self ): > """ for reopen a closed brz_telnet """ > > self.__tn = telnetlib.Telnet() > self.__tn.open( self.__server , self.__port > ) > > def execute( self , cmd ): > """ """ > self.__cmds = cmd > > self.__tn.write( '\n' ) > self.__msg.append( self.__tn.read_until( > self.__login_prompt, self.__conn_timeout ) ) > self.__tn.write( "%s\n" % self.__user ) > self.__msg.append( self.__tn.read_until( > self.__passwd_prompt, self.__conn_timeout ) ) > self.__tn.write( "%s\n" % self.__passwd ) > response = self.__tn.read_until( > self.__cmd_prompt, self.__conn_timeout ) > self.__msg.append( response ) > if not string.count( response, > self.__cmd_prompt ): > print "login failure!" > self.printMsg() > return 1 > > for cmd in self.__cmds: > self.__tn.write( "%s\n" % cmd ) > response = self.__tn.read_until( > self.__cmd_prompt , self.__exec_timeout ) > if not string.count( response, > self.__cmd_prompt ): > print "execute %s failure!" % cmd > self.printMsg() > return 1 > > def __del__( self ): > self.__tn.close() > del self.__tn > > > def test(): > """test example for class brz_telnet. > create a temp file named test_file in > /tmp/test directory on remote server. > """ > IP = "10.71.105.27" > USER = "breeze" > PASSWD = "breeze" > CMD_PROMPT = "%" > CMDs = ["touch /tmp/test","touch > /tmp/test_file"] > > > obj = brz_telnet( server=IP, user=USER, > passwd=PASSWD, cmd_prompt=CMD_PROMPT ) > obj.execute( CMDs ) > > if __name__ == '__main__': > test()> _______________________________________________ > python-chinese list > python-chinese at lists.python.cn > http://python.cn/mailman/listinfo/python-chinese > _________________________________________________________ Do You Yahoo!? 150万曲MP3疯狂搜,带您闯入音乐殿堂 http://music.yisou.com/ 美女明星应有尽有,搜遍美图、艳图和酷图 http://image.yisou.com 1G就是1000兆,雅虎电邮自助扩容! http://cn.rd.yahoo.com/mail_cn/tag/1g/*http://cn.mail.yahoo.com/event/mail_1g/
Zeuux © 2025
京ICP备05028076号