Java exec()问题

时间:2016-04-27 13:57:57

标签: java ssh runtime.exec

我试图让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库的所有方法,有人可以帮我吗?

2 个答案:

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