背景是这样的。
我在本地通过 jsch 对一台远程机器执行命令,但该命令需 sudo 权限。
远程用户,只开放了登录用户的 sudo su 的权限。
导致想执行 sudo 命令需分两步:
sudo su -
docker ps
这里涉及到 session 切换,原生的 Jsch 的 ExecChannel 就用不了。
改为 ChannelShell 。
ChannelShell channel = (ChannelShell) session.openChannel("shell");
OutputStream os = channel.getOutputStream();
os.write(("sudo su - \r").getBytes());
os.flush();
os.write(("docker ps \r").getBytes());
os.flush();
os.write(("exit \r".getBytes());
os.flush();
os.write(("exit \r").getBytes());
os.flush();
但这个命令的返回,是一堆 shell 命令和结果糅合在一起,比较难提取真正的结果。
sudo su -
docker ps
exit
exit
20:51:19 [email protected]:~
$ sudo su -
20:51:19 [email protected]:~
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a3da88c5f8b ca6e5bfba5a5 "/usr/bin/tini -- /u…" 3 days ago Up 3 days docker_job_xxx
20:51:19 [email protected]:~
# exit
logout
20:51:19 [email protected]:~
$ exit
logout
而且如果远程机器换一个 os ,例如是 centos ,则:
Last login: Thu Mar 31 20:27:32 2022 from 192.168.1.2
sudo su -
docker ps
exit
exit
[[email protected] ~]$ sudo su -
Last login: Thu Mar 31 14:17:40 CST 2022 on pts/3
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8929e8f93280 img_xxx "/usr/sbin/init" 5 months ago Up 5 months docker_job_yyy
[[email protected] ~]# exit
logout
[[email protected] ~]$ exit
logout
不同系统或者 terminal 可能会返回格式不同,导致真正想要的结果难以提取。
请教是否有好的解决方法呢?
文档: