#!/bin/bash
# SFTP 服务器信息
SFTP_HOST="172.16.5.147"
SFTP_PORT="2022"
SFTP_USER="forlinx"
SFTP_PASS="forlinx"
SFTP_DIR="DATAROOT"
# 本地录音文件目录
AUDIO_DIR="/media/forlinx/xctf/AudioExceed/$(date +%y%m)"
# 本地日志记录文件
LOG_DIR="/home/forlinx/AudioUpload"
MOD_TIME_LOG_FILE="$LOG_DIR/upload_log.txt"
# 本地执行日志目录
LOGS_DIR="$LOG_DIR/logs"
EXEC_LOG_FILE=""
# 是否上传所有文件的配置
#true:上传所有文件
#false:仅上传当前系统时间后产生的文件
UPLOAD_ALL_FILES=false
# 设置超时时间(TIMEOUT)和最大重试次数(MAX_RETRIES)
TIMEOUT=10
MAX_RETRIES=3
#RETRY_INTERVAL=5 # 重试间隔时间(秒)
# 初始化重试次数
retry_count=0
# 函数:输出日志信息
log_info() {
echo "$(date '+%b %d %H:%M:%S') $(hostname) $1" | tee -a "$EXEC_LOG_FILE"
}
# 确保目录存在且具有写入权限
if [ ! -d "$LOG_DIR" ]; then
mkdir -p "$LOG_DIR"
chmod 755 "$LOG_DIR"
chown forlinx:forlinx "$LOG_DIR" # 将所有者和组更改为forlinx
log_info "创建日志目录成功"
fi
if [ ! -d "$LOGS_DIR" ]; then
mkdir -p "$LOGS_DIR"
chmod 755 "$LOGS_DIR"
chown forlinx:forlinx "$LOGS_DIR" # 将所有者和组更改为forlinx
log_info "创建执行过程日志目录成功"
fi
# 读取日志文件中的最后修改时间(以秒为单位)
get_last_mod_time() {
local last_mod_time
# 确保日志文件存在且具有写入权限
if [ ! -f "$MOD_TIME_LOG_FILE" ]; then
touch "$MOD_TIME_LOG_FILE"
chmod 644 "$MOD_TIME_LOG_FILE"
chown forlinx:forlinx "$MOD_TIME_LOG_FILE" # 将所有者和组更改为forlinx
log_info "创建记录上传时间日志成功"
fi
if [ -s "$MOD_TIME_LOG_FILE" ]; then
last_mod_time=$(cat "$MOD_TIME_LOG_FILE")
echo "$last_mod_time"
else
echo "-1"
fi
}
# 更新日志文件
update_log_file() {
local new_mod_time_seconds=$1
echo "$new_mod_time_seconds" > "$MOD_TIME_LOG_FILE"
}
# 定义日志文件名称,按天创建
EXEC_LOG_FILE="$LOGS_DIR/$(date +%Y%m%d)_log.txt"
# 确保执行日志文件存在且具有写入权限
if [ ! -f "$EXEC_LOG_FILE" ]; then
touch "$EXEC_LOG_FILE"
chmod 644 "$EXEC_LOG_FILE"
chown forlinx:forlinx "$EXEC_LOG_FILE" # 将所有者和组更改为forlinx
fi
# 创建远程目录
create_remote_dir() {
local remote_dir=$1
# 使用sshpass和sftp命令尝试连接服务器,超时控制
while [ $retry_count -lt $MAX_RETRIES ]
do
if timeout $TIMEOUT sshpass -p "${SFTP_PASS}" sftp -oPort=${SFTP_PORT} ${SFTP_USER}@${SFTP_HOST} <<EOF
mkdir '${remote_dir}'
EOF
then
return 0
else
retry_count=$((retry_count+1))
log_info "连接 $SFTP_HOST 端口 $SFTP_PORT 失败,正在重试$((retry_count))..."
if [ $retry_count -eq $MAX_RETRIES ]; then
log_info "$MAX_RETRIES 次尝试后,连接SFTP服务器失败。请检查网络连接是否正常或服务器配置是否正确。"
exit 1
#else
#log_info "$RETRY_INTERVAL 秒后将重试..."
#sleep $RETRY_INTERVAL
fi
fi
done
}
last_mod_time=-1
# 上传文件
upload_file() {
local file=$1
local filename=$(basename "$file")
# 提取文件名中的时间
local file_date=${filename:1:8} # 提取 YYYYMMDD
local remote_dir="${SFTP_DIR}/${file_date}"
if [ ! -s "$MOD_TIME_LOG_FILE" ]; then
# 创建远程目录
create_remote_dir "$SFTP_DIR"
fi
# 获取文件的最新修改时间
local file_mod_time=$(stat -c %y "$file" | sed 's/..$//')
local file_mod_seconds=$(date -d "$file_mod_time" +%s)
# 修改时间阈值
last_time_seconds=$2
# 比较文件的最后修改时间和日志文件的时间
if [[ "$file_mod_seconds" -gt "$last_time_seconds" ]]; then
create_remote_dir "${remote_dir}"
# 上传文件
log_info "正在上传 ${filename} 到 ${remote_dir}/"
sshpass -p "${SFTP_PASS}" sftp -oPort=${SFTP_PORT} ${SFTP_USER}@${SFTP_HOST} <<EOF
put "$file" "${remote_dir}/$filename"
bye
EOF
log_info "上传成功: ${filename}"
# 更新日志文件为最新文件的修改时间(以秒为单位)
if [ "$file_mod_seconds" -gt "$last_mod_time" ]; then
last_mod_time="$file_mod_seconds"
update_log_file "$last_mod_time"
fi
fi
}
# 主程序
last_mod_time_seconds=$(get_last_mod_time)
# 获取当前时间
last_sys_time_seconds=$(( $(date +%s) - 60 ))
#log_info "脚本开始执行。"
if [ "$UPLOAD_ALL_FILES" = true ]; then
# 首次上传
if [ ! -s "$MOD_TIME_LOG_FILE" ]; then
log_info "正在上传全部文件"
find "$AUDIO_DIR" -type f | while read -r file; do
upload_file "$file" "0"
done
else
find "$AUDIO_DIR" -type f -newermt "$(date -d @$last_mod_time_seconds '+%Y-%m-%d %H:%M:%S')" | while read -r file; do
upload_file "$file" "$last_mod_time_seconds"
done
fi
else
# 首次上传
if [ ! -s "$MOD_TIME_LOG_FILE" ]; then
log_info "正在上传当前时间 $(date) 之后的文件"
find "$AUDIO_DIR" -type f -newermt "$(date -d @$last_sys_time_seconds '+%Y-%m-%d %H:%M:%S')" | while read -r file; do
upload_file "$file" "$last_sys_time_seconds"
done
else
find "$AUDIO_DIR" -type f -newermt "$(date -d @$last_mod_time_seconds '+%Y-%m-%d %H:%M:%S')" | while read -r file; do
upload_file "$file" "$last_mod_time_seconds"
done
fi
fi
#log_info "脚本执行完成。"
星辰北聂
- 粉丝: 6
- 资源: 1
最新资源
- PHPThinkphp+Vue2.0前后端分离框架通用后台源码数据库 MySQL源码类型 WebForm
- 构建一个大模型训练、微调、评估、推理、部署的全流程开发套件,基于MindSpore内置的并行技术和组件化设计
- 基于SpringCloud+Vue的财务数据管理系统(后端代码)
- 基于SpringBoot+Vue的在线课程管理系统(前端代码)
- 基于SpringBoot+Vue的在线课程管理系统(后端代码)
- MindInsight为MindSpore提供了简单易用的调优调试能力 用于模型优化的可视化仪表板
- 野火霸道开发板485原工程
- 国产化自主可控的人工智能开源平台 平台面向人工智能研究中的数据处理、算法开发、模型训练、算力管理和推理应用等各个流程的技术难点
- 基于Springboot+Vue的江西红色旅游景点宣传网站(后端代码)
- 基于Springboot+Vue的江西红色旅游景点宣传网站(管理端代码)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈