Как ввести пароль для sudo, используя Java Runtime?
Мне нужно выполнить данные команды от имени пользователя root и sudo, используя Java. Однако я не уверен в способе, который я могу использовать для передачи пароля. Есть ли способ, с помощью которого я могу передать пароль на терминал?
7 ответов
Вы можете просто сбросить sodu вместе, создать скрипт suid root и запустить его вместо этого.
chmod +s myscript && chown root myscript && chgrp root myscript
всякий раз, когда этот скрипт вызывается, он запускается от имени пользователя root.
Вы можете настроить sudo, чтобы разрешить выполнение определенной команды без пароля. Это не требует, чтобы вы знали пароль.
Наличие корневого пароля в программе, который должен быть открытым текстом на каком-то этапе, на самом деле является менее безопасным ИМХО.
Обычно sudo читает пароль, работая непосредственно на терминале. Вы должны использовать sudo -S
Вот. С помощью этой опции он будет пытаться прочитать пароль из стандартного ввода, а затем вы можете отправить его через OutputStream
вы получаете от Process
создано Runtime.exec()
когда вы запускаете свою команду.
Переход с одной машины на другую с использованием ssh или scp можно выполнить, если вы настроите ssh без пароля. Это один метод, который используется для кластеров машин, которые должны работать вместе и управляются головным узлом. Например, hadoop использует этот метод.
Мне нужно было использовать ProcessBuilder для запуска tcpdump. Вот как я это сделал:
visudo myuser ALL = NOPASSWD: / usr / sbin / tcpdump
Тогда моя команда из Java была запущена из myuser: /usr/bin/sudo /usr/sbin/tcpdump -i eth0 port 8561 ...
Как уже упоминали ребята, вы можете использовать sudo
только если ваше текущее использование настроено в системе как то, которое может работать sudo
, В противном случае (в общем случае) вы должны ввести пароль.
Вы должны ввести пароль, если вы хотите запускать команды на удаленных компьютерах, а также с помощью ssh
или скопируйте файлы удаленно, используя scp
,
Некоторые команды могут принимать пароль в качестве параметра командной строки. Например mysql
утилита может принять пароль после переключения -p
, Некоторые другие команды более строгие: они не исключают пароль в командной строке и даже не позволяют вводить пароль через перенаправление stdin процесса. Примеры ssh
а также scp
,
Единственный способ убедиться, что вы всегда можете программно запустить любую команду, требующую ввода пароля, - это эмулировать терминал. Это какая утилита expect
делает. Взгляните на его справочную страницу: http://linux.die.net/man/1/expect
я использовал expect
в прошлом. это утилита, управляемая скриптом, которая позволяет имитировать действия пользователя точно так же, как это делает пользователь, когда он работает с терминалом. Мы запустили ожидаемый скрипт из Java как обычный внешний процесс, используя ProcessBuilder
,
Будет лучше, если вы создадите скрипт на терминале и вызовете его из Java(используя Runtime.exec)