前言
SSH我们大家都不陌生,它是Linux下进行远程连接的基本工具,不单单可以登录,还可以远程操作。接下来我们来说一下怎么本地执行脚本到远程?没错!就是使用SSH。
日常工作中我们常常遇到在多个主机上远程部署,比如要在一台主机上写好shell脚本,执行脚本到远程主机。有两种方法:
1. 使用scp将本地脚本文件拷贝到远端,然后再通过ssh执行远端的脚本;(弊端是脚本修改后,每次都需要scp);
2. 直接在本地执行脚本到远程。
我们就说第二种方法了
一、 执行本地脚本
- 执行一个脚本到远程,我们用两个主机测试,主机1 IP:192.168.2.111 和主机2 IP:192.168.2.112
$ cat test.sh //主机1上写一个简单脚本 获取当前主机IP
ifconfig | grep inet | awk -F "[: ]+" '{print $4}' | head -n1
$ sh test.sh //本地执行一下
192.168.2.111 //获取到本机内网IP
重点来了!!执行本地脚本到远程的方法
$ ssh root@192.168.2.112 < test.sh
192.168.2.112 //在本地执行脚本获取到目标主机的IP
通过重定向 stdin,本地的脚本 test.sh 在远程服务器上被执行
- 为脚本传递参数
$ cat test2.sh
echo $1
echo $2
在本地执行结构如下:
$ sh test2.sh a b
a
b
通过重定向远程执行,会报错
$ ssh root@10.153.195.138 < test2.sh a b
bash: a: command not found
要想在这种情况下(远程执行本地的脚本)执行带有参数的脚本,需要为 bash 指定 -s 参数:
$ ssh root@10.153.195.138 'bash -s' < test2.sh a b
a
b
二、 执行远程主机上的脚本
除了执行本地的脚本,还有情况是脚本文件存放在远程服务器上,而我们需要远程执行它。现在我们在主机2上创建test3.sh脚本,在主机1上远程执行。
$ cat test3.sh //主机2中的脚本
ifconfig | grep inet | awk -F "[: ]+" '{print $4}' | head -n1
$ ssh root@192.168.2.112 sh /root/test3.sh //主机1中去执行 (一定要是绝对路径去执行)
192.168.2.112
##传递参数
$ cat test4.sh //主机2中的脚本
echo $1
echo $2
$ ssh root@192.168.2.112 sh /root/test4.sh aa bb //主机1中传参数执行
aa
bb