用Java启动一个进程

用Java启动一个进程,java,ubuntu,runtime.exec,Java,Ubuntu,Runtime.exec,最近我被一个Java程序卡住了。我的要求是,我必须通过Ubuntu机器中的java代码重新启动snmp服务。通常情况下,我们也可以这样做 Runtime.getRuntime().exec("service snmpd restart"); 如果我使用ROOT用户登录系统,上述代码工作正常。 但现在的要求是,客户端可能没有root权限。在这种情况下,要重新启动snmp,需要使用sudo“sudo服务snmpd restart”执行命令。此命令将要求输入机器密码,输入密码后,系统将重新启动服务

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

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

现在,每当我试图用下面的代码执行java代码时,它都不会重新启动服务。e假设它没有接收密码的选项。 Runtime.getRuntime().exec(“sudo服务snmpd重启”)

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

我几乎可以肯定,您将无法截获密码输入,因为这将是一个安全问题

不管怎样,我不建议你做
-S
。我的建议是你

因此,您必须知道要使用哪个用户来编写Java代码。一旦执行此操作,请在终端中执行此操作:


sudovisudo

添加一行,如下所示:


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

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

我几乎可以肯定,您将无法拦截密码输入,因为这将是一个安全问题

不管怎样,我不建议你做
-S
。我的建议是你

因此,您必须知道要使用哪个用户来编写Java代码。一旦执行此操作,请在终端中执行此操作:


sudovisudo

添加一行,如下所示:


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

如果要使用
service
命令而不是
sudo/etc/init.d/snmpd
,则可能必须创建一个包装shell脚本(因为sudo不支持参数安全性),请尝试:

Runtime.getRuntime().exec("$echo <password> | sudo -S service snmpd restart"); 
Runtime.getRuntime().exec($echo | sudo-S服务snmpd restart”);
这是一个可行的解决方案,尽管它不是安全方面的最佳解决方案,因为任何有权访问JAR文件的人都可以读取密码。

试试:

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

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

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

对于通用解决方案:

MY_APP_USERS MY_APP_HOSTS= NOPASSWD: MY_APP_CMDS.
当用户
tom
(MY_APP_USERS的一部分)在其中一个
MY_APP_主机中运行
sudo服务snmpd restart
(MY_APP_CMDS
的一部分)时,他将被授予权限,而无需使用密码

和特定的解决方案(无别名):


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

对于通用解决方案:

MY_APP_USERS MY_APP_HOSTS= NOPASSWD: MY_APP_CMDS.
当用户
tom
(MY_APP_USERS的一部分)在其中一个
MY_APP_主机中运行
sudo服务snmpd restart
(MY_APP_CMDS
的一部分)时,他将被授予权限,而无需使用密码

和特定的解决方案(无别名):


正如有人评论道:“您可以配置sudo以允许在没有密码的情况下运行特定命令。这并不要求您知道密码。”这样做,不要在java中输入密码…您可以帮助我获得配置sudo而不使用密码吗正如有人评论道-“您可以将sudo配置为允许在没有密码的情况下运行特定命令。这并不要求您知道密码。“这样做,不要在java中输入密码…你能帮我获取配置以配置不带密码的sudo的配置你能帮我获取配置以配置不带密码的sudo的配置你能帮我获取配置以配置不带密码的sudo的配置用户可以将路径中的
sudo
替换为要回送管道输入的内容,从而获取密码。这是一个非常不安全的解决方案-1这是我的错误,不是说这不是最佳解决方案。但这是对用户要求的直接回应,我喜欢这个回应,并警告说,拥有JAR文件的任何人都可以轻易获得密码。也许这只是一个cron任务,这并不重要。。。那就太好了。作为终端用户应用程序,它有点冒险。如果您编辑答案,我会将我的投票改为+1。+1是一个快速解决方案。用户可以将路径中的
sudo
替换为可回送管道输入的内容,从而获得密码。这是一个非常不安全的解决方案-1这是我的错误,不是说这不是最佳解决方案。但这是对用户要求的直接回应,我喜欢这个回应,并警告说,拥有JAR文件的任何人都可以轻易获得密码。也许这只是一个cron任务,这并不重要。。。那就太好了。作为终端用户应用程序,它有点冒险。如果你编辑答案,我会将我的投票改为+1。+1是一个快速解决方案。我只是好奇:你是否完全错过了我比你早一小时发布的答案,或者你认为这不是一个好答案。我只是好奇:你是否完全错过了我比你早一小时发布的答案,或者你认为这不是一个好答案。