本文目录导读:

基于 SCP 的脚本
#!/bin/bash # 远程文件拷贝脚本 - SCP版本 # 配置 REMOTE_USER="username" REMOTE_HOST="192.168.1.100" REMOTE_PATH="/home/username/data/" LOCAL_PATH="/data/backup/" # 拷贝远程文件到本地 echo "开始拷贝远程文件到本地..." scp -P 22 "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/file.txt" "$LOCAL_PATH/" # 拷贝本地文件到远程 echo "开始拷贝本地文件到远程..." scp -P 22 "$LOCAL_PATH/local_file.txt" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/" # 拷贝整个目录 echo "开始拷贝远程目录到本地..." scp -r "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH" "$LOCAL_PATH/" echo "文件拷贝完成!"
基于 RSYNC 的增量拷贝脚本
#!/bin/bash
# 增量备份脚本 - rsync版本
# 配置
REMOTE_USER="username"
REMOTE_HOST="192.168.1.100"
SOURCE_DIR="/home/username/data/"
DEST_DIR="/data/backup/"
EXCLUDE_FILE="temp/"
# 同步远程到本地
rsync -avz --progress --partial \
-e "ssh -p 22" \
--exclude="$EXCLUDE_FILE" \
"$REMOTE_USER@$REMOTE_HOST:$SOURCE_DIR" "$DEST_DIR"
# 同步本地到远程
rsync -avz --progress --partial \
-e "ssh -p 22" \
--exclude="$EXCLUDE_FILE" \
"$DEST_DIR" "$REMOTE_USER@$REMOTE_HOST:$SOURCE_DIR"
echo "同步完成!"
自动批量文件拷贝脚本
#!/bin/bash
# 批量远程文件拷贝脚本
# 服务器列表
SERVERS=(
"192.168.1.10"
"192.168.1.11"
"192.168.1.12"
)
# 配置
REMOTE_USER="admin"
REMOTE_PORT=22
LOCAL_FILE="/path/to/local/file.txt"
REMOTE_PATH="/home/admin/uploads/"
SSH_KEY="/home/user/.ssh/id_rsa"
# 批量拷贝函数
batch_copy() {
local file=$1
local dest=$2
for server in "${SERVERS[@]}"; do
echo "正在拷贝到 $server..."
scp -i "$SSH_KEY" -P "$REMOTE_PORT" \
"$file" "${REMOTE_USER}@${server}:${dest}"
if [ $? -eq 0 ]; then
echo "✓ $server 拷贝成功"
else
echo "✗ $server 拷贝失败"
fi
done
}
# 执行批量拷贝
batch_copy "$LOCAL_FILE" "$REMOTE_PATH"
带日志和错误处理的完整脚本
#!/bin/bash
# 完善的远程文件拷贝脚本
# 日志配置
LOG_FILE="/var/log/file_copy_$(date +%Y%m%d).log"
ERROR_LOG="/var/log/file_copy_error_$(date +%Y%m%d).log"
# 配置文件
CONFIG_FILE="/etc/remote_copy.conf"
# 日志函数
log_info() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [INFO] $1" | tee -a "$LOG_FILE"
}
log_error() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [ERROR] $1" | tee -a "$ERROR_LOG" >&2
}
# 加载配置
load_config() {
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
log_info "配置文件加载成功"
else
log_error "配置文件 $CONFIG_FILE 不存在"
exit 1
fi
}
# 检查依赖
check_dependencies() {
local cmds=("ssh" "scp" "rsync")
for cmd in "${cmds[@]}"; do
if ! command -v "$cmd" &> /dev/null; then
log_error "$cmd 未安装"
exit 1
fi
done
log_info "依赖检查通过"
}
# 测试SSH连接
test_ssh_connection() {
log_info "测试 SSH 连接..."
ssh -o ConnectTimeout=5 -o BatchMode=yes \
"${REMOTE_USER}@${REMOTE_HOST}" "echo '连接成功'" 2>/dev/null
if [ $? -eq 0 ]; then
log_info "SSH 连接测试成功"
return 0
else
log_error "SSH 连接测试失败"
return 1
fi
}
# 执行文件拷贝
copy_files() {
local source=$1
local destination=$2
local mode=${3:-"scp"} # 默认使用scp
case "$mode" in
"scp")
log_info "使用 SCP 拷贝..."
scp -P "$REMOTE_PORT" \
-o "StrictHostKeyChecking=no" \
-o "ServerAliveInterval=60" \
"$source" "${REMOTE_USER}@${REMOTE_HOST}:${destination}"
;;
"rsync")
log_info "使用 RSYNC 拷贝..."
rsync -avz --progress \
-e "ssh -p $REMOTE_PORT" \
"$source" "${REMOTE_USER}@${REMOTE_HOST}:${destination}"
;;
*)
log_error "不支持的拷贝模式: $mode"
return 1
;;
esac
return $?
}
# 主函数
main() {
# 检查依赖
check_dependencies
# 加载配置
load_config
# 测试连接
test_ssh_connection || exit 1
# 执行拷贝
if copy_files "$SOURCE" "$DEST" "scp"; then
log_info "文件拷贝成功"
else
log_error "文件拷贝失败"
exit 1
fi
}
# 执行主函数
main "$@"
配置文件示例 (remote_copy.conf)
# 远程服务器配置 REMOTE_USER="admin" REMOTE_HOST="192.168.1.100" REMOTE_PORT=22 # 路径配置 SOURCE="/data/source/file.txt" DEST="/data/backup/" # SSH密钥路径 SSH_KEY="/home/user/.ssh/id_rsa" # 重试次数 RETRY_COUNT=3 # 超时设置(秒) TIMEOUT=30
使用方法
# 1. 创建脚本 chmod +x remote_copy.sh # 2. 基本使用 ./remote_copy.sh # 3. 带参数使用 ./remote_copy.sh /local/file.txt user@host:/remote/path/ # 4. 添加到crontab(定时任务) crontab -e # 每天凌晨2点执行 0 2 * * * /path/to/remote_copy.sh >> /var/log/copy.log 2>&1
安全保障
#!/bin/bash
# 带安全检查的脚本
# 设置SSH密钥认证(免密码)
ssh-keygen -t rsa -b 4096
ssh-copy-id user@remote_host
# 在Linux中正确使用密码参数
# 1. 使用 sshpass (需要安装)
# apt-get install sshpass (Ubuntu)
# yum install sshpass (CentOS)
# 2. 连接到远程服务器并执行命令
sshpass -p 'your_password' ssh user@remote_host "ls -la"
# 3. 使用 sshpass 进行文件传输
sshpass -p 'your_password' scp file.txt user@remote_host:/path/
# 注意:永远不要在脚本中硬编码密码!
# 推荐使用环境变量或配置文件
PASSWORD="${COPY_PASSWORD:-$(cat /run/secrets/copy_password)}"
注意事项
-
安全考虑
- 使用SSH密钥认证,避免密码暴露
- 限制脚本执行权限 (chmod 700)
- 不要在脚本中硬编码密码
-
性能优化
- 使用rsync替代scp进行增量同步
- 对大文件使用压缩传输
- 设置合适的超时时间
-
错误处理
- 添加重试机制
- 记录详细的日志
- 发送通知(邮件、钉钉等)
需要我详细解释某个特定场景的脚本实现吗?