Samba 文件名中的特殊字符

Samba 文件名中的特殊字符

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

my_file:_(important).txt

显示为

M43J1E~0.TXT

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

答案1

  • 我有一台 Apple Macbook Pro 笔记本电脑,装有 64 位 OS X 10.11 “El Capitan”,运行 Samba 3,我通过麦克波特

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

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

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

当我使用 Linux 笔记本电脑访问 OS X Samba 共享时,所有字符串均能正确显示:玛萨我们正确显示。名称较长的文件和文件夹也会显示,并且其名称会正确显示。因此,在 OS X 上运行的 Samba 服务器已正确配置...

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

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

mangled names = no
dos charset = CP850
unix charset = UTF-8

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

sudo service smbd restart

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

sudo systemctl restart smbd.service

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

脚注

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

答案2

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

看:http://support.microsoft.com/kb/177506

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

A filename cannot contain any of the following characters:
\ / : * ? " < > |

再往下一点,他们写道:

可用于命名文件、文件夹或快捷方式的字符包括字母 (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

但就我个人而言,我将把不允许使用的字符列表作为向此处的一些客户介绍情况的参考;)

答案3

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

testparm -vs | less

再缩小一点:

testparm -vs|grep "case\|mangl"

这一页了解更多信息。另外,请参阅大约一半的内容这一页(与前一个链接的信息相同)。

答案4

是的,这是字符编码为责备

将“iocharset=iso8859-1”作为选项传递给 mount.cifs 或选择 iso8859-1 区域设置,而不是 utf-8。

您还可以尝试在命令前面添加“LANG=C.ISO8859-1”或“LC_ALL=C.ISO8859-1”等等。

相关内容