我正在编写一个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()一起使用,我将为您解释。
谢谢
最佳答案
我觉得问题是sudo不像gksu那样要求我输入密码。但是我不知道如何给它输入密码。
很有可能是这种情况。
这里有两种不同的可能情况,我认为每种情况都有其自己的解决方案:
运行该程序的用户(对于桌面应用程序)已经具有运行所需命令的权限。 -提示用户输入密码,并使用-s标志通过stdin将其传递给sudo。 Check out the sudo man page for more。这很简单,可以确保您的应用程序没有比运行它的用户更大的访问权限。
如果您的应用程序需要以与用户不同的特权运行,或者该应用程序正在服务器上运行,则应以其自己的系统用户身份运行该应用程序。然后,您可以使用visudo使该系统用户能够仅运行所需命令,而无需输入密码。在编辑sudoers文件时要非常小心。我建议将其添加为一个单独的文件,并仅在实际的sudoers中链接到它,以便以后撤消时更容易。