从 WSL 中的 Ubuntu shell 访问 Windows 网络共享

spr*_*rad 16 command-line networking windows-subsystem-for-linux

我正在尝试从 Cygwin 迁移到 WSL。在 Cygwin 上的 bash 中,我可以执行以下操作:

$ ls //servername/sharename

访问 Windows 共享文件夹。我不需要先安装它或任何东西,它就可以工作了。如果我在 Ubuntu 中尝试同样的操作,我会收到“没有这样的文件或目录”错误。

我使用很多网络共享。在 WSL 下的 Ubuntu 中处理此问题的最佳/最简单方法是什么?

Rin*_*ind 15

$ sudo mkdir /mnt/share
$ sudo mount -t drvfs '\\server\share' /mnt/share
Run Code Online (Sandbox Code Playgroud)

使用单引号,否则您将需要转义反斜杠。

WSL2 还支持 CIFS。

$ sudo apt install cifs-utils
$ sudo mount -t cifs -o user={user},pass={password},vers=1.0 //server/share /mnt/share
Run Code Online (Sandbox Code Playgroud)

  • 为什么`vers=1.0`? (4认同)

Not*_*1ds 6

根据@BowlOfRed 的autofs回答进行更新。有一些事情需要解决,autofs才能使其适合您的用例。

一个答案虽然完全正确,但似乎认为您是在问如何挂载 CIFS/SMB 驱动器共享,但我并不是这样阅读您的问题。您似乎已经知道需要安装共享。您隐含的问题是是否有一种方法可以像 Cygwin 中那样“无需首先安装即可访问共享”(按需安装)。我知道,正如您所说,如果有大量不同的共享,这可能会方便得多。

虽然我最初的答案基本上是“否”,但 @BowlOfRed 指出autofs 可以“按需安装”。autofs然而,我的测试中存在一些问题:

  • 首先,很容易解决,在 WSL 下,您将需要某种方法来启动服务autofs。通常在 Ubuntu 下,这将是一个随引导启动的 Systemd 单元。但是,WSL 不支持 Systemd。幸运的是autofs,还附带了 SysVInit 风格的脚本,因此sudo service autofs start可以用来启动它。请参阅我的 Stack Overflow 答案,了解如何在启动时执行此操作,具体取决于您运行的是 Win 10 还是 11。

  • 其次,auto.smb附带的脚本autofs 可能要求您将每个主机的凭据存储在单独的/etc/creds/<hostname>文件中。但是,听起来您可能在拥有域帐户的公司环境中。在这种情况下,您可能只能使用 Kerberos 或 winbind 登录一次并autofs使用缓存的凭据/票证。但是,我无法在我的网络上对此进行测试,并且我无法提供您所需的配置的任何指导。

    我认为,另一种选择是编写一个autofs脚本来使用 DrvFs 而不是 CIFS。在 WSL 下,DrvFs 挂载的行为(在某种程度上)类似于 Cygwin,它使用 Windows 用户的凭据,并且在挂载之前不需要额外的身份验证。不过,这里存在一个挑战,因为自动挂载脚本以 root 用户而不是普通用户身份运行。

    另一种选择可能是修改当前auto.smb脚本以使用一个通用凭据文件,而不是为每个主机使用一个凭据文件。

  • 虽然 WSL 本质上是一个单用户系统,但我也不喜欢在文件系统上存储纯文本 Windows 密码,无论权限如何。当然,上面的 DrvFs、Kerberos 或 winbind 选项可以解决这个问题。


旁注/替代方案:

当然,如果您希望在 WSL 中始终可用的共享数量有限,那么您可以将它们添加到您的共享中,/etc/fstab以便默认安装它们。

none /mnt/smb tmpfs rw,relatime 0 0
drvfs /mnt/smb/servername/sharename 9p rw,dirsync,relatime,X-mount.mkdir,aname=drvfs;path=UNC\servername/sharename;symlinkroot=/mnt/,mmap,access=client,msize=262144,trans=virtio 0 0
Run Code Online (Sandbox Code Playgroud)

这会为 SMB/CIFS 挂载创建一个 tmpfs 位置,然后在该目录中挂载共享。

您可以在手动安装后复制格式/etc/mtab,但我建议添加该X-mount选项,以便在安装点中自动创建父目录。


小智 5

在 Windows(以及 cygwin)中,您可能会通过登录获得一些 Windows/域凭据。UNC 路径挂载可以使用这些用户级凭据进行挂载。WSL 将无法使用它们。

但是,如果您有一个不需要密码的 CIFS 服务器(或者如果您愿意填充 /etc/creds 并让任何登录用户都能够使用它们进行访问),那么您可以使用自动挂载程序。

  • 安装 autofs。
  • 添加/cifs /etc/auto.smb --timeout=300/etc/auto.master
  • 启动/重新启动 autofs

这样,您应该能够ls /cifs/<hostname>/<share>看到数据。