所有
我想以root身份运行我的Java程序的一部分。只有一个特定的功能作为root。程序的其他部分应该以启动程序的用户权限运行。我想只以root身份运行下面的代码,而另一个原样运行。这是因为当使用ROOT权限运行时,我看到此代码的行为不同。
try
{
addr = Inet6Address.getByName(host);
isReachable = addr.isReachable(20*1000);
} catch (UnknownHostException e)
提前致谢
答案 0 :(得分:4)
Java程序没有可移植的方式来更改有效的用户ID;即从使用root权限运行更改为另一个用户。 (即使在C语言中,应用程序也无法在特权和非特权之间切换。权限切换是单向的。)
根据JVM进程的权限,读取InetAddress.isReachable
它的的javadoc 使用不同的机制。但是,isReachable
使用的两种方法都不能保证起作用; e.g。
所以我会完全解决问题。只是尝试做任何你真正尝试做的事情,而忘记使用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的可达性并不等同于你想要使用的服务是可以访问的。