作为一名Linux系统管理员,我每天都需要在不同服务器之间传输文件。SFTP(SSH File Transfer Protocol)是我最常用的工具之一,它基于SSH加密通道,比传统的FTP更安全可靠。今天我就来分享在Ubuntu系统中使用SFTP进行文件传输的完整流程和实用技巧。
SFTP最大的优势在于它使用SSH默认的22端口,不需要额外配置防火墙规则。同时所有传输数据都经过加密,避免了FTP明文传输的安全隐患。下面我将从网络连通性检查开始,详细介绍SFTP连接、文件操作以及常见问题的解决方法。
在进行SFTP传输前,首先要确保两台机器之间的网络是连通的。最基础的检查方法是使用ping命令:
bash复制ping 192.168.1.100
如果看到类似以下的输出,表示网络连接正常:
code复制64 bytes from 192.168.1.100: icmp_seq=1 ttl=64 time=0.8ms
64 bytes from 192.168.1.100: icmp_seq=2 ttl=64 time=0.6ms
注意:如果ping不通,需要先检查网络配置。确认两台机器是否在同一局域网,或者是否有路由规则限制。在云服务器环境下,还需要检查安全组规则是否放行了ICMP协议。
SFTP依赖于SSH服务,因此需要确保远程主机的SSH服务正在运行。在Ubuntu上检查SSH服务状态的命令是:
bash复制sudo systemctl status ssh
正常运行的输出应该包含"active (running)"字样。如果没有运行,可以使用以下命令启动SSH服务:
bash复制sudo systemctl start ssh
sudo systemctl enable ssh # 设置开机自启
确认网络连通且SSH服务正常运行后,就可以建立SFTP连接了。基本连接命令格式如下:
bash复制sftp username@remote_host
例如,连接IP为192.168.1.100的远程主机,用户名为ubuntu:
bash复制sftp ubuntu@192.168.1.100
首次连接时会提示确认远程主机的指纹,输入yes后继续。然后会要求输入用户密码,验证成功后就会进入SFTP交互界面,提示符变为"sftp>"。
进入SFTP会话后,可以使用以下命令进行文件操作:
| 命令 | 功能 | 示例 |
|---|---|---|
| ls | 列出远程目录内容 | ls /home/ubuntu |
| cd | 切换远程工作目录 | cd /var/www |
| lls | 列出本地目录内容 | lls ~/Downloads |
| lcd | 切换本地工作目录 | lcd /tmp |
| put | 上传文件到远程主机 | put local.txt remote.txt |
| get | 下载远程文件到本地 | get remote.txt local.txt |
| mkdir | 在远程创建目录 | mkdir new_folder |
| rmdir | 删除远程空目录 | rmdir old_folder |
| rm | 删除远程文件 | rm file.txt |
| exit/bye | 退出SFTP会话 | exit |
实用技巧:在put和get命令中使用相对路径时,会基于当前的工作目录(通过cd/lcd设置的)。建议先使用cd/lcd切换到目标目录,再使用简单的文件名进行操作。
SFTP支持使用-r参数递归传输整个文件夹。例如上传本地project文件夹到远程的backup目录:
bash复制put -r project /home/ubuntu/backup/
下载远程的logs文件夹到本地的tmp目录:
bash复制get -r /var/log/apache2/logs /tmp
注意事项:传输大文件夹时,建议先压缩再传输,效率会更高。可以使用tar命令创建压缩包,传输完成后再解压。
相比密码认证,SSH密钥认证更安全且方便。配置步骤如下:
bash复制ssh-keygen -t rsa -b 4096
bash复制ssh-copy-id ubuntu@192.168.1.100
配置完成后,SFTP连接时就不再需要输入密码了。
对于大文件传输,可以通过以下方法优化速度:
bash复制sftp -C ubuntu@192.168.1.100
code复制Host *
Ciphers aes128-ctr,aes192-ctr,aes256-ctr
Compression yes
对于定期备份等自动化任务,可以使用批处理模式。创建一个包含SFTP命令的脚本文件(如transfer.txt):
code复制put /backup/db.sql /remote/backups/
get /remote/logs/error.log /local/logs/
bye
然后通过以下命令执行:
bash复制sftp -b transfer.txt ubuntu@192.168.1.100
如果遇到"Connection refused"错误,可能的原因和解决方法:
出现"Permission denied"时的排查步骤:
当远程主机的SSH密钥变更时,会收到警告并拒绝连接。解决方法:
bash复制ssh-keygen -R 192.168.1.100
这条命令会从known_hosts文件中删除旧密钥,下次连接时会重新获取。
大文件传输过程中如果连接中断,可以使用rsync命令恢复传输:
bash复制rsync -P -e ssh local_file ubuntu@192.168.1.100:remote_file
-P参数显示进度并支持断点续传,-e ssh指定使用SSH作为传输协议。
code复制PermitRootLogin no
code复制AllowUsers ubuntu webadmin
使用强密码或密钥认证,避免使用简单密码
定期更新SSH服务到最新版本,修复已知漏洞
监控SFTP登录日志(/var/log/auth.log),及时发现异常登录尝试
我在管理多台服务器时,发现配置好SSH密钥认证后,SFTP使用体验会大幅提升。特别是结合~/.ssh/config文件设置主机别名和参数,可以简化日常操作。例如:
code复制Host myserver
HostName 192.168.1.100
User ubuntu
IdentityFile ~/.ssh/id_rsa
Compression yes
配置后只需简单的"sftp myserver"即可连接,既安全又高效。