2009-06-18 50 views
13

試圖寫能夠運行UNIX命令作爲不同UNIX用戶的Java程序。我有用戶的密碼,我知道我要運行的命令,但該命令必須按該用戶運行 - 所以我必須先登錄,該用戶。運行UNIX命令爲不同的用戶,從Java

例如:假設我們有一個用戶,吉姆,誰願意看到什麼在bob的主目錄,(無論何種原因)吉姆有權訪問而鮑勃不執行LS。 我們目前以bob的身份登錄。以下是我們可以做的事情:

[email protected]$ su jim && ls ~bob 

問題是,我們得到提示輸入jim的密碼。由於這是從Java程序運行的,即

Process p = Runtime.getRuntime().exec("su jim && ls ~bob"); 

我們得到提示輸入jim的密碼並掛斷。 我們知道吉姆的密碼。但是,我無法輸入。

此外,我們不能使用Expect腳本(沒有安裝它),我們不能成爲超級用戶。我也看了成使用SSH來試試這個,因爲我們可以在技術上做到

[email protected]$ ssh [email protected] "ls ~bob" 

但這也因爲我沒有權限設置密碼的SSH不起作用。

我最後的努力是嘗試使用Java庫的SSH庫,因爲密碼可供Java程序使用,我將可以使用該密碼登錄(並執行正確的命令)。但是因爲我要在同一臺主機上運行,​​所以看起來好像過分了。

有什麼建議嗎?

P.S:Java版本1.4.2,無法升級; AIX UNIX 5.3。

+0

您是否能夠在不使用第三方庫的情況下找到解決方法,如果可以,請分享一下? – HyperioN 2017-07-12 05:36:57

回答

6

問題已解決。使用JSch(http://www.jcraft.com/jsch/)以已知的用戶名和密碼登錄到服務器,並執行命令。非常感謝您的建議!

+0

請在這裏添加一個例子。 – vijendra 2016-12-16 10:13:08

7

安裝了sudo,讓用戶運行在/ etc/sudoers中輸入的有關命令的Java程序,並使用sudo -u jim ls ~bob

+0

這不是一個解決方案。不幸的是,我無法修改系統 - 包括安裝sudo。 – 2009-06-18 14:07:23

+2

然後您需要切換主機。 – 2009-06-18 14:10:17

+0

同意Andrew。如果你的主機不允許你使用pubkey SSH,甚至不能安裝「sudo」,那麼你可能會提出任何關於你的「su」方案的想法,雖然也許可能,你的主機不允許無論如何,你必然會遇到麻煩。找到允許sudo的託管商,這是唯一明智的解決方案。 – DevSolar 2009-06-18 15:08:45

0

可能的Java實現的期待?當谷歌搜索時出現ExpectJ,但我無法找到有關在1.4.2下運行的任何文檔。

+0

這可能是一個解決方案。謝謝你的提示。 – 2009-06-18 14:24:32

+0

那麼,ExpectJ看起來應該可以工作 - 設法複製和構建依賴關係。問題是,ExpectJ使用了StringBuilder,直到1.5才實現。有什麼建議麼? – 2009-06-18 14:53:13

+0

您可以詢問ExpectJ人員是否有舊版本(sourceforge上沒有一個版本)。如果唯一的問題是StringBuilder,你應該可以自己修改代碼。 – 2009-06-18 15:38:31

0

你有沒有嘗試重定向sudo命令輸入和寫入。我有一段時間沒有用過Java,但我相信有一種方法可以獲取輸入流並寫入它。你可以使用它來編寫密碼,後面跟着一個新行,sudo或su應該接受密碼。

使用getInputStream()並寫出你的密碼。

su jim -c ls ~Bob 
-1

也許這會工作:

Process process = Runtime.getRuntime().exec("su jim && ls ~bob"); 

OutputStream standardInput = process.getOutputStream(); 
Writer standardInputWriter = new OutputStreamWriter(standardInput); 
standardInputWriter.write("password\n"); 
standardInputWriter.close(); 
+0

謝謝,但它沒有奏效。我以前嘗試過類似的方法,但結果大致相同。 – 2009-06-18 14:19:26

-1

我不知道這樣的代碼:

Process p = Runtime.getRuntime().exec("su jim && ls ~bob"); 

將在shell執行,評估& &需要的,那就是一個shell命令(/ bin/sh)。你應該通過su命令行來傳遞命令「ls〜bob」。例如:

su jim -c 'ls ~bob' 
+0

與上述答案相同。 – 2009-06-18 14:22:28

+0

然後SSH imho是唯一可行的選項 – dfa 2009-06-18 14:29:29