在Linux系统中,文件传输是日常运维和开发工作中的常见需求,而SFTP(SSH File Transfer Protocol)凭借其安全性和便捷性,成为远程文件传输的首选工具,相较于传统的FTP协议,SFTP基于SSH协议构建,所有数据均通过加密通道传输,有效避免了信息泄露和篡改风险,本文将详细介绍Linux环境下SFTP上传操作的完整流程、进阶技巧及常见问题解决方案,帮助读者高效掌握这一实用技能。

SFTP基础:从概念到优势
SFTP全称为SSH File Transfer Protocol,也称为安全文件传输协议,它整合了SSH(Secure Shell)的安全特性和文件传输功能,运行在SSH传输层之上(默认端口22),与FTP不同,SFTP在传输过程中对用户名、密码、文件内容等所有信息进行加密,同时支持文件和目录的权限管理、断点续传等高级功能,适用于企业级应用场景。
在Linux系统中,SFTP通常与OpenSSH捆绑安装,无需额外配置即可使用,其核心优势包括:安全性高(基于SSH加密)、操作统一(通过SSH协议实现,无需额外端口)、功能丰富(支持文件/目录操作、权限设置、进度显示等),无论是上传配置文件到远程服务器,还是批量同步开发代码,SFTP都能提供稳定可靠的传输保障。
Linux SFTP上传实操:从连接到传输
检查SFTP客户端与服务端环境
在开始上传操作前,需确认本地Linux系统已安装SFTP客户端,远程服务器已启用SFTP服务,大多数Linux发行版默认已安装SFTP客户端(可通过sftp -V检查版本);远程服务器需确保SSH服务运行正常(执行systemctl status sshd查看状态),且允许SFTP连接(SSH配置文件/etc/ssh/sshd_config中需包含Subsystem sftp /usr/lib/ssh/sftp-server,并取消注释)。
建立SFTP连接
上传文件前,需先通过SFTP协议连接到远程服务器,基本语法为:
sftp [username]@[remote_host]
以用户root连接到服务器168.1.100,执行:
sftp root@192.168.1.100
首次连接时,系统会提示远程主机的SSH指纹(需确认是否信任,输入yes即可),连接成功后,进入SFTP交互式环境,命令提示符变为sftp>,此时可执行SFTP命令。
上传单个文件
上传文件是SFTP最核心的功能,使用put命令实现,基本语法为:
put [local_path] [remote_path]
- 本地路径:待上传文件的完整路径(如
/home/user/data.txt),若仅写文件名(如data.txt),则默认从当前本地目录查找。 - 远程路径:文件在远程服务器上的存储路径(如
/opt/backup/data.txt),若未指定,则默认上传到远程用户的当前目录(可通过pwd查看)。
示例:将本地/home/user/report.pdf上传到远程服务器的/shared/files/目录,并重命名为2026_report.pdf:
put /home/user/report.pdf /shared/files/2026_report.pdf
上传过程中,SFTP会显示传输进度(如Uploading /home/user/report.pdf to /shared/files/2026_report.pdf),完成后提示100%。

上传整个目录
若需上传整个目录及其子目录,需使用put命令的-r参数(递归上传):
put -r [local_directory] [remote_directory]
示例:将本地/home/user/project目录上传到远程服务器的/opt/projects/目录:
put -r /home/user/project /opt/projects/
注意:远程目录若不存在,SFTP会自动创建;若存在同名目录,则递归合并文件(同名文件会被覆盖)。
查看与切换目录
上传文件时,常需确认本地或远程的目录结构,可通过以下命令操作:
lpwd:显示本地当前工作目录(Linux命令行目录,非SFTP环境)。!pwd:通过执行Linux命令,查看本地路径(如!ls -l列出本地文件)。pwd:显示远程当前工作目录。cd [remote_path]:切换远程目录(如cd /tmp)。lcd [local_path]:切换本地目录(如lcd /home/user/downloads)。
示例:先切换本地到/data/upload目录,再切换远程到/backup/2026,最后上传文件:
lcd /data/upload cd /backup/2026 put monthly_report.xlsx
高效进阶:批量与自动化上传技巧
批量上传多个文件
若需上传多个文件,可使用通配符(、等)匹配文件名,上传本地/logs目录下所有.log文件到远程/var/log/remote/:
put /logs/*.log /var/log/remote/
或上传特定前缀的文件(如app_开头的文件):
put /logs/app_*.log /var/log/remote/
非交互式上传(脚本化)
在自动化运维场景中,需通过脚本实现SFTP上传,避免手动交互,可通过-b参数指定脚本文件,或结合expect工具处理密码输入。
方法1:使用SFTP脚本文件
创建脚本文件upload.txt如下:

open username@remote_host put /local/file.txt /remote/path/ put /local/dir /remote/path/ bye
执行命令:
sftp -b upload.txt
方法2:结合expect自动化输入密码
安装expect(yum install expect或apt install expect),编写脚本sftp_upload.exp:
#!/usr/bin/expect set remote_user "username" set remote_host "192.168.1.100" set local_file "/local/file.txt" set remote_path "/remote/file.txt" set timeout 30 spawn sftp $remote_user@$remote_host expect "password:" send "your_password\r" expect "sftp>" send "put $local_file $remote_path\r" expect "sftp>" send "bye\r" expect eof
赋予执行权限并运行:
chmod +x sftp_upload.exp ./sftp_upload.exp
断点续传与进度监控
当传输大文件因网络中断时,可通过-a参数(append)实现断点续传:
put -a large_file.zip /remote/large_file.zip
若需实时监控传输进度,可结合pv(Pipe Viewer)工具:
pv local_file.txt | sftp username@remote_host "put - /remote/file.txt"
执行后,pv会显示传输速度、剩余时间等信息(需提前安装pv:yum install pv或apt install pv)。
避坑指南:常见问题与解决方案
连接失败:拒绝连接或认证错误
- 原因1:远程SSH服务未启动或端口错误。
解决:检查远程服务器SSH服务状态(systemctl start sshd),确认端口(默认22)未被防火墙拦截(firewall-cmd --list-ports)。 - 原因2:用户名或密码错误。
解决:确认用户名存在,密码正确(可尝试SSH登录验证);若使用密钥认证,需确保~/.ssh/id_rsa私钥文件权限正确(chmod 600 ~/.ssh/id_rsa)。
上传失败:权限不足或磁盘空间不足
- 权限不足:远程目录或文件权限限制用户写入。
解决:在远程服务器上执行chmod 755 /remote/dir(设置目录权限)或chown username:username /remote/file(修改文件所有者)。 - 磁盘空间不足:远程服务器目标分区剩余空间不足。
解决:使用df -h检查磁盘空间,清理无用文件或扩容分区。
传输中断:网络波动或文件被占用
- 网络波动:长距离传输或网络不稳定导致连接断开。
解决:使用-a参数断点续传,或尝试压缩文件后上传(减少传输数据量)。 - 文件被占用:本地或远程文件正在被其他程序使用。
解决:关闭占用文件的程序,或使用mv命令移动文件后再上传。
文件名乱码:编码不一致导致
- 原因:本地系统与远程服务器字符编码不同(如本地为GBK,远程为UTF-8)。
解决:统一编码格式,可通过export LANG=en_US.UTF-8设置本地环境变量,或使用iconv工具转换文件编码后再上传。
SFTP凭借其安全性和易用性,成为Linux环境下文件传输的必备工具,从基础的put命令上传,到批量脚本化操作、断点续传等进阶技巧,掌握SFTP上传不仅能提升工作效率,更能保障数据传输的安全性,在实际应用中,建议结合密钥认证替代密码登录,进一步提升安全性;对于海量文件传输,可考虑结合rsync工具实现增量同步,进一步优化传输效率,通过本文的介绍,相信读者已能熟练应对Linux SFTP上传的各种场景,为日常运维和开发工作提供有力支持。












