Изменение пользовательской среды с помощью ProcessBuilder + Java - PullRequest
4 голосов
/ 15 ноября 2010

Я пытаюсь изменить пользователя дочернего процесса на пользователя с незначительными привилегиями. но когда я выполняю метод запуска ProcessBuilder, подпроцесс exec с тем же пользователем родительского

        LinkedList<String> commands = new LinkedList<String>();
        commands.add("vlc");
        ProcessBuilder builder = new ProcessBuilder(commands);
        Map<String,String> enviroment = builder.environment();
        enviroment.clear();            
        enviroment.put("USER", "otheruser");
        enviroment.put("LOGNAME", "otheruser");
        enviroment.put("PWD", "/home/otheruser");
        enviroment.put("HOME", "/home/otheruser");
        enviroment.put("USERNAME", "otheruser");
        enviroment.put("SHELL", "/bin/false");
        builder.directory(new File("/home/otheruser"));            

        Process process = builder.start();
        process.waitFor();

Я работаю в Linux (Ubuntu)

Ответы [ 2 ]

3 голосов
/ 15 ноября 2010

Джим абсолютно прав. Но если вы все еще хотите запускать вашу программу как другой пользователь, вам нужно использовать инструменты, зависящие от платформы.

Windows: используйте команду runas, например: runas / user: domain \ jamesbond regedt32.exe К сожалению, runas требует от пользователя вводить пароль вручную. Следующая статья объясняет, как обойти проблему: http://www.windowsnetworking.com/kbase/WindowsTips/WindowsXP/AdminTips/Miscellaneous/RunprogramsasanotheruserinWindows2000WindowsXP.html

В качестве альтернативы вы можете написать свою собственную утилиту в VBS и запустить ее из Java. Смотрите этот пост для деталей: http://weblogs.asp.net/hernandl/archive/2005/12/02/startprocessasuser.aspx

Unix: см. ссылку su и sudo. su хорошо, но он также требует пароль (если текущий пользователь не является пользователем root). Чтобы обойти это, вы можете создать ожидаемый скрипт (см. http://en.wikipedia.org/wiki/Expect). Expect по умолчанию устанавливается в большинстве дистрибутивов Unix.

Удачи!

0 голосов
/ 15 ноября 2010

Вы не можете изменить действующего пользователя, просто передав переменную окружения USER. Это функция безопасности Linux (и Unix в целом), иначе злоумышленник может просто установить переменную USER на ROOT. Подпроцессы всегда выполняются как тот же пользователь, что и родительский, если исполняемый файл не помечен setuid или процесс не выполняет setuid () для изменения действующего пользователя (и setuid () разрешен).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...