1

私は 3 台のマシンを持っておりssh、それらを 1 台ずつ操作してから、sudo コマンドを実行する必要があります。

次のことを行うにはJSchが必要です。

ssh <user>@<machine>
sudo <some command>

これは、JSch を実行するために使用するコード ブロックです。

String homeFolder = System.getProperty("user.home");
JSch jsch = new JSch();
jsch.addIdentity(homeFolder + "/.ssh/id_rsa.pub");
jsch.setKnowHosts(homeFolder + "/.ssh/known_hosts");

final Session session = jsch.getSession(user, machine);
session.connect();

StringBuilder response = new StringBuilder();
try {
    final Channel channel = session.openChannel("exec");
    ((ChannelExec) channel).setCommand("sudo /etc/init.d/eedir status")
    channel.connect();

    try {
        InputStream in = channel.getInputStream();
        OutputStream out = channel.getOutputStream();

        out.write((password + System.getProperty("line.separator")).getBytes());

        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String line = null;
        while (null != (line = reader.readLine())) {
            System.out.println(line);
        }
    } finally {
        channel.disconnect();
    }
} finally {
    session.disconnect();
}

私の問題は、このプログラムを使用して、所有している 3 台のマシンのうち 2 台の eedir サービスのステータスを正常に取得できるが、最後の 1 台では取得できないことです。

指定したユーザー名でリモート マシンに ssh し、次のコマンドを直接実行できます。

sudo /etc/init.d/eedir status

ssh で使用されるユーザー名は、 my で既に構成されています/etc/sudoers

だから、私の質問は次のとおりです。

  1. なぜ JSch は 3 台のマシンのうち 2 台でこのプログラムを実行できるのに、残りの 1 台では実行できないのでしょうか? sudoers の構成は、これらのマシンでまったく同じです。

  2. もう 1 つの質問は、sudoers で現在のユーザーを構成した場合、実際のマシンで sudo をパスワードを再入力せずに実行できるのに、JSch sudo はプログラムでパスワードを要求するのはなぜですか?

どんな指示でも本当に感謝しています。現在の状況でエラーが発生する可能性がある場合は、どなたでもご指摘いただければ幸いです。

ありがとう。

4

3 に答える 3

1

CentOS でも同じ問題が発生しました。1)で解決した
後、チャネルで setCommand を実行した後、次のようにします。

((ChannelExec) channel).setPty(true);

2) 入力ストリーム、チャネル、およびセッションを閉じるための最終的なブロックがあることを確認します

注: ユーザーがパスワードを必要としない場合は、出力ストリームを開く必要はありません (上記の例とは異なります)。

于 2014-07-22T09:28:54.463 に答える
1
  1. 失敗したマシンで jsch sudo を試行すると、どのような出力が得られますか? 必要なエラー出力を取得するには:

    (ChannelExec)commandChannel.getErrStream();
    

    ssh サーバーの設定が異なる可能性があります。私のサーバーでは、pty が必要です:

    (ChannelExec)commandChannel.setPty(true);
    (ChannelExec)commandChannel.setPtyType("VT100");
    
  2. 通常、sudo のセッションごとに 1 回だけパスワードを入力する必要があります。おそらく、実際のマシンでは、すでに sudo を一度実行していて、ログアウトしていない可能性があります。上記のコードは毎回再接続するため、毎回パスワードを送信する必要があります。

于 2013-03-28T12:57:19.187 に答える
0

現在までの最新バージョンにsudoは、リモートホストでコマンドを使用するサンプルJavaクラスがあります。プロジェクトの.zipファイルと.jarの両方をダウンロードします。これらは、神だけが知っている理由で分離されているためです。

于 2012-08-03T03:18:57.493 に答える