ssh遠程調用之shell腳本遠程調用應用程序


1.引子

前幾天有一個需求是這樣的:本機的shell腳本,通過遠程調用另一台機子上的shell腳本,來完成對遠程機子上分發的Java程序的執行和其他操作。看上去挺容易,實際上也不難。

第一步:用scp從本機向目的機子分發Java程序;

第二步:編寫shell腳本,用ssh完成調用。

然而,問題來了。

2.分析

先聲明:第一,Local和Remote兩個機子上的JDK安裝路徑、環境變量(都配置在.bash_profile中)、使用的版本統統一樣;第二,Java程序在Remote機上用shell腳本是可以啟起來的。
首先,給出一個用於測試的簡單Java代碼:
public class Hello{
        public static void main(String[] args){
                System.out.println("Test Successful, Hello!");
        }
}
然后,是Local shell腳本:
#!/usr/bin/env bash

echo "Local Java Version:"
echo `java -version`
echo "Remote Java Version:"
ssh blade27 "java -version"
echo "==========================================================="
ssh blade27 "rpm -qa | grep java"
echo "==========================================================="
ssh blade27 ". /home/wangpeng/zhiming/test/test.sh arguments"
echo "invoke done!"
最后,是Remote shell腳本:
#!/usr/bin/env bash

echo "Remote Java Home:"
echo $JAVA_HOME
echo "===============Execute Java Program============="
java -cp /home/wangpeng/zhiming/test/Hello.jar Hello
echo "================================================"
echo "Success, make it!"
echo "This is a args: $1"
 
         
 我們先直接運行看看結果: 
        
我們可以明顯的發現以下問題:1.Local Java Version和Remote Java Version不一樣;2.Remote shell根本就沒有找到已經配置好的環境變量$JAVA_HOME;3.Remote啟用了Linux自帶的OpenJDK。因此,才會報錯:Java程序的編譯和運行時的Java Version不一樣。
那么,現在我們就來分析原因。由運行結果可以看出,Remote機上配置環境變量的.bash_profile文件,在ssh連接時根本沒有被加載,而ssh連接別的機子,啟用的shell是non-login + non-interactive模式,即非登錄非交互模式,從而導致.bash_profile文件沒有被加載。
注:關於ssh連接遠程主機執行腳本及配置文件加載順序的介紹參考http://feihu.me/blog/2014/env-problem-when-ssh-executing-command-on-remote/#userconsent#這個鏈接的文件(必須注意:Linux不同版本其文件加載順序不同,不可照搬)。
因此,我就不多介紹配置文件加載和ssh連接模式了。

3.解決方案

由於那篇文件介紹的解決方案可能會因Linux版本的不同而發現一些變化,我這里就介紹比較簡單卻啰嗦的方法。
方式一:在Remote機上的shell腳本的開頭重新配置Java的環境變量
JAVA_HOME=/home/wangpeng/install/jdk1.7.0_25
export PATH=$JAVA_HOME/bin:$PATH
方式二:同樣還是在Remote shell的開頭設置,用source使.basn_profile文件生效
source /home/wangpeng/.bash_profile
方式三:干掉OpenJdk(注:一般我們使用的用戶沒有權限)
然后我們再來調用一次,觀察運行結果:

雖然在ssh連接Remote的時候,Remote仍然啟用的是OpenJdk,但是由於我們在Remote shell里重新是環境變量生效了,所以在執行Remote shell時,用的是自己安裝的JDK。


參考文獻
Linux man

版權聲明:本文為博主原創文章,未經博主允許不得轉載。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM