Java Te lnet клиент не работает после отправки Ctrl +] - PullRequest
0 голосов
/ 17 апреля 2020

Я использую Apache Commons Net TelnetClient для имитации набора операций, которые я обычно делаю вручную с терминала Unix. пример:

[nmsadmin@dcdnx35p-b3 ~]$ telnet 172.xx.xx.xx 500xx
Trying 172.xx.xx.xx...
Connected to 172.xx.xx.xx.
Escape character is '^]'.
$$

здесь я нажимаю Ctrl +]. Таким образом, появляется приведенная ниже подсказка.

telnet>

Теперь я даю команду «отправить brk» и нажимаю ввод. Таким образом, я получаю

telnet> send brk

?

Здесь я даю команду «login», и после этого появляются подсказки для имени пользователя и пароля, и я их соответствующим образом даю.

 ?login

 Enter User Name
 >user1
 Enter Password
 >xxxx

И здесь я буду войти в устройство. И я могу выдавать больше команд отсюда.

Я хочу воспроизвести c этот материал, и я нашел пример кода, который использует Apache .commons. net. Вот пример кода.

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

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, String user, String password) {
        try {
            // Connect to the specified server
            telnet.connect(server, 23);

            // 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) {
        try {
            AutomatedTelnetClient telnet = new AutomatedTelnetClient(
                    "myserver", "userId", "Password");
            System.out.println("Got Connection...");
            telnet.sendCommand("ps -ef ");
            System.out.println("run command");
            telnet.sendCommand("ls ");
            System.out.println("run command 2");
            telnet.disconnect();
            System.out.println("DONE");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Я пытался разными способами использовать этот код, соответственно изменил значение приглашения, и я использовал метод readUntil("$$"), и он дает мне строковое значение как " ^ M ^ @ $$». Но после этого мне нужно дать ctrl + escape и остальные функции. Как я могу изменить приведенный выше код для набора операций, которые я дал сверху? Пожалуйста, игнорируйте команды ps -ef, ls внизу. Они не работают на устройстве, с которым я общаюсь в любом случае. Я попробовал следующие команды.

    //sending escape
    telnet.write(Character.toString((char) 29));
    //sending brk
    telnet.write("send brk");
    logger.info("sending login");
    telnet.write("login");

Эти команды не работают. Может ли кто-нибудь помочь мне в этом? Спасибо.

...