1

最近我被一个Java程序困住了。我的要求是,我必须通过我的 Ubuntu 机器中的 java 代码重新启动我的 snmp 服务。通常我们可以这样做

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

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

现在,每当我尝试使用以下代码执行 java 代码时,它都不会重新启动服务。ecasue 它没有接收密码的选项。Runtime.getRuntime().exec("sudo service snmpd restart");

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

4

3 回答 3

3

我几乎可以肯定您将无法拦截密码输入,因为这将是一个安全问题。-见 Ricardo Cachiera 的回答

无论如何我不建议你这样做-S。我的建议是配置 sudo 让 java 用户在没有密码的情况下运行 snmpd(即NOPASSWD

因此,您必须知道您将使用哪个用户来访问 Java 代码。完成后,在终端中执行此操作:

sudo visudo

添加一行类似:

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

如果您想使用service命令而不是sudo /etc/init.d/snmpd.

于 2013-05-20T21:05:33.397 回答
2

试试看:

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

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

于 2013-05-20T21:06:26.447 回答
1

我的建议与编程无关。只需修改您的Sudoers文件以允许您的程序的用户使用NOPASSWD.

对于通用解决方案:

MY_APP_USERS MY_APP_HOSTS= NOPASSWD: MY_APP_CMDS.

当用户tom(Part of ) 在其中一个中MY_APP_USERS运行sudo service snmpd restart(Part of ) 时,他将被授予权限,而无需使用密码。MY_APP_CMDSMY_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
于 2013-05-20T21:48:32.690 回答