【问题标题】:Edit read-only file in java在java中编辑只读文件
【发布时间】:2015-01-03 00:53:55
【问题描述】:

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

sudo gedit /etc/ppp/options

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

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

【问题讨论】:

  • 您目前的程序运行情况如何?
  • @Malt 你这是什么意思?我不确定知道这对我的问题有多大用处。
  • @DanielH 如果他知道您是通过 ide 还是控制台运行程序,也许他可以帮助您
  • @CyanogenCX 好的,我很抱歉。
  • @Malt 我有一个 GUI (swing),允许用户从 IP 地址列表中进行选择(它们稍后用于连接目的)。当用户选择一个时,我需要通过将这个地址放入其中来编辑我上面提到的文本文件。我想在程序获得“sudo”访问权限后,我会使用 BufferedWriter 或 PrintWriter 进行相应的更改。

标签: java linux text-files readonly writing


【解决方案1】:

我的问题是如何赋予我的 java 程序“sudo”权限,以便能够写入该文件并保存这些编辑。

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

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

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

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

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


那么有什么替代品呢?

  1. 您可以使用ProcessBuildersudo 命令作为外部命令“执行”。但是,无法通过其命令行将密码传递给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 专家来审查您实现的机制。

【讨论】:

  • 您好,谢谢您的回复。我想强调两点。首先,可以从我读过的内容中传递密码。这里有一篇文章展示了 sudo 命令的使用:alvinalexander.com/java/java-exec-processbuilder-process-1 其次,我不允许用户输入任何类型的命令。它们都将被预先编程,因此不必担心。我有一系列用户可以做的选项(JButtons),他们只能这样做。用户在这方面没有回旋余地。
  • @DanielH - 是的......但用户可以信任>>你
  • 您提出了一个非常有效的问题。我正在为自己和我开始参与的社区制作这个程序。他们使用的方法很糟糕,因为它需要四个终端,而且很乱。我根本没有恶意,我只是想提供帮助。但我确实明白你的意思。我会做一些思考来找出正确和最好的方法。谢谢。
  • @DanielH - 这不仅仅是恶意。使用sudo 运行的命令中的一个诚实错误可能同样具有破坏性。人们应该能够预览将要执行的内容……以防万一。
  • 好的,我认为这是公平的。我将在执行前进行预览。
猜你喜欢
  • 2013-09-22
  • 2022-07-02
  • 2020-07-28
  • 1970-01-01
  • 2019-07-18
  • 2022-12-13
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
相关资源
最近更新 更多