一个非常诡异的问题,在 Ubuntu Linux 上运行的 filezilla server FTP 服务器,客户端连接到 FTP 服务器后,不能显示目录中文件名包含中文等 non-ASCII 字符的文件,上传文件或修改文件名的时候,如果文件名包含中文等非 ASCII 字符时,也会操作失败,错误信息是 550 Invalid file name or path,即文件名或路径名无效,实际上是文件名或路径名包含无法识别的字符。
filezilla server 550 Invalid file name or path 错误信息示例如下
- Command: STOR 吴先成.txt
- Response: 550 Invalid file name or path
- Error: Critical file transfer error
复制代码- Command: RNTO 吴先成.txt
- Response: 550 Invalid file name or path
复制代码 将 filezilla server 整个软件目录打包放到另外一台版本相同的 Ubuntu Linux 上运行,却没有出现相同的问题。
最后发现,竟然是操作系统语言设置导致了 filezilla server 不能正常显示、保存、修改文件名包含非 ASCII 字符的文件。
在故障设备上运行以下命令查看语言设置,返回结果如下。- locale
- LANG=C.UTF-8
- LANGUAGE=
- LC_CTYPE="C.UTF-8"
- LC_NUMERIC="C.UTF-8"
- LC_TIME=C.UTF-8
- LC_COLLATE="C.UTF-8"
- LC_MONETARY="C.UTF-8"
- LC_MESSAGES="C.UTF-8"
- LC_PAPER="C.UTF-8"
- LC_NAME="C.UTF-8"
- LC_ADDRESS="C.UTF-8"
- LC_TELEPHONE="C.UTF-8"
- LC_MEASUREMENT="C.UTF-8"
- LC_IDENTIFICATION="C.UTF-8"
- LC_ALL=
复制代码 而在无故障设备上返回的结果是- locale
- LANG=en_US.UTF-8
- LANGUAGE=
- LC_CTYPE="en_US.UTF-8"
- LC_NUMERIC="en_US.UTF-8"
- LC_TIME="en_US.UTF-8"
- LC_COLLATE="en_US.UTF-8"
- LC_MONETARY="en_US.UTF-8"
- LC_MESSAGES="en_US.UTF-8"
- LC_PAPER="en_US.UTF-8"
- LC_NAME="en_US.UTF-8"
- LC_ADDRESS="en_US.UTF-8"
- LC_TELEPHONE="en_US.UTF-8"
- LC_MEASUREMENT="en_US.UTF-8"
- LC_IDENTIFICATION="en_US.UTF-8"
- LC_ALL=
复制代码 打开故障设备上的文件 /etc/default/locale,发现文件内容如下。- LANG=en_US.UTF-8
- LC_TIME=en_DK.UTF-8
复制代码 很明显,LC_TIME=en_DK.UTF-8 导致了问题,操作系统找不到 en_DK,也就是丹麦英语,en_DK.UTF-8 最终回落到了 C.UTF-8。
将 en_DK.UTF-8 修改成 en_US.UTF-8 可以解决这个问题。
方法一,打开 /etc/default/locale,直接修改文件后保存。
方法二,以管理员 root 身份运行以下命令。- update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
复制代码 相关链接 filezilla server locale |
|