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