使用Java启动进程

时间:2013-05-20 21:01:12

标签: java ubuntu runtime.exec

最近我遇到了Java程序。我的要求是,我必须通过我的Ubuntu机器中的java代码重启我的snmp服务。通常我们可以用

做同样的事情
Runtime.getRuntime().exec("service snmpd restart"); 

如果我使用ROOT用户登录系统,上面的代码工作正常。 但现在要求来了,客户端机器可能没有root权限。在这种情况下,要重新启动snmp,需要使用sudo“ sudo service snmpd restart ”执行命令。此命令将询问机器密码,输入密码系统后将重新启动服务。

现在每当我尝试使用以下代码执行java代码时,它都不会重新启动服务。因此,它无法接收密码。 Runtime.getRuntime()。exec(“sudo service snmpd restart”);

所以,当用户不是root用户并且需要使用sudo命令启动服务时,请帮助我找到一种用java重启服务的方法。

3 个答案:

答案 0 :(得分: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,则可能必须创建包装shell脚本(因为sudo不支持参数安全性)。

答案 1 :(得分:2)

试试:

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

这是一个工作解决方案,虽然它不是安全方面的最佳解决方案,因为任何有权访问JAR文件的人都可以读取密码。

答案 2 :(得分:1)

我的建议与编程无关。只需修改您的Sudoers文件,即允许程序用户使用NOPASSWD运行所需的命令。

对于通用解决方案:

MY_APP_USERS MY_APP_HOSTS= NOPASSWD: MY_APP_CMDS.

当用户tomMY_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