歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> Linux 通過Shell遠程調用

Linux 通過Shell遠程調用

日期:2017/2/28 16:01:19   编辑:SHELL編程

(1)Linux如何通過命令行進行遠程調用?通過google和百度,終於讓我找到一個簡單的方法,其實一條語句就好:

$ssh ip “command”

或者是$ssh ip ‘ command‘

例如: ssh 100.100.100.100 “mkdir -p /home/zhangliuhang/zz/zz/zz”

(2)在遠程調用中一個個人認為很重要的問題是環境變量怎麼傳過去?我們知道export的作用域是後面的shell子進程,當前shell進行export設置好環境變量後在次重啟shell時,原先通過export設置的環境變量會被清除。除非將export語句寫在特殊的文件中。例如 .bash_profile或者.bashrc文件中。

那麼我們在啟動遠程進程時該如何將當前進程的env傳過去給遠程進程使用?

我們可以這麼做:

$ssh 100.100.100.100 “export ZZZ=100;echo $ZZZ”

但是當我們需要傳遞整個env時,並且要傳遞的env中存在詭異的環境變量名的時候,這種做法就行不通了。。。

我們知道使用export時,環境變量名具有特殊要求,比如對於如下情況會報錯

$export java.tmp.dir=/home/zhangliuhang/tmp

因為‘java.tmp.dir’是一個非法的變量名,也許你會問這個非法的變量名怎麼可能出現在env中。。。恩。。。通過java或者c語言程序是可以的。比如:

Java中:

Map<String,String>env=new HashMap<String,String>();

env.put(“java.tmp.dir”,”/home/zhangliuhang/tmp”)

ProcessBuilder builder=new

ProcessBuilder(“bash”,”/home/zhangliuhang/program”);

Builder.environment().putAll(env);

Builder.start();

C語言中:

#include “stdio.h”

#include “stdlib.h”

Int main (int argc,char* args[])

{

setenv(“java.tmp.dir”,”/zhangliuhang/tmp”,1);

system(args[1]);

return 0;

}

回到主題上,我們可以怎麼做呢?我的具體做法是:

在當前目錄下寫一個c語言的小程序setenv.cc,代碼如下:

1 #include "stdio.h"

2 #include "stdlib.h"

3 #include "string.h"

4

5 int main(int argc,char* args[])

6 {

7 FILE *fp;

8 char s[200];

9 char envVariable[200];

10 char envValue[200];

11 int i,j,length;

12

13 if((fp=fopen(args[1],"r"))==NULL)

14 {

15 printf("file can't open!\n");

16 return 0;

17 }

18

19 while (!feof(fp))

20 {

21 fgets(s,200,fp);

22

23 //split the chars

24 length=strlen(s);

25 for(i=0;i<length;i++)

26 {

27 if(s[i]=='=')

28 {

29 envVariable[i]='\0';

30 break;

31 }

32 envVariable[i]=s[i];

33 }

34 for (j=i+1;j<length;j++)

35 {

36 envValue[j-i-1]=s[j];

37 }

38 envValue[j-i-1]='\0';

39

40 setenv(envVariable,envValue,1);

41 }

42

43 fclose(fp);

44

45 system(args[2]);

46

47 return 0;

48 }

編譯成setenv可執行程序

同時寫了一個腳本RemoteComputing.sh:

ssh 100.100.100.100 “mkdir -p ”$TMPDIR

env>envcontent

scp envcontent 100.100.100.100:$TMPDIR/

scp ./setenv 100.100.100.100:$TMPDIR/

bash -c “ssh 100.100.100.100 ‘$TMPDIR/setenv $TMPDIR/envcontent command’ ”

ssh 100.100.100.100 “rm –rf $TMPDIR”

那麼只要調用RemoteComputing .sh這個腳本並且將腳本中command換成要執行的遠程程序就好了~

Copyright © Linux教程網 All Rights Reserved