我有这个代码在使用和不使用sudo
选项
String sudoScript = "sudo -u root -S ls /";
String script = "ls /";
try {
System.out.println("===================================");
System.out.println("command="+sudoScript);
Process p1 = Runtime.getRuntime().exec(sudoScript);
System.out.println("p2.waitFor()="+p1.waitFor());
BufferedReader stdInput1 = new BufferedReader(new InputStreamReader(p1.getInputStream()));
while ((sudoScript = stdInput1.readLine()) != null) {
System.out.println(script);
}
System.out.println("===================================");
System.out.println("command="+script);
Process p2 = Runtime.getRuntime().exec(script);
System.out.println("p2.waitFor()="+p2.waitFor());
BufferedReader stdInput2 = new BufferedReader(new InputStreamReader(p2.getInputStream()));
while ((script = stdInput2.readLine()) != null) {
System.out.println(script);
}
} catch (Exception e) {
e.printStackTrace();
}
这就是我得到的那种输出 -
===================================
command=sudo -u root -S ls /
p2.waitFor()=1
===================================
command=ls /
p2.waitFor()=0
bin
boot
cgroup
data
dev
etc
home
home.save
lib
lost+found
media
mnt
null
opt
opt.save
proc
root
sbin
selinux
srv
sys
tmp
usr
var
如果你观察到,我无法使用sudo
命令获得相同的输出。我有什么想念的吗?
答案 0 :(得分:1)
现在大多数发行版都配置了sudo,要求tty执行。
尝试(在/ etc / sudoers中):
Defaults requiretty
或
Defaults!/path/to/program !requiretty
您需要确保sudo不需要该特定命令的该用户的密码(例如ls /
),或者您需要将其提供给sudo
。
更新:顺便说一下,读取stderr也是一个好主意,所以我们不必猜测命令执行有什么问题
答案 1 :(得分:0)
你应该能够输入sudo命令的密码。
答案 2 :(得分:0)
命令sudo -u root -S ls /
会提示输入用户密码。
像echo '[password]' | sudo -u root -S ls /
之类的东西可能会成功。
注意: 这需要对密码进行硬编码。这可能不是最好的主意。
编辑:
根据{{1}},man sudo
选项是不必要的。运行-u root
将产生相同的效果。