【问题标题】:Python Linux-copy files to windows shared drive (samba)Python Linux-将文件复制到Windows共享驱动器(samba)
【发布时间】:2011-11-08 14:54:42
【问题描述】:

这个问题类似于How to copy files to network path or drive using Python 但是,我在 Linux 上并试图将文件复制到通过 samba 访问的 Windows 共享网络。 我试过代码:

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: not found

我认为这是因为“NET USE”是特定于 Windows 的。我如何在 Linux 中做类似的事情?

谢谢! 哈梅尼

【问题讨论】:

  • linux上没有'NET'命令

标签: python networking share samba smb


【解决方案1】:

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 为 windows 工作站或服务器的 IP 地址

Windows 共享的用户名

windows 共享密码

按 windows 服务器的域。几乎是WORKGROUP

如果您想避免提示输入密码(如果确实需要),请参阅visudo

sudo visudo

在编辑器打开的文件中输入下面一行

username ALL=(ALL) NOPASSWD: ALL

在 Ubuntu 上用您的用户名替换用户名。保存文件( Ctrl+x 然后按 Y )。注销和登录

【讨论】:

    【解决方案2】:

    感谢您的回复。我必须使用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))
    

    【讨论】:

      【解决方案3】:

      这应该适合你。请注意,Linux 使用根文件系统,而不是驱动器号。 另外请注意,这只有在您的 linux 机器上有一个名为 /mnt/P 的文件夹时才有效。不能挂载到不存在的文件夹。

      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")
      

      【讨论】:

        【解决方案4】:

        在 linux 上,您可以使用 smbmount 来执行与此处使用 NET 相同的操作。

        【讨论】:

          猜你喜欢
          • 2017-11-08
          • 1970-01-01
          • 2016-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-23
          相关资源
          最近更新 更多