2017-02-25 58 views
0
#!/bin/sh 
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac)))) 
echo JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac)))) 
echo JAVA_HOME=$JAVA_HOME 
${JAVA_HOME}/bin/java -jar xxxxx 

獲得$ JAVA_HOME我想在jsch在遠程機器上執行這個腳本:如何通過Jsch

public boolean actionShell(Session sshSession, String command) { 
     boolean flag = false; 
     Channel channel = null; 
      try { 
      channel = sshSession.openChannel("exec"); 
      ((ChannelExec) channel).setCommand(command); 
      channel.setInputStream(null); 
      ((ChannelExec) channel).setErrStream(System.err); 
      InputStream in = channel.getInputStream(); 
      channel.connect(); 

      while (true) { 
       if (channel.isClosed()) { 
        if (in.available() > 0) continue; 
         flag = channel.getExitStatus() == 0 ? true : false; 
         log.info("exit-status: " + flag); 
         break; 
        } 
        Thread.sleep(1000); 
       } 
      } catch (Exception e) { 
       log.error("error", e.getMessage()); 
      } finally { 
       if (channel != null || channel.isConnected()) 
        channel.disconnect(); 
      } 
      return flag; 
     } 

結果表明,這個sh腳本不能得到JAVA_HOME的值。

JAVA_HOME= 
JAVA_HOME= 
/bin/java -jar xxxxx 

由於我們沒有得到遠程matchine的conf,所以我們不能指出JAVA_HOME。

+0

你得到不同的結果,當你在一個交互式SSH終端執行腳本? –

回答

0

,我們可以得到一個非交互式和非登錄shell和插入此代碼腳本:

#!/bin/bash . /etc/profile . ~/.profile

非交互式和非登錄shell將不能找到並加載「 BASH_ENV」。有一個圖像顯示文件加載的差異。

enter image description here

+0

這是爲了回答或附加信息你的問題? –

+0

@馬丁Prikryl嗨馬丁Prikryl,這是我的解決方案。可能對某些人有用。 –

0

我想你應該在你的操作系統上設置JAVA_HOME變量。你有沒有嘗試過?

+0

這應該是個註釋 –

0

如果遠程機器沒有在遠程環境中設置$ JAVA_HOME,那麼(很明顯)當它得到它時它將是空的。

因此,要麼,你需要:

  • 變化遠程機器的遠程shell初始化設定適當的$ JAVA_HOME,或
  • 通過在腳本中適當的$ JAVA_HOME設置你正在運行,或
  • 寫一個聰明的shell函數,可以「intuit」適當的$ JAVA_HOME設置;例如通過查看JRE 可能已安裝的各個地方
+0

謝謝yon Stephen C.正如你所說,我們已經在/ etc/profile的路徑中設置了$ JAVA_HOME。在我的問題中,ssh登錄模式是問題的原因。我們可以從這裏找到一些信息:[link](http://askubuntu.com/questions/155865/what-are-login-and-non-login-shell) –

+0

「當作爲交互式登錄shell或者使用-login選項的非交互式shell,它首先嚐試從/ etc/profile和〜/ .profile中按順序讀取和執行命令。 -noprofile選項可用於禁止此行爲。當作爲名爲sh的交互式shell進行調用時,bash會查找變量ENV,如果它已定義,則展開其值,...「 - 瞭解bash Shell,第二版 –