python3访问samba共享目录

懒得说啥了,直接上干货

你需要修改连接ip地址,如果有用户名密码填进去,如果端口不是445改了

依赖 pip3 install pysmb pyasn1 需要先安装了

我只是遍历目录,排序显示,要上传下载文件的方法自己去百度一大堆

如果有可能以后考虑做成个客户端界面。。。pyqt5 + pyinstaller

生成单个可执行文件 exe 使用 pyinstaller -F xx.py (需要安装 pip3 install pyinstaller)

# -*- coding: utf-8 -*-

# 依赖安装
# pip3 install pysmb pyasn1

# 特殊提醒目录或文件名不要用smb、smb.py,否则会和引用包冲突
import traceback
from smb.SMBConnection import SMBConnection
from smb.base import SharedDevice

# 全部共享文件夹目录,缓存用
shared_dirs = []

# 遍历
def walk_path(dir,path):
    dirs = []
    files = []
    print ('Walking path:', path)
    for p in conn.listPath(dir, path):
        # 排除.和..
        if p.filename!='.' and p.filename!='..':
            parentPath = path
            if not parentPath.endswith('/'):
                parentPath += '/'
            if p.isDirectory:
                # print('{}{}'.format(path,p.filename))
                # dirs.append('{}{}'.format(path,p.filename))
                dirs.append(p.filename)
                # 递归,如果单层显示,可以不用!!!
                walk_path(dir,parentPath+p.filename)
            else:
                # print('{}'.format(p.filename))
                files.append(p.filename)
        else:
            # print("特殊目录:",p.filename)
            pass
    #排序文件夹和文件
    dirs.sort()
    files.sort()

    print('----[文件夹]----')
    for dir in dirs:
        print(dir)
    print('----[文件]----')
    for file in files:
        print(file)

if __name__ == "__main__":

    # ip或域名
    host = '192.168.1.2'
    username = ""
    password = ""
    try:
        # with方式,使用后自动close连接
        with SMBConnection(username, password, "", "", use_ntlm_v2=True) as conn:
            result = conn.connect(host, 445)  # smb协议默认端口445
            if result:
                print("登录成功")
                shares = conn.listShares()
                for share in shares:
                    # 只记录共享文件夹
                    if share.type==SharedDevice.DISK_TREE:
                        shared_dirs.append({'name':share.name,'comments':share.comments})
                        # print(share.name)
                        # print(share.comments)
                    # 其他共享 如打印机 IPC$ 等
                    else:
                        # print(share.name)
                        # print(share.comments )
                        pass

                # 有共享文件夹时候才遍历
                if len(shared_dirs)>0:
                    print("共享文件夹:")
                    for dir in shared_dirs:
                        print(dir)
                        shared_folder = dir['name']
                        # 调用遍历方法
                        walk_path(dir['name'],'/')
                else:
                    print("没有发现共享文件夹")

            else:
                print("登录失败")
    except Exception as e:
        print("连接异常:")
        traceback.print_exc()
        print(e)

输出dict格式目录结构

# -*- coding: utf-8 -*-

# 依赖安装
# pip3 install pysmb pyasn1

import traceback
from smb.SMBConnection import SMBConnection
from smb.base import SharedDevice

# 全部共享文件夹目录
shared_dirs = []

# 遍历
def walk_path(dir,path,path_info):
    print ('Walking path:', path)
    for p in conn.listPath(dir, path):
        # 排除.和..
        if p.filename!='.' and p.filename!='..':
            parentPath = path
            if not parentPath.endswith('/'):
                parentPath += '/'

            if p.isDirectory:
                # print('{}{}'.format(path,p.filename))

                path_info_ = {
                    'path':p.filename,
                    'dirs':[],
                    'files':[]
                }
                path_info['dirs'].append(path_info_)

                # 递归,如果单层显示,可以不用!!!
                walk_path(dir,parentPath+p.filename,path_info_)
            else:
                # print('{}'.format(p.filename))

                path_info['files'].append(p.filename)
        else:
            # print("特殊目录:",p.filename)
            pass

if __name__ == "__main__":

    # ip或域名
    host = "127.0.0.1"
    # smb协议默认端口445
    port = 445
    username = ""
    password = ""
    try:
        # with方式,使用后自动close连接
        with SMBConnection(username, password, "", "", use_ntlm_v2=True) as conn:
            result = conn.connect(host, port)
            if result:
                print("登录成功")
                shares = conn.listShares()
                for share in shares:
                    # 跳过打印机
                    if share.type==SharedDevice.DISK_TREE and share.name != 'print$':
                        shared_dirs.append({'name':share.name,'comments':share.comments})
                    # 其他共享 如打印机 IPC$ 等
                    else:
                        pass

                if len(shared_dirs)>0:
                    print("共享文件夹:")
                    for dir in shared_dirs:
                        path_file = {
                            'path':"",
                            'dirs':[],
                            'files':[]}
                        print(dir)
                        shared_folder = dir['name']
                        walk_path(dir['name'],'/',path_file)

                        # 输出文件目录结构
                        print(path_file)
                else:
                    print("没有发现共享文件夹")

            else:
                print("登录失败")
    except Exception as e:
        print("连接异常:")
        traceback.print_exc()
        print(e)

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值