我正在使用在其中传递以下命令的文件:
hostname
pwd
pbrun su - fclaim
whoami
cd ..
pwd
添加以下 Java 代码:
for (String command1 : commands) {
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand(command1);
in=channel.getInputStream();
channel.connect();
byte[] tmp=new byte[1024];
while(true){
while(in.available()>0){
int i=in.read(tmp, 0, 1024);
if(i<0)
break;
System.out.println(new String(tmp, 0, i));
}
if(channel.isClosed()){
break;
}
}
channel.setInputStream(null);
channel.disconnect();
}
但我得到这个输出:
- 一些主机名
/home/imam
- 缺少输出
imam
- 缺少输出
/home/imam
您的代码在隔离的环境中执行每个命令。所以你的第二个whoami
不在范围内运行pbrun su
,正如您可能所希望的那样。
The pbrun su
执行一个新的 shell。
要向 shell 提供命令,您可以:
-
指定命令su
命令行,例如官方 JSchSudo.java example http://www.jcraft.com/jsch/examples/Sudo.java.html shows:
((ChannelExec)channel).setCommand("pbrun su - fclaim -c whoami");
-
或使用 shell 的标准输入将命令提供给 shell:
OutputStream out = channel.getOutputStream();
out.write(("whoami\n").getBytes());
也可以看看:
sudo 登录后使用 Java JSch 程序执行多个 bash 命令 https://stackoverflow.com/q/46724329/850848 and
sudo登录后运行命令 https://stackoverflow.com/q/41670999/850848.
一般来说,我推荐第一种方法,因为它使用定义更好的 API(命令行参数)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)