gpt4 book ai didi

java - 如何循环打印多个 JSch session 的输出?

转载 作者:太空宇宙 更新时间:2023-11-04 11:30:25 27 4
gpt4 key购买 nike

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

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

作为official example for the "exec" channel shows :

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){}
}

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

关于java - 如何循环打印多个 JSch session 的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43863898/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com