Python Linux-копирование файлов на общий диск Windows (samba) - PullRequest
3 голосов
/ 01 сентября 2011

этот вопрос похож на Как скопировать файлы на сетевой путь или диск с помощью Python Тем не менее, я использую Linux и пытаюсь скопировать файлы в общую сеть Windows, доступ к которой осуществляется через samba. Я попробовал код:

from contextlib import contextmanager
@contextmanager

def network_share_auth(share, username=None, password=None, drive_letter='P'):

    """Context manager that mounts the given share using the given
    username and password to the given drive letter when entering
    the context and unmounts it when exiting."""

    cmd_parts = ["NET USE %s: %s" % (drive_letter, share)]

    if password:
        cmd_parts.append(password)
    if username:
        cmd_parts.append("/USER:%s" % username)
    os.system(" ".join(cmd_parts))
    try:
        yield
    finally:
        os.system("NET USE %s: /DELETE" % drive_letter)

with network_share_auth(r"\\ComputerName\ShareName", username, password):
    shutil.copyfile("foo.txt", r"P:\foo.txt")

Я получаю сообщение об ошибке: sh: NET: не найдено

Я думаю, это потому, что «NET USE» является специфичным для Windows. Как мне сделать нечто подобное в Linux?

Спасибо! Harmaini

Ответы [ 4 ]

4 голосов
/ 01 сентября 2011

В Linux вы бы использовали smbmount , чтобы сделать то же самое, что и NET, который используется здесь.

2 голосов
/ 07 сентября 2011

Спасибо за ваши ответы. Мне пришлось использовать mount -t smbfs вместо smbmount, чтобы заставить его работать. Это сработало:

        cmd_parts = ["mount -t smbfs"]
        if password:
            cmd_parts.append("-o password=%s,user=%s %s %s" % (password, username, share, drive_letter))
        os.system(" ".join(cmd_parts))
0 голосов
/ 13 марта 2016

1.Установите cifs-utils

sudo apt-get install cifs-utils

2.Сделайте каталог для своей доли. Примерно так:

sudo mkdir /media/localShareName

Вы можете использовать другое имя вместо localShareName.

3. Код вашей функции Python

def mountWindowsShare():

    cmd1 ='sudo mount -t cifs' + '  '
    cmd1+='//Server_IP_Address/ShareFolder' + '  '
    cmd1+='/media/localShareName' + '  '
    cmd1+='-o username=<usernameOfWindowsShare>,'
    cmd1+='password=<passwordOfWindowsShare>,'
    cmd1+='domain=<DomainOfWindowsServer>,'
    cmd1+='noexec'

    os.system(cmd1)

    ''' 
          do whatever you want like:

    print(os.listdir('/media/localShareName'))
    '''

    os.system('sudo umount /media/localShareName')

заменить

Server_IP_Address по IP-адресу рабочей станции или сервера Windows

по имени пользователя общего ресурса Windows

по паролю общего ресурса Windows

по домену сервера Windows. это почти WORKGROUP

Если вы хотите избежать запроса пароля (если это действительно необходимо), см. visudo

sudo visudo

Введите следующую строку в открытый файл в редакторе

username ALL=(ALL) NOPASSWD: ALL

Замените имя пользователя вашим именем в Ubuntu. Сохраните файл (Ctrl + x и затем нажмите Y). Выйти и войти

0 голосов
/ 02 сентября 2011

Это должно работать для вас. Обратите внимание, что Linux использует корневую файловую систему, а не буквы дисков. Также обратите внимание, что это будет работать только в том случае, если у вас есть папка с именем /mnt/P на вашем компьютере с Linux. Вы не можете подключиться к несуществующей папке.

from contextlib import contextmanager
@contextmanager

def network_share_auth(share, username=None, password=None, drive_letter='/mnt/P'):

    """Context manager that mounts the given share using the given
    username and password to the given drive letter when entering
    the context and unmounts it when exiting."""

    cmd_parts = ["smbmount %s %s" % (share, drive_letter)]

    if password:
        cmd_parts.append("-o password=%s,username=%s" % (password, username))
    os.system(" ".join(cmd_parts))
    try:
        yield
    finally:
        os.system("umount %s" % drive_letter)

with network_share_auth(r"//ComputerName/ShareName", username, password):
    shutil.copyfile("foo.txt", r"/mnt/P/foo.txt")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...