Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Netty: How to implement a telnet client handler which needs authentication

This is my first time ask question through this platform. I am sorry. I am not good in English. I will try my best to let you understand my questions. I am totally beginner in Netty. I would like to implement a program to send commands to a telnet server and receive response message. I modified the sample telnet program to connect and get response from the serve when there is no authentication of serve. The question is that When the authentication processes are setup in server. (Require login name and password) How to implement the client side program? How can I receive the serve login request and response it? Should I implement another handler to handle the authentication?

below shows how i send the commands to the server

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();
    }

but what should i do before send the above commands to login into the serve?

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

Thank you very much!!!

like image 459
tai man chan Avatar asked Oct 16 '25 04:10

tai man chan


1 Answers

If we talk about TELNET as a protocol you should know that Telnet client from Netty examples does not support TELNET protocol. His name is just confusing and you can't connect to any standard telnet servers. You can read more about TELNET protocol here - THE TELNET PROTOCOL .

I see 2 ways:

  1. write your implementation for TELNET on Netty
  2. use another implementation for examples Apache Commons Net

Example for the first way - modified netty client, i tested him on Linux servers. He has several dirty hacks like a timer but he works.

Example for the second - Java – 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();
    }
}
like image 191
Vladislav Kysliy Avatar answered Oct 18 '25 04:10

Vladislav Kysliy