You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地脚本批量复制服务器当日新文件失败,手动执行scp正常,求助原因

问题分析与解决方案

你的脚本存在两个核心问题导致文件无法复制,我们一步步拆解并修正:

1. 脚本过早终止,scp命令从未执行

看你的脚本内容,在echo输出文件列表后直接写了exit——这个命令会立刻终止整个脚本进程,后面的scp代码根本没有机会运行!这是最直观的致命错误。

2. 脚本执行逻辑完全颠倒:你在远程服务器上运行了需要本地执行的scp命令

你通过ssh bastibast@192.168.0.200 'bash -s' < fileretriever.sh调用脚本,意味着整个脚本都在远程服务器上运行:

  • find命令确实能在远程找到目标文件,
  • 但随后的scp命令是在远程服务器上执行的,它会尝试把远程文件复制到远程服务器的~/test/multiplecopy路径下(而非你的本地机器),同时远程服务器上的~/.ssh/id_rsa也不是你本地的私钥,权限和路径逻辑完全混乱。

修正后的可行方案

我们需要调整逻辑:在本地运行脚本,先通过SSH获取远程的文件列表,再在本地执行scp命令完成复制。

修正后的脚本(保存为fileretriever.sh,在本地运行)

#!/usr/bin/env bash
# 远程获取符合条件的文件列表,用-print0处理含空格/特殊字符的文件名
REMOTE_FILES=$(ssh bastibast@192.168.0.200 "find /home/bastibast/test -type f -mtime 0 -print0" | xargs -0 echo)

# 检查是否有文件需要复制,避免空列表导致scp报错
if [ -n "$REMOTE_FILES" ]; then
    scp -T -i ~/.ssh/id_rsa bastibast@192.168.0.200:"$REMOTE_FILES" ~/test/multiplecopy
    echo "已成功复制文件到本地"
else
    echo "未找到符合条件的新文件"
fi

运行方式

给脚本添加执行权限后直接在本地运行:

chmod +x fileretriever.sh
./fileretriever.sh

额外说明

  • 用-print0和xargs -0是为了兼容文件名包含空格、特殊字符的场景,避免文件路径解析错误;
  • 增加了空值检查,防止没有新文件时执行scp出现不必要的报错;
  • 去掉了调试模式-x,如果需要排查问题可以重新加上。

内容的提问来源于stack exchange,提问作者Baptise

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 08:33:11