使用 Samba 打通 Linux 物理机和 Windows 虚拟机文件互传

1 安装 Samba

具体步骤如下:

  • 在 Linux 宿主机安装 Samba, 以 CentOS 为例:
  yum install samba
  • 配置共享文件夹(例如 /home/win_share),编辑 /etc/samba/smb.conf,添加如下共享配置:
  [shared]
  path = /home/win_share
  browseable = yes
  read only = no
  guest ok = yes

其中,方括号 [] 中的内容是共享名称,它不一定要叫 [shared],可以叫 [abc][project_files][documents],只要合法就行。

path 表示宿主机上的共享文件夹路径,browseable = yes 表示共享文件夹可被浏览,read only = no 表示允许写入,guest ok = yes 允许没有认证的访问。

  • 创建共享目录:
  mkdir -p /home/win_share
  • 设置正确的权限,确保这个目录允许 Samba 访问:
  chown -R nobody:users /home/win_share
  chmod -R 0777 /home/win_share
  • 重启 Samba,使配置生效:
  systemctl restart smb

2 测试连通性

  • 在 Linux 物理机上进入共享目录:
  cd /home/win_share
  • 任意创建一个文件,例如:
  # 创建 test.txt
  vim test.txt
  
  # 内容如下:
  11111111
  22222222
  33333333

按下 ESC,输入:wq保存并退出。

  • 虚拟机中访问宿主机共享目录的路径为:
  \\<Linux-IP>\<shared-dir>

进入 Windows 虚拟机,打开文件资源管理器,在地址栏输入:\\<Linux-IP>\<shared-dir>,本例中为 \\10.6.9.36\shared, 可以看到 test.txt,该文件可以正常打开:

  • 接下来,在虚拟机中创建一个文件 widnows.txt,内容如下:
  abc123
  • 回到 Linux 宿主机中查看共享目录:

可以看到 Windows.txt并且该文件可编辑。

3 在 Windows 虚拟机上用 Python 访问共享目录

  • 首先在共享目录创建一个文件,例如 config.json,内容如下:
  {
      "name": "super surprise"
  }
  • 然后再 Windows 上创建 Python 脚本 test.py,内容如下:
  import json
  
  file_dir = r"\\10.6.9.36\shared\config.json"
  
  # 测试读文件
  with open(file_dir, 'r', encoding='utf-8') as f:
      data = json.load(f)
  print(json)
  
  # 测试写文件
  data["name"] = "null"
  saved_dir = r"\\10.6.9.36\shared\modified.json"
  with open(saved_dir, 'w', encoding='utf-8') as f:
      json.dump(data, f, ensure_ascii=False)
  • 在 Windows 上执行脚本:
  python ./test.py
  • 在 Linux 上查看共享目录,可以查看输出文件 modified.json

4 将共享目录映射为 Windows 网络驱动器

上面的方法中,需要使用 UNC 路径(例如:\\10.6.9.36\shared) 访问,可以将这个目录映射为网络驱动器,例如映射到 Z:\,然后直接使用这个盘符访问。

步骤如下:

  1. 资源管理器打开此电脑,按下图打开”映射网络驱动器“:

然后设置驱动器和文件夹:

点击完成,就可以在 Python 中直接用 Z:\ 路径访问了。

5 需要认证的情况

如果 Samba 配置是需要账号密码的,可以用 Python 的 smbprotocol 库或者 pysmb 库来访问。

简单示例如下:

from smbprotocol.connection import Connection
from smbprotocol.session import Session
from smbprotocol.tree import TreeConnect
from smbprotocol.open import Open, FileAttributes, CreateOptions, CreateDisposition, FilePipePrinterAccessMask

# 建立连接
Connection(uuid="test", server="10.6.9.36", port=445).connect()

# 登陆会话
Session(username="your_username", password="your_passwd").connect()

# 连接共享目录
TreeConnect(r"\\10.6.9.36\shared").connect()

# 然后就可以文件操作了

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注