Получение нежелательных символов при чтении вывода команды с сервера SSH с использованием JSch - PullRequest
0 голосов
/ 08 октября 2018

Я подключаюсь к SSH-серверу удаленного сервера и пытаюсь получить список файлов по определенному пути. Я могу получить список файлов по пути, но они были в нечитаемом формате, может ли кто-нибудь помочь в этом

String host="xxxxx.yyyy.com";
String user="user";
String password="password";
String command1="dzdo su - lucy";
try{    
    java.util.Properties config = new java.util.Properties(); 
    config.put("StrictHostKeyChecking", "no");
    JSch jsch = new JSch();
    Session session=jsch.getSession(user, host, 22);
    session.setPassword(password);
    session.setConfig(config);
    session.connect();
    System.out.println("Connected");

    Channel channel=session.openChannel("shell");
    OutputStream ops = channel.getOutputStream();
    PrintStream ps = new PrintStream(ops, true);

    channel.connect();
    ps.println(command1);
    ps.println("ls -ltr");
    InputStream in=channel.getInputStream();
    byte[] tmp=new byte[1024];
    while(true){
        while(in.available()>0){
            int i=in.read(tmp, 0, 1024);
            if(i<0)break;
            System.out.print(new String(tmp, 0, i));
        }
        if(channel.isClosed()){
            System.out.println("exit-status: "+channel.getExitStatus());
            break;
        }
        try{Thread.sleep(1000);}catch(Exception ee){}
    }
    channel.disconnect();
    session.disconnect();
    System.out.println("DONE");

Вот вывод консоли

drwxrws---. 2 gleaiid gleai 4096 Jan 21  2016 [0m[01;34mold[0m
-rwxrws---. 1 jhon gleai  100 Jul 20  2017 [30;43mNVISAP_814_Test.txt[0m
-rwxrws---. 1 jhon  gleai  134 Jul 20  2017 [30;43mUS_NISC14_4164556_Test.txt[0m
-rwxrws---. 1 jhon  gleai    0 Jul 20  2017 [30;43mNVISAP_R00814_Test.trg[0m

1 Ответ

0 голосов
/ 08 октября 2018

Это Экранирующие коды ANSI , которые обычно интерпретируются терминальным клиентом для красивой [цветной] печати вывода.

Если сервер настроен правильно, вы получите их только приВы используете интерактивный терминал.Другими словами, если вы запросили псевдотерминал для сеанса (что не следует делать, если вы автоматизируете сеанс).

JSch автоматически запрашивает псевдотерминал, если вы использоваликанал "shell", который предполагается использовать для реализации интерактивного терминала.

  • Если вы автоматизируете выполнение удаленных команд, вам лучше использовать канал "exec", так какпоказано в JSch Exec.java пример .

  • В качестве альтернативы, вы можете запретить JSch запрашивать псевдотерминал, вызвав setPty.Но я не рекомендую использовать «оболочку» канала.Хотя, если вам нужно, по какой-либо причине, вам следует позвонить setPty(false) в любом случае, так как это предотвратит множество других подобных проблем.На самом деле я уже рекомендовал вам в ваш предыдущий вопрос .


Примечание для других: хотя я понимаю, почему OP использует команду ls, в целомЧтобы получить список каталогов , нужно использовать SFTP API вместо выполнения ls и анализа его выходных данных.Синтаксический анализ ls вывода - довольно ненадежный подход.


Смежные вопросы:

...