Ubuntu 虚拟机文件传输到 Windows的一种好玩的办法
背景
当文件存储在 Ubuntu 虚拟机中时,需要将这些文件传输到 Windows 主机。本文档介绍使用 Python HTTP 服务器的方式实现文件传输,以及相关的配置和优化方法。
方案选择:Python HTTP 服务器
在众多文件传输方案中(共享文件夹、SCP/SFTP、云存储、USB直通等),Python HTTP 服务器方案具有以下优势:
- ✅ 简单快捷:无需安装额外软件
- ✅ 即用即走:适合临时文件传输
- ✅ 跨平台:只需浏览器即可访问
- ✅ Python 内置:Ubuntu 默认包含 Python3
一、基础使用
1.1 启动 HTTP 服务器
在需要分享的文件所在目录执行:
python3 -m http.server 8000
这会在当前目录启动一个 HTTP 服务器,监听 8000 端口。
参数说明:
8000:端口号,可以改为其他未占用的端口(如 8080、9000 等)
1.2 查看虚拟机 IP 地址
在 Ubuntu 虚拟机中执行以下任一命令:
方法一:简洁输出
hostname -I
方法二:详细信息
ip addr show
方法三:仅显示 IPv4 地址
ip -4 addr show | grep inet
方法四:获取第一个 IP
hostname -I | awk '{print $1}'
通常会得到类似 192.168.x.x 或 10.x.x.x 的 IP 地址。
1.3 从 Windows 访问文件
- 确保虚拟机网络模式为 桥接模式 或 NAT 模式(可访问宿主机)
- 在 Windows 浏览器中访问:
例如:http://虚拟机IP:8000http://192.168.1.100:8000 - 在浏览器中点击文件即可下载
二、后台运行
基础命令会占用终端窗口,关闭终端后服务也会停止。以下是让服务后台运行的方法。
2.1 使用 nohup 和 & 符号
nohup python3 -m http.server 8000 > /dev/null 2>&1 &
命令解析:
nohup:忽略挂断信号,即使终端关闭进程也继续运行> /dev/null:将标准输出重定向到空设备(不显示输出)2>&1:将错误输出也重定向到标准输出&:在后台运行
查看进程:
ps aux | grep http.server
停止服务:
kill <PID>
其中 <PID> 是进程 ID,可以从 ps 命令输出中获取。
2.2 使用 screen(推荐用于临时调试)
安装 screen:
sudo apt install screen
使用步骤:
# 1. 创建新会话
screen -S httpserver# 2. 运行服务器
python3 -m http.server 8000# 3. 按 Ctrl+A,然后按 D 键分离会话(服务继续运行)# 4. 重新连接会话
screen -r httpserver# 5. 查看所有会话
screen -ls
2.3 使用 tmux(screen 的替代方案)
安装 tmux:
sudo apt install tmux
使用步骤:
# 1. 创建新会话
tmux new -s httpserver# 2. 运行服务器
python3 -m http.server 8000# 3. 按 Ctrl+B,然后按 D 键分离会话# 4. 重新连接
tmux attach -t httpserver# 5. 列出所有会话
tmux ls
三、开机自动启动
如果需要长期使用此服务,可以配置为系统服务,实现开机自动启动。
3.1 创建 systemd 服务文件
使用 systemd 是 Ubuntu 推荐的服务管理方式。
创建服务文件:
sudo nano /etc/systemd/system/httpserver.service
添加以下内容:
[Unit]
Description=Python HTTP Server for File Sharing
After=network.target[Service]
Type=simple
User=me
WorkingDirectory=/home/me/oneos-multi
ExecStart=/usr/bin/python3 -m http.server 8000
Restart=on-failure
RestartSec=5s[Install]
WantedBy=multi-user.target
配置说明:
Description:服务描述After=network.target:确保网络启动后再启动服务User:运行服务的用户(改为你的用户名)WorkingDirectory:要分享的目录路径(改为你的实际路径)ExecStart:启动命令Restart=on-failure:失败时自动重启RestartSec=5s:重启前等待 5 秒
3.2 启用并启动服务
# 重新加载 systemd 配置
sudo systemctl daemon-reload# 启用服务(开机自动启动)
sudo systemctl enable httpserver.service# 立即启动服务
sudo systemctl start httpserver.service
3.3 服务管理命令
# 查看服务状态
sudo systemctl status httpserver# 停止服务
sudo systemctl stop httpserver# 重启服务
sudo systemctl restart httpserver# 禁用开机自动启动
sudo systemctl disable httpserver# 查看服务日志
sudo journalctl -u httpserver -f
四、安全注意事项
⚠️ 重要提醒:
- 内网使用:此方法适合内网环境,不建议暴露到公网
- 无认证:Python HTTP 服务器没有密码保护,任何知道 IP 的人都可以访问
- 只读访问:默认只能下载文件,不能上传或删除
- 防火墙:确保防火墙允许 8000 端口访问
允许防火墙通过(如果需要):
sudo ufw allow 8000/tcp
关闭防火墙端口(停止分享后):
sudo ufw delete allow 8000/tcp
五、高级技巧
5.1 指定端口和绑定地址
# 绑定到特定 IP(只允许特定网络访问)
python3 -m http.server 8000 --bind 192.168.1.100# 使用其他端口
python3 -m http.server 9000
5.2 使用更强大的 HTTP 服务器
如果需要更多功能(如上传、认证),可以考虑:
安装 uploadserver(支持上传):
pip3 install uploadserver
python3 -m uploadserver 8000
使用 nginx(生产环境):
sudo apt install nginx
# 配置 nginx 提供文件服务
5.3 临时分享单个文件
如果只想分享单个文件,可以使用更轻量的方式:
# 使用 Python 创建简单的文件下载服务
python3 -c "import http.server; http.server.test()" 8000
六、故障排除
6.1 无法访问服务
检查服务是否运行:
ps aux | grep http.server
检查端口是否监听:
sudo netstat -tulpn | grep 8000
# 或
sudo ss -tulpn | grep 8000
检查防火墙:
sudo ufw status
6.2 端口被占用
如果 8000 端口已被占用:
# 查找占用端口的进程
sudo lsof -i :8000# 使用其他端口
python3 -m http.server 8001
6.3 虚拟机网络问题
- 确保虚拟机网络模式正确(桥接或 NAT)
- 尝试 ping 虚拟机 IP:
ping 192.168.x.x - 检查虚拟机网络适配器是否启用
七、总结
本文介绍了使用 Python HTTP 服务器从 Ubuntu 虚拟机传输文件到 Windows 主机的完整流程:
- ✅ 基础使用:启动服务器、查看 IP、浏览器访问
- ✅ 后台运行:使用 nohup、screen 或 tmux
- ✅ 开机自启:配置 systemd 服务
- ✅ 安全建议:防火墙配置和注意事项
- ✅ 故障排查:常见问题解决方案
这个方案特别适合快速、临时的文件分享需求。如果需要更稳定、长期的解决方案,建议使用虚拟机共享文件夹或 Samba 服务。
最后执行的命令:
nohup python3 -m http.server 8000 > /dev/null 2>&1 &
服务已在后台运行,进程 ID: 23032
访问地址:
http://你的虚拟机IP:8000
愉快地传输文件吧!🚀
