0

我有一个我可以访问的服务器列表,我需要每 30 天至少登录一次以保持我的访问权限,因此对于我使用 JSch 的第一个程序,我想创建一个程序,该程序将包含以下列表主机,用户名和密码,并让我登录和退出每个服务器。

我能够很好地连接到服务器,甚至可以执行命令,但是如果我运行 Unix 命令“last”,它不会显示我已经登录到服务器。任何关于为什么在我运行程序时它不记录但如果我使用 putty 登录它会记录的任何见解将不胜感激。

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 回答