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
可以看到 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
4 将共享目录映射为 Windows 网络驱动器
上面的方法中,需要使用 UNC 路径(例如:\\10.6.9.36\shared
) 访问,可以将这个目录映射为网络驱动器,例如映射到 Z:\
,然后直接使用这个盘符访问。
步骤如下:
- 资源管理器打开此电脑,按下图打开”映射网络驱动器“:
然后设置驱动器和文件夹:
点击完成,就可以在 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() # 然后就可以文件操作了