Python论坛  - 讨论区

标题:[python-chinese] 使用telnetlib远程执行一条命令,如何判断已经登录成功

2005年02月17日 星期四 16:24

hw_cg hw_cg at huawei.com
Thu Feb 17 16:24:53 HKT 2005

采用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

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年02月17日 星期四 18:15

Hoxide Ma hoxide_dirac at yahoo.com.cn
Thu Feb 17 18:15:43 HKT 2005

我怀疑如果登陆失败的话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/


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号