编辑 java 中的只读文件

Edit read-only file in java

我的 Linux 操作系统上有一个受保护的只读文本文件,我必须对其进行编辑。当然,我可以转到终端并输入:

sudo gedit /etc/ppp/options

然后我必须输入我的 sudo 密码。我的问题是如何赋予我的 java 程序 "sudo" 权限以便能够写入此文件并保存这些编辑?我想一旦我给了程序这些权限,我就可以使用 BufferedWriter 或 PrintWriter 进行编辑。

澄清一下,我的程序提示用户输入他们的管理 (sudo) 密码。我如何使用它来授予对该文件的访问权限以进行写入?

My question is how do I give my java program "sudo" privileges to be able to write to this file and save those edits.

我认为简单的答案是你不能。

Sudo 的工作方式是检查文件以查看用户是否允许 运行 命令,并可选择通过询问他/她的密码来确认他/她的身份。如果这两个都检查出来,那么 sudo 命令将以不同的用户身份执行请求的命令;通常 root.

但是,为了做到这一点,"sudo" 程序本身被实现为 "setuid" 程序;即 自身 运行 具有更高权限的程序。没有这个,它就不能 运行 请求的程序 "as root",甚至不能读取“/etc/sudoers”文件。

那么我们可以在Java中模仿"sudo"吗?

基本上没有。为此,您需要将 java 命令设为 "setuid" 程序。但是 java 命令可以执行任何人编写的任何 java 程序。因此 "setuid" java 将允许任何人 运行 具有管理员权限的任何 java 程序。那将是疯狂不安全。


那么有哪些选择呢?

  1. 您可以使用 ProcessBuilder 到 "exec" sudo 命令作为外部命令。但是,无法通过其命令行将密码传递给 sudo。所以你需要:

    • 配置sudoers文件以允许在没有密码的情况下执行(特定的)命令(潜在危险),或者

    • 想办法使用 --askPass 挂钩从 Java 或

    • 安全地请求用户密码
    • 使用 --stdin 选项从标准输入而不是用户终端读取用户密码。

  2. 编写自定义 "setuid"(或 "setgid")包装器来执行管理命令。注意:"setuid" shell 脚本从根本上讲是不安全的。 C/C++ 包装器可能是最安全的方法……但是您需要确保包装器不会被提供巧妙的参数或环境变量欺骗而去做一些危险/讨厌的事情。

  3. 不要在Java中这样做。从命令行获取用户 运行 特权命令;例如使用 sudo。您可以通过提供脚本(shell、perl 等)来处理任何复杂的事情、进行健全性检查等,从而使用户更轻松。

我的建议是方法 #3(一般而言)。这是最安全和透明的方法。 (作为管理员/高级用户,如果某些复杂/不透明的 Java 应用程序要求我输入 运行 sudo 的密码,我会 非常不自在 我系统上的命令。)

警告

安全可靠地做这种事情需要很好地理解 UNIx / Linux 安全性的工作原理。您可能会犯许多错误(太多无法一一列举),这些错误可能会危及安全,并允许用户以 root 身份 运行 任意程序,或其他危险/破坏性的事情。小心点,请一位真正的 UNIX / Linux 专家来审查您实施的机制。