在j2ssh

时间:2015-05-28 19:03:40

标签: java sudo j2ssh

我正在尝试编写一些连接到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 \“”(触摸不是我正在运行的命令,只是用它来测试。)这不起作用。

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

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

2 个答案:

答案 0 :(得分:0)

您是否在最初的'startShell'方法中使用了wait语句?

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

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

答案 1 :(得分:0)

我建议使用这样的东西,对我有用:

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();....