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

时间:2014-09-30 14:45:49

标签: java linux command-line-interface

我正在尝试从Java中找到当前登录的用户名。

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

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

2 个答案:

答案 0 :(得分: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进行了更多挖掘。

答案 1 :(得分:0)

来自who:

的手册页
"-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,抱歉,我不能更有帮助!