#!/bin/bash # 从 Windows 服务器同步凭证照片到本地 input 目录 # Windows 路径: D:\beifen\会计工具\ # 本地路径: ~/mc/会计工具/input/ WIN_HOST="administrator@192.168.123.11" WIN_PATH="/D:/beifen/会计工具/" LOCAL_PATH="$HOME/mc/会计工具/input" SSH_PASS="xue.2538" # 已处理的文件记录 SEEN_FILE="$HOME/mc/会计工具/.synced_files.txt" touch "$SEEN_FILE" # 列出服务器上的文件(用 cmd.exe,避免 PowerShell 路径 quoting 问题) SERVER_FILES=$(sshpass -p "$SSH_PASS" ssh "$WIN_HOST" "cmd.exe /c dir D:\\beifen\\会计工具\\*.jpg /b D:\\beifen\\会计工具\\*.png /b D:\\beifen\\会计工具\\*.jpeg /b D:\\beifen\\会计工具\\*.webp /b 2>nul" 2>/dev/null) # 无声模式:没新文件就不输出任何内容(配合 cron no_agent 使用) if [ -z "$SERVER_FILES" ]; then exit 0 fi NEW_COUNT=0 TOTAL_COUNT=0 while IFS= read -r FILENAME; do [ -z "$FILENAME" ] && continue # 去掉 Windows 的 \r 换行符 FILENAME="${FILENAME//$'\r'/}" [ -z "$FILENAME" ] && continue # 只处理图片文件 case "${FILENAME,,}" in *.jpg|*.jpeg|*.png|*.bmp|*.tiff|*.tif|*.webp) ;; *) continue ;; esac TOTAL_COUNT=$((TOTAL_COUNT + 1)) # 检查是否已同步 if grep -qxF "$FILENAME" "$SEEN_FILE" 2>/dev/null; then continue fi sshpass -p "$SSH_PASS" scp "$WIN_HOST:${WIN_PATH}${FILENAME}" "$LOCAL_PATH/" 2>/dev/null if [ $? -eq 0 ]; then echo "$FILENAME" >> "$SEEN_FILE" NEW_COUNT=$((NEW_COUNT + 1)) fi done <<< "$SERVER_FILES" if [ $NEW_COUNT -gt 0 ]; then echo "✅ 同步完成: $NEW_COUNT 张新照片" fi