使用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
重要注意事项
- sshpass的正确位置:必须把
sshpass -p '密码'放在scp命令的最前面,作为前缀来为scp提供密码,不能和其他变量混排。 - 安全警告:用
sshpass明文写密码是非常不安全的操作,建议你配置SSH密钥登录:本地生成密钥对,把公钥上传到远程服务器的/root/.ssh/authorized_keys里,之后scp/ssh都不需要输入密码,安全性和效率都更高。 - 通配符解析:远程路径的
*不需要加引号,这样本地shell会把它传给远程服务器的shell来解析,从而匹配远程目录下的所有文件。
内容的提问来源于stack exchange,提问作者Bogaso
相关产品推荐
相关产品推荐

