我正在开发一个需要根/管理员权限才能正常运行的 Java 应用程序。如果用户没有以这样的权限启动应用程序,我想通知用户并以这些权限重新启动程序。我已经想出如何在 Windows 和 OS X 上执行此操作,但找不到在 Linux 系统上执行此操作的方法。在 Windows 上,我发现一个程序可以提升你传递给它的任何命令,在 OS X 上可以通过运行一个简单的 AppleScript 但在 Linux 上,根本没有可移植的方法来做到这一点。
我的计划是使用 gksu,但我最近发现大多数 Linux 系统并没有默认安装它,Debian 也没有,所以我也无法安装它。在大多数(如果不是全部)Linux 发行版和 Java 版本上,是否有任何可移植的方法以 root 权限重启应用程序?
编辑:我能够检查该程序是否在所有平台上以管理员身份运行。
最佳答案
您将无法在 Linux 上干净地执行此操作**,因为升级权限的想法在 Linux 中并不存在。 sudo
是特权执行的实际答案,但真正做的只是以 root 身份运行单个命令,这在概念上不同于以同一用户身份运行命令但具有升级权限。
考虑这样一个事实,即使是基线 sudo
(甚至不考虑 gksudo
或类似的东西)也只是一个用户空间应用程序,而不是 Linux 的核心组件。例如,如果 Arch 上的某些人更喜欢使用 su
做事,他们可能从未安装过它。
这种理念与 OS X 和 Windows 形成鲜明对比,OS X 和 Windows 以桌面为中心,因此可以方便地模糊管理和常规使用之间的界限。因为 Linux 对桌面和服务器发行版使用相同的内核,所以服务器环境的更高安全要求往往会在内核级别主导围绕这些事情的策略,因此您不会获得不特定的解决方案某些面向桌面的发行版。
还有文化差异; Linux 用户往往是那种希望对如何运行事物进行细粒度控制的人,并且大多数人可能会将以 root 权限自行重启的事物视为一种病毒:P
简单的答案:抛出一条错误消息,指出应用程序需要 root 权限,以非零错误代码退出,收工。这或多或少是 Linux 领域的“预期”行为。
Hack-y 答案:如果您要在图形环境中运行,则将 gksudo
作为依赖项与 gtk
(或 kdesudo
如果你正在使用 qt
或其他东西,等等)然后用它来提示升级。即使默认情况下未安装它,您也可以利用 Linux 发行版的精美包管理轻松安装它,而无需用户付出任何额外努力。在非图形环境中,你只是运气不好。
** 至少,对于一个应用程序而言,它的值(value)还不够容易,特别是考虑到您的应用程序可能会成为任何试图编写新 rootkit 的人的攻击媒介。
关于java - 在大多数(如果不是全部)Linux 发行版上以 root 权限重新启动 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34658917/