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

使用SCP从远程Ubuntu服务器批量下载文件失败求助

解决SCP批量下载的"command not found"错误

你的命令报错的核心原因是循环里的$i位置完全错了——当前命令里do $i sshpass ...会把本地当前目录下的每个文件名当作命令来执行,而这些文件名显然不是系统可识别的命令,所以会抛出"command not found"。

正确的批量下载姿势(分两种场景)

场景1:直接下载远程目录下的所有内容(最推荐)

如果只是想把远程/opt/Data下的所有文件/子目录批量下载到本地当前目录,根本不需要写循环,用scp的递归参数-r加上通配符就能搞定,配合sshpass的正确格式如下:

# 下载/opt/Data下的所有文件和子目录到本地当前目录
sshpass -p 'Remote_Server_Passcode' scp -r root@<Remote_Server_IP>:/opt/Data/* .

# 如果想把整个Data目录(包括目录本身)下载过来,去掉*即可
sshpass -p 'Remote_Server_Passcode' scp -r root@<Remote_Server_IP>:/opt/Data .

场景2:确实需要循环处理每个远程文件(特殊需求)

如果因为某些特殊逻辑(比如下载前判断文件大小、过滤特定后缀等)必须逐个处理文件,那你需要先获取远程服务器的文件列表,再循环下载:

# 通过ssh获取远程/opt/Data下的文件列表,再逐个scp下载
sshpass -p 'Remote_Server_Passcode' ssh root@<Remote_Server_IP> "ls /opt/Data/" | while read file; do
    sshpass -p 'Remote_Server_Passcode' scp root@<Remote_Server_IP>:/opt/Data/"$file" .
done

重要注意事项

  1. sshpass的正确位置:必须把sshpass -p '密码'放在scp命令的最前面,作为前缀来为scp提供密码,不能和其他变量混排。
  2. 安全警告:用sshpass明文写密码是非常不安全的操作,建议你配置SSH密钥登录:本地生成密钥对,把公钥上传到远程服务器的/root/.ssh/authorized_keys里,之后scp/ssh都不需要输入密码,安全性和效率都更高。
  3. 通配符解析:远程路径的*不需要加引号,这样本地shell会把它传给远程服务器的shell来解析,从而匹配远程目录下的所有文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:02:57