由于在集群中手动分发文件较为麻烦,这里记录一下自动分发脚本。
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; do
case "$opt" in
p) 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}" ]; then
TARGETS=("${DEFAULT_TARGETS[@]}")
fi
# 检查方法是否有效
if [[ "$METHOD" != "scp" && "$METHOD" != "rsync" ]]; then
echo "Error: Method must be either 'scp' or 'rsync'."
usage
fi
# 函数:创建远程目录
create_remote_dir() {
local target=$1
ssh "$target" "mkdir -p $FILE_PATH"
}
# 函数:使用SCP分发文件,显示进度条
distribute_scp() {
local target=$1
scp -r "$FILE_PATH"/* "$target:$FILE_PATH"
}
# 函数:使用Rsync分发文件,显示进度条
distribute_rsync() {
local target=$1
rsync -avz --progress "$FILE_PATH"/* "$target:$FILE_PATH"
}
echo "Source Path: $FILE_PATH"
# 分发文件
for target in "${TARGETS[@]}"; do
echo "Target Path: $target:$FILE_PATH"
# 检查并创建远程目录
create_remote_dir "$target"
# 分发文件
if [[ "$METHOD" == "scp" ]]; then
distribute_scp "$target"
else
distribute_rsync "$target"
fi
echo "Files distributed to $target using $METHOD."
done
echo "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
)。