写在前面
早前,就碰到 【访问带密码的共享文件夹】 的任务需求,一直找不到解决的方法。
这次,又碰到了,搜索半天,终于找到了方法路子,原来用pysmb模块即可。
pysmb是一个使用纯 Python 实现的 SMB/CIFS 库,支持 Windows 和 Linux 机器间的文件共享。
python 访问无密码的共享文件夹
可能有人需要,还是先分享下 【访问无密码的共享文件夹】的实现方法,其实很简单。
这里只展示打开目录操作,其他文件操作,自行搜索,与本地文件操作,基本无异。
try:
the_folder = "\\\\10.10.10.10\你的文件目录"
os.startfile(the_folder) # 打开目录
except Exception:
pass
python 访问带密码的共享文件夹
好了,进入正题,先感谢下前辈的分享,主要是下面几篇文章:
《pysmb 使用》
《python3 访问windows共享目录》
《python3访问samba共享目录》
《Python简单操作samba文件服务器Pysmb》
《如何使用pysmb(文件接收)》
核心代码如下,来自文章《pysmb 使用》
from smb.SMBConnection import SMBConnection
# 与samba服务器建立连接
# -*- coding: utf-8 -*-
# @Time : 2022/2/26 9:46
# @Author : heyubin
# @Email : 1551231277@qq.com
# @File : pysmb_test.py
from smb.SMBConnection import *
# param1:username
# param2:password
# param3:local NetBIOS machine name
# param4:remote NetBIOS machine name
samba = SMBConnection("17358882238", "19990123hyb", '', '') # 默认情况下,samba协议的NetBIOS是关闭的,因此填空即可
# param1: samba服务器的IP地址
assert samba.connect("192.168.1.121") # 连接samba服务器
# 上传文件
f = open("python.txt", 'rb') # 这里推荐使用b模型打开文件,测试发现总是出现一些奇怪的问题
# param1: samba服务器的共享路径
# param2: 共性路径下的,文件路径(这里需要指定上传到samba服务器上的哪个文件,如果没有就会创建一个),
# param3: 你需要上传的文件的对象(这个对象所属的类必须要有read()方法)
samba.storeFile('17358882238_Home1', 'Public/python.txt', f)
f.close()
# 下载文件
f = open("test.txt", 'wb')
# param1: samba服务器的共享路径
# param2: 共享路径下的,文件路径
# param3: 你需要下载的文件的对象
samba.retrieveFile('17358882238_Home1', "Public/DPU.txt", f)
f.close()
# samba对象还有很多的其他API函数
# samba.createDirectory()
# samba.deleteDirectory()
# samba.deleteFiles()
# samba.listShares()
# samba.listPath()
#从服务器获取文件列表
sharelist = samba.listPath("17358882238_Home1","/Public")
for i in sharelist:
print (i.filename)
########################################
samba.close()
一心狮自制——精美的smb工具类
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from smb.SMBConnection import SMBConnection
from smb.base import SharedDevice
#############################################################################################
# pysmb管理器 #pysmb是一个使用纯 Python 实现的 SMB/CIFS 库,支持 Windows 和 Linux 机器间的文件共享。
#############################################################################################
class SMBManager():
# 创建smb连接
def __init__(self):
self.host = "10.10.10.10" # ip或域名
self.port = 445 # smb协议默认端口445
self.smb = SMBConnection(username='Administrator', password='1234abcd', my_name='', remote_name='WIN-EMV001TRGH8', is_direct_tcp=True)
# 上传文件到服务器
def goto_storeFile(self,shared_folder,store_path,file_path):
try:
self.smb.connect(self.host, self.port)
f = open(file_path, 'rb')
self.smb.storeFile(shared_folder, store_path, f)
f.close()
return True
except:
return False
finally:
self.smb.close()
# 下载文件到本地
def goto_retrieveFile(self, shared_folder, retrieve_path, file_path):
try:
self.smb.connect(self.host, self.port)
f = open(file_path, 'wb')
self.smb.retrieveFile(shared_folder, retrieve_path, f)
f.close()
return True
except:
return False
finally:
self.smb.close()
#从服务器获取文件列表
def goto_listPath(self, shared_folder, dir_path):
try:
self.smb.connect(self.host, self.port)
flist = self.smb.listPath(shared_folder, dir_path)
return flist
except:
return False
finally:
self.smb.close()