Java exec() 问题

Java exec() issue

我正在尝试使 Java 运行 成为以下命令:

sshpass -p '[PASSWORD]' ssh -t -o StrictHostKeyChecking=no [USERNAME]@[HOSTNAME] 'sudo /sbin/iptables -A INPUT -p tcp -s $IP --dport [PORT] -j ACCEPT'

只有当我 运行 它与 运行s 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 库,有人可以帮助我吗?

下面是我将如何处理 ProcessBuilder

String sshPassword = [...];
String sshCommand = [...];
ProcessBuilder denyCommsBuilder = new ProcessBuilder("sshpass",
                                                         "-p", sshPassword,
                                                         sshCommand);
Process denyCommsProc = denyCommsBuilder.start();
denyCommsProc.waitFor();

ProcessBuilder 构造函数可以采用数组或字符串列表,并将它们的第一个元素区分为已执行的命令,将下一个元素作为其参数。
使用 start() 产生一个新的 Process,如果你想有与 Runtime.exec().

相同的阻塞执行,你将必须 waitFor()

如果您使用 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);
    }
}

嗯,字符串连接效率不高,但我希望你明白我的意思。

我建议使用 JSCH 库来处理 ssh 连接和执行。您可以在以下位置找到打开连接和 运行 sudo 命令的示例:http://www.jcraft.com/jsch/examples/Sudo.java.html