Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在一个循环中打印多个JSch会话的输出?_Java_Session_Ssh_Jsch - Fatal编程技术网

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

Java 如何在一个循环中打印多个JSch会话的输出?,java,session,ssh,jsch,Java,Session,Ssh,Jsch,下面的代码用于在特定服务器的多个用户中执行命令。此代码并没有连接到每个用户,而是只在第一个用户中运行命令 try { String users[] = {"sproln23", "sprsec23", "sproln52", "sprsec52"}; for(String user: users) { JSch jsch = new JSch(); System.out.println("Checking for user :" + user);

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

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();
}
输出

检查用户:sproln23
正在检查用户:sprsec23
sproln23
预期产出

检查用户:sproln23
sproln23
正在检查用户:sprsec23
sprsec23
正在检查用户:sproln52
sproln52
正在检查用户:sprsec52
sprsec52

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

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

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

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

作为:

InputStream in=channel.getInputStream();
channel.connect();
字节[]tmp=新字节[1024];
while(true){
while(in.available()>0){
inti=in.read(tmp,0,1024);
如果(i0)继续;
System.out.println(“退出状态:+channel.getExitStatus());
打破
}
尝试{Thread.sleep(1000);}catch(异常ee){}
}

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

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

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

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

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

作为:

InputStream in=channel.getInputStream();
channel.connect();
字节[]tmp=新字节[1024];
while(true){
while(in.available()>0){
inti=in.read(tmp,0,1024);
如果(i0)继续;
System.out.println(“退出状态:+channel.getExitStatus());
打破
}
尝试{Thread.sleep(1000);}catch(异常ee){}
}

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

您希望代码做什么?是否要并行运行这些命令?或者您想为第一个用户运行命令,等待它完成,然后与其他用户一起运行?如果它也并行运行,我认为没有问题。尽管如此,我主要关心的是在每个指定的用户中执行该命令。您希望代码做什么?是否要并行运行这些命令?或者您想为第一个用户运行命令,等待它完成,然后与其他用户一起运行?如果它也并行运行,我认为没有问题。尽管如此,我主要关心的是在每个指定的用户中执行该命令。
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){}
}