感谢支持
我们一直在努力

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

赞(0) 打赏
转载请注明出处:服务器评测 » Linux 通过Shell远程调用
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏