java - 在java中编辑只读文件

标签 java linux text-files readonly

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

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”程序;即 自身 以提升的权限运行的程序。否则,它无法以“root”身份运行请求的程序,甚至无法读取“/etc/sudoers”文件。

那么我们可以在 Java 中模拟“sudo”吗?

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


那么有哪些选择呢?

  1. 您可以使用 ProcessBuildersudo 命令作为外部命令“执行”。但是,无法通过命令行将密码传递给 sudo。所以你需要:

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

    • 想办法使用 --askPass Hook 从 Java 安全地请求用户密码,或者

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

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

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

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

警告

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

关于java - 在java中编辑只读文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27750633/

相关文章:

java - 如何使用 Stream API 删除符合特定条件的所有元素(除了其中 N 个最大的元素)

java - 如何强制 CLOSE_WAIT 停止

linux - GNU C交叉编译器: Cannot execute binary file

python - 如何将for循环的内容保存到python中的文本文件中

java - 使用 AngularJS 将 URL 中的 RequestParams 传递到 Spring MVC 后端

java - C++ 映射冲突解决作为 java HashMap

java - 使用 ProcessBuilder 在 Jar 中运行可执行文件

linux - 在 Unix 上连接文本文件中的多个字段

java - 在屏幕上显示保存到文件的数据

python - 从文本文件中打印按整数排序的城市名称