0

アクセスを維持するために少なくとも 30 日に 1 回はログインする必要があるサーバーのリストがあるため、JSch を使用する最初のプログラムでは、サーバーのリストを取り込むプログラムを作成したいと考えました。ホスト、ユーザー名とパスワード、および各サーバーへのログインとログアウト。

サーバーに正常に接続でき、コマンドを実行することもできますが、「最後に」Unix コマンドを実行しても、サーバーにログインしたことが示されません。プログラムを実行するとログに記録されないが、パテを使用してログインするとログに記録される理由についての洞察をいただければ幸いです。

JSch jsch = new JSch();
Session session = jsch.getSession(userId, host, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect(timeout);

Channel channel = session.openChannel("exec");
((ChannelExec)channel).setCommand(command);
channel.connect();

InputStream commandOutput = channel.getInputStream();
        int readByte = commandOutput.read();
while(readByte != 0xffffffff)
{
  outputBuffer.append((char)readByte);
  readByte = commandOutput.read();
}

channel.disconnect();
session.disconnect();
4

1 に答える 1

0

疑似端末を割り当てれば、

Channel channel = session.openChannel("exec");
((ChannelExec)channel).setCommand(command);
((ChannelExec)channel).setPty(true);      // !!!!
channel.connect();

コマンド "last" で見つけることができますが、端末エミュレータの入力ストリームから不要な文字シーケンスを取得する可能性があります。最後のコマンドの出力ではなく、/var/log/secure、/var/log/auth.log を確認してみてはどうでしょうか。

そして、Channel#connect() と Channel#getInputStream() の間に受信したデータの一部が失われる可能性があるため、Channel#connect() の前に Channel#getInputStream() を呼び出した方がよいでしょう。

于 2012-10-31T03:23:54.527 に答える