(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換成要執行的遠程程序就好了~