2013-05-20 9 views
1

Недавно я застрял в программе Java. Мое требование: я должен перезапустить службу snmp через java-код на моей машине Ubuntu. Обычно мы можем сделать то же самое сЗапустите процесс с Java

Runtime.getRuntime().exec("service snmpd restart"); 

Над кодом работает нормально, если я вхожу в систему с пользователем ROOT. Но теперь требовалось, чтобы клиентская машина не имела разрешения root. В этом случае для перезапуска snmp необходимо выполнить команду с помощью sudo «sudo service snmpd restart». Эта команда запросит пароль для машины, и после ввода пароля система перезапустит службу.

Теперь, когда я пытаюсь выполнить код java с приведенным ниже кодом, это не перезапуск службы. ecasue у него нет возможности получить пароль. Runtime.getRuntime(). Exec ("sudo service snmpd restart");

Итак, пожалуйста, помогите мне узнать способ перезапуска службы с помощью java, когда пользователь не является пользователем root и необходимо запустить службу с помощью команды sudo.

+0

Как кто-то заметил - «Вы можете настроить Sudo, чтобы конкретная команда для запуска без пароля Это не требует, чтобы знать пароль.. " Сделайте это, не ставьте пароли в java ... – hovanessyan

+0

Можете ли вы помочь мне настроить конфигурацию для sudo без пароля? –

ответ

3

Я почти уверен, что вы не сможете перехватить вход для пароля, поскольку это будет проблемой безопасности. - See Ricardo Cachiera's answer.

Независимо от того, что я не рекомендую вам делать -S. Моя рекомендация в том, что вы configure sudo to let the java user run the snmpd with out a password (ie NOPASSWD).

Значит, вам нужно знать, какой пользователь вы собираетесь использовать в Java-коде. После того, как вы делаете, делайте это в терминале:

sudo visudo

Добавить строку что-то вроде:

myusername ALL = (root) NOPASSWD: /etc/init.d/snmpd

Вы, возможно, придется сделать скрипт оберточной оболочки (как Судо не поддерживает аргумент безопасности), если вы хотите использовать команду service вместо sudo /etc/init.d/snmpd.

+0

Можете ли вы помочь мне настроить конфигурацию для sudo без пароля? –

2

попробовать что:

Runtime.getRuntime().exec("$echo <password> | sudo -S service snmpd restart"); 

Это работа решение, хотя это не самое лучшее решение в вопросе безопасности, так как пароль может быть прочитан кем-либо, которые имеют доступ к архиву.

+1

Пользователь может заменить 'sudo' в их путь с чем-то, чтобы эхоподавать входной канал, тем самым приобретая пароль. Это очень небезопасное решение. -1 –

+0

Это была моя ошибка, не сказав, что это не лучшее решение. Но это было прямым ответом на то, что пользователь спросил. –

+0

Мне нравится ответ с предостережением о том, что пароль будет легко доступен любому, у кого есть файл JAR. Возможно, это просто работа на cron, и это не имеет значения ... тогда это здорово. Как приложение для конечного пользователя, это довольно рискованно. Я изменю свой голос на +1, если вы отредактируете ответ. –

1

Мое предложение не имеет ничего общего с программированием. Просто измените свой файл Sudoers, чтобы пользователи вашей программы могли запускать нужные команды с помощью NOPASSWD.

Для общего решения:

MY_APP_USERS MY_APP_HOSTS= NOPASSWD: MY_APP_CMDS. 

Когда пользователь tom (Часть MY_APP_USERS) работает sudo service snmpd restart (Часть MY_APP_CMDS) в одном из MY_APP_HOSTS он будет предоставлено разрешение без использования пароля.

И конкретное решение (без псевдонимов):

# tom will be able to run sudo /usr/sbin/service snmpd restart at userver 
tom userver=(root) NOPASSWD: /usr/sbin/service snmpd restart 
+0

Мне просто интересно: вы полностью пропустили мой ответ, который был отправлен на час раньше, чем ваш, или вы считали, что это не очень хороший ответ. –