2014-09-30 44 views
2

我正试图从Java中找到当前登录的用户名。从Java运行“who -m”命令会产生空的结果

Process p; 
try 
{ 
    p = Runtime.getRuntime().exec("who -m"); 
    p.waitFor(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 

    String line = ""; 
    while ((line = reader.readLine()) != null) 
     System.out.println(line); 
} 
catch (Exception e) 
{ 

} 

上面的代码不打印任何结果。但是,如果我删除-m选项,它会打印用户名和其他详细信息。而且我还测试了其他选项,如-s,-u。除-m以外,它都可以工作。有没有人有一个想法,为什么这样呢?

注: 我知道

System.getProperty("user.name"); 

但是,这不是在我的情况的解决方案。我正在调用其中使用“who -m”的shell脚本。所以,我不能使用java类。

+2

你在命令行上试过吗? – jgr208 2014-09-30 14:47:15

+0

我的'who'手册页说'谁-m'只显示“与stdin关联的主机名和用户”。如果标准输入已更改,则可能有问题。 – ajb 2014-09-30 15:09:18

+0

@ jgr208 - 是的。我做到了。它适用于命令行,但不适用于Java环境。 – 2014-09-30 15:26:49

回答

0

从谁手册页:“谁刚打回车键”

"-m only hostname and user associated with stdin" 

我推测,这意味着谁命令知道根据当前用户标准。鉴于您正在运行JVM的命令,我完全期望发生一些奇怪的事情。

如果您使用bash脚本,请尝试使用此功能作为解决方法。

process=`ps | grep ps | cut -d ' ' -f2` 
user=`who -u | grep $process | cut -d ' ' -f1` 

不幸的是,我从来没有试图让java和bash工作togeather,抱歉我不能更有帮助!

+0

谢谢。但是,即使我从终端直接运行shell脚本,这也给了我空字符串。 – 2014-09-30 15:30:34

+0

你确定你正在返回$ user,即'echo $ user'应该返回你的用户名。 – ConMan 2014-10-01 08:03:32

2

您看到的原因是Java进程启动程序不能保证存在关联的TTY。考虑实际的命令行这个例子:

$ who -m 
user pts/8  2014-09-02 02:24 
$ who -m </dev/null 
$ 

由于标准输入不与用于第二who呼叫的终端相关联,who不能确定相关联的用户。有趣的是,重定向stdin/dev/tty似乎没有工作,要么:

$ who -m </dev/tty 
$ 

坦率地说,除非确定与stdin相关联的用户是正是你是什么之后,你或许应该更新脚本,以使用hostname和例如id -un或其他任何你的shell解释器可能提供的方式来确定当前用户。


对于那些对细节感兴趣的人,我做了一些更多的挖掘another answer of mine

+0

如果应用程序使用sudo运行,则id -un将返回“root”。但是我需要登录的实际用户。 – 2014-09-30 17:43:37

+0

@KarthikAndhamil:'sudo'在环境IIRC中设置了'SUDO_USER'变量。你可以检查它... – thkala 2014-09-30 21:10:27