2

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命令获得相同的输出。我在这里错过了什么吗?

4

3 回答 3

1

如今,大多数发行版都将 sudo 配置为需要 tty 才能执行。

尝试(在 /etc/sudoers 中):

Defaults    requiretty

或者

Defaults!/path/to/program !requiretty

您需要确保 sudo 不需要该用户对该特定命令(例如ls /)的密码,或者您需要将其提供给sudo.

更新:顺便说一句,阅读 stderr 也是个好主意,这样我们就不必猜测命令执行出了什么问题

于 2013-08-14T09:41:47.700 回答
0

您应该能够将密码输入 sudo 命令。

于 2013-08-14T09:36:28.523 回答
0

该命令sudo -u root -S ls /提示输入用户密码。

类似的东西echo '[password]' | sudo -u root -S ls /可能会奏效。

注意:这需要对密码进行硬编码。这可能不是最好的主意。

编辑:根据man sudo,该-u root选项是不必要的。跑步sudo -S ls /也会有同样的效果。

于 2013-08-14T09:39:10.613 回答