【问题标题】:Linux command "logname" not working in javaLinux命令“logname”在java中不起作用
【发布时间】:2014-05-15 10:35:30
【问题描述】:

我使用的是 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);
    }  

我得到的输出是

登录用户:null

我也试过

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。

【问题讨论】:

    标签: java linux terminal ubuntu-14.04


    【解决方案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
    

    【讨论】:

    • 感谢您的回复。我试过 /usr/bin/logname 但没有用。关于“whoami”和“echo $USER”,我通过 sudo 具有 root 访问权限,但我希望当前登录用户的名称,即我的 java 应用程序将以 root 身份运行,但我需要当前登录用户的名称。
    • 我了解到您需要某些命令的输出。我注意到 $SUDO_USER 由 sudo 设置并显示执行 sudo 的用户的用户名。
    • 对此有什么想法吗?
    • 我更新了我的答案。。我的猜测是你执行logname的环境(由java运行时提供)是不够的。
    • 环境?如果你提到 jdk,我在我的 linux 机器上使用 8.05。我运行了代码。它返回 retValue = 1 和 Logged User: 。我是运行 strace 的新手,所以我不知道。我该怎么做?
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复。可悲的是,用 bash 替换 sh 不起作用。我希望命令对所有基于 *nix 的系统执行,而不仅仅是 Ubuntu
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2013-10-04
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多