java channelexec_java-使用SSH exec通道调用Shell脚本,但忽略对其他Shell脚本的调用
我正在使用此處提供的有用示例,使用JSch exec在遠程服務器上執(zhí)行Shell腳本.我可以看到腳本返回的回顯,并且結尾處的退出狀態(tài)為0-乍一看,一切看起來都很不錯.
但是,問題在于腳本本身會調出其他腳本,而這些腳本似乎被完全忽略,只是被跳過了.
該腳本直接調用其他腳本.即腳本的第一行類似于:
script_two.sh
任何人都可以建議以任何方式克服這一問題嗎?我確實開始研究“ shell”通道而不是“ exec”通道,但是在我的情況下這可能很棘手,因為在允許用戶訪問系統(tǒng)之前,服務器會提供一個表格來填寫(名稱,編號,為什么您已登錄,等等)-我尚無法以編程方式填寫并提交此表格,因此,如果可能的話,我想堅持使用exec.
我是這一切的新手,所以任何幫助/建議都將受到歡迎!
下面的代碼段.就像我說的那樣,這似乎可行,但是以“ scriptFileName”表示的sh腳本會在代碼中調用其他sh腳本,并且這些腳本不會執(zhí)行.
預先感謝您的幫助,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();
解決方法:
我認為腳本看起來像:
script_one.sh
script_two.sh
即該腳本依賴. (當前路徑)位于PATH環(huán)境變量中,這不是默認值.
因此,為了使腳本正常工作,請使用.必須在某些啟動腳本中添加到PATH中.這種添加很有可能僅針對交互式會話發(fā)生(可能是無意間錯誤地).可能是因為添加是在僅針對交互式會話執(zhí)行(來源)的啟動腳本中完成的.
JSch中的“ exec”通道(正確地)沒有為會話分配偽終端(PTY).因此,與使用SSH客戶端登錄時相比,(可能)獲得了(可能)不同的啟動腳本集.基于TERM環(huán)境變量的存在/不存在,和/或在腳本中采用不同的分支.因此,環(huán)境可能不同于您與SSH客戶端一起使用的交互式會話.
解決方案為(按優(yōu)先順序排列):
>更正腳本,使其不依賴具有的非默認設置.在PATH中.用顯式路徑調用子腳本:
./script_one.sh
./script_two.sh
>更正啟動腳本以添加.無條件地連接到PATH(即使是非交互式會話).
>(不推薦)使用.setPty方法為“ exec”通道強制偽終端分配:
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setPty(true);
標簽:jsch,shell,ssh,java
來源: https://codeday.me/bug/20191118/2028468.html
總結
以上是生活随笔為你收集整理的java channelexec_java-使用SSH exec通道调用Shell脚本,但忽略对其他Shell脚本的调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java axisclient超时_调用
- 下一篇: java 注解妙用_框架开发之Java注