前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SSH集群登录、文件同步分发、同步执行脚本

SSH集群登录、文件同步分发、同步执行脚本

作者头像
长安不见使人愁
发布2022-11-01 15:35:32
1.1K0
发布2022-11-01 15:35:32
举报
文章被收录于专栏:给时光以生命

一、SSH登录

1、配置静态ip - netplan

修改netplan配置文件

代码语言:javascript
复制
root@Server1:~# vim /etc/netplan/01-network-manager-all.yaml

配置详情

代码语言:javascript
复制
# Let NetworkManager manage all devices on this system
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    ens33:
      dhcp4: no #关闭动态分配ip
      addresses: [192.168.35.150/24]
      gateway4: 192.168.35.2 #虚拟机VMnet8默认网关为192.168.xx.2
      nameservers:
        addresses: [192.168.35.2] #dns 虚拟机使用网关即可

应用新配置

代码语言:javascript
复制
root@Server1:~# netplan apply
2、配置ip和hostname映射

修改本机hostname

代码语言:javascript
复制
root@Server1:~# vim /etc/hostname

添加映射

代码语言:javascript
复制
root@Server1:~# vim /etc/hosts
代码语言:javascript
复制
127.0.0.1       localhost
127.0.1.1       Server1

192.168.35.151  Server2
192.168.35.152  Server3

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

重启生效

代码语言:javascript
复制
root@Server1:~# reboot
3、本机生成ssh公钥和密钥

生成密钥

代码语言:javascript
复制
root@Server1:~# ssh-keygen -t rsa

密钥文件 ~/.ssh/id_rsa.pub为公钥 ~/.ssh/id_rsa为密钥

4、上传公钥并追加其内容到远程主机 ~/.ssh/authorized_keys

追加公钥,注意此处不要用 cat > 命令导致原有公钥被覆盖

代码语言:javascript
复制
root@Server1:~# cat 公钥 >> ~/.ssh/authorized_keys

重启ssh服务

代码语言:javascript
复制
root@Server1:~# systemctl restart sshd.service

二、文件同步分发脚本

1、rsync(remote synchronizetion)

安装

代码语言:javascript
复制
root@Server1:~# apt-get install rsync

使用rsync实现文件复制,rsync只会对差异文件进行更新,不同于scp复制所有文件。

基本用法

代码语言:javascript
复制
rsync -av 文件路径 用户名@主机:远程文件路径
rsync -av /usr/local/mysoft/jdk8 root@Server2:/usr/local/mysoft/

参数 -a 归档拷贝(类似于递归) -v 显示复制过程

2、编写文件分发脚本 tsync

新建脚本tsync

代码语言:javascript
复制
#!/bin/bash

#1. 判断参数个数
if [ $# -lt 1 ]
then
    echo Not Enough Arguement!
    exit;
fi

#2. 遍历集群所有机器
for host in Server2 Server3
do
    echo ====================  $host  ====================
    #3. 遍历所有目录,挨个发送

    for file in $@
    do
        #4. 判断文件是否存在
        if [ -e $file ]
            then
                #5. 获取父目录
                pdir=$(cd -P $(dirname $file); pwd)

                #6. 获取当前文件的名称
                fname=$(basename $file)
                ssh $host "mkdir -p $pdir"
                rsync -av $pdir/$fname $host:$pdir
            else
                echo $file does not exists!
        fi
    done
done

添加执行权限

代码语言:javascript
复制
root@Server1:~# chmod +x /usr/local/myshell/tsync

创建软连接 - 环境变量

代码语言:javascript
复制
root@Server1:~# ln -s /usr/local/myshell/tsync /usr/bin/tsync

使用tsync分发文件

代码语言:javascript
复制
root@Server1:~# ll /usr/local/tan/test/
total 16
drwxr-xr-x 2 root root 4096 8月   2 09:14 ./
drwxrwxrwx 3 root root 4096 8月   2 00:17 ../
-rw-r--r-- 1 root root   13 8月   2 09:14 demo.txt
-rw-r--r-- 1 root root   13 8月   2 09:15 test.txt
root@Server1:~# tsync /usr/local/tan/test
==================== Server2 ====================
sending incremental file list
test/
test/demo.txt
test/test.txt

sent 222 bytes  received 58 bytes  186.67 bytes/sec
total size is 26  speedup is 0.09
==================== Server3 ====================
sending incremental file list
test/
test/demo.txt
test/test.txt

sent 222 bytes  received 58 bytes  560.00 bytes/sec
total size is 26  speedup is 0.09
root@Server1:~# ssh Server2 ls /usr/local/tan/test/
demo.txt
test.txt

三、同步执行脚本

1、SSH远程执行命令找不到环境变量的问题
  • 通过SSH执行远程主机的命令或脚本时,经常会出现找不到自定义环境变量的问题。但是,如果通过SSH登录远程主机,然后再执行相同的命令或脚本,那么此时执行又是成功的。两种相似的方法,得到的结果却不同,根本原因在于这两种方式使用的bash模式不同。
  • (1)通过SSH登录后再执行命令和脚本 这种方式会使用Bash的interactive + login shell模式,这里面有两个概念需要解释:interactive和login。 login故名思义,即登陆,login shell是指用户以非图形化界面或者以ssh登陆到机器上时获得的第一个shell,简单些说就是需要输入用户名和密码的shell。因此通常不管以何种方式登陆机器后用户获得的第一个shell就是login shell。 interactive意为交互式,这也很好理解,interactive shell会有一个输入提示符,并且它的标准输入、输出和错误输出都会显示在控制台上。所以一般来说只要是需要用户交互的,即一个命令一个命令的输入的shell都是interactive shell。而如果无需用户交互,它便是non-interactive shell。通常来说如bash script.sh此类执行脚本的命令就会启动一个non-interactive shell,它不需要与用户进行交互,执行完后它便会退出创建的Shell。 在interactive + login shell模式中,Shell首先会加载/etc/profile文件,然后再尝试依次去加载下列三个配置文件之一,一旦找到其中一个便不再接着寻找: ~/.bash_profile ~/.bash_login ~/.profile
  • (2)通过SSH直接执行远程命令和脚本 这种方式会使用Bash的non-interactive + non-login shell模式,它会创建一个shell,执行完脚本之后便退出,不再需要与用户交互。 no-login shell,顾名思义就是不是在登录Linux系统时启动的(比如你在命令行提示符上输入bash启动)。它不会去执行/etc/profile文件,而会去用户的HOME目录检查.bashrc并加载。 系统执行Shell脚本的时候,就是属于non-interactive shell。Bash通过BASH_ENV环境变量来记录要加载的文件,默认情况下这个环境变量并没有设置。如果有指定文件,那么Shell会先去加载这个文件里面的内容,然后再开始执行Shell脚本。
  • 要解决SSH远程执行命令时找不到自定义环境变量的问题,可以在登录用户.bashrc中添加需要的环境变量。
2、编写同步执行脚本

此处自定义为tcall

代码语言:javascript
复制
#!/bin/bash

# 获取控制台指令

cmd=$*

# 判断指令是否为空
if [ ! -n "$cmd" ]
then
        echo "command can not be null !"
        exit
fi

# 获取当前登录用户
user=`whoami`
echo "=================current host is localhost==================="
$cmd
echo -e "\n"

# 在从机执行指令,这里需要根据你具体的集群情况配置,host与具体主机名一致,同上
for (( host=2;host<=3;host++ ))
do
        echo "================current host is $user@Server$host================="
        echo "--> excute command \"$cmd\""
        ssh $user@Server$host $cmd
        echo -e "\n"
done

echo "excute successfully !"

同样需要添加执行权限和建立软连接

以Java为例,添加用户环境变量

代码语言:javascript
复制
root@Server1:~# ssh Server2 cat /root/.bashrc
export JAVA_HOME=/usr/local/mysoft/jdk8
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
......

同步执行java -version

代码语言:javascript
复制
root@Server1:~# tcall java -version
=================current host is localhost===================
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)


================current host is root@Server2=================
--> excute command "java -version"
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)


================current host is root@Server3=================
--> excute command "java -version"
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)


excute successfully !
root@Server1:~#

Q.E.D.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、SSH登录
    • 1、配置静态ip - netplan
      • 2、配置ip和hostname映射
        • 3、本机生成ssh公钥和密钥
          • 4、上传公钥并追加其内容到远程主机 ~/.ssh/authorized_keys
          • 二、文件同步分发脚本
            • 1、rsync(remote synchronizetion)
              • 2、编写文件分发脚本 tsync
              • 三、同步执行脚本
                • 1、SSH远程执行命令找不到环境变量的问题
                  • 2、编写同步执行脚本
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档