Как запустить sudo poweroff в java

Я jsp-разработчик. Мне нужно иногда выключать мой медленный, не отвечающий, отстающий (вы понимаете) «сервер» разработки Ubuntu, когда его клавиатура перестает реагировать на ввод. У меня уже правильно настроен tomcat, и даже когда моя клавиатура перестает отвечать на запросы, я могу использовать его как сервер (доступ к веб-страницам, обслуживаемым tomcat). Моя идея состоит в том, чтобы создать страницу jsp, которая вызывает sudo poweroff. Но я понятия не имею, как это сделать. я пытался

Runtime.getRuntime.exec("sudo poweroff");

но это не работает для меня. Я уже отредактировал файл sudoers, чтобы позволить пользователю tomcat выполнять это действие без запроса пароля. Как я могу это сделать?


person vikarjramun    schedule 03.08.2016    source источник
comment
Это может помочь вам для Runtime.exec(): stackoverflow.com/questions/8877236/ . Если вам нужно sudo, вы можете написать программу на C с setuid root, которая вызывает poweroff.   -  person user3486184    schedule 04.08.2016
comment
Вы не можете этого сделать. Это невозможно   -  person Turtle    schedule 04.08.2016
comment
Это ужасная идея, но вы хотите sudo /sbin/shutdown -h now. Вероятно, было бы лучше установить openssh-сервер и использовать удаленный ssh ​​для его закрытия.   -  person Elliott Frisch    schedule 04.08.2016
comment
@ElliottFrisch Это только мой сервер разработки. Он очевидно не будет использоваться в производстве. Но могу ли я сделать sudo /shin/poweroff? Просто интересуюсь....   -  person vikarjramun    schedule 04.08.2016
comment
Попробуйте и убедитесь сами. И если ответ не да, продолжайте пытаться.   -  person Elliott Frisch    schedule 04.08.2016
comment
@ElliottFrisch О, и я пробовал ssh, но у меня было много проблем с подключением. По какой-то причине он принимал соединения только с моего iPad, а не с PuTTY на моем компьютере. Но это другой вопрос   -  person vikarjramun    schedule 04.08.2016
comment
См. также Когда Runtime.exec () не будет для многих полезных советов по правильному созданию и управлению процессом. Затем игнорируйте ссылку на exec и используйте ProcessBuilder для создания процесса. Также разбейте String arg на String[] args для учета таких вещей, как пути, содержащие символы пробела, и для разделения частей команды.   -  person Andrew Thompson    schedule 04.08.2016
comment
@ElliottFrisch Если вы сделаете свой первоначальный комментарий ответом, я выберу его.   -  person vikarjramun    schedule 12.08.2016


Ответы (1)


Если у пользователя, работающего с tomcat, есть разрешения sudo (без пароля), это должно быть выполнимо, но вызов должен быть примерно таким:

Runtime.getRuntime().exec(new String[]{"sudo", "poweroff"});

Команда и параметры не могут быть переданы одной большой строкой.

Дополнительные сведения см. в документации: https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec(java.lang.String[])

PS: Это, наверное, плохая идея. :)

person Larry    schedule 03.08.2016
comment
В документации по Java также есть этот метод, поэтому ваш ответ неверен, по крайней мере, в соответствии с приведенной вами аргументацией - person vikarjramun; 04.08.2016
comment
Вы пробовали? Метод, на который вы ссылаетесь, предназначен для команды без параметров. - person Larry; 05.08.2016