使用JSCH执行命令并读取终端输出的一些使用心得
2021-05-14 13:29
标签:hup remote 就是 one 两条命令 identity ssh timeout null http://www.jcraft.com/jsch/ Jsch是java实现的一个SSH客户端。开发JSCH的公司是 jcraft: JCraft成立于1998年3月,是一家致力于Java应用程序和Internet / Intranet服务的应用程序开发公司。 Jcraft的总裁兼首席执行官是Atsuhiko Yamanaka博士 在Yamanaka博士于1998年3月创立JCraft之前,他已经加入NEC公司两年了,从事软件的研究和开发。 Yamanaka博士拥有日本东北大学的信息科学硕士学位和博士学位。他还获得了东北大学信息科学学士学位。他的主题与计算机科学的数学基础有关,尤其是构造逻辑和功能编程语言的设计。 上述两段代码已经用于生产环境,如果通过异步的方式启动,可以在Buffer中通过appendBuffer方法接收每一行的输出。可以打印到终端,也可以写如文件,甚至写到websocket,Kafka等。 就是执行一些命令,例如启动 spark, 思路,既然我们读的是标准终端输出,以及错误终端输出,那么我们是见过 经过实践,解决方案就是,无论执行什么命令,在后面都可以增加 至于为什么不加 这两条命令都是可以在Java程序中打印出结果的。 例如: Linux中的执行结果如下 可以看到这两种执行方式,之所以能在Java中打印出来输出结果,是因为打印到了某些pipe,根据推测是打印到了ssh进程的pipe,所以才能通过SSH协议送回我们本地机器Java应用程序中的jsch的线程内的。 使用JSCH执行命令并读取终端输出的一些使用心得 标签:hup remote 就是 one 两条命令 identity ssh timeout null 原文地址:https://www.cnblogs.com/slankka/p/11988477.html使用Jsch执行命令,并读取终端输出
jsch
执行命令
public static String executeCommandWithAuth(String command,
SubmitMachineInfo submitMachineInfo,
ExecuteCommandACallable
public interface ExecuteCommandACallable
实际遇到的问题
spark-submit
,启动 flink, flink run
,都无法读取终端输出,且都阻塞到readLine。2>&1
这种重定向,是不是可以利用他重定向到我们的流呢?2>&1
,即便是 ls 2>&1
, date 2>&1
.2>&1
就不行,或许是因为以这种方式启动的命令输出,是到了 /dev/tty
了,或者某个非ssh进程的pipe。非充分验证
executeCommandWithAuth("date;sleep 1m;date", submitMachineInfo, buffer);
, 并查看Linux中通过ssh协议产生bash进程的fdexecuteCommandWithAuth("date;sleep 1m;date 2>&1", submitMachineInfo, buffer);
, 并查看Linux中通过ssh协议产生bash进程的fd2019年 12月 05日 星期四 11:57:16 CST
2019年 12月 05日 星期四 11:58:16 CST
[root@hm arvin]# ps aux | grep bash
arvin 7886 0.0 0.0 113248 1592 ? Ss 11:55 0:00 bash -c date;sleep 1m;date
root 7910 0.0 0.0 112668 972 pts/1 S+ 11:56 0:00 grep --color=auto bash
[root@hm arvin]# ll /proc/7886/fd
总用量 0
lr-x------ 1 arvin arvin 64 12月 5 11:55 0 -> pipe:[64748]
l-wx------ 1 arvin arvin 64 12月 5 11:55 1 -> pipe:[64749]
l-wx------ 1 arvin arvin 64 12月 5 11:55 2 -> pipe:[64750]
[root@hm arvin]# ps aux | grep bash
root 617 0.0 0.0 115248 944 ? S 09:40 0:00 /bin/bash /usr/sbin/ksmtuned
arvin 7968 0.0 0.0 113248 1588 ? Ss 11:57 0:00 bash -c date;sleep 1m;date 2>&1
root 8000 0.0 0.0 112672 972 pts/1 S+ 11:57 0:00 grep --color=auto bash
[root@hm arvin]# ll /proc/7968/fd
总用量 0
lr-x------ 1 arvin arvin 64 12月 5 11:57 0 -> pipe:[64278]
l-wx------ 1 arvin arvin 64 12月 5 11:57 1 -> pipe:[64279]
l-wx------ 1 arvin arvin 64 12月 5 11:57 2 -> pipe:[64280]
[root@hm arvin]#
这里我就不再制造不加重定向无法打印的例子,但可以用此方法验证,推测Linux进程输出到别的位置了。
上一篇:PHP 可变参数
下一篇:webstorm安装wepy插件
文章标题:使用JSCH执行命令并读取终端输出的一些使用心得
文章链接:http://soscw.com/index.php/essay/85629.html