我试图让Java运行以下命令:
sshpass -p '[PASSWORD]' ssh -t -o StrictHostKeyChecking=no [USERNAME]@[HOSTNAME] 'sudo /sbin/iptables -A INPUT -p tcp -s $IP --dport [PORT] -j ACCEPT'
只有当我使用运行Java的同一用户运行它才能运行,我认为问题出在exec()
函数中。
以下是运行命令的代码:
if (Config.ENABLE_DDOS_PROTECTION_SYSTEM)
{
String deny_comms = Config.DDOS_COMMAND_BLOCK;
deny_comms = deny_comms.replace("$IP", addhost);
try
{
Runtime.getRuntime().exec(deny_comms);
if (Config.ENABLE_DEBUG_DDOS_PROTECTION_SYSTEM)
{
LOGGER.info("Accepted IP access GS by " + addhost);
LOGGER.info("Command is" + deny_comms);
}
}
catch (final IOException e1)
{
LOGGER.info("Accepts by ip " + addhost + " no allowed");
LOGGER.info("Command is" + deny_comms);
}
}
我尝试过使用ssh库的所有方法,有人可以帮我吗?
答案 0 :(得分:0)
以下是我使用ProcessBuilder
处理的方式:
String sshPassword = [...];
String sshCommand = [...];
ProcessBuilder denyCommsBuilder = new ProcessBuilder("sshpass",
"-p", sshPassword,
sshCommand);
Process denyCommsProc = denyCommsBuilder.start();
denyCommsProc.waitFor();
ProcessBuilder
构造函数可以获取数组或字符串列表,并将它们的第一个元素区分为已执行的命令,将下一个元素区分为其参数。
使用start()
生成新的Process
,如果您希望与waitFor()
中的阻止执行相同,则需要Runtime.exec()
。
如果使用sshpass
执行大量这些ssh命令,则可以创建自己的包装器ProcessBuilder
:
public class RemoteExecutionBuilder extends ProcessBuilder {
public RemoteExecutionBuilder(String remoteHost, String remotePassword, String remoteCommand, String... sshOptions) {
super("sshpass", "-p", remotePassword, "ssh " + sshOptions.join(" ") + " " + remoteHost + " -- " + remoteCommand);
}
}
嗯,字符串连接效率不高,但我希望你能明白我的意思。
答案 1 :(得分:0)
我建议使用JSCH库来处理ssh连接和执行。您可以在以下位置找到打开连接并运行sudo命令的示例:http://www.jcraft.com/jsch/examples/Sudo.java.html