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

我正在连接到远程服务器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

回答:

这些是ANSI转义码,通常由终端客户端解释以漂亮地[彩色]打印输出。

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

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

  • 如果自动执行远程命令,则最好使用“ exec”通道,如JSch Exec.javaexample所示。

  • 另外,您可以通过调用阻止JSch请求伪终端setPty。但是我不建议使用“ shell”通道。尽管无论出于何种原因您都需要致电setPty(false),但无论如何都应致电,因为这样可以避免许多其他类似的麻烦。实际上,我已经在上一个问题中向您建议了这一点。


其他说明:尽管我了解OP为什么使用ls命令,但通常来说,应该使用SFTP

API来检索目录列表,而不是执行ls和解析其输出。解析ls输出是一种非常不可靠的方法。


以上是 使用JSch从SSH服务器读取命令输出时获取不需要的字符 的全部内容, 来源链接: utcz.com/qa/424881.html

回到顶部