背景是这样的。
我在本地通过 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 demo@host-a.b.c:~
$ sudo su -
20:51:19 root@host-a.b.c:~
# 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 root@host-a.b.c:~
# exit
logout
20:51:19 demo@host-a.b.c:~
$ exit
logout
而且如果远程机器换一个 os ,例如是 centos ,则:
Last login: Thu Mar 31 20:27:32 2022 from 192.168.1.2
sudo su -
docker ps
exit
exit
[demo@host-e.f.g ~]$ sudo su -
Last login: Thu Mar 31 14:17:40 CST 2022 on pts/3
[root@host-e.f.g ~]# 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
[root@host-e.f.g ~]# exit
logout
[demo@host-e.f.g ~]$ exit
logout
不同系统或者 terminal 可能会返回格式不同,导致真正想要的结果难以提取。
请教是否有好的解决方法呢?
文档:
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.