2016-06-28 30 views
3

我正在使用此處提供的有用示例管理使用JSch exec在遠程服務器上執行shell腳本。我可以看到從腳本返回的回聲,最後的退出狀態爲0 - 因此乍一看都很好看。使用SSH exec通道調用shell腳本,但忽略對其他shell腳本的調用

但是,問題在於腳本本身調用了其他腳本,而這些腳本似乎完全被忽略,只是跳過了。

腳本直接調用其他腳本。即腳本的第一行是這樣的:

script_two.sh 

任何人都可以建議的任何方式來克服這一點?我確實開始研究「shell」通道而不是「exec」,但是這對我來說可能會很棘手,因爲在給用戶訪問系統之前,服務器提供一個表單來填寫(名稱,數字,爲什麼是你登錄等) - 我還沒有能夠以編程方式填寫並提交此表單,因此如果可能,我想堅持使用exec。

我對這一切都很陌生,所以任何幫助/建議都將是最受歡迎的!

下面的代碼片段。正如我所說,這似乎工作,但由「scriptFileName」代表的sh腳本代碼調用其他sh腳本,並且不會執行這些腳本。

提前爲任何幫助非常感謝,J

JSch jsch = new JSch(); 
JSch.setConfig(FileTransferConstants.STRICT_HOST_KEY_CHECKING, "no"); 

Session session = jsch.getSession(username, hostIPAddress, port); 
session.setPassword(password); 
session.connect(); 

//create the execution channel over the session 
ChannelExec channelExec = (ChannelExec)session.openChannel("exec"); 

channelExec.setCommand(scriptFileName); 
channelExec.connect(); 
+0

*「向其他腳本發出呼叫,並且這些腳本似乎完全被忽略,只是跳過」* - 腳本如何調用其他腳本?他們如何被忽略? 「召喚」是否產生任何錯誤信息? –

+0

感謝您的回覆Martin。該腳本直接調用其他腳本。即腳本的第一行如下所示: - script_two.sh當我以同一用戶的身份手動運行腳本時,它可以正常工作,但在使用Jsch shell遠程運行時似乎忽略它。 –

回答

3

我認爲劇本的樣子:

script_one.sh 
script_two.sh 

即該腳本依賴於.(當前路徑)在PATH環境變量中,什麼不是默認值。

因此,爲了使腳本能夠正常工作,需要在某些啓動腳本中將.添加到PATH。很可能只有交互式會話纔會發生添加(可能是無意的錯誤)。可能是因爲添加是在僅爲交互式會話執行(源代碼)的啓動腳本中完成的。

JSch中的「exec」通道(正確)不會爲會話分配僞終端(PTY)。因此,一組不同的啓動腳本(可能)來源於使用SSH客戶端登錄時。和/或基於TERM環境變量的缺席/存在,採取腳本中的不同分支。因此,環境可能與您在SSH客戶端使用的交互式會話不同。


解決方案是(按優先順序):


也看到了相關的問題Shell ping command with source option is failing when executed using JSch setCommand

+0

馬丁,對於這樣一個細緻而深思熟慮的答覆,我感激不盡。請知道這對我來說是一個巨大的幫助,並且已經解釋得非常好。我將與團隊聊天,特別是負責遠程服務器上.sh腳本的人員,以嘗試執行此操作。我會在這裏報告任何更新。你是絕對正確的,腳本是從主腳本調用的,沒有。 –

+1

再次感謝!剛剛接受了答案,並閱讀了鏈接中的註釋「請不要在您的問題上添加評論,也不要在回覆中說」謝謝「。」哎呀 - 對不起!現在我又來了!一旦實際實施和測試,我將添加更多技術(非社會)備註。 –