Samba 文件名中的特殊字符

Mat*_*tti 24 samba

当通过 Samba 提供文件名中包含特殊字符(例如“()?:”)的文件时,名称会转换为无法识别的格式。例如,一个文件

my_file:_(important).txt
Run Code Online (Sandbox Code Playgroud)

显示为

M43J1E~0.TXT
Run Code Online (Sandbox Code Playgroud)

有没有办法避免这种行为(显然不重命名文件)?我假设字符编码不是罪魁祸首,因为几个 UTF-8 字符似乎工作正常。

Yur*_*ira 11

  • 我拥有一台 Apple Macbook Pro 笔记本电脑,带有 64 位 OS X 10.11“El Capitan”,运行我通过Macports安装的 Samba 3 。

  • 我还拥有一台戴尔 Inspiron 笔记本电脑,带有 64 位 GNU/Linux XUbuntu 16.04“Xenial Xerus”,运行我通过 APT 安装的 Samba 3。

两台机器都有网络共享文件夹并使用 Samba 以便在我的 WLAN(无线 LAN)上进行通信。

我的两个系统都是巴西葡萄牙语。因此,我使用特殊字符,例如çáãâôéó等等。

当我使用我的 Linux 笔记本电脑访问我的 OS X Samba 共享时,所有字符串都正确显示:像maçãônusbênção这样的词显示正确。长名称的文件和文件夹也会显示,并且它们的名称显示正确。因此,在 OS X 上运行的 Samba 服务器已经正确配置......

...但事情并没有反过来:如果我在 OS X 上使用 Finder 应用程序访问我的 Linux Samba 共享,则不会显示至少包含这些特殊字符之一的所有文件和文件夹(它们仍然不可见) me),并且文件和文件夹的长名称被转换为奇怪的短名称。因此,在我的 Linux 机器上运行的 Samba 服务器出现了问题。

=> 就我而言,解决此问题的方法是将以下几行添加到我的 Linux 机器上文件[global]内的部分smb.conf

mangled names = no
dos charset = CP850
unix charset = UTF-8
Run Code Online (Sandbox Code Playgroud)

之后,我打开一个 shell 终端窗口并使用以下命令重新启动 Linux Samba 服务器:

sudo service smbd restart
Run Code Online (Sandbox Code Playgroud)

...可以用其他命令替换(以防上面的命令在您的 Linux 发行版上不起作用):

sudo systemctl restart smbd.service
Run Code Online (Sandbox Code Playgroud)

在我重新启动 Linux Samba 服务器后,OS X 上的 Finder 应用程序终于正确显示了以前由于名称包含一个或多个特殊字符而隐藏的所有文件和文件夹。被破坏(“缩短”)的名字也被“未破坏”。

脚注

  1. 在 GNU/Linux 系统中,smb.conf文件的标准位置是/etc/samba/smb.conf
  2. 假设您的 Linux 系统将smb.conf文件存储在标准位置/etc/samba/:有几种不同的方法可以编辑smb.conf文件。例如,如果您没有使用桌面环境(例如您的系统只有一个 shell 终端,没有窗口),您可以通过发出诸如或或其他命令(取决于您使用的 Linux 发行版)来安装Nano文本编辑器正在使用),然后运行。如果您使用的是桌面环境,您可以通过发出诸如或或其他命令(取决于您使用的 Linux 发行版)来安装图形文本编辑器,例如GNOME Edit,然后运行.sudo apt-get install nano -ysudo dnf -b -y install nanosudo nano /etc/samba/smb.confsudo apt-get install gedit -ysudo dnf -b -y install geditsudo gedit /etc/samba/smb.conf
  3. 在 Samba 3+ 中,display charset不推荐使用该参数。
  4. dos charset参数不支持该UTF-8参数。因此,它必须使用默认参数CP850
  5. mangled names = no指示 Samba 服务器不要缩短文件和文件夹的长名称。因此,因为 Samba 客户端只是将 Samba 服务器提供给客户端的内容复制给用户,所以一旦正确配置了服务器,客户端将不再向用户显示任何缩短的名称。

  • 谢谢你,差不多 12 年后了,我还在谷歌上搜索这个;希望它是默认的。 (3认同)

Den*_*son 10

Windows 不允许在 Unix 允许的文件名中使用某些字符。Samba 会“修改”文件名以使其符合 Windows 限制。您可以检查文件/etc/smb.conf/etc/samba/smb.conf查看有哪些设置。要显示这些设置以及默认值,请使用以下命令:

testparm -vs | less
Run Code Online (Sandbox Code Playgroud)

将范围缩小一点:

testparm -vs|grep "case\|mangl"
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅此页面。另外,请参阅此页面的大约一半(与上一个链接的信息相同)。


Sim*_*ity 9

我在 OS-X 和 Windows 上使用共享文件夹。有些文件有同样的问题,因为它们属于以下情况: 它们在文件名中使用字符,Windows 不支持。

请参阅:http : //support.microsoft.com/kb/177506

它列出了文件或目录中 Windows 不支持的字符。我猜,Samba 在列出文件和目录时使用相同的字符列表。

A filename cannot contain any of the following characters:
\ / : * ? " < > |
Run Code Online (Sandbox Code Playgroud)

再往下一点,他们写道:

可用于命名文件、文件夹或快捷方式的字符包括字母 (AZ) 和数字 (0-9) 的任意组合,以及以下特殊字符:

^   Accent circumflex (caret)
&   Ampersand
'   Apostrophe (single quotation mark)
@   At sign
{   Brace left
}   Brace right
[   Bracket opening
]   Bracket closing
,   Comma
$   Dollar sign
=   Equal sign
!   Exclamation point
-   Hyphen
#   Number sign
(   Parenthesis opening
)   Parenthesis closing
%   Percent
.   Period
+   Plus
~   Tilde
_   Underscore
Run Code Online (Sandbox Code Playgroud)

但我个人将不允许的字符列表作为参考,在这里向一些客户介绍情况;)


Pol*_*len 5

从 samba 文档中,您可以使用这些:

dos charset = ISO8859-1
unix charset = ISO8859-1
display charset = ISO8859-1
Run Code Online (Sandbox Code Playgroud)

  • 这和添加 mangled names= no 到 [global] 修复了我在 nas4free 上的问题 (4认同)