(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换成要执行的远程程序就好了~