Ubuntu 虚拟机文件传输到 Windows的一种好玩的办法

背景

当文件存储在 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.x10.x.x.x 的 IP 地址。

1.3 从 Windows 访问文件

  1. 确保虚拟机网络模式为 桥接模式NAT 模式(可访问宿主机)

  2. 在 Windows 浏览器中访问:

    复制代码
    http://虚拟机IP:8000

    例如:http://192.168.1.100:8000

  3. 在浏览器中点击文件即可下载

二、后台运行

基础命令会占用终端窗口,关闭终端后服务也会停止。以下是让服务后台运行的方法。

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

四、安全注意事项

⚠️ 重要提醒:

  1. 内网使用:此方法适合内网环境,不建议暴露到公网
  2. 无认证:Python HTTP 服务器没有密码保护,任何知道 IP 的人都可以访问
  3. 只读访问:默认只能下载文件,不能上传或删除
  4. 防火墙:确保防火墙允许 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 主机的完整流程:

  1. 基础使用:启动服务器、查看 IP、浏览器访问
  2. 后台运行:使用 nohup、screen 或 tmux
  3. 开机自启:配置 systemd 服务
  4. 安全建议:防火墙配置和注意事项
  5. 故障排查:常见问题解决方案

这个方案特别适合快速、临时的文件分享需求。如果需要更稳定、长期的解决方案,建议使用虚拟机共享文件夹或 Samba 服务。


最后执行的命令:

bash 复制代码
nohup python3 -m http.server 8000 > /dev/null 2>&1 &

服务已在后台运行,进程 ID: 23032

访问地址:

复制代码
http://你的虚拟机IP:8000

愉快地传输文件吧!🚀

相关推荐
EVERSPIN2 小时前
32位MCU芯片国产品牌(32系列单片机常用型号有哪些)
单片机·嵌入式硬件·mcu单片机·32系列单片机
liao__ran2 小时前
ClickHouse CPU 排查快速参考指南
运维·服务器·clickhouse
liao__ran2 小时前
ClickHouse CPU 排查详细指南
运维·clickhouse
爱吃汽的小橘2 小时前
使用DSI TX IP驱动LCD显示屏
单片机·嵌入式硬件
9ilk2 小时前
【仿RabbitMQ的发布订阅式消息队列】 ---- 功能测试联调
linux·服务器·c++·分布式·学习·rabbitmq
q***7482 小时前
在Linux系统上使用nmcli命令配置各种网络(有线、无线、vlan、vxlan、路由、网桥等)
linux·服务器·网络
serve the people2 小时前
Comma-Separated List Output Parser in LangChain
windows·langchain·list
曦樂~3 小时前
【Docker】Dockerfile自定义镜像
运维·docker·容器
拾心213 小时前
【云运维】Kubernetes安装(基于 Docker + Calico)
运维·docker·kubernetes