我有三台机器,我需要逐一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
中配置。
所以,我的问题是:
为什么JSch可以在三台机器中的两台机器上运行这个程序 休息一个不可以? sudoers的配置完全相同 这些机器。
另一个问题是:为什么sudo在真机上 如果配置了当前值,则可以在不输入密码的情况下运行 用户在sudoers中,而JSch sudo需要程序中的密码?
任何指示都非常感谢。如果在我目前的情况下可能存在一些潜在的错误,欢迎大家指出。
感谢。
答案 0 :(得分:1)
你从失败的机器上的jsch sudo尝试获得了什么输出?获取您可能需要的错误输出:
(ChannelExec)commandChannel.getErrStream();
ssh服务器可能有不同的设置。在我的服务器上你需要pty:
(ChannelExec)commandChannel.setPty(true);
(ChannelExec)commandChannel.setPtyType("VT100");
一般来说,每次会话只需要为sudo输入一次密码。也许在真正的机器上你曾经做过一次sudo并且没有退出。上面的代码每次都重新连接,因此每次都需要发送密码。
答案 1 :(得分:1)
我在CentOS上遇到了同样的问题。解决了它 1)在通道上执行setCommand之后执行以下操作:
((ChannelExec) channel).setPty(true);
2)确保你最后阻止/ s关闭输入流,频道和会话
注意:如果用户不需要密码,则无需打开输出流(与上例中显示的不同)
答案 2 :(得分:0)
latest version to date在远程主机上使用sudo
命令有一个示例java类。下载项目 .zip 文件和 .jar ,因为它们是分开的,原因只有GOD知道!!