2016-02-22 34 views
2

這是我第一次通過這個平臺提問。對不起。我英語不好。我會盡我所能讓你理解我的問題。 我完全是Netty的初學者。我想實現一個程序向遠程登錄服務器發送命令並接收響應消息。我修改了示例telnet程序,以便在沒有對服務進行身份驗證時連接並獲取服務器的響應。 問題是, 當身份驗證過程在服務器中設置。 (需要登錄名和密碼) 如何實現客戶端程序? 我如何收到服務登錄請求並回復它? 我是否應該實現另一個處理程序來處理身份驗證?Netty:如何實現需要認證的telnet客戶端處理程序

下面

顯示如何我的命令發送到服務器

EventLoopGroup group = new NioEventLoopGroup(); 
    try { 
     Bootstrap b = new Bootstrap(); 
     b.group(group) 
       .channel(NioSocketChannel.class) 
       .handler(new TelnetClientInitializer(sslCtx)); 

     // Start the connection attempt. 
     ChannelFuture lastWriteFuture = null; 
     lastWriteFuture = b.connect(HOST, PORT).sync(); 

     Channel ch = lastWriteFuture.channel(); 

     lastWriteFuture = ch.writeAndFlush("ls" + "\r\n", ch.newPromise()); 

     lastWriteFuture = ch.writeAndFlush("status" + "\r\n"); 

     lastWriteFuture = ch.writeAndFlush("ls" + "\r\n"); 

     lastWriteFuture = ch.writeAndFlush("exit" + "\r\n"); 

     // Wait until the connection is closed. 
     lastWriteFuture.channel().closeFuture().sync(); 

    } finally { 
     // Shut down the event loop to terminate all threads. 
     group.shutdownGracefully(); 
    } 

,但我應該怎麼辦日前發出上述命令登錄到該服務?

The following picture shows what i want to do in the program

非常感謝您!

回答

0

Telnet沒有真正的密碼包的概念,密碼提示就像任何普通的文本輸出。這意味着您可以將連接時的用戶名和密碼作爲單獨的行發送,並且telnet服務器將正確使用它們。

ch.writeAndFlush("administrator" + "\r\n"); 
ch.writeAndFlush("LetMeIn4!!" + "\r\n"); 

如果您需要連接到服務器,它並不總是需要密碼,那麼你應該從服務器讀取輸出,檢查它是否包含「用戶名」,發送用戶名,那麼請繼續閱讀,如果它包含「密碼」併發送密碼。這很容易破壞,因爲服務器不需要發送這些字符串,合法輸出也可能包含這些字符串。這是telnet協議的缺點。

+0

首先,謝謝您的幫助!我試過了。它不起作用。沒有來自服務器和頻道的響應在幾分鐘後未註冊 –

+0

您在哪裏放置了代碼?它應該在'Channel ch = lastWriteFuture.channel();'和'lastWriteFuture = ch.writeAndFlush(「ls」+「\ r \ n」,ch.newPromise());' – Ferrybig

+0

年。我對你的描述也一樣。在我的程序中,處理程序和telnetClientInitializer中沒有任何更改。他們和樣本一樣。 –

0

如果我們談論TELNET作爲一種協議,您應該知道來自Netty示例的Telnet客戶端不支持TELNET協議。他的名字很混亂,你不能連接到任何標準的telnet服務器。你可以在這裏閱讀更多關於TELNET協議 - THE TELNET PROTOCOL

我看到2種方式:

  1. 寫的Netty您的TELNET實現中使用另一個
  2. 實施例子阿帕奇百科全書網

例爲第一種方式 - modified netty client,我測試了他在Linux服務器上。他有幾個骯髒的黑客像計時器,但他的工作。

例爲第二 - 爪哇 - Writing An Automated Telnet Client

import org.apache.commons.net.telnet.*; 

import java.io.InputStream; 
import java.io.PrintStream; 

public class AutomatedTelnetClient { 
    private TelnetClient telnet = new TelnetClient(); 
    private InputStream in; 
    private PrintStream out; 
    private String prompt = "~>"; 

    public AutomatedTelnetClient(String server) { 
     try { 
      // Connect to the specified server 
      telnet.connect(server, 8023); 
      TerminalTypeOptionHandler ttopt = new TerminalTypeOptionHandler("VT100", false, false, true, false); 
      EchoOptionHandler echoopt = new EchoOptionHandler(true, false, true, false); 
      SuppressGAOptionHandler gaopt = new SuppressGAOptionHandler(true, true, true, true); 
      try { 
       telnet.addOptionHandler(ttopt); 
       telnet.addOptionHandler(echoopt); 
       telnet.addOptionHandler(gaopt); 
      } catch (InvalidTelnetOptionException e) { 
       System.err.println("Error registering option handlers: " + e.getMessage()); 
      } 
      // Get input and output stream references 
      in = telnet.getInputStream(); 
      out = new PrintStream(telnet.getOutputStream()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

// public void su(String password) { 
//  try { 
//   write(「su」); 
//   readUntil(「Password: 「); 
//   write(password); 
//   prompt = 「#」; 
//   readUntil(prompt + 」 「); 
//  } catch (Exception e) { 
//   e.printStackTrace(); 
//  } 
// } 

    public String readUntil(String pattern) { 
     try { 
      char lastChar = pattern.charAt(pattern.length() - 1); 
      StringBuffer sb = new StringBuffer(); 
      boolean found = false; 
      char ch = (char) in.read(); 
      while (true) { 
       System.out.print(ch); 
       sb.append(ch); 
       if (ch == lastChar) { 
        if (sb.toString().endsWith(pattern)) { 
         return sb.toString(); 
        } 
       } 
       ch = (char) in.read(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    public void write(String value) { 
     try { 
      out.println(value); 
      out.flush(); 
      System.out.println(value); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public String sendCommand(String command) { 
     try { 
      write(command); 
      return readUntil(prompt + " "); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    public void disconnect() { 
     try { 
      telnet.disconnect(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     String user = "test"; 
     String password = "test"; 
     AutomatedTelnetClient telnet = new AutomatedTelnetClient("localhost"); 
     // Log the user on 
     telnet.readUntil("login:"); 
     telnet.write(user); 
     telnet.readUntil("Password:"); 
     telnet.write(password); 
     // Advance to a prompt 
     telnet.readUntil(telnet.prompt + " "); 

     telnet.sendCommand("ps -ef"); 
     telnet.sendCommand("ls"); 
     telnet.sendCommand("w"); 
     telnet.disconnect(); 
    } 
} 
相關問題