CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  其他开发语言 >  脚本语言(Perl ,Python)

用Python实现telnet,即编写telnet的服务端程序

楼主ndzmh(冰点)2006-03-09 02:24:59 在 其他开发语言 / 脚本语言(Perl ,Python) 提问

用python实现一个telnet的服务端程序,仿telnet的.  
   
  客户端为cmd.exe就可以了.  
   
  怎么实现?比如登陆过程  
   
  我的计划是这样的:  
  在登陆上服务端的IP,PORT后,  
  服务端向客户端发登陆消息  
  服务端向客户端发送"name:",提示用户输入用户名.  
  客户端,用户在控制台输入字符  
  服务端接收客户端发过来的字符,并回显到客户端.  
  当客户端按回车时,服务端接收到回车字符,判断当前命令(在此为用户输入的登陆用户名),记录该用户名及其密码.并向客户端发送"password:",继续等待客户端的输入.  
  客户端输入命令(此处为密码),这个过程同上,也是通过服务端回显.然后读到回车时,判断输入的密码是否于已经记录下的密码相符.  
  如果相符,服务端向客户端输出命令提示符,如:cisco>  
  否则向客户端输出错误提示信息...  
   
   
  这个过程的python程序应该如何写?求各位高人帮忙,急需,谢谢!!! 问题点数:100、回复次数:6Top

1 楼ChumpKlutz(朽木)回复于 2006-03-09 09:43:44 得分 10

用telnetlib中的Telnet类  
   
  Telnet类的方法如下:  
  read_until(   expected[,   timeout])    
  read_all(   )    
  read_some(   )    
  read_very_eager(   )    
  read_eager(   )    
  read_lazy(   )    
  read_very_lazy(   )    
  read_sb_data(   )    
  open(   host[,   port])    
  msg(   msg[,   *args])    
  set_debuglevel(   debuglevel)    
  close(   )    
  get_socket(   )    
  fileno(   )    
  write(   buffer)    
  interact(   )    
  mt_interact(   )    
  expect(   list[,   timeout])    
  set_option_negotiation_callback(   callback)    
   
  例:  
  import   getpass  
  import   sys  
  import   telnetlib  
   
  HOST   =   "localhost"  
  user   =   raw_input("Enter   your   remote   account:   ")  
  password   =   getpass.getpass()  
   
  tn   =   telnetlib.Telnet(HOST)  
   
  tn.read_until("login:   ")  
  tn.write(user   +   "\n")  
  if   password:  
          tn.read_until("Password:   ")  
          tn.write(password   +   "\n")  
   
  tn.write("ls\n")  
  tn.write("exit\n")  
   
  print   tn.read_all()  
   
  Top

2 楼ndzmh(冰点)回复于 2006-03-09 13:39:19 得分 0

你写的这个是python的客户端,客户端用cmd.exe就行了.  
  我想实现的是服务端,模拟就行了.  
   
  最好是命令,提示符,报文消息都是存在文件中.  
   
  比如说,我们在控制台输入telnet   IP   port,回车后,  
  服务端会向客户端发送登陆消息(该消息存在文件中,比如:文件中登陆消息为"login   success!",则控制台登陆成功后就会显示"login   success!")  
  然后用户在控制台用键盘手动敲入admin(用户名),服务器收到,然后怎么处理一下,再向控制台输出密码提示符,等待用户输入.  
  然后用户再输入密码,服务器接收,与文件中记录的用户名密码比较,如果正确,将文件中相应的报文信息输出到客户端....  
  Top

3 楼xyzxyz1111(程序员的自我修养)回复于 2006-03-09 15:57:02 得分 0

最基本的socket编程就可以了  
   
  socket  
  listen  
   
  while   ...  
          select    
          accept  
          read  
          write  
   
  无非如此  
  Top

4 楼ndzmh(冰点)回复于 2006-03-09 23:28:00 得分 0

模式大概就是这个样子,我当然知道啦~  
   
  但我现在是从文件中读命令,读返回给Client的消息,只有命令是从cmd.exe输入的.  
   
  而对于特定命令的输入,要返回特定的消息.  
  比如你在name:提示符下输入user,则返回的消息是:password:  
  但你再次输入user,就不会再返回那个消息了.Top

5 楼shhgs()回复于 2006-03-10 07:48:36 得分 10

Python标准类库里有TCPServer,你实现它,让它侦听端口,把听到的字符串送到subprocess模块,把返回的file   object读出来,返回给客户端。  
   
  真搞不懂你实现这个干吗。Telnet的服务器到处都是,有必要用Python实现吗?Top

6 楼xyzxyz1111(程序员的自我修养)回复于 2006-03-10 11:05:10 得分 80

你是不是要实现一个有状态的server?实现一个状态机?  
  响应根据状态来决定行为,如果处于接受username状态,则响应Client送来的username信息,否则就不响应。  
  一般状态机可以用两种方法,一种是在一个函数里判断if   ..   elif   ...    
  非形式化的描述如下  
  def   handle(self,   data):  
          if   self.state   ==   0:   #   user   name   input  
                    take_username(data)  
                    write("password")  
                    self.state   ==   1  
        elif   self.state   ==   1:   #   take   password  
                    take_password(data)  
                    if   data   ==   password"  
                            write("cisco>")  
                            self.state   ==   2  
                    else:  
                            self.close()  
        elif   ...  
  这种模式  
   
  另外一种是定义一个__current_func,  
   
  def   handle(self,   data):  
            if   self.__current_func:  
                      self.__current_func   =   self.__current_func(data)  
            else:  
                      self.close()  
  然后定义一系列的处理函数处理每个状态  
  def   __on_init(self,   data):  
          write("username")  
          return   self.__on_username  
  __current_func   =   __on_init  
  def   __on_username(self,   data):  
          take_username(data)  
          write("password")  
          return   self.__on_password  
   
  def   __on_password(self,   data):  
          if   data   ==   password:  
                  write("cisco>")  
                  return   self.__on_other  
          else:  
                  return   None  
   
  如此而已  
  以上是非形式化的描述,你可以自己看看。  
   
  Top

相关问题

  • 求救,关于编写telnet client程序的问题
  • 在VC里面如何编写telnet程序?
  • 怎样编写Servies程序?
  • 驱动程序的编写
  • 用UltraEdit编写Java程序
  • ghost程序的编写
  • vb.net下编写POS程序?
  • 如何编写此程序!!!!急!急
  • 怎样编写Winnt的服务程序?
  • 如何用C编写CGI程序

关键词

  • 客户
  • 字符
  • 密码
  • 用户
  • python
  • cisco
  • 客户端
  • self
  • telnet
  • 服务端

得分解答快速导航

  • 帖主:ndzmh
  • ChumpKlutz
  • shhgs
  • xyzxyz1111

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo