+ * 此方法单次发送一个命令到服务端,不读取环境变量,执行结束后自动关闭Session,不会产生阻塞。 + *
+ * + * @param session Session会话 + * @param cmd 命令 + * @param charset 发送和读取内容的编码 + * @param errStream 错误信息输出到的位置 + */ + public static String exec(Session session, String cmd, Charset charset, OutputStream errStream) { + final String result; + try { + session.execCommand(cmd, charset.name()); + result = IoUtil.read(new StreamGobbler(session.getStdout()), charset); + + // 错误输出 + IoUtil.copy(new StreamGobbler(session.getStdout()), errStream); + } catch (IOException e) { + throw new IORuntimeException(e); + } finally { + close(session); + } + return result; + } + + /** + * 执行Shell命令 + *+ * 此方法单次发送一个命令到服务端,自动读取环境变量,执行结束后自动关闭Session,不会产生阻塞。 + *
+ * + * @param session Session会话 + * @param cmd 命令 + * @param charset 发送和读取内容的编码 + * @param errStream 错误信息输出到的位置 + */ + public static String execByShell(Session session, String cmd, Charset charset, OutputStream errStream) { + final String result; + try { + session.requestDumbPTY(); + IoUtil.write(session.getStdin(), charset, true, cmd); + + result = IoUtil.read(new StreamGobbler(session.getStdout()), charset); + if(null != errStream){ + // 错误输出 + IoUtil.copy(new StreamGobbler(session.getStdout()), errStream); + } + } catch (IOException e) { + throw new IORuntimeException(e); + } finally { + close(session); + } + return result; + } + + /** + * 关闭会话 + * + * @param session 会话通道 + */ + public static void close(Session session) { + if (session != null) { + session.close(); + } + } +} diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java index 8d2df2a45..9222dc315 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java @@ -417,7 +417,7 @@ public class JschUtil { * @param cmd 命令 * @param charset 发送和读取内容的编码 * @param errStream 错误信息输出到的位置 - * @return {@link ChannelExec} + * @return 执行结果内容 * @since 4.3.1 */ public static String exec(Session session, String cmd, Charset charset, OutputStream errStream) {