1

我有三台机器,我需要ssh一个接一个,然后 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();
}

我的问题是我可以成功地使用这个程序在我拥有的三台机器中的两台上获取 eedir 服务的状态,但不是最后一台。

我可以使用给定的用户名 ssh 到远程机器,然后直接运行这个命令:

sudo /etc/init.d/eedir status

ssh 中使用的用户名已经在我的/etc/sudoers.

所以,我的问题是:

  1. 为什么 JSch 可以在三台机器中的两台上运行这个程序,而另一台不能?sudoers 的配置在这些机器上完全相同。

  2. 还有一个问题是:为什么我在sudoers中配置了当前用户,而JSch sudo需要在程序中输入密码,为什么真机上的sudo不需要再次输入密码就可以运行?

任何方向都非常感谢。如果在我目前的情况下可能有一些潜在的错误,欢迎大家指出。

谢谢。

4

3 回答 3

1
  1. 您从故障机器上的 jsch sudo 尝试得到什么输出?要获得您可能需要的错误输出:

    (ChannelExec)commandChannel.getErrStream();
    

    ssh 服务器可能有不同的设置。在我的服务器上,您需要 pty:

    (ChannelExec)commandChannel.setPty(true);
    (ChannelExec)commandChannel.setPtyType("VT100");
    
  2. 通常,您只需在每个会话中输入一次密码即可使用 sudo。也许在真机上你已经执行了一次 sudo 并且没有注销。上面的代码每次都会重新连接,所以每次都需要发送密码。

于 2013-03-28T12:57:19.187 回答
1

我在 CentOS 上遇到了同样的问题。
通过1) 在通道上执行 setCommand 后解决它:

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

2) 确保您最终有 block/s 来关闭输入流、通道和会话

注意:如果用户不需要密码,则不需要打开输出流(与上面示例中显示的不同)

于 2014-07-22T09:28:54.463 回答
0

迄今为止的最新版本sudo有一个使用远程主机上的命令的示例 java 类。下载项目.zip文件和.jar文件,因为它们是分开的,原因只有上帝知道!

于 2012-08-03T03:18:57.493 回答