0

Linuxワークステーションに接続し、sudoでコマンドを実行し、コマンドが完了するまでブロックするJavaコードを作成しようとしています。

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」これは機能しません。

これを行うための魔法の公式は何ですか???? 前もって感謝します。

4

2 に答える 2

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();....
于 2016-06-06T12:34:52.547 に答える
0

元の「startShell」ベースのアプローチで待機ステートメントを使用しましたか?

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

投稿のコードは、sudo コマンドを記述した直後にコマンド出力を取得しようとしているようです。IOStreamConnector はスレッドを生成してコマンドを読み取るため、セッションが閉じられる前に完了していない可能性があります。

于 2015-07-20T11:16:21.703 に答える