核心场景分类
- 传输文件/目录本身:将一个或多个文件/文件夹从一台机器复制到另一台机器。
- 远程执行命令:在远程机器上运行一个命令,并将结果(标准输出、标准错误)返回到本地机器。
- 文件同步:保持本地和远程目录内容一致,只传输有变化的文件。
下面我将针对每个场景,介绍最主流的命令行工具。

传输文件/目录
这是最常见的需求,主要工具有 scp, rsync, sftp。
scp (Secure Copy - 安全拷贝)
scp 是基于 SSH 协议的,简单易用,适合一次性、小规模的文件传输。
语法:
scp [选项] [源路径] [目标路径]
关键点:

[源路径]和[目标路径]的格式可以是本地路径或用户名@主机名:远程路径。- 传输是加密的,但效率通常低于
rsync。
示例:
-
从本地上传文件到远程服务器:
# 将本地的 /path/to/local_file.txt 上传到远程服务器的 /home/user/ 目录 scp /path/to/local_file.txt user@remote_server:/home/user/ # 上传整个目录(需要加 -r 选项) scp -r /path/to/local_directory user@remote_server:/home/user/
-
从远程服务器下载文件到本地:
# 将远程服务器上的 /home/user/remote_file.txt 下载到当前本地目录 scp user@remote_server:/home/user/remote_file.txt . # 下载整个目录 scp -r user@remote_server:/home/user/remote_directory .
-
通过中间代理服务器(跳板机)传输:
(图片来源网络,侵删)# 从本地 -> 跳板机 -> 目标服务器 scp -o ProxyCommand="ssh -W %h:%p user@jump_server" /path/to/local_file.txt user@target_server:/home/user/
rsync (Remote Sync - 远程同步)
rsync 是一个更强大、更高效的工具,尤其适合传输大文件或目录,它会检查源和目标之间的差异,只传输变化的部分,非常适合备份和同步。
语法:
rsync [选项] [源路径] [目标路径]
关键点:
- 增量传输:只同步变化的文件,速度极快。
- 压缩传输:可以在传输前压缩数据,节省带宽。
- 保持文件属性:可以保留文件的权限、时间戳等元数据。
- 支持排除文件:可以通过规则排除特定文件或目录。
常用选项:
-a(archive): 归档模式,相当于-rlptgoD的集合,保留几乎所有属性。-v(verbose): 显示详细过程。-z(compress): 压缩数据传输。-h(human-readable): 以人类可读的格式显示文件大小。--progress: 显示传输进度。--delete: 删除目标目录中存在但源目录中不存在的文件(谨慎使用!)。
示例:
-
同步本地目录到远程服务器(常用备份命令):
# 将本地 /path/to/local_dir 同步到远程服务器的 /home/user/backup_dir # 如果远程目录下有文件但本地没有,这些文件不会被删除(除非加 --delete) rsync -avz /path/to/local_dir user@remote_server:/home/user/backup_dir
-
从远程服务器同步到本地:
# 将远程服务器的 /home/user/backup_dir 同步到本地的 /path/to/local_dir # 如果本地目录下有文件但远程没有,这些文件不会被删除 rsync -avz user@remote_server:/home/user/backup_dir /path/to/local_dir
-
删除目标目录多余的文件(完整同步):
# 确保 /path/to/local_dir 和远程 /home/user/backup_dir 完全一致 # 如果本地删除了某个文件,远程也会被删除 rsync -avz --delete /path/to/local_dir user@remote_server:/home/user/backup_dir
sftp (SSH File Transfer Protocol)
sftp 是一个交互式的文件传输程序,感觉就像一个 FTP 客户端,但所有传输都是通过 SSH 加密的,它更适合需要浏览、上传、下载、删除、重命名等复杂文件操作的场景。
语法:
sftp [用户名@]主机名
示例:
# 连接到远程服务器 sftp user@remote_server # 进入 sftp 交互式命令行后,可以执行以下命令: sftp> ls # 列出远程当前目录文件 sftp> get remote_file.txt # 从远程下载文件到本地当前目录 sftp> put local_file.txt # 从本地上传文件到远程当前目录 sftp> cd /path/to/dir # 切换远程目录 sftp> lcd /local/path # 切换本地目录 sftp> mkdir new_dir # 在远程创建新目录 sftp> rm unwanted_file # 删除远程文件 sftp> exit # 退出 sftp
远程执行命令
如果你不需要传输文件,只是想在远程机器上运行一个命令并获取结果,ssh 是你的不二之选。
ssh (Secure Shell)
ssh 是最核心的远程管理工具。
语法:
ssh [用户名@]主机名 [命令]
关键点:
- 如果不提供
[命令],它会为你打开一个交互式的远程 shell。 - 如果提供了
[命令],它会执行该命令并在本地终端显示其输出,然后立即断开连接。
示例:
-
登录远程服务器,进入交互式 shell:
ssh user@remote_server
-
在远程服务器上执行单个命令,并返回结果:
# 查看远程服务器的磁盘使用情况 ssh user@remote_server 'df -h' # 查看远程服务器的内核版本 ssh user@remote_server 'uname -r' # 在远程服务器上创建一个目录 ssh user@remote_server 'mkdir -p /tmp/test_dir'
-
在远程服务器上执行一个脚本:
# 本地有一个脚本,先传上去再执行 scp my_script.sh user@remote_server:/tmp/ ssh user@remote_server 'bash /tmp/my_script.sh' # 或者直接通过管道执行(脚本内容在本地,但执行在远程) cat my_script.sh | ssh user@remote_server 'bash'
文件同步
这个场景实际上已经被 rsync 完美覆盖了。rsync 的核心功能就是高效同步。
rsync 的同步特性使其成为自动化备份和部署的黄金标准。
一个典型的自动化备份脚本示例:
#!/bin/bash # 定义变量 LOCAL_DIR="/var/www/html" REMOTE_USER="backup_user" REMOTE_SERVER="backup.server.com" REMOTE_DIR="/backups/web_$(date +%Y%m%d)" # 使用 rsync 进行同步 rsync -avz --delete --exclude="*.log" $LOCAL_DIR $REMOTE_USER@$REMOTE_SERVER:$REMOTE_DIR # 检查 rsync 是否成功 if [ $? -eq 0 ]; then echo "Backup successful on $(date)" else echo "Backup failed on $(date)" >&2 fi
这个脚本会:
- 将本地的网站目录同步到远程备份服务器。
- 创建一个以当前日期命名的备份目录。
--delete确保备份是完整的。--exclude="*.log"排除了所有的日志文件。- 执行后打印成功或失败信息。
总结与选择建议
| 工具 | 主要用途 | 优点 | 缺点 |
|---|---|---|---|
scp |
简单、快速的文件/目录拷贝 | 简单易记,无需额外配置 | 无增量传输,效率低,不适合大文件和频繁同步 |
rsync |
高效的文件同步和备份 | 增量传输,压缩,保留属性,功能强大 | 参数较多,初学稍复杂 |
sftp |
交互式文件管理 | 类似 FTP,功能全面(增删改查) | 非脚本化,不适合自动化任务 |
ssh |
远程执行命令 | 最核心的远程管理工具,功能灵活 | 主要用于命令执行,文件传输需要配合 scp |
如何选择?
- 只想快速传几个小文件? ->
scp - 需要备份、同步,或者传大文件/目录? ->
rsync(强烈推荐) - 需要像使用 FTP 客户端一样浏览和管理远程文件? ->
sftp - 只是想在远程服务器上跑个命令,看结果? ->
ssh
在现代运维和开发中,rsync 和 ssh 是最常用、最强大的组合。
