java - shell script fork



使用SSH exec通道調用shell腳本,但忽略對其他shell腳本的調用 (1)

我正在使用這裡提供的有用示例來管理使用JSch exec在遠程服務器上執行shell腳本。 我可以看到從腳本返回的迴聲,最後的退出狀態為0,所以乍一看都很好看。

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

該腳本直接調用其他腳本。 即腳本的第一行是類似的:

script_two.sh

任何人都可以提出任何方式來克服這一點? 我開始研究“shell”通道而不是“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();

我假設腳本如下所示:

script_one.sh
script_two.sh

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

所以為了腳本的工作, 必須在某些啟動腳本中添加到PATH中。 只有交互式會話才會發生添加(可能是無意的錯誤)。 可能是因為添加是在僅為交互式會話執行(源)的啟動腳本中完成的。

JSch中的“exec”通道(正確)不會為會話分配偽終端(PTY)。 因此,一組不同的啟動腳本(可能)源於您使用SSH客戶端登錄時。 和/或腳本中的不同分支是基於TERM環境變量的不存在/存在而被採用的。 因此,環境可能與您在SSH客戶端上使用的交互式會話不同。

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

  • 改正腳本不要依賴非默認設置.PATH 。 使用顯式路徑調用子腳本:

    ./script_one.sh
    ./script_two.sh
  • 更正啟動腳本以添加. 無條件地路由到PATH (即使是非交互式會話)。

  • (不推薦)使用.setPty方法強制“exec”通道的偽終端分配:

    Channel channel=session.openChannel("exec");
    ((ChannelExec)channel).setPty(true);

    使用偽終端自動執行命令可能會帶來令人討厭的副作用。 例如,看看有沒有一種簡單的方法來擺脫當你使用Python的Paramiko庫進行SSH並從遠程機器的CLI獲取輸出時出現的垃圾值?

另請參閱相關問題使用JSch setCommand執行時,帶有源選項的Shell ping命令失敗 。





jsch