背景
当文件存储在 Ubuntu 虚拟机中时,需要将这些文件传输到 Windows 主机。本文档介绍使用 Python HTTP 服务器的方式实现文件传输,以及相关的配置和优化方法。
方案选择:Python HTTP 服务器
在众多文件传输方案中(共享文件夹、SCP/SFTP、云存储、USB直通等),Python HTTP 服务器方案具有以下优势:
- ✅ 简单快捷:无需安装额外软件
- ✅ 即用即走:适合临时文件传输
- ✅ 跨平台:只需浏览器即可访问
- ✅ Python 内置:Ubuntu 默认包含 Python3
一、基础使用
1.1 启动 HTTP 服务器
在需要分享的文件所在目录执行:
bash
python3 -m http.server 8000
这会在当前目录启动一个 HTTP 服务器,监听 8000 端口。
参数说明:
8000:端口号,可以改为其他未占用的端口(如 8080、9000 等)
1.2 查看虚拟机 IP 地址
在 Ubuntu 虚拟机中执行以下任一命令:
方法一:简洁输出
bash
hostname -I
方法二:详细信息
bash
ip addr show
方法三:仅显示 IPv4 地址
bash
ip -4 addr show | grep inet
方法四:获取第一个 IP
bash
hostname -I | awk '{print $1}'
通常会得到类似 192.168.x.x 或 10.x.x.x 的 IP 地址。
1.3 从 Windows 访问文件
-
确保虚拟机网络模式为 桥接模式 或 NAT 模式(可访问宿主机)
-
在 Windows 浏览器中访问:
http://虚拟机IP:8000例如:
http://192.168.1.100:8000 -
在浏览器中点击文件即可下载
二、后台运行
基础命令会占用终端窗口,关闭终端后服务也会停止。以下是让服务后台运行的方法。
2.1 使用 nohup 和 & 符号
bash
nohup python3 -m http.server 8000 > /dev/null 2>&1 &
命令解析:
nohup:忽略挂断信号,即使终端关闭进程也继续运行> /dev/null:将标准输出重定向到空设备(不显示输出)2>&1:将错误输出也重定向到标准输出&:在后台运行
查看进程:
bash
ps aux | grep http.server
停止服务:
bash
kill <PID>
其中 <PID> 是进程 ID,可以从 ps 命令输出中获取。
2.2 使用 screen(推荐用于临时调试)
安装 screen:
bash
sudo apt install screen
使用步骤:
bash
# 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:
bash
sudo apt install tmux
使用步骤:
bash
# 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 推荐的服务管理方式。
创建服务文件:
bash
sudo nano /etc/systemd/system/httpserver.service
添加以下内容:
ini
[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 启用并启动服务
bash
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启用服务(开机自动启动)
sudo systemctl enable httpserver.service
# 立即启动服务
sudo systemctl start httpserver.service
3.3 服务管理命令
bash
# 查看服务状态
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 端口访问
允许防火墙通过(如果需要):
bash
sudo ufw allow 8000/tcp
关闭防火墙端口(停止分享后):
bash
sudo ufw delete allow 8000/tcp
五、高级技巧
5.1 指定端口和绑定地址
bash
# 绑定到特定 IP(只允许特定网络访问)
python3 -m http.server 8000 --bind 192.168.1.100
# 使用其他端口
python3 -m http.server 9000
5.2 使用更强大的 HTTP 服务器
如果需要更多功能(如上传、认证),可以考虑:
安装 uploadserver(支持上传):
bash
pip3 install uploadserver
python3 -m uploadserver 8000
使用 nginx(生产环境):
bash
sudo apt install nginx
# 配置 nginx 提供文件服务
5.3 临时分享单个文件
如果只想分享单个文件,可以使用更轻量的方式:
bash
# 使用 Python 创建简单的文件下载服务
python3 -c "import http.server; http.server.test()" 8000
六、故障排除
6.1 无法访问服务
检查服务是否运行:
bash
ps aux | grep http.server
检查端口是否监听:
bash
sudo netstat -tulpn | grep 8000
# 或
sudo ss -tulpn | grep 8000
检查防火墙:
bash
sudo ufw status
6.2 端口被占用
如果 8000 端口已被占用:
bash
# 查找占用端口的进程
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 服务。
最后执行的命令:
bash
nohup python3 -m http.server 8000 > /dev/null 2>&1 &
服务已在后台运行,进程 ID: 23032
访问地址:
http://你的虚拟机IP:8000
愉快地传输文件吧!🚀