我正在使用Ubuntu 14.04,我试图从java以sudo用户的身份执行logname命令,但它返回空值。我尝试的代码如下:

try {
        Process p = Runtime.getRuntime().exec("logname");
        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String sa = br.readLine();
        System.out.println("Logged User: "+sa);
    } catch (IOException ex) {
        System.out.println(ex);
    }

我得到的结果是
记录用户:空
我也试过了
字符串[]temp={“/bin/sh”,“-c”,“logname”}exec(temp);
字符串[]temp={“/bin/sh”,“-c”,“sudo logname”}exec(temp);
exec(“sudo logname”);
更新1:
我试过whoami | awk{print$1}来查找日志名。但那没用。如果我以根用户身份登录,则显示根用户。

最佳答案

是否尝试使用要执行的应用程序的完整路径?

/usr/bin/logname


/usr/bin/whoami

那么使用:
"echo $SUDO_USER"

这似乎有效:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class runlogname {

    public static void main(String[] args)
    {
    try
        {
        ProcessBuilder pb = new ProcessBuilder();
        pb.command("/bin/bash", "-c", "/usr/bin/logname").start();
        Process p = pb.start();
        int retValue = p.waitFor();
        System.out.println("retValue = " + Integer.toString(retValue));

        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        StringBuffer output = new StringBuffer();
        String line = "";
        while ((line = br.readLine())!= null) {
            output.append(line + "\n");
        }

        String sa = output.toString();
        System.out.println("Logged User: "+sa);
        }
    catch (IOException ex)
        {
        System.out.println(ex);
        }
    catch (InterruptedException ex)
        {
        System.out.println(ex);
        }
    }
}

但返回代码1由logname命令返回,该命令根据手册页指示错误。所以这意味着java代码是正确的,但是logname命令不起作用。
运行我提供的示例的strace(带有-f标志)将给出失败的原因。
在我的盒子上是:
[pid 29925] write(2, "/usr/bin/logname: ", 18) = 18
[pid 29925] write(2, "no login name", 13) = 13
[pid 29925] write(2, "\n", 1)           = 1

10-07 16:44