python 访问共享文件夹 pysmb 带用户名密码 带密码共享 创建多级目录 复制本地文件夹到服务器

复制本地文件夹到服务器

def create_nested_directories(conn, share_name, path):
    # 如果没有就创建多级目录
    try:
        conn.listPath(share_name, path)
        return
    except:
        pass
    directories = path.split('/')
    current_path = ''
    for directory in directories:
        if directory:
            current_path += '/' + directory
            try:
                conn.listPath(share_path, current_path)
            except:
                conn.createDirectory(share_name, current_path)


def store_remote_file(local_file_path, remote_dir, share_path='xtjfs01', host=host):
    remote_file_path = os.path.join(remote_dir, os.path.basename(local_file_path))
    with SMBConnection(**login_dict) as conn:
        result = conn.connect(host, 445)  # smb协议默认端口445
        print("登录状态", result)
        # 如果没有目录就创建一个
        # try:
        #     conn.listPath(share_path, remote_file_dir)
        # except:
        #     conn.createDirectory(share_path, remote_file_dir)

        create_nested_directories(conn,share_name=share_path,path=remote_dir)

        try:
            with open(local_file_path, 'rb') as f:
                print(2323)
                conn.storeFile(share_path, remote_file_path, f)
                print('write remote file success')
        except Exception as e:
            print(e)
            print('write remote file fail')



remote_dir = r'EP\{}'.format('2021')

# store_remote_file(local_file, remote_dir)

def copy_folder_to_server(source_folder, destination_folder, share_path='xtjfs01', host=host):
    with SMBConnection(**login_dict) as conn:
        result = conn.connect(host, 445)  # smb协议默认端口445
        print("登录状态", result)
        # 创建目标文件夹
        # conn.mkdir(share_name, destination_folder)

        # 遍历源文件夹中的文件和子文件夹
        for item in os.listdir(source_folder):
            source_item = os.path.join(source_folder, item)
            destination_item = os.path.join(destination_folder, item)

            # 如果是文件夹,则递归复制
            if os.path.isdir(source_item):
                copy_folder_to_server(source_item, destination_item)
            # 如果是文件,则复制到服务器
            elif os.path.isfile(source_item):
                store_remote_file(source_item, destination_folder)
                # with open(source_item, 'rb') as file:
                #     conn.storeFile(share_path, destination_item, file)


source_folder = r"E:\file\報告"
destination_folder = remote_dir
copy_folder_to_server(source_folder, destination_folder)

如何根据 ip 获取计算机名
ping -a 192.168.1.100

目标主机的 ip 地址 或域名,及下面的信息都不能错
my_name = “” # 这个随便,可以为空字符串

创建多级目录

创建前先判断,如果存在目录则不创建


def get_remote_file(local_file_path, remote_file_path):
    with SMBConnection(**login_dict) as conn:
        result = conn.connect(host, 445)  # smb协议默认端口445
        with open(local_file_path, 'wb') as fw:
            conn.retrieveFile(share_path,remote_file_path,fw)
            print('local file path', local_file_path)
            print("get remote file success")

def create_nested_directories(conn, share_name, path):
    # 如果没有就创建多级目录
    try:
        conn.listPath(share_name, path)
        return
    except:
        pass
    # 如果这样不行,则将 / 改为 \\
    directories = path.split('/')
    current_path = ''
    for directory in directories:
        if directory:
            current_path += '/' + directory
            try:
                conn.listPath(share_path, current_path)
            except:
                conn.createDirectory(share_name, current_path)


def store_remote_file(local_file_path, remote_file_path):
    remote_file_dir = os.path.dirname(remote_file_path)
    with SMBConnection(**login_dict) as conn:
        result = conn.connect(host, 445)  # smb协议默认端口445
        print("登录状态", result)
        # 如果没有目录就创建一个
        # try:
        #     conn.listPath(share_path, remote_file_dir)
        # except:
        #     conn.createDirectory(share_path, remote_file_dir)

        create_nested_directories(conn,share_name=share_path,path=remote_file_dir)

        try:
            with open(local_file_path, 'rb') as f:
                print(2323)
                conn.storeFile(share_path, remote_file_path, f)
                print('write remote file success')
        except Exception as e:
            print(e)
            print('write remote file fail')
login_dict = {
    'username': username,
    # 'password': password,
    'password': password,
    'my_name': my_name,
    'remote_name': remote_name,
    'is_direct_tcp': True,
    'use_ntlm_v2': True
}

遍历可访问的共享目录

from smb import SMBConnection

try:
    conn = SMBConnection(username,password,'name',system_name,domain,use_ntlm_v2=True,
                         sign_options=SMBConnection.SIGN_WHEN_SUPPORTED,
                         is_direct_tcp=True) 
    connected = conn.connect(system_name,445)

    try:
        Response = conn.listShares(timeout=30)  # obtain a list of shares
        print('Shares on: ' + system_name)

        for i in range(len(Response)):  # iterate through the list of shares
            print("  Share[",i,"] =", Response[i].name)

            try:
                # list the files on each share
                Response2 = conn.listPath(Response[i].name,'/',timeout=30)
                print('    Files on: ' + system_name + '/' + "  Share[",i,"] =",
                                       Response[i].name)
                for i in range(len(Response2)):
                    print("    File[",i,"] =", Response2[i].filename)
            except:
                print('### can not access the resource')
    except:
        print('### can not list shares')    
except:
    print('### can not access the system')

listpath 列出子目录方式

 conn.listPath(share_path, remote_file_dir)
 conn.listPath('root', 'sub\sub_second\sub_third')

with 方式连接

 try:
        # with方式,使用后自动close连接
        with SMBConnection(username, password, "", "", use_ntlm_v2=True) as conn:
            result = conn.connect(host, 445)  # smb协议默认端口445






连接服务器

```python
from smb.SMBConnection import SMBConnection

host = "192.168.1.2"  #ip或域名,改成你自己的
username = "user" #用户名,改成你自己的
password = "pass" #密码,改成你自己的
my_name = "aaaa" # 这个随便,可以为空字符串
remote_name = "WIN-1QI0CPE887P" # 这个是共享主机的主机名,listShares会用到,不用listShares的话可以为空字符串
conn = SMBConnection(username, password,my_name , remote_name , is_direct_tcp=True)
result = conn.connect(host, 445) #smb协议默认端口445
print("登录状态", result)

上传文件

with open('1.txt', 'rb') as f:
    conn.storeFile("Software","11.txt", f)

下载文件

with open('1.txt', 'wb') as fw:
    conn.retrieveFile("Software","11.txt",fw) 

删除文件
第二个参数是要删除的文件,可包含通配符。第三个参数是否删除目录
`conn.deleteFiles(“Software”, “test/*”, delete_matching_folders=True)

创建文件夹

创建文件夹
无返回值,没报错就是创建成功
conn.createDirectory("Software", "test")

重命名文件

重命名文件
conn.rename("Software","11.txt","22.txt")

参考
https://blog.csdn.net/Qwertyuiop2016/article/details/129367401
https://blog.csdn.net/firseve/article/details/119635385
https://blog.csdn.net/qqyuanhao163/article/details/100145749

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值