我正在编写一个Java应用程序,其中(以及其他内容)我将安装外部设备,进行一些复制,然后卸载它。
//I am mounting several devices in created dirs named sdb, sdc... according to the partitions
String[] command = {"gksu", "mount", "/dev/sd" + letter + "1", "mounter/sd" + letter};
Runtime.getRuntime().exec(command);
这在终端和我的程序中都可以正常工作。
为了更快地卸载,我考虑使用umount -a
,但gksu umount -a
在终端中不起作用,因此不在Java程序中。 sudo umount -a
在终端中有效,但在应用程序中无效。与此同时,我通过逐个卸载设备来实现它,但如果我能够让umount -a
工作,那将会更清晰。
如果你理解为什么gksu无法使用umount或sudo与Runtime.exec(),我会采取你的解释。
由于
答案 0 :(得分:1)
我觉得问题是sudo没有问我密码,就像gksu那样。但我不知道如何给它一个密码。
很可能是这种情况。 这里有几种不同的可能情况,我认为每种情况都有自己的解决方案:
运行程序的用户(如果是桌面应用程序)已具有运行所需命令的权限。 - 提示用户输入密码并使用-s标志通过stdin将其传递给sudo。 Check out the sudo man page for more。这很简单,可确保您的应用程序的访问权限不超过运行它的用户。
如果您的应用程序需要使用不同于用户的权限运行,或者如果它在服务器上运行,那么应用程序应该以其自己的系统用户身份运行。然后,您可以使用visudo为该系统用户提供仅运行所需命令的功能,而无需密码。编辑sudoers文件时要非常谨慎。我建议将其作为单独的文件添加,并在实际的sudoers中链接到它,以便以后更容易撤消。