smbclient可以访问Windows共享内容,mount.cifs不能

smbclient可以访问Windows共享内容,mount.cifs不能

我已获得 Windows 文件服务器上的帐户。 (对我来说)非常奇怪的情况是

  • 我可以连接smbclient、更改到(深层)子目录或显示其内容
  • 我可以挂载共享(没有错误消息;挂载点位于/proc/mounts),但我无法更改为相同的路径或列出其内容。我明白了No such file or directory

我既没有“显示内容”也没有“更改为”较低级别子目录的权限。这应该不是问题,也不适合smbclient

Windows 管理员已向我的用户授予额外权限,以便我现在可以查看挂载点的内容。现在我也可以通过挂载到达更深层次的子目录。

我们尚未确定在当前配置中运行所需的最小 Windows 权限集是什么。不过,无论如何,问题肯定出在Linux端。

  • Windows 共享的访问方式smbclient和访问方式有何区别?mount.cifs
  • 怎样才能mount.cifs让自己表现得像smbclient

结论

我让 Windows 管理员重置了共享的权限,以便我可以测试答案中的建议。不幸的是问题消失了。和以前一样,我看不到共享的内容,但现在挂载可以访问深层子目录。很奇怪。

评论@intika:我本来打算为你的答案提供额外的赏金,但当我这样做时,你出于某种原因删除了你的答案......

对评论和答案的回应

Windows服务器

服务器 2016,SMB 3.1.1

桑巴版

4.5.16;不是域的成员

使用的命令

  • /etc/fstab://fs-p01.dnsdomain/Data /data cifs credentials=/root/fs-p01.credentials 0 0
  • smbclient //fs-p01.dnsdomain/Data -U username -W windowsdomain

我刚刚意识到windowsdomain命令smbclient不完整。可能不相关,因为这有效。它只是name代替了name.local。但是,这是命令之间配置的差异。不幸的是,我无法检查mount如果我使用错误的域是否可以工作,因为我无法将 Windows 服务器上的权限更改回原始设置。我必须等待 Windows 管理员在周一执行此操作。

路径

对于我想要工作的目录,共享内的路径长度为 85 个字符。我也应该能够访问其父目录,即更少:

xxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/2020/2020_06

配置文件

/root/fs-p01.credentials

username=username
password=...
domain=name.local

/etc/smb/smb.conf(可能与客户端功能无关)

[global]
   workgroup = MERCHANTINVOICE
   dns proxy = no
   log file = /var/log/samba/log.%m
   max log size = 1000
   # panic action = /usr/share/samba/panic-action %d
   server role = standalone server
   passdb backend = tdbsam
   encrypt passwords = yes
   unix password sync = no
   passwd program = /usr/bin/passwd %u
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
   pam password change = no
   map to guest = bad user
   usershare allow guests = no

答案1

正如 intika 在评论中指出的那样,您没有向我们提供足够的详细信息。

路径限制

您可能会遇到臭名昭著的 260最大路径长度限制。有一种 Unicode 方式来访问 API,它有一个32,767局限性。在 Windows 世界中,这取决于您是否以\\server\share(适用 260 限制)或\\?\UNC\server\share(适用 32767 限制)的方式访问它。

现在的问题是,您要列出的路径有多长。第二个问题是哪个smbclient使用 vs. mount.cifs.

引用自smbclient手册页:

smbclient 支持长文件名,其中服务器支持 LANMAN2 协议或更高版本。

然而我找不到任何提到 mount.cifs 支持长路径的内容,因此现在可以肯定地说不mount.cifs支持长路径。

SMB协议版本

我认为您没有使用,smb1因为它被认为是不安全的。
您正在使用smb2smb3连接smbclient/吗mount.cifs

如果您使用smb3协议,则可能存在 NTLM 安全隐患,这可能会阻止您列出目录。

笔记:您应该检查服务器上而不是客户端上的日志(事件查看器),以了解发生了什么。

编辑:由于更新和评论

我想你可能会遭受以下困扰 smbv2错误(使用安装时)。
简而言之就是:

当安装作为驱动器根目录的 Windows 共享(例如 C$)时,服务器不会返回.目录..条目。这会导致 smb2 代码路径错误地跳过前 2 个条目。

怎么查出来呢?您可以在/etc/fstab条目中指定应使用的 smb 版本,方法是添加例如vers=3.0(smbv3)。如果可能的话(如果支持的话),我会通过降级版本以vers=1.0查看是否显示所有内容来解决问题。

所以你的挂载代码看起来像这样(我还添加了sec强制执行ntlm(你可能必须尝试其他你可能会在mount.cif 手册页:

//fs-p01.dnsdomain/Data  /data  cifs  credentials=/root/fs-p01.credentials,vers=1.0,sec=ntlm  0 0

如果smbv1已禁用并且您无法出于测试目的启用它,您可以使用以下方法启用 SMB 调试:

echo 1 > /proc/fs/cifs/traceSMB

然后,您可以简单地ls -la查看是否可以在日志中看到该目录。如果是,那么您受到此错误的影响。

我想到的第三个选项是在挂载根目录中有两个以上的条目。这些内容应该以位于您想要查看的条目之前的方式开始。

报告的错误

此错误已被报告。您可以在以下位置找到它:桑巴的bugzilla

解决方案

你可以尝试使用Aurelien 的这个补丁,但我不知道它是否经过正确测试。

第二个选项是执行类似于上面第三个选项的“解决方法”。有两个目录,默认排序时它们位于顶部。这只是一个快速解决方法。为了得到正确的修复,确实应该对其进行修补。

答案2

服务器端

您也可以考虑服务器端,我们知道它是 Windows 共享,但仅此而已,了解此特定案例所使用的 Windows 和 SMB 版本将有所帮助。服务器配置可能会产生很大的差异,尤其是在不使用 Windows 操作系统作为客户端时。要知道,自从windows共享出现以来,一直是一场猫捉老鼠的游戏,Samba等团队都在追逐微软的改变,由于它是一个封闭的系统,他们根本没有被迫透露新的内容。特征。

主要区别

smbclient 和 mount.cifs 访问 Windows 共享的方式有什么区别?

smbclient 旨在用作命令行实用程序来访问网络资源,mount.cifs 通常由 root 使用,在使用 cifs 文件系统类型时由 mount 命令调用,在 /etc/fstab 文件中使用时用于永久访问文件系统。

来自手册页主要的区别可能是mount.cifs 完全忽略 smb.conf

像 smbclient(8) 这样的 samba 客户端工具遵循 smb.conf 中存在的客户端配置参数。与那些客户端工具不同,mount.cifs 完全忽略 smb.conf。

smbclient是旧协议的旧实现,SMB被CIFS取代,据说,cifs有对新实现的考虑。

因此,使用该协议的最新实现可能是一个好主意,但您应该检查这些实现中哪个与可用的服务器版本配合得更好。

他们可以表现得一样吗?

如何使 mount.cifs 表现得像 smbclient 一样?

由于mount.cifs会忽略smb.conf文件,因此该文件的所有配置都应该在调用命令中表达,例如/etc/fstab中的相应行。例如,您已经在考虑-U 用户名smbclient 中使用的选项,但 smb.conf 中还有其他配置,您可以检查。特别是日志配置,可能会写入错误消息,应该是 fstab 文件之一,而不是 smb.conf 文件,检查 dmesg、/var/log/boot、/var/log/messeges

相关内容