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

以Root用户身份运行Java程序的一部分,java,security,root,Java,Security,Root,全部, 我想以root用户身份运行Java程序的一部分。只有一个特定的函数作为根。程序的另一部分应以启动程序时使用的用户权限运行。我只想以root用户身份运行下面的代码,而另一个则按原样运行。这是因为当此代码以ROOT权限运行时,我看到了不同的行为 try { addr = Inet6Address.getByName(host); isReachable = addr.isReachable(20*1000); } catch (Unkno

全部,

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

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

提前感谢

Java程序没有可移植的方法来更改有效的用户id;i、 e.从使用root权限运行更改为其他用户。(即使在C语言中,应用程序也不能随意在特权和非特权之间切换。特权切换是单向的。)

根据JVM进程的权限,读取javadoc确实会使用不同的机制。但是,
isReachable
使用的两种方法都不能保证有效;e、 g

  • 某些防火墙可能会选择性地阻止ICMP回显消息
  • 目标计算机可能没有在端口7上运行回显服务。。。或者端口7可能被防火墙锁定
所以我将完全解决这个问题。只要试着去做你真正想做的事情,忘记使用
isReachable
。或者,如果在您的控制范围内,请修复机器/网络,以便这两种机制都适用于您需要测试的机器


@极客-你说你不能测试特定的端口,因为它们可能被阻塞。嗯任何都可以被阻止,包括ICMP PING、ICMP ECHO和任何其他可能用于测试主机是否可访问的内容

只有一件事是真正重要的:你能和你真正要使用的服务交谈吗。只有一种方法可以找到答案:尝试使用它


或者换一种说法,测试主机是否可用是没有意义的。主机不可用:特定的服务不可用。

特权分离在JAVA中是不可能的,因为它在不同的操作系统中以非常不同的方式工作


解决yor问题的一种可能方法是尝试TCP连接。您可以捕获包含附加信息的IOException。这是高度依赖于平台的,因此要明智地解释它们。

对于使用其他权限运行程序的部分,您需要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的可访问性并不等同于您要使用的服务是可访问的。

您能解释一下您观察到的不同行为吗?@Nishan:isReachable=对于ROOT用户为true,否则为false。我在Inet6Address API中了解到了这一点以及它的工作原理。既然我不能解决这个问题,我想我可以在这段时间内尝试一下。我无法修复网络。我只想检查一下互联网上的某个主机是否已启动并正在运行。我无法使用套接字连接进行测试,因为某些端口将被阻止。还有别的办法吗?例如,我只想检查一下我的程序是否可以访问google.com。@天哪,你可以尝试使用
HttpUrlConnection
通过http获取主页,但我认为最好在正常操作期间处理连接问题,而不是只检查一次,然后希望网络状态不会改变。最好尝试通过所需的协议和端口访问机器。ping可以被阻止,如果没有,仍然无法通过http访问(由于防火墙、代理和其他原因)。对于谷歌,我会尝试一个HTTP呼叫。也许很贵,但那样你就会知道一些有价值的东西。@extraneon:请你再解释一下,我没有听到“我只是想尝试一下,对于谷歌来说,一个HTTP呼叫”。(我想他的意思是“尝试向谷歌发送一个HTTP请求”。@vb:谢谢。就像我说的,我只想ping,看看互联网上的主机是否可用。@Geek-但你为什么要使用ping呢?这毫无意义——它不会告诉您主机是否可用于ICMP以外的任何用途。如果您计划通过hhtp或https连接到它,请使用其中一个来确认服务可用。