【问题标题】:Running a part of a Java Program as Root以 Root 身份运行 Java 程序的一部分
【发布时间】:2011-03-11 10:28:39
【问题描述】:

全部,

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

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

提前致谢

【问题讨论】:

  • 你能解释一下你观察到的不同行为吗?
  • @Nishan :对于 ROOT 用户,isReachable = true,否则为 false。我在 Inet6Address API 中了解了这一点以及它是如何工作的。由于我无法解决这个问题,我想我可以同时尝试一下。

标签: java security root


【解决方案1】:

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

阅读InetAddress.isReachable 的javadoc 确实根据JVM 进程的权限使用不同的机制。但是,isReachable 使用的两种方法都不能保证有效。例如

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

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


@Geek - 你说你不能测试特定的端口,因为它们可以被阻止。好吧,任何东西都可以被阻止,包括 ICMP PING、ICMP ECHO 以及您可能用来测试主机是否可达的任何其他东西。

只有一件事真正很重要:您能否与您实际要使用的服务交谈。而且只有一种方法可以找出答案:尝试使用它。

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

【讨论】:

  • 我无法修复网络。我只想检查 Internet 上的特定主机是否已启动并运行。我无法使用 Socket 连接进行测试,因为某些端口会被阻塞。还有其他方法吗?例如。我只想检查一下我的程序是否可以访问 google.com。
  • @Geek,您可以尝试使用HttpUrlConnection 通过http 获取主页,但我认为在常规操作期间处理连接问题而不是检查一次然后希望网络状态会更好不变。
  • 尝试通过所需的协议和端口访问机器可能会更好。可以阻止 ping,如果没有,仍然无法通过 http 访问(由于防火墙、代理和其他乐趣)。对于谷歌,我只想尝试一个 HTTP 调用。也许很贵,但你实际上会知道一些有价值的东西。
  • @extraneon:你能解释一下吗,我没有得到“我只想尝试,对于谷歌,一个 HTTP 调用。”。
  • (我认为他的意思是“尝试向 Google 发送 HTTP 请求”。)
【解决方案2】:

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

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

【讨论】:

  • @vb:谢谢。就像我说的,我只想 ping 一下 Internet 上的主机是否可用。
  • @Geek - 但你为什么要使用 ping?这是没有意义的——它不会告诉你主机是否可用于 ICMP 以外的任何东西。如果您打算通过 hhtp 或 https 连接到它,请使用其中之一来确认该服务可用。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    相关资源
    最近更新 更多