以Root身份运行Java程序的一部分

时间:2011-03-11 10:28:40

标签: java security root

所有

我想以root身份运行我的Java程序的一部分。只有一个特定的功能作为root。程序的其他部分应该以启动程序的用户权限运行。我想只以root身份运行下面的代码,而另一个原样运行。这是因为当使用ROOT权限运行时,我看到此代码的行为不同。

 try
    {
         addr = Inet6Address.getByName(host);
         isReachable = addr.isReachable(20*1000);
    } catch (UnknownHostException e)

提前致谢

3 个答案:

答案 0 :(得分:4)

Java程序没有可移植的方式来更改有效的用户ID;即从使用root权限运行更改为另一个用户。 (即使在C语言中,应用程序也无法在特权和非特权之间切换。权限切换是单向的。)

根据JVM进程的权限,读取InetAddress.isReachable它的的javadoc 使用不同的机制。但是,isReachable使用的两种方法都不能保证起作用; e.g。

  • 某些防火墙可能会选择性地阻止ICMP ECHO消息,
  • 目标计算机可能未在端口7上运行Echo服务...或者端口7可能被防火墙锁定。

所以我会完全解决问题。只是尝试做任何你真正尝试做的事情,而忘记使用isReachable。或者,如果它在您的控制范围内,请修复机器/网络,以便两种机制都适用于您需要测试的机器。


@Geek - 您说您无法测试特定端口,因为它们可能被阻止。 任何都可以被阻止,包括ICMP PING,ICMP ECHO以及您可能用于测试主机是否可访问的任何其他内容。

只有一件事真的很重要:您能否与您实际要使用的服务进行对话。并且只有一种方法可以找到:尝试使用它。

或者换句话说,测试主机是否可用是没有意义的。主机不可用:具体服务是。

答案 1 :(得分:1)

JAVA无法实现权限分离,因为它在不同的操作系统中的工作方式非常不同。

解决问题的一种可能方法是TCP连接尝试。您可以捕获包含其他信息的IOException。这是高度依赖于平台的,所以要巧妙地解释它们。

答案 2 :(得分:0)

要运行具有其他权限的程序部分,您需要JNI和系统相关的调用。更简单的方法是使用ProcessBuilder或Runtime.exec简单地调用外部程序:

Process p = Runtime.getRuntime().exec(new String[]{"sudo", "ping", "-c", "5", "host"});
int result = p.waitFor();
if(result == 0) {
   // reachable
}
else {
   // unreachable, or some error
}

这需要sudoers配置文件中的合适条目(对于其他系统和/或其他版本的ping可能还有其他参数)。

但正如其他人所说,ping的可达性并不等同于你想要使用的服务是可以访问的