2013-05-02 116 views
2

我試圖連接到主機,然後使用「su - john」更改用戶,然後以john身份執行命令。僅使用JSch可能嗎?Java JSch更改遠程計算機上的用戶並執行命令

問題是,我創建會話並打開通道並執行上述命令後,它應該請求密碼,但沒有任何反應。

這是我如何連接到遠程機器:

try 
{ 
    Channel channel = session.openChannel("exec"); 
    channel.setInputStream(null); 
    channel.setOutputStream(System.out); 

    ((ChannelExec) channel).setCommand(command); 

    channel.connect(); 

    InputStream in = channel.getInputStream(); 

    byte[] tmp = new byte[1024]; 
    while (true) 
    { 
     while (in.available() > 0) 
     { 
      int i = in.read(tmp, 0, 1024); 
      if (i < 0) 
      { 
       break; 
      } 
      System.out.print(new String(tmp, 0, i)); 
     } 
     if (channel.isClosed()) 
     { 
      break; 
     } 
     try 
     { 
      Thread.sleep(1000); 
     } 
     catch (Exception ee) 
     { 
     } 
    } 
    channel.disconnect(); 
} 
catch (Exception e) 
{ 
    e.printStackTrace(); 
} 

是否必須創建另一個信道,當I:

String address = "myremote.computer.com"; 

JSch jsch = new JSch(); 
String user = "tom"; 
String host = address; 
String password = "l33tpaSSw0rd"; 
Session session = jsch.getSession(user, host, 22); 
java.util.Properties config = new java.util.Properties(); 
config.put("StrictHostKeyChecking", "no"); 
session.setConfig(config); 
session.setPassword(password); 

session.connect(); 

然後我經由runSshCommand()方法,它看起來像這樣執行命令改變用戶,或如何使這項工作?

因爲如果我使用

runSshCommand("su - john",session); 
runSshCommand("tail -1 ~/mylog.log",session); 

它只是執行「蘇」命令,但它並沒有完成用戶的變化和事後執行「尾巴」將導致一個錯誤,因爲「湯姆」不是招」 t得到的文件:/

基本上我想我的應用程序連接到機器,更改用戶,讀取一個文件並返回數據。任何人都可以點亮一下嗎?

回答

6

這裏有幾個問題。

首先,SSH連接中的每個通道獨立於其他通道,並且每個可執行通道中的命令都在其自己的shell(命令行解釋器)中執行。因此,您在一個頻道中所做的任何更改對其他頻道都沒有任何影響。你也可以這樣做這樣的東西:

runSshCommand("cd Documents", session); 
runSshCommand("ls -l", session); 

(其實你可以做到這一點,但它不會顯示Documents目錄的內容,但主目錄。)

對於cd,可以解決通過使這兩個命令爲一個「命令」,在相同的信道exec要使用:

runSshCommand("cd Documents; ls -l"); 

(相反的;也可以使用一個換行\n到SEP arate的命令,或任何其他你的shell接受。)

對於su這是不行的,在這裏我們就來第二個問題

su不是改變當前shell狀態的命令(如cd),而是一個在現有shell中打開新shell的命令。當您離開由su開始的外殼程序(例如,通過exit,logout或文件結束)時,它只會返回到外殼程序,然後您再次是以前的用戶。

要將命令傳遞給「內殼」,必須將它們傳遞給shell輸入。或使用su-c--command)的說法:

runSshCommand("su -c 'tail -1 ~/mylog.log' - john ",session); 

然後,您可能會在第三個問題運行:su會問john的密碼,並可能會拒絕從標準輸入讀取它,但嘗試從終端讀取它。而你的頻道沒有僞終端。您可以嘗試使用cannel.setPty(true),然後實際將密碼寫入輸出流,但我不確定這是否可行。

替代方案:而不是su -c可以使用sudo,它可以被配置爲不詢問某些命令和用戶密碼(否則你將再次有相同的終端問題)。或者你可以直接登錄爲john,或者讓tom的日誌文件可讀。 (另外,我希望你的真實密碼比源代碼中的好。)

相關問題