【问题标题】:running a sudo command over j2ssh在 j2ssh 上运行 sudo 命令
【发布时间】:2015-05-28 19:03:40
【问题描述】:

我正在尝试编写一些连接到 linux 工作站的 Java 代码,使用 sudo 执行命令,然后阻塞直到命令完成。

session.getOutputStream().write("sudo -s \n".getBytes());
session.getOutputStream().write(command.getBytes());
session.getOutputStream().write("\n exit\n".getBytes());

IOStreamConnector output = new IOStreamConnector();
java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();
output.connect(session.getInputStream(), bos);
String theOutput = bos.toString();

似乎没有等待程序完成或返回输出。

    session.executeCommand(command);
    IOStreamConnector output = new IOStreamConnector();
    java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();
    output.connect(session.getInputStream(), bos);
    session.getState().waitForState(ChannelState.CHANNEL_CLOSED);
    theOutput = bos.toString();

效果很好,但不适用于 sudo。我试过设置命令:

"su -c \"touch /tmp/whatever\"" (touch不是我正在运行的命令,只是用来测试。)这不起作用。

“sudo touch /tmp/whatever”这不起作用。

这样做的神奇公式是什么????提前致谢。

【问题讨论】:

  • 是否需要 sudo 命令的密码?
  • 不,它不需要密码。我在 sudoers 文件中配置了不需要密码。不过谢谢你的建议。

标签: java sudo j2ssh


【解决方案1】:

您是否在最初的基于“startShell”的方法中使用了等待语句?

session.getState().waitForState(ChannelState.CHANNEL_CLOSED);

帖子中的代码似乎试图在编写 sudo 命令后立即捕获命令输出。由于 IOStreamConnector 会产生线程来读取命令,因此在会话关闭之前它可能尚未完成。

【讨论】:

    【解决方案2】:

    我建议使用这样的东西,对我来说效果很好:

    if ( session.executeCommand("echo "+"/'your_sudo_password/' "+"| "+ "sudo -S "+command) ) {
                    IOStreamConnector output = new IOStreamConnector();
                    ByteArrayOutputStream bos =  new ByteArrayOutputStream();
                    output.connect(session.getInputStream(), bos );
                    session.getState().waitForState(ChannelState.CHANNEL_CLOSED);
                    theOutput = bos.toString();....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 2016-09-07
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多