2012-07-12 94 views
1

我有三臺機器,我需要給他們一個接一個,然後sudo一個命令。JSch:sudo <某些命令>有時不能正常工作

我需要的JSch做以下的事情:

ssh <user>@<machine> 
sudo <some command> 

這是代碼塊我如何使用運行JSch:

String homeFolder = System.getProperty("user.home"); 
JSch jsch = new JSch(); 
jsch.addIdentity(homeFolder + "/.ssh/id_rsa.pub"); 
jsch.setKnowHosts(homeFolder + "/.ssh/known_hosts"); 

final Session session = jsch.getSession(user, machine); 
session.connect(); 

StringBuilder response = new StringBuilder(); 
try { 
    final Channel channel = session.openChannel("exec"); 
    ((ChannelExec) channel).setCommand("sudo /etc/init.d/eedir status") 
    channel.connect(); 

    try { 
     InputStream in = channel.getInputStream(); 
     OutputStream out = channel.getOutputStream(); 

     out.write((password + System.getProperty("line.separator")).getBytes()); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
     String line = null; 
     while (null != (line = reader.readLine())) { 
      System.out.println(line); 
     } 
    } finally { 
     channel.disconnect(); 
    } 
} finally { 
    session.disconnect(); 
} 

我的問題是,我可以成功地使用這個程序在我擁有的三臺機器中的兩臺上獲得eedir服務的狀態,但不是最後一臺。

我可以ssh到遠程機器用給定的用戶名,然後直接運行下面的命令:

sudo /etc/init.d/eedir status 

在SSH中使用的用戶名在我/etc/sudoers已經配置。

所以,我的問題是:

  1. 爲什麼JSch可以在兩個三臺機的運行這個程序,而其餘 一個不能?這些機器上的sudoers配置完全相同。

  2. 而另一個問題是:爲什麼真機 上,sudo命令可以無需再次輸入密碼,如果我配置的當前 用戶在sudoers中運行,而JSch須藤需要在程序中的密碼?

任何方向真的很感激。如果在我目前的情況下可能存在一些潛在的錯誤,歡迎大家指出。

謝謝。

回答

1
  1. 什麼輸出你從jsch sudo嘗試失敗的機器上得到什麼?得到你可能需要的錯誤輸出:

    (ChannelExec)commandChannel.getErrStream(); 
    

    ssh服務器可能有不同的設置。我的服務器上,你需要PTY:

    (ChannelExec)commandChannel.setPty(true); 
    (ChannelExec)commandChannel.setPtyType("VT100"); 
    
  2. 一般只需要每次會話都輸入密碼sudo的。也許在真正的機器上,你已經完成了一次sudo並且沒有註銷。上面的代碼每次重新連接,所以每次都需要發送密碼。

0

latest version to date在遠程主機上有一個使用sudo命令的java類示例。下載這兩個項目.zip文件和.jar因爲他們是分開的只有上帝知道的原因!

1

我在CentOS上有同樣的問題。通過
1解決它),你做的通道上的set命令之後:

((ChannelExec) channel).setPty(true); 

2)確保你已經finally塊/ s到關閉輸入流,通道和會話

注意:如果用戶不需要密碼,則不需要打開輸出流(不像上面示例中所示)

+0

我從Ubuntu切換到CentOS時出現此問題。這個答案確實有幫助。 – Burt 2017-11-30 07:12:34