繁体   English   中英

如何在循环中打印多个JSch会话的输出?

[英]How to print output of multiple JSch sessions in a loop?

下面的代码旨在在特定服务器的多个用户中执行命令。 此代码不是连接到每个用户,而是仅在第一个用户中运行命令。

try {
    String users[] = {"sproln23", "sprsec23", "sproln52", "sprsec52"};

    for(String user: users) {
        JSch jsch = new JSch();
        System.out.println("Checking for user :" + user);
        Session session = jsch.getSession(user, "server");
        session.setPassword("pass");
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect(30000);

        Channel ch = session.openChannel("exec");
        ((ChannelExec)ch).setCommand("whoami");
        ch.setOutputStream(System.out);
        ch.connect();
    }

} catch (JSchException e) {
    e.printStackTrace();
}

输出

Checking for user :sproln23
Checking for user :sprsec23
sproln23

预期产出

Checking for user :sproln23
sproln23
Checking for user :sprsec23
sprsec23
Checking for user :sproln52
sproln52
Checking for user :sprsec52
sprsec52

您拥有的代码并行运行命令(您不必等待命令完成)。

我会说(虽然我没有测试它),一旦第一个命令完成(在后台异步处理,而你正在处理其他用户),JSch会关闭输出流。 当您将System.out设置为输出流时,它会有效地阻止您的应用程序产生更多输出。

另一个可能的问题是,由于您实际上没有等待命令完成,您的应用程序(例如,一个简单的控制台应用程序)实际上可以在命令完成之前终止。 虽然在这种情况下,您至少会为每个用户“检查用户”。

您应该尝试仅将JSch的输出复制到System.out ,而不是直接使用System.out

正如“exec”频道官方示例所示

InputStream in=channel.getInputStream();

channel.connect();

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()){
    if(in.available()>0) continue; 
    System.out.println("exit-status: "+channel.getExitStatus());
    break;
  }
  try{Thread.sleep(1000);}catch(Exception ee){}
}

上述代码解决了上述两个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM