Я пишу приложение 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
работает в терминале, но не в приложении. Между тем, я получил его для работы, разобрав устройства 1 на 1, но было бы более чистым, если бы я мог работать с umount -a
чтобы работать.
Если вы понимаете, почему gksu не работает с umount или sudo с Runtime.exec(), я бы принял ваше объяснение.
благодаря
Я чувствую, что проблема заключается в том, что sudo не спрашивает у меня пароль, как это делает gksu. Но я не знаю, как дать ему пароль.
Это очень вероятно. Здесь есть пара различных возможных ситуаций, и каждый из них, по моему мнению, имеет собственное решение:
У пользователя, запускающего программу (в случае настольного приложения), уже есть привилегии для запуска необходимых команд. - Попросите пользователя ввести свой пароль и передать его в sudo через stdin, используя флаг -s. Посмотрите страницу руководства sudo для получения дополнительной информации. Это просто и гарантирует, что ваше приложение не имеет большего доступа, чем пользователь, который его запускает.
Если ваше приложение должно запускаться с разными правами, чем у пользователя, или если оно выполняется на сервере, приложение должно запускаться в качестве собственного пользователя системы. Затем вы можете использовать visudo, чтобы дать пользователю этой системы возможность запускать ТОЛЬКО команды, которые вам нужны, не требуя пароля. Просто будьте очень осторожны в редактировании файла sudoers. Я рекомендую добавить его как отдельный файл и просто связать его с реальными sudoers, чтобы его было легче отменить позже.
Runtime.exec()
?