Как автоматом войти в телнет?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by monz, 4 May 2010.

  1. monz

    monz New Member

    Joined:
    31 Jul 2009
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Вопрос такой, может конечно немного не в ту ветку, но думаю это возможно решить с помощью перечисленных в ней языков - надеюсь на это.
    Вобщем хочу сделать автореконект для своего модема.
    Успешно реконектить получаеться когда захожу на модем через командную строку на телнет (telnet 192.168.1.1) и далее выдает приглашение на ввод логина и пароля. Можно было сделать батник, но вот незнаю как с него ввести туда этот логин и пароль. Весь вопрос в том как можно зайти и выполнить там нужные комманды автоматом.
     
  2. lukmus

    lukmus Elder - Старейшина

    Joined:
    18 Nov 2009
    Messages:
    404
    Likes Received:
    118
    Reputations:
    23
    вот код на ruby, я свой так переконекчиваю
    Code:
    #!/usr/bin/ruby
    require 'net/telnet'
    def rechange_ip()
    	telnet=Net::Telnet::new("Host" => "192.168.1.1", "Timeout" => 10,"Prompt" => /[$%#>] \z/n)
    	telnet.login("admin", "admin")
    	begin
    		telnet.cmd("reboot")
    		telnet.close
    	rescue => e
    		puts e
    	end
    	
    end
    
    rechange_ip
     
  3. monz

    monz New Member

    Joined:
    31 Jul 2009
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Запускаю скрипт, видно что к телнету подключилось и ввело логин, пароль возможно тоже, но он не отображаеться и далее идет таймаут 10 сек и выключаеться, а сами команды почемуто не передаються.
     
    #3 monz, 4 May 2010
    Last edited: 4 May 2010
  4. monz

    monz New Member

    Joined:
    31 Jul 2009
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Все! Огромное спасибо lukmus!
    Сработал такой вариант:
    PHP:
    require 'net/telnet'  
    uname "admin" 
    pwd "admin"  
    begin     
    tn 
    Net::Telnet.new({"Host"  =>  "192.168.1.1"})     { |str| print str }      
    tn.login(uname,pwd)  { |str| print str }  
    rescue     
    print "The username or password is incorrect. \nPlease try again ...\n\n"      
    print "\nEnter user name : "     
    uname STDIN      print "\nEnter password : "     
    pwd STDIN     
    pwd 
    STDIN      
    retry  ensure   tn
    .cmd("echo 3 > /proc/var/fyi/wan/ppp_0_1_32_1/wanup")  { |str| print str }   
    sleep 10   tn.cmd("echo 1 > /proc/var/fyi/wan/ppp_0_1_32_1/wanup")  
    { |
    str| print str }   tn.close()  
    end
    почемуто именно с двойным вводом пароля
     
  5. BukTop.

    BukTop. New Member

    Joined:
    8 Apr 2010
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    как делються вещи на делфях:
    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, Graphics, Controls, Forms, Dialogs, ComCtrls,
    StdCtrls, Spin,
      SysUtils, Classes,  IdBaseComponent, IdComponent, IdTCPConnection,
      IdTCPClient, IdTelnet;
    
    type
      TTfrmTelnetDemo = class(TForm)
        Memo1: TRichEdit;
        edtServer: TEdit;
        lblServer: TLabel;
        spnedtPort: TSpinEdit;
        lblPort: TLabel;
        btnConnect: TButton;
        btnDisconnect: TButton;
        sbrStatus: TStatusBar;
        Label1: TLabel;
        IdTelnetDemo: TIdTelnet;
        procedure btnConnectClick(Sender: TObject);
        procedure btnDisconnectClick(Sender: TObject);
        procedure Memo1KeyPress(Sender: TObject; var Key: Char);
        procedure IdTelnetDemoConnected(Sender: TObject);
    
        procedure IdTelnetDemoDataAvailable(Sender: TIdTelnet;
          const Buffer: string);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      TfrmTelnetDemo: TTfrmTelnetDemo;
    
    implementation
    
    {$R *.dfm}
    
    procedure TTfrmTelnetDemo.btnConnectClick(Sender: TObject);
    begin
      IDTelnetDemo.Host := edtServer.Text;
      IDTelnetDemo.port := spnedtPort.Value;
      IdTelnetDemo.Connect;
    end;
    
    procedure TTfrmTelnetDemo.btnDisconnectClick(Sender: TObject);
    begin
    IdTelnetDemo.Disconnect;
    end;
    
    
    
    
    procedure TTfrmTelnetDemo.IdTelnetDemoConnected(Sender: TObject);
    begin
      sbrStatus.SimpleText := 'Connected';
    end;
    
    procedure TTfrmTelnetDemo.IdTelnetDemoDataAvailable(Sender: TIdTelnet;
      const Buffer: string);
    {This routine comes directly from the ICS TNDEMO code. Thanks to
    Francois Piette
    It updates the memo control when we get data}
    const
        CR = #13;
        LF = #10;
    var
        Start, Stop : Integer;
    begin
      if Memo1.Lines.Count = 0 then
          Memo1.Lines.Add('');
    
    
      Start := 1;
      Stop  := Pos(CR, Buffer);
      if Stop = 0 then
          Stop := Length(Buffer) + 1;
      while Start <= Length(Buffer) do begin
          Memo1.Lines.Strings[Memo1.Lines.Count - 1] :=
              Memo1.Lines.Strings[Memo1.Lines.Count - 1] +
              Copy(Buffer, Start, Stop - Start);
          if Buffer[Stop] = CR then begin
              Memo1.Lines.Add('');
              {$IFNDEF Linux}
              SendMessage(Memo1.Handle, WM_KEYDOWN, VK_UP, 1);
              {$ENDIF}
          end;
          Start := Stop + 1;
          if Start > Length(Buffer) then
              Break;
          if Buffer[Start] = LF then
             Start := Start + 1;
          Stop := Start;
          while (Buffer[Stop] <> CR) and (Stop <= Length(Buffer)) do
              Stop := Stop + 1;
      end;
    
    
    end;
    
    procedure TTfrmTelnetDemo.Memo1KeyPress(Sender: TObject; var Key: Char);
    begin
      {we simply send the key stroke to the server.  It may echo it back to
    
    
    us}
      if IdTelnetDemo.Connected then
        IdTelnetDemo.SendCh(Key);
      Key := #0;
    end;
    
    end.
    
    Тут конечно не происходит перезагрузка, но не составить труда переделать под свои нужды...
     
    #5 BukTop., 16 May 2010
    Last edited: 16 May 2010