Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux命令";logname";不在java中工作_Java_Linux_Terminal_Ubuntu 14.04 - Fatal编程技术网

Linux命令";logname";不在java中工作

Linux命令";logname";不在java中工作,java,linux,terminal,ubuntu-14.04,Java,Linux,Terminal,Ubuntu 14.04,我使用的是Ubuntu14.04,我试图从java以sudo用户的身份执行logname命令,但它返回null。我试过的代码如下: try { Process p = Runtime.getRuntime().exec("logname"); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));

我使用的是Ubuntu14.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);
    }  
我得到的输出是

登录用户:空

我也试过了

字符串[]temp={“/bin/sh”、“-c”、“logname”}exec(temp)

字符串[]temp={”/bin/sh“,“-c”,“sudo logname”}exec(temp)

执行官(“sudo logname”)

更新1:


我试着用whoami | awk{print$1}查找日志名。但这并不奏效。如果我以root用户身份登录,它将显示root用户。

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

你有没有尝试使用你试图执行的应用程序的完整路径

/usr/bin/logname

如何使用:

"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

谢谢你的回复。遗憾的是,用bash替换sh并不奏效。我希望命令能够执行到所有基于*nix的系统,而不仅仅是UBUNTUTHANK以获得回复。我尝试了/usr/bin/logname,但没有成功。关于“whoami”和“echo$USER”,我通过sudo拥有root访问权限,但我希望当前登录用户的名称(即我的java应用程序)将以root身份运行,但我需要当前登录用户的名称。我知道您希望从某些命令中获得输出。我注意到$SUDO_USER由SUDO设置,并显示执行SUDO的用户的用户名。对此有何想法?我更新了答案。。我猜您执行logname的环境(由java运行时提供)不充分?如果你提到jdk,我在linux机器上使用的是8.05。我运行了代码。它返回retValue=1,并记录了用户:。我是运行strace的新手,所以我不知道它。我该怎么做?
[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