Java 使用JSch从SSH服务器读取命令输出时获取不需要的字符

Java 使用JSch从SSH服务器读取命令输出时获取不需要的字符,java,linux,ssh,sftp,jsch,Java,Linux,Ssh,Sftp,Jsch,我正在连接到远程服务器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();

我正在连接到远程服务器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");
这些通常由终端客户机解释为漂亮的[彩色]打印输出

如果服务器配置正确,则只有在使用交互式终端时才能获得这些信息。换句话说,如果您为会话请求了一个请求(如果您正在使会话自动化,那么您不应该这样做)

如果您使用了“shell”通道,JSch会自动请求伪终端,因为该通道应该用于实现交互式终端

  • 如果自动执行远程命令,最好使用“exec”通道,如中所示

  • 或者,您可以通过调用来防止JSch请求伪终端。但我不建议使用“shell”频道。但是,如果出于任何原因需要,您应该在任何情况下调用
    setPty(false)
    ,因为这将避免许多其他类似的问题。事实上我已经向你推荐了


其他人注意:虽然我知道OP为什么使用
ls
命令,但一般来说,应该使用use,而不是执行
ls
并解析其输出。解析
ls
输出是一种非常不可靠的方法


相关问题:

这些通常由终端客户机解释为漂亮的[彩色]打印输出

如果服务器配置正确,则只有在使用交互式终端时才能获得这些信息。换句话说,如果您为会话请求了一个请求(如果您正在使会话自动化,那么您不应该这样做)

如果您使用了“shell”通道,JSch会自动请求伪终端,因为该通道应该用于实现交互式终端

  • 如果自动执行远程命令,最好使用“exec”通道,如中所示

  • 或者,您可以通过调用来防止JSch请求伪终端。但我不建议使用“shell”频道。但是,如果出于任何原因需要,您应该在任何情况下调用
    setPty(false)
    ,因为这将避免许多其他类似的问题。事实上我已经向你推荐了


其他人注意:虽然我知道OP为什么使用
ls
命令,但一般来说,应该使用use,而不是执行
ls
并解析其输出。解析
ls
输出是一种非常不可靠的方法


相关问题:


创建通道后,可以将伪终端类型设置为“哑”


创建通道后,可以将伪终端类型设置为“哑”


这与
setPty(false)
差不多,不那么简单。这与
setPty(false)
差不多,不那么简单。
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
ChannelShell channel = (ChannelShell) session.openChannel("shell");
channel.setPtyType("dumb");