从Java运行“who -m”命令会产生空的结果

我正在尝试从Java中查找当前login的用户名。

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选项,它会打印用户名和其他细节。 而且我还testing了其他选项,如-s,-u。 除了-m以外所有的工作。 有没有人有一个想法,为什么这样呢?

注意:我知道

 System.getProperty("user.name"); 

但这不是我的情况的解决scheme。 我正在调用一个使用“who -m”的shell脚本。 所以,我不能使用Java类。

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

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

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

 $ who -m </dev/tty $ 

坦率地说,除非确定与stdin相关的用户正是你所追求的,否则你应该更新你的脚本以使用hostname ,例如id -un或者shell解释器可能提供的其他任何方法来确定当前用户。


对于那些对细节感兴趣的人,我做了一些更多的挖掘,以寻求我的另一个答案 。

从谁手册页:

 "-m only hostname and user associated with stdin" 

我认为这意味着who命令基于“谁刚回到了键?”而知道当前用户。 标准。 假设您正在运行JVM的命令,我完全期望发生一些奇怪的事情。

如果你使用的是bash脚本,试试这个作为解决方法。

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

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