使用 SCP 命令拉取远程虚拟机文件
scp
(Secure Copy)是基于 SSH 协议的安全文件传输工具,可以在本地与远程主机之间复制文件。以下是使用scp
从其他虚拟机拉取文件的详细指南:
一、基本语法
bash
# 从远程主机复制到本地
scp [选项] 远程用户名@远程IP:远程文件路径 本地目标路径
# 示例:从IP为192.168.1.100的虚拟机复制文件
scp user@192.168.1.100:/home/user/file.txt /local/directory/
二、常用选项
选项 | 功能描述 |
---|---|
-r | 递归复制目录 |
-P [端口] | 指定 SSH 端口(注意是大写 P) |
-i [密钥] | 指定私钥文件 |
-v | 显示详细传输过程(用于调试) |
-C | 启用压缩传输(适合大文件 / 慢速网络) |
三、操作示例
1. 复制单个文件
bash
# 从远程虚拟机复制文件到当前目录
scp user@192.168.1.100:/data/report.txt .
# 指定本地保存路径
scp user@192.168.1.100:/data/report.txt /home/localuser/Documents/
2. 复制整个目录
bash
# 递归复制远程目录到本地
scp -r user@192.168.1.100:/data/project/ /local/backup/
3. 指定 SSH 端口
如果远程 SSH 服务使用非标准端口(如 2222):
bash
scp -P 2222 user@192.168.1.100:/data/file.txt .
4. 使用 SSH 密钥认证
bash
scp -i ~/.ssh/id_rsa user@192.168.1.100:/data/file.txt .
四、进阶技巧
1. 从多个远程主机复制
bash
# 批量复制多个虚拟机的日志文件
scp user@vm1:/var/log/syslog user@vm2:/var/log/syslog /local/analysis/
2. 复制到远程主机(反向传输)
bash
# 将本地文件上传到远程虚拟机
scp /local/file.txt user@192.168.1.100:/remote/directory/
3. 使用通配符
bash
# 复制远程目录下所有txt文件
scp user@192.168.1.100:/data/*.txt /local/
五、故障排除
1. 权限问题
- 确保远程用户对源文件有读取权限
- 确保本地用户对目标目录有写入权限
2. SSH 连接失败
- 检查远程虚拟机 SSH 服务是否运行:
bash
# 在远程虚拟机上执行 systemctl status sshd # Linux
- 检查防火墙是否允许 SSH 端口(默认 22):
bash
# 在远程虚拟机上开放22端口(以Ubuntu为例) sudo ufw allow 22/tcp
3. 密钥认证失败
- 确认私钥文件权限正确(
chmod 600 ~/.ssh/id_rsa
) - 确认公钥已添加到远程主机的
~/.ssh/authorized_keys
六、替代工具
1. rsync(推荐)
支持增量传输,适合大文件或频繁同步:
bash
# 安装rsync(如未安装)
sudo apt install rsync # Ubuntu/Debian
sudo yum install rsync # CentOS/RHEL
# 同步远程目录(保留权限、时间戳等)
rsync -avz user@192.168.1.100:/data/ /local/backup/
2. sftp(交互式传输)
bash
# 连接到远程主机
sftp user@192.168.1.100
# 在sftp提示符下操作
sftp> get remote_file.txt # 下载文件
sftp> put local_file.txt # 上传文件
sftp> exit
七、安全建议
- 避免明文密码:使用 SSH 密钥认证替代密码认证
- 限制 SSH 访问:配置
sshd_config
限制仅特定用户可登录 - 使用非标准端口:修改 SSH 默认端口(如 22 → 2222)
- 定期更新系统:确保虚拟机操作系统和 SSH 服务为最新版本