在java中编辑只读文件

时间:2015-01-03 00:53:56

标签: java linux text-files readonly writing

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

sudo gedit /etc/ppp/options

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

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

1 个答案:

答案 0 :(得分:3)

  

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

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

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

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

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

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


那么有哪些替代方案?

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

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

    • 找出一种使用--askPass挂钩从Java安全地请求用户密码的方法,或者

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

  2. 编写自定义“setuid”(或“setgid”)包装器以执行admin命令。注意:“setuid”shell脚本从根本上说是不安全的。 C / C ++包装器可能是最安全的方法......但是你需要确保通过提供聪明的参数或环境变量,不会欺骗包装器做一些危险/讨厌的事情。

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

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

    警告

    安全可靠地执行此类操作需要充分了解UNIx / Linux安全性的工作原理。您可能会犯很多错误(列出的太多)可能会危及安全性,并允许用户以root用户身份运行任意程序,或其他危险/破坏性事件。小心,并找一个真正的UNIX / Linux专家来检查你实现的机制。