【发布时间】:2019-06-21 13:59:49
【问题描述】:
我有一个客户端/服务器套接字程序。 服务器部分通过 ssh 连接到主机,运行脚本,并将输出的每一行发送到客户端。
下面的服务器代码部分返回一个BufferedReader,其中包含脚本输出:
public synchronized BufferedReader runScript(<params>) {
BufferedReader br = null ;
try {
Connection conn = new Connection(host);
conn.connect();
... // authentication part
Session sess = conn.openSession();
sess.execCommand("ascript");
InputStream stdout = new StreamGobbler(sess.getStdout());
br = new BufferedReader(new InputStreamReader(stdout));
} catch (Exception e) {
e.printStackTrace();
}
return br;
}
上面的方法是从另一个服务器端的类/代码中调用的,如下所示,将 BufferedReader 的每一行通过套接字写入客户端,以便客户端在运行时看到脚本的实时输出:
BufferedReader br = new UnixCommandExecutor().runScript(<params>);
String line;
while ((line = br.readLine()) != null) {
out.writeObject(line);
}
runScript 方法的明显问题是它不会关闭 ssh 连接和会话(ganymed ssh 库),因为它会在底层脚本仍在运行时立即返回 BufferedReader(如果我没记错的话)。如果我在 return 语句之前关闭这些,BufferedReader 将是不完整的。 那么,一旦底层脚本完成,我该如何正确关闭连接/会话呢?
(我知道 try-with-resources 并会使用它,但我怀疑它能否完全解决问题?)
【问题讨论】:
-
您需要告诉我们您使用的众多 SSH API 中的哪一个,但其中肯定有
close()方法吗? -
@user207421 我已经提到了 api(ganymed),当然,其中有一个
close()方法。这不是问题的重点 -
这里的实际问题是 我应该把 close() 放在哪里
-
你把它放在命令完成之后,这将是在你消耗完它的所有输出之后。很明显。
-
那显然会在哪里呢?在
runScript()方法之外?
标签: java ssh client-server