最近我遇到了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重启服务的方法。
答案 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.
当用户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