远程调用linux,Linux 通过Shell远程调用

本文详细介绍了如何使用SSH在Linux中进行远程命令执行,包括一条简单的SSH命令示例以及如何处理复杂的环境变量传递问题。当环境变量包含特殊字符时,作者提供了一种通过编写C程序和临时文件来解决的方法,确保远程进程中能正确使用本地环境变量。
摘要由CSDN通过智能技术生成

(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中:

Mapenv=new HashMap();

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值