我正在尝试从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类。
答案 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,抱歉,我不能更有帮助!