我的Linux操作系统上有一个保护,只读的文本文件,我必须对其进行编辑。当然我可以转到终端并输入:
sudo gedit /etc/ppp/options
然后我必须输入我的sudo密码。我的问题是如何提供我的java程序" sudo"能够写入此文件并保存这些编辑的权限?我想,一旦我给了程序这些权限,我就可以使用BufferedWriter或PrintWriter进行编辑。
为了澄清,我的程序会提示用户输入管理(sudo)密码。我如何使用它来为写入目的授予对此文件的访问权限?
答案 0 :(得分:3)
我的问题是如何为我的java程序提供“sudo”权限,以便能够写入此文件并保存这些编辑。
我认为简单的答案是你不能。
Sudo的工作原理是检查文件以查看用户是否允许运行命令,并可选择通过询问他/她的密码来确认他/她的身份。如果这两个都签出,则sudo
命令以不同的用户执行所请求的命令;通常是root
。
然而,为了做到这一点,“sudo”程序本身被实现为“setuid”程序;即一个以提升的权限运行的本身的程序。没有它,它就无法“以root身份”运行所请求的程序,甚至无法读取“/ etc / sudoers”文件。
那么我们可以在Java中模拟“sudo”吗?
基本上没有。为此,您需要将java
命令设为“setuid”程序。但是java
命令可以执行任何人编写的任何java程序。因此,“setuid”java
将允许任何人以管理员权限运行任何java程序。那将是疯狂不安全。
那么有哪些替代方案?
您可以使用ProcessBuilder
“执行”sudo
命令作为外部命令。但是,无法通过其命令行将密码传递给sudo
。所以你需要:
配置sudoers
文件以允许在没有密码的情况下执行(特定)命令(有潜在危险),或
找出一种使用--askPass
挂钩从Java安全地请求用户密码的方法,或者
使用--stdin
选项从标准输入而不是用户终端读取用户密码。
编写自定义“setuid”(或“setgid”)包装器以执行admin命令。注意:“setuid”shell脚本从根本上说是不安全的。 C / C ++包装器可能是最安全的方法......但是你需要确保通过提供聪明的参数或环境变量,不会欺骗包装器做一些危险/讨厌的事情。
不要用Java做。让用户从命令行运行特权命令;例如使用sudo
。你可以通过提供一个脚本(shell,perl,无论如何)来处理复杂的事情,进行健全性检查等等,从而使用户更容易。
我的建议是方法#3(一般情况下)。这是最安全和透明的方法。 (作为管理员/高级用户,我会非常不舒服使用一些复杂/不透明的Java应用程序,要求我的密码在我的系统上运行sudo
命令。)
安全可靠地执行此类操作需要充分了解UNIx / Linux安全性的工作原理。您可能会犯很多错误(列出的太多)可能会危及安全性,并允许用户以root用户身份运行任意程序,或其他危险/破坏性事件。小心,并找一个真正的UNIX / Linux专家来检查你实现的机制。