本地脚本批量复制服务器当日新文件失败,手动执行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
相关产品推荐
相关产品推荐

