在 JSch 中使用 SSH“exec”通道执行 sudo

2024-02-17

我正在使用在其中传递以下命令的文件:

  1. hostname
  2. pwd
  3. pbrun su - fclaim
  4. whoami
  5. cd ..
  6. 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();
}

但我得到这个输出:

  1. 一些主机名
  2. /home/imam
  3. 缺少输出
  4. imam
  5. 缺少输出
  6. /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(使用前将#替换为@)

在 JSch 中使用 SSH“exec”通道执行 sudo 的相关文章

随机推荐