[转帖]Linux文件分发脚本,只需一条命令将你的文件分发到各个服务器上

linux,文件,分发,脚本,一条,命令,各个,服务器 · 浏览次数 : 0

小编点评

**脚本概述:** 脚本旨在分发文件到多个服务器上。它使用 `xrsync` 命令实现文件复制操作。脚本首先使用 `node1`、`node2` 和 `node3` 等主机名获取服务器列表,然后遍历所有服务器,复制文件到其对应目录下。 **脚本步骤:** 1. 检查参数数量,确保有足够参数传递。 2. 遍历所有服务器,并执行以下步骤: - 使用 `mkdir -p` 创建父目录。 - 使用 `rsync -av` 命令将文件复制到目标服务器的指定目录。 - 如果文件已存在,则提示用户文件已存在。 3. 配置环境变量,使 `xrsync` 命令可以在全局范围内使用。 4. 将脚本存储为 `/opt/shell` 下的 `xrsync` 文件,并将其加入 `PATH` 环境变量。 **优化建议:** - 使用 `/etc/hosts` 文件记录服务器列表,方便使用主机名直接操作。 - 生成 SSH 私钥,免密登录服务器。 - 使用 `chmod +x xrsync` 命令为 `xrsync` 文件赋予可执行权限。 - 配置环境变量,使其易于使用。 **注意:** - 脚本中的 `node1`、`node2` 和 `node3` 等变量需要根据实际情况修改为服务器的 IP 地址或主机名。 - 脚本中的 `a.txt` 和 `b.txt` 是示例文件名称,实际文件名称应根据需求更改。

正文

https://zhuanlan.zhihu.com/p/438457921

 

背景

在运维或在日常工作生活中,我们经常会把一个文件拷贝到其它服务器上,或同时分发到多个服务器上,甚至要求目标机将文件放在相同的路径下,方便程序进一步调用。

遇到这种问题,我们通常的做法是使用scp或rsync命令把文件拷贝一个一个地拷贝到多台服务器上,这样做费时费力;大神的做法是使用ansible的playbook一下把事情干完,前提是你得会ansible;快捷的做法就是使用今天的脚本了。

效果演示

目前拥有4台机器,分别为client、node1、node2和node3,client与其它3台机器能够建立ssh链接。在client的/root/test目录下有a.txt和b.txt两个文件。

[root@client test]# ls /root/test/
a.txt  b.txt
[root@client test]# 

我把文件分发到node1、node2和node3的/root/test下,执行以下命令:

# 在/root/test目录下执行, xrsync是我的脚本
[root@client test]# xrsync a.txt b.txt 

执行分发过程:

[root@client test]# xrsync a.txt b.txt 
============ node1 ============
sending incremental file list
a.txt

sent 93 bytes  received 35 bytes  256.00 bytes/sec
total size is 2  speedup is 0.02
sending incremental file list
b.txt

sent 93 bytes  received 35 bytes  85.33 bytes/sec
total size is 2  speedup is 0.02
============ node2 ============
sending incremental file list
a.txt

sent 93 bytes  received 35 bytes  256.00 bytes/sec
total size is 2  speedup is 0.02
sending incremental file list
b.txt

sent 93 bytes  received 35 bytes  256.00 bytes/sec
total size is 2  speedup is 0.02
============ node3 ============
sending incremental file list
a.txt

sent 93 bytes  received 35 bytes  85.33 bytes/sec
total size is 2  speedup is 0.02
sending incremental file list
b.txt

sent 93 bytes  received 35 bytes  256.00 bytes/sec
total size is 2  spee

到node2上看一下,文件果然存在。同样地,node3和node4也同步过去了。

# node2上查看
[root@node2 ~]# ls /root/test/
a.txt  b.txt
[root@node2 ~]# 

# node3上查看
[root@node3 ~]# ls /root/test/
a.txt  b.txt
[root@node3 ~]# 

# node4上查看
[root@node4 ~]# ls /root/test/
a.txt  b.txt
[root@node4 ~]# 

脚本奉上

整个脚本的代码,只需要把其中的node1 node2 node3修改为自己环境下的主机名或ip地址即可。

#!/bin/bash
# 判断参数是否足够
if [ $# -lt 1 ]
then
 echo Not Enounh Arguement!
 exit;
fi

# 遍历所有的机器
for host in node1 node2 node3
do
 echo ============  $host ============
 for file in $@
 do
  # 判断文件是否存在
  if [ -e $file ]
  then
   # 获取父目录
   pdir=$(cd -P $(dirname $file); pwd)

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

运行条件

为了更方便脚本的运行,建议使用如下优化。

1.修改/etc/hosts文件,加入IP地址与主机名的对应关系,这样方便我们使用主机名直接操作。比如我演示的机器配置。

vim  /etc/hosts
# 加入配置,自己的机器对应修改
……
192.168.31.47 client
192.168.31.48 node1
192.168.31.50 node2
192.168.31.51 node3

2.客户机与目标机之间使用ssh密码验证登录,这样在传输文件时不需要二次验证。

# 生成ssh私钥
ssh-keygen -f /root/.ssh/id_rsa -N '' 
# 循环把公钥传递到服务器上,免密登录
for i in node1 node2 node3 
do 
  ssh-copy-id $i
done

# 根据提示输入密码

3.给脚本加可执行权限,并配置环境变量,使用全局可用。

# 把文件存储为xrsync,加上x权限
[root@client shell]# chmod +x xrsync 
[root@client shell]# 

# 配置环境变量
# 我把脚本放在/opt/shell下的,自己情况类比修改
[root@client shell]# vim /etc/profile.d/my_env.sh 
export PATH=$PATH:/opt/shell

# 配置生效,就可以在全局生效了
[root@client opt]# source /etc/profile

至此,早点干完活,开始愉快的玩耍吧~

与[转帖]Linux文件分发脚本,只需一条命令将你的文件分发到各个服务器上相似的内容:

[转帖]Linux文件分发脚本,只需一条命令将你的文件分发到各个服务器上

https://zhuanlan.zhihu.com/p/438457921 背景 在运维或在日常工作生活中,我们经常会把一个文件拷贝到其它服务器上,或同时分发到多个服务器上,甚至要求目标机将文件放在相同的路径下,方便程序进一步调用。 遇到这种问题,我们通常的做法是使用scp或rsync命令把文件拷

[转帖]远程执行Linux命令和使用for循环执行Linux命令

记录:363 场景:在CentOS 7.9操作系统上,在主机A上远程执行主机B上的Linux命令。使用for循环执行Linux命令,比如把主机A的/etc/yum.repos.d目录下文件,分发到集群其它节点。 1.使用for循环执行Linux命令 场景:把k8s-master01主机文件分发(拷贝

[转帖]Linux文件权限除了r、w、x外还有s、t、i、a权限

https://www.cnblogs.com/hiyang/p/15122714.html setuid 是 set user ID upon execution 再次缩写为suid setgid 是 set group ID upon execution 再次缩写为 sgid 它们是控制文件访问

[转帖]linux性能优化-内存回收

linux文件页、脏页、匿名页 缓存和缓冲区,就属于可回收内存。它们在内存管理中,通常被叫做文件页(File-backed Page)。通过内存映射获取的文件映射页,也是一种常见的文件页。它也可以被释放掉,下次再访问的时候,从文件重新读取。 大部分文件页,都可以直接回收,以后有需要时,再从磁盘重新读

[转帖]Linux之fstab文件详解

https://blog.yelvlab.cn/archives/592/ fstab文件是干什么用的: /etc/fstab是用来存放文件系统的静态信息的文件。位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改。当系

[转帖]Linux修改文件句柄数及vm.max_map_count、stack size的大小

文章目录 一、修改文件句柄数`1.1.查看当前大小``1.2.临时修改``1.3.永久修改` 二、修改max user processes进程数`2.1.临时修改``2.1.永久修改` 三、调整vm.max_map_count的大小`报错“max virtual memory areas vm.ma

[转帖]Linux中split大文件分割和cat合并文件详解

https://www.yingsoo.com/news/servers/70195.html 当需要将较大的数据上传到服务器,或从服务器下载较大的日志文件时,往往会因为网络或其它原因而导致传输中断而不得不重新传输。这种情况下,可以先将大文件分割成小文件后分批传输,传完后再合并文件。 1. 分割文件

[转帖]Linux中查找大文件两种姿势

https://rumenz.com/rumenbiji/linux-find-du-max-file.html 使用find命令查找大文件 find命令是Linux系统管理员工具库中最强大的工具之一。它允许你根据不同的标准(包括文件大小)搜索文件和目录。 例如,如果在当前工作目录中要搜索大小超过1

[转帖]Linux权限详解(chmod、600、644、666、700、711、755、777、4755、6755、7755)

https://www.cnblogs.com/monjeo/p/12191673.html 权限简介Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功。Linux下文件的权限类型一般包括读,写,执行。对应字母为 r、w、x。Linux下权限

[转帖]Linux中的Grep命令(在文件中查找文本)

[日期:2020-05-14] 来源:Linux公社 作者:醉落红尘 [字体:大 中 小] grep命令是(global regular expression print,全局正则表达式输出)的缩写,它是Linux中功能最强大且最常用的命令之一。 grep在一个或多个输入文件中搜索与给定模式匹配的行