我已获得 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
因为它被认为是不安全的。
您正在使用smb2
或smb3
连接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