开篇答案
在Linux服务器上,下载文件是靠scp、rsync、sftp这类命令行工具完成的,而文件最终“落地”的位置,取决于你执行命令时所在的当前目录。如果你登录服务器时人在/home/admin,下载命令执行完,文件就在/home/admin下面,而不是自动跑到某个名叫“下载”的文件夹里,搞清楚这个逻辑,比死记硬背命令更重要。
linux从服务器下载文件的命令详解
scp命令:最直接暴力的下载方式
scp是OpenSSH套件自带的远程复制工具,它的用法和cp非常相似,只不过多了一个主机名参数,行业共识认为,这是运维和开发人员使用频率最高的下载命令。
scp 用户名@服务器地址:服务器文件路径 本地目标路径
举个例子,你想从一台酷番云服务器(IP假设是2.3.4)上下载/data/logs/app.log到本地机器的/home/user/logs/目录:
scp root@1.2.3.4:/data/logs/app.log /home/user/logs/
执行后输入服务器密码,文件就传输完成了,这里有三个细节需要你注意:
- 本地路径指定:最后那个
/home/user/logs/就是文件落地的地方,如果省略不写,scp会把文件放在你当前所在的目录(用pwd查看)。 - 端口参数:如果服务器SSH端口不是默认的22,需要加
-P参数指定,比如scp -P 2222 root@1.2.3.4:/data/logs/app.log ./ - 目录下载:下载整个文件夹要加
-r参数,否则会报错,例如scp -r root@1.2.3.4:/data/config/ /home/user/backup/
rsync命令:大文件和增量同步的首选
rsync和scp长得像亲兄弟,但它更擅长处理两件事:一是断点续传,二是增量同步,对于动辄几十GB的数据库备份文件,scp实在不是个明智的选择。
rsync -avz --progress root@1.2.3.4:/data/mysql_backup.tar.gz /home/user/
参数拆解一下:
-a:归档模式,保留文件属性-v:显示传输过程,让你心里有底-z:传输时压缩,省流量--progress:显示进度条,实时掌握下载速度
如果中途断网了,重新执行一模一样的命令,rsync会自动对比源文件和目标文件的差异,只传输缺失的部分,续传不需要你手动做什么操作,这点在下载大文件时非常实用,跑了一天的传输任务因为网络抖动断了,换scp就得从头再来,rsync却能接上进度继续跑。
sftp命令:交互式文件传输
sftp是一个交互式的文件传输工具,适合那些需要先看看服务器上有哪些文件,再决定下载哪个的场景,登录命令:
sftp root@1.2.3.4
进入sftp交互界面后,它就和普通的shell命令环境有些区别了,常用操作如下:
pwd:查看远程(服务器)当前的目录lpwd:查看本地当前的目录(注意那个l是local的意思)ls:列出远程目录的文件lls:列出本地目录的文件cd和lcd:分别切换远程和本地的目录get 文件名:把远程文件下载到本地lcd指定的目录get -r 目录名:递归下载整个目录
特别提醒一句,get下载的文件默认放在你本地lpwd显示的目录里,这点非常容易踩坑,建议首次使用sftp时,先执行lpwd看看文件会下到哪里,别等下载完再找。
linux怎么把服务器上的文件下载到本地目录:路径指定技巧
云服务器运维场景的下载常见疑问
很多用户用的是简米云服务器,初次接触时,最容易困惑的根子在于iTerm等终端工具默认的工作目录问题,本地目录路径用表示当前目录,表示上级目录,表示当前用户的家目录,这三个符号在scp命令里同样管用。
假设你在本地终端里,当前目录是/home/ubuntu,执行下面这条命令:
scp root@1.2.3.4:/data/app.jar .
那个英文句号就代表 /home/ubuntu,下载的文件会直接出现在这个目录中,如果这目录不是你的预期位置,就先用cd切换到你想要存放文件的目录,再执行scp命令,命令不认目录名,只认路径,路径写对了,文件就到那儿了。
确认文件是否下载成功的三种实用方法
文件下载完成后,怎么确认它真的到了?这个问题看着基础,但实际操作中相当一部分用户会栽跟头,误以为下载失败。
ls -l命令检查:在本地目标目录执行ls -l 文件名,查看文件大小是否和服务器上的源文件一致。md5sum校验完整性:在服务器上执行md5sum /data/app.jar,再在本地执行md5sum ~/app.jar,两次输出的MD5值相同就代表文件完整无损,大文件的二进制完整性验证,最好养成这个习惯,因为极端情况下网络传输可能出错。- 查看文件修改时间:
stat命令能显示文件的创建和修改时间,通过比对时间能够粗略判断文件是否刚下载完毕。
使用WinSCP/Xshell等Windows客户端时文件去哪了
如果你的电脑是Windows系统,平时用Xshell连接服务器,那下载路径的问题会更隐蔽,Xshell自带了一个rz和sz命令,其中sz配合lrzsz软件包使用,执行sz 服务器文件名,Windows端会弹出文件保存窗口,你选择哪个目录,文件就下到哪个目录。
至于WinSCP这类图形化工具,逻辑更直白:远程窗口和本地窗口分屏显示,你从远程窗口选中文件拖到本地窗口的某个文件夹,文件就下载到那个文件夹里,不存在“不知道去哪了”的问题,关键是你得清楚本地窗口显示的是哪个路径,WinSCP登录连接后,顶部有地址栏,会明文显示当前本地目录是C:\Users\Administrator\Downloads之类的位置。
服务器上能直接下载到本地浏览器的场景:wget与HTTP服务
用Python临时起一个HTTP服务
有一种情况比较特殊:你只是想临时把服务器上的某个文件下载到本地浏览器里,不想折腾scp或sftp那套命令行,解决办法是在服务器上启动一个临时的HTTP服务,用浏览器直接下载。
Python3环境下的做法:
cd /data python3 -m http.server 8080
执行完,服务器上的/data目录就通过8080端口对外提供了HTTP访问,在本地浏览器地址栏输入http://服务器IP:8080/app.jar,就能直接下载,下载的文件会出现在浏览器左下角或浏览器设置中指定的下载目录(通常是Windows的“下载”文件夹或macOS的~/Downloads目录),这是和命令行下载最明显的区别。
但这个方法有个安全前提:服务器防火墙需要放行8080端口,如果你的服务器在简米云或酷番云控制台开了安全组,记得只放行你本机IP访问该端口,不要设为0.0.0/0,否则等同于把服务器文件目录裸露在公网,被爬虫扫到就可能出事,用完立即Ctrl+C终止服务。
wget命令与Linux下载文件到本地的本质区别
有些新手容易把wget和scp搞混。wget是Linux系统从互联网上下载文件的工具,它本质是在服务器本机执行,把远程资源拉到服务器当前的指定目录,而scp才是真正目的明确的跨机器传输命令。
换句话说,如果你在本地电脑的Linux终端里执行wget https://example.com/file.zip,文件下载到的是本地电脑当前目录;但如果你先在本地用ssh root@服务器IP登上了服务器,然后执行wget https://example.com/file.zip,那文件就被下载到服务器的当前目录了,工具相同,操作环境不同,结果天差地别。
搞清楚这个区别,你就不会在“wget下载的文件在哪个目录”这个问题上反复纠结了,关键是先弄清楚你当前在哪个终端环境里。
综合实操建议
从性能到安全的下载策略选择
总结一下不同场景下该选什么工具,不看花哨的参数,只讲最核心的判断逻辑:
- 小文件且临时用(比如几个配置文件):
scp最方便 - 大文件且需要断点续传(比如数据库备份、日志包):
rsync最稳健 - 交互式浏览服务器目录再选择:
sftp最灵活 - Windows环境且想可视化操作:WinSCP或Xshell的sz命令最省心
安全方面再啰嗦两句,下载完成后,临时开的HTTP服务务必关闭;服务器上的敏感文件(比如包含数据库密码的配置文件)下载到本地后,注意保管,不要在公网传输渠道里留下副本,据行业数据统计,近年来的云主机入侵事件中,有相当一部分是因为用户本地机器被种了后门,直接盗走了云端下载的密钥文件。
文件落地的最终检查清单
如果你下载完文件后还是不知道它去哪了,按这个清单排查一遍:
- [ ] 执行
pwd确认当前目录,下载文件默认落在当前位置 - [ ] 执行
ls -la查看隐藏文件,有没有被放在当前目录下 - [ ] 确认scp命令的目标路径是否用了相对路径(或),相对路径依赖执行命令时的位置
- [ ] 用
find ~ -name "文件名" -mmin -10查找10分钟内新改动的文件
这四条走完,文件基本都能找回来,省下来的时间,不值得为了找文件单独付出一次额外成本。
常见问题问答模块
用scp下载服务器文件时提示Permission denied怎么办?
这是SSH登录用户对源文件没有读取权限导致的,解决方案有两种:一是使用有权限的用户执行scp,比如root用户;二是在服务器上给源文件添加读权限chmod +r 文件名,如果目标目录在本地也没权限写入,scp同样会报错,需要检查本地目录是否可写。
linux下下载服务器文件夹用什么命令最有效率?
如果文件夹内的文件数量多且总大小较大,rsync -avz --progress 用户名@服务器IP:远程目录/ 本地目录/是最高效的,它支持断点续传且只传输新增和变化的文件,如果只是少量小文件,scp -r和sftp的get -r也够用,不需要额外等待rsync进行文件比对的过程。
怎么查看之前用scp下载到本地的文件存在什么位置?
在终端执行history | grep scp,能看到过往执行过的scp命令,命令末尾的路径参数就是文件下载存放的目录,如果终端历史已经被清空或换了一台电脑操作,则通过find / -name "目标文件名" 2>/dev/null全局搜索同名文件,最根本的解决方法还是建议在每次执行scp下载时指定绝对路径存放,避免使用这样的相对路径,这样文件去向就永远在掌握之中。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/linux%e6%80%8e%e4%b9%88%e4%b8%8b%e8%bd%bd%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8a%e7%9a%84%e6%96%87%e4%bb%b6%ef%bc%8c%e4%b8%8b%e8%bd%bd%e5%90%8e%e4%bf%9d%e5%ad%98%e5%9c%a8%e5%93%aa%e4%b8%aa%e7%9b%ae/


