如何在Java中获得用户名(即,Java中的who-m)(或Jython 2.1)

如何在Java中获得用户名(即,Java中的who-m)(或Jython 2.1),java,jython,Java,Jython,情况是这样的。我在一个共享帐户中有一个jython 2.1脚本,需要知道是谁在调用它。在bash中,我可以简单地使用$(who-m),它将为我提供正确的用户名 所谓“共享帐户”,我的意思是我以自己的身份登录,然后$(sudo su-shared_account)进入共享帐户 我还没有在java(或jython)中找到任何类似的结果。即使尝试调用Runtime.getRuntime().exec(“who-m”)也不会做任何事情。当我尝试从exec返回的进程读取InputStream时,该流为空。

情况是这样的。我在一个共享帐户中有一个jython 2.1脚本,需要知道是谁在调用它。在bash中,我可以简单地使用$(who-m),它将为我提供正确的用户名

所谓“共享帐户”,我的意思是我以自己的身份登录,然后$(sudo su-shared_account)进入共享帐户


我还没有在java(或jython)中找到任何类似的结果。即使尝试调用Runtime.getRuntime().exec(“who-m”)也不会做任何事情。当我尝试从exec返回的进程读取InputStream时,该流为空。

要让进程所有者执行以下操作:

System.getProperty("user.name");
getRunTime().exec()的语法很复杂

Runtime.getRuntime().exec(new String[] {"/path/to/who", "-m"});

我想出了一个选择,尽管我并不喜欢:

将此标志添加到java调用:

-Duser.name="$(who -m | awk '{print $1}')"
然后使用以下命令访问用户名:

System.getProperty('user.name')
你可以用这个

System.out.println( System.getProperties().getProperty("user.name"));

不确定(但肯定懒得检查),但我认为这会返回进程的所有者,而不是stdin的所有者(正如
who-m
所做的那样)。我试图获取stdin所有者名称(我最初登录的帐户),而不是进程所有者名称(我用sudo切换到的帐户)。@Romain,你说得对,根据文档,这是用户的帐户名。
。Runtime.exec的问题是它似乎不知道谁拥有stdin。java中没有来自“who-m”的输出。@amertune,您是否分别为getRuntime().exec()传入了路径和参数?@amertune,非常整洁。请注意,我用getRunTime().exec()的示例更新了我的答案。好主意。。。但请使用不同的属性名称。其他代码和其他程序员希望
“user.name”
属性包含进程所有者的名称。当您说username时,您指的是操作系统报告的登录用户名吗?有点像。如果我以amertune登录,然后是‘sudo su-shared_account’,我希望获得用户名amertune(who-m这样做),而不是用户名shared_account。