centos7配置ssh免密登录并配置xsync(同步文件目录)、xcall(同步执行命令)

113 阅读3分钟

一、作用

搭建集群的时候,可以将一份内容同时分发给多个已配置的服务器,不需要多次手动上传。
xsync是对rsync脚本的二次封装,可以自定义内容

二、scp和rsync

  • scp :命令格式为scp -r ·pdir/$fname $user@host:$pdir/$filename
    -r表示递归复制,给定本机的文件或目录地址 和 目标机器的用户名、主机IP、目的地路径和文件名就可以完成拷贝操作。使用 scp 传输数据时,文件是加密的,因此任何敏感内容都不会在传输过程中被篡改
  • rsync : 命令格式为 rsync -av $pdir/$fname $user@$host:$pdir/$fname
    -a表示归档拷贝,-v表示显示复制过程

scp与rsync的差别:

  • scp 通过安全的 SSH 连接将文件从本地机器复制到远程机器,而 rsync 允许您同步远程文件夹。
  • scp 读取源文件并将其写入目标,是在本地或通过网络执行线性复制。rsync 也是在本地或通过网络复制文件,但它使用特殊的增量传输算法和一些优化来使操作更快。
  • scp 总是安全的,而 rsync 必须通过 SSH 传输才能安全。
  • 如果要传输大文件,并且传输在完成之前断开连接,rsync 会从中断的地方继续传输,而 scp 没有。
  • rsync 比较每一端的文件并只传输更改文件的更改部分,当你第一次传输文件时,它的行为与 scp 非常相似,但是对于大多数文件未更改的第二次传输,它推送的数据将比 scp 少得多。这也是一种重新启动失败传输的便捷方法,你只需重新发出相同的命令,它就会从上次中断的地方开始,而 scp 将从头开始。

三、配置ssh免密登录,以001服务器为例,其余的一样

vim /etc/hosts
# 增加以下内容
192.168.74.133 kafka001
192.168.74.134 kafka002
192.168.74.135 kafka003

# 返回家目录
cd
# 生成公钥私钥,一直回车即可
ssh-keygen -t rsa
# 查看
ls -al
# 进入.ssh
cd .ssh
# 配置免密登录服务器
ssh-copy-id kafka002
ssh-copy-id kafka003

四、安装rsync(都安装)

yum -y install rsync
# 启动服务
systemctl start rsyncd.service
# 设置开机自启
systemctl enable rsyncd.service

1、创建xsync脚本

#!/bin/bash
# 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if [ $pcount -lt 1 ]
then
    echo Not Enough Arguement!
    exit;
fi

# 遍历集群所有机器
hostlist="kafka002 kafka003"
for host in $hostlist
do
    echo ====================    $host    ====================
    # 遍历所有目录,挨个发送
    for file in $@
    do
        # 判断文件是否存在
        if [ -e $file ]
        then
            # 获取父目录
            pdir=$(cd -P $(dirname $file); pwd)
            echo pdir=$pdir

            # 获取当前文件的名称
            fname=$(basename $file)
            echo fname=$fname

            # 通过ssh执行命令:在$host主机上递归创建文件夹(如果存在该文件夹)
            ssh $host "mkdir -p $pdir"

            # 远程同步文件至$host主机的$USER用户的$pdir文件夹下
            rsync -av $pdir/$fname $USER@$host:$pdir
        else
            echo $file does not exists!
        fi
    done
done

2、设置到全局命令

# 将上面的脚本文件复制到目录即可
echo $path

五、xcall

在一个节点上输入命令可以同步到其余节点执行

#!/bin/bash

# 获取控制台指令

cmd=$*

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

source /etc/profile

hostlist="kafka001 kafka002 kafka003"

for i in $hostlist
do
        echo "================ $i ================="
        echo "--> excute command \"$cmd\""
        ssh $USER@$i $cmd
done

echo "excute successfully !"

将上面的shell脚本放到任意$PATH下即可
jps命令找不到的解决方式,创建软连接
ln -s -f /usr/local/tools/jdk1.8/bin/jps /usr/local/bin/