由于在集群中手动分发文件较为麻烦,这里记录一下自动分发脚本。
1 脚本说明
该脚本用于将文件分发到远程设备。默认分发文件的路径为脚本所在路径,默认分发目标地址为node1
和node2
。可以在启动脚本时手动输入分发文件的路径和目标设备地址,并可以选择使用 scp 或 rsync 进行文件传输。如果目标设备不存在相同地址会自动创建。
2 脚本代码
可以根据实际情况修改默认参数。
#!/bin/bash# 默认参数
DEFAULT_PATH=$(pwd)
DEFAULT_TARGETS=("node1" "node2")
DEFAULT_METHOD="rsync"# 函数:检查是否安装了指定的命令
check_command() {command -v "$1" >/dev/null 2>&1 || {echo "Error: $1 is not installed. Please install it and try again."exit 1}
}# 检查所需的命令
check_command "scp"
check_command "rsync"# 函数:将相对路径转换为绝对路径
get_absolute_path() {local path="$1"echo "$(cd "$path" && pwd)"
}# 函数:显示用法信息
usage() {echo "Usage: $0 [-p <path>] [-t <target1,target2,...>] [-m <scp|rsync>]"exit 1
}# 解析输入参数
while getopts "p:t:m:" opt; docase "$opt" inp) FILE_PATH=$OPTARG ;;t) IFS=',' read -r -a TARGETS <<< "$OPTARG" ;;m) METHOD=$OPTARG ;;*) usage ;;esac
done# 设置默认值
FILE_PATH=${FILE_PATH:-$DEFAULT_PATH}
FILE_PATH=$(get_absolute_path "$FILE_PATH")
METHOD=${METHOD:-$DEFAULT_METHOD}
if [ -z "${TARGETS+x}" ]; thenTARGETS=("${DEFAULT_TARGETS[@]}")
fi# 检查方法是否有效
if [[ "$METHOD" != "scp" && "$METHOD" != "rsync" ]]; thenecho "Error: Method must be either 'scp' or 'rsync'."usage
fi# 函数:创建远程目录
create_remote_dir() {local target=$1ssh "$target" "mkdir -p $FILE_PATH"
}# 函数:使用SCP分发文件,显示进度条
distribute_scp() {local target=$1scp -r "$FILE_PATH"/* "$target:$FILE_PATH"
}# 函数:使用Rsync分发文件,显示进度条
distribute_rsync() {local target=$1rsync -avz --progress "$FILE_PATH"/* "$target:$FILE_PATH"
}echo "Source Path: $FILE_PATH"
# 分发文件
for target in "${TARGETS[@]}"; doecho "Target Path: $target:$FILE_PATH"# 检查并创建远程目录create_remote_dir "$target"# 分发文件if [[ "$METHOD" == "scp" ]]; thendistribute_scp "$target"elsedistribute_rsync "$target"fiecho "Files distributed to $target using $METHOD."
doneecho "File distribution completed."
3 使用说明
3.1 基本用法
./distribute_files.sh
3.2 选项说明
-p <path>
:指定分发文件的路径,默认为脚本所在路径。-t <target1,target2,...>
:指定分发目标地址,默认为node1
和node2
。多个地址使用逗号分隔,且不要加空格。-m <scp|rsync>
:选择使用scp
或rsync
进行文件传输,默认为scp
。建议首次传输使用scp
,之后的传输使用rsync
。
3.3 示例用法
-
使用默认参数执行脚本:
./distribute_files.sh
分发脚本所在路径的文件到
node1
和node2
,使用 rsync 进行传输。 -
指定分发路径和目标地址:
./distribute_files.sh -p /path/to/files -t node1,node2,node3
分发
/path/to/files
路径下的文件到node1
、node2
和node3
,使用 rsync 进行传输。 -
指定使用 scp 进行分发:
./distribute_files.sh -m scp
分发脚本所在路径的文件到
node1
和node2
,使用 scp 进行传输。
4 注意事项
- 确保目标设备已经配置了 SSH 访问权限,并且本地设备能够通过 SSH 连接到目标设备。
- 分发文件路径和目标地址需要用户有相应的读写权限。
- 在首次使用时,请先测试连接是否正常,以避免大规模文件分发失败。
- 请确保本地和远程设备上可以使用必要的命令(
scp
、rsync
)。