2014-09-30 69 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