0

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

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);
    }  

我得到的输出是

登录用户:空

我也试过

String[] temp = {"/bin/sh","-c","logname"} exec(temp);

String[] temp = {"/bin/sh","-c","sudo logname"} exec(temp);

exec("sudo 登录名");

更新1:

我尝试使用 whoami|awk '{print $1}' 来查找日志名。但这没有用。如果我以 root 身份登录,它会显示 root。

4

2 回答 2

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
于 2014-05-15T11:18:36.730 回答
0

尝试用“/bin/bash”替换“/bin/sh”。如果你有 Ubuntu,你可能有 bash shell,而不是 sh。

于 2014-05-15T10:46:19.937 回答