如何使用java Runtime输入密码到sudo?
我需要以root身份执行给定的命令,使用Java执行sudo用户。 但是,我不确定我可以用来传递密码的方法。 有没有办法将密码传递给终端?
您可以将sodu全部放在一起并创建一个shell脚本suid root并运行它。
chmod +s myscript && chown root myscript && chgrp root myscript
无论何时调用该脚本,它都将以root身份运行。
您可以配置sudo以允许特定命令在没有密码的情况下运行。 这不需要您知道密码。
在程序中拥有root密码,在某个阶段必须是明文,实际上不太安全恕我直言。
通常sudo通过直接在终端上操作来读取密码。 你应该在这里使用sudo -S
。 使用此选项,它将尝试从标准输入读取密码,然后您可以通过运行命令时由Runtime.exec()
创建的Process
获得的OutputStream
发送它。
如果配置无密码ssh,则可以使用ssh或scp从一台计算机进入另一台计算机。 这是一种用于需要协同工作并由头节点控制的机器群集的方法。 例如,hadoop使用此方法。
如果在终端上创建脚本并从Java调用它(使用Runtime.exec)会更好
正如大家已经提到的,只有当你在系统中将当前用途配置为可以运行sudo
,才能使用sudo
。 否则(一般情况下)你必须输入密码。
如果要在远程计算机上运行命令以及使用scp
远程使用ssh
或远程复制文件,则必须键入密码。
某些命令可以接受密码作为命令行的参数。 例如, mysql
实用程序可以在切换-p
后接受密码。 其他一些命令更严格:它们不会在命令行中输入密码,甚至不允许您通过重定向进程的stdin来提供密码。 例子是ssh
和scp
。
确保您始终可以以编程方式运行任何需要输入密码的命令的唯一方法是模拟终端。 这就是公用事业所expect
。 看看它的手册页: http : //linux.die.net/man/1/expect
我过去常用过。 它是脚本驱动的实用程序,允许模拟用户的操作,就像人类用户在使用终端时一样。 我们使用ProcessBuilder
java的expect脚本作为常规外部进程运行。
我需要使用ProcessBuilder来运行tcpdump。 我是这样做的:
visudo myuser ALL = NOPASSWD:/ usr / sbin / tcpdump
然后我的Java命令是从myuser运行的:/ usr / bin / sudo / usr / sbin / tcpdump -i eth0 port 8561 …