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
我正在尝试使 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