pysmb获取smb共享服务器的目录树

时间:2015-10-20 03:11:16

标签: python linux samba os.walk

我设法使用pysmb连接和访问smb共享服务器。 我的意思是读/写/删除/创建文件/文件夹到/从服务器。

大多数时候我需要从smb设备和服务名称(pysmb术语)上的服务器读取文件(无论是jpg还是csv等)。

基本上我不知道smb设备中的文件名和目录名是什么。意思是命名是动态的。

我想知道在处理读取文件之前首先获取已过滤的目录树是个好主意。关于60TB的约3个月数据,不知道文件和目录的数量。

listShares(timeout=30)[source]
listPath(service_name, path, search=55, pattern='*', timeout=30)

以上方法只能获得1个特定级别的层次结构。 我想要的是来自os.walk.path()的类似输出。

有人有想法经验吗?我能得到什么建议吗?非常感谢你。

3 个答案:

答案 0 :(得分:4)

def smbwalk(conn, shareddevice, top = u'/'):
    dirs , nondirs = [], []

    if not isinstance(conn, SMBConnection):
        raise TypeError("SMBConnection required")


    names = conn.listPath(shareddevice, top)

    for name in names:
        if name.isDirectory:
            if name.filename not in [u'.', u'..']:
                dirs.append(name.filename)
        else:
            nondirs.append(name.filename)

    yield top, dirs, nondirs

    for name in dirs:
        new_path = os.path.join(top, name)
        for x in smbwalk(conn, shareddevice, new_path):
            yield x


conn = SMBConnection(*con_str, domain='workgroup')
assert conn.connect('10.10.10.10')
ans = smbwalk(conn, 'SHARE_FOLDER',top= '/')

这就是我想要的,但我发现如果网络份额太大,它将永远回归。

答案 1 :(得分:2)

不确定这是否是你想要的。但我正在研究类似的东西,所以你走了。

我使用Impacket实际上使用pysmb中的一些基类。 https://github.com/CoreSecurity/impacket

我希望你的listPath方法以文本格式返回输出而不是SharedFile实例。

我的意思是,在列出它们时存储低于值。

get_longname is_directory get_filesize

我有遍历共享/路径的树方法,并检查SharedFile实例是否是目录,&对自己进行递归调用。

    int y = 0;
    int i = 0;
    while ((r = fileInput.read()) != -1) { // goes through each character in
                                            // file, char by char
        char c = (char) r;
        GameOfLife.grid[i][y] = c;
        y++;
        if (y == 75)
        {
            y = 0;
            ++i;
            if (i == 25)
            {
                break;
            }
        }
    }

答案 2 :(得分:1)

您考虑使用线程吗?快速的想法是获取所有顶级目录然后使用线程为所有这些目录并使用您的smbwalk函数。在树步行时,它会对对象进行查找,因此需要时间。但是你会看到使用线程提高性能。