Joh*_*man 5 windows linux encoding sftp
\n
我有一个 Ubuntu 服务器,它.png
使用 SFTP 托管一些文件。
Force UTF-8
当我尝试使用 FileZilla 或 WinSCP 从 Windows 笔记本电脑访问这些文件时,如果选中(Site Manager \xe2\x86\x92 Custom Charset),则文件无法成功传输:
这些文件来自在 Windows Server 上运行的 VisualCron,虽然我已在 VisualCron 中将编码更改为 UTF-8,但我不确定它是否适用,因为这是它们可以开始出现的唯一位置编码不同。
\n\nsshd_config
:\n# AcceptEnv LANG LC_*\nSubsystem sftp = /usr/lib/openssh/sftp-server -l INFO\nMatch Group = sftp_users\nChrootDirectory = /ftproot/owners/%u\nForceCommand = internal-sftp\n
Run Code Online (Sandbox Code Playgroud)\n请注意,我已注释掉:AcceptEnv LANG LC_*
。根据here,这意味着服务器将不允许客户端传递区域设置环境变量。在这种情况下,即使使用VisualCron 的 Windows Server 使用“错误”编码发送文件,服务器也不应该接受它,而应使用 UTF-8。正确的?
LANG = en_US.UTF-8\nlanguage =\nLC_CTYPE = "en_US.UTF-8"\nLC_NUMERIC = "en_US.UTF-8"\nLC_TIME = "en_US.UTF-8"\nLC_COLLATE = "en_US.UTF-8"\nLC_MONETARY = "en_US.UTF-8"\nLC_MESSAGES = "en_US.UTF-8"\nLC_PAPER = "en_US.UTF-8"\nLC_NAME = "en_US.UTF-8"\nLC_ADDRESS = "en_US.UTF-8"\nLC_TELEPHONE = "en_US.UTF-8"\nLC_MEASUREMENT = "en_US.UTF-8"\nLC_IDENTIFICATION = "en_US.UTF-8"\nLC_ALL =\n
Run Code Online (Sandbox Code Playgroud)\nISO-8859-15
包含\xc3\xa8
和等字符的文件将被传输,但传输的文件会出现启用错误:\n\xc3\xa9
Force UTF-8
Response: New directory is: "/tickets/"\nCommand: get "FILENAME containing Li\xc3\xa8ge.png" "C:\\test\\FILENAME containing Li\xc3\xa8ge.png"\n\n Error: /tickets/FILENAME containing Li\xc3\xa8ge.png: open for read: no such file or directory\n Error: File transfer failed\n
Run Code Online (Sandbox Code Playgroud)\n
在哪里可以查看 SFTP 服务器用于文件列表的编码以及如何将其更改为 UTF-8?
初步评论:
\nsftp必须使用 UTF-8 作为文件名编码(例如,请参阅此处作为参考)。但是,有些客户端和服务器不遵循该要求并违反规范,这可能是导致您的问题的原因。
\n您写道:“请注意,我已注释掉:AcceptEnv LANG LC_*。根据此处,这意味着服务器将不允许客户端传递区域设置环境变量。”
\n对于它的工作原理和用途可能存在误解。每当两台机器通信时,它们必须使用相同的数据格式。例如,假设 VisualCron 将编码为 ISO 8859-1 的文件名放入其发送到 Ubuntu 服务器的字节流中,但您强制 Ubuntu 服务器将传入的(文件名)字节流解释为以 UTF- 编码。 8. 这不会解决问题,反而会引发问题。
\n话虽如此:
\n我首先会尝试找出问题到底出在哪里。我强烈假设您可以通过 SSH 访问,甚至可以通过物理方式(键盘)访问 Ubuntu 服务器。然后
\nen_US.UTF-8
检查Ubuntu 服务器上是否安装了语言环境。请注意,仅设置LC_
和LANG
环境变量并不会安装区域设置。
相反,您可以在操作系统安装期间或通过类似的方式安装区域设置dpkg-reconfigure locales
(在 debian 上 - 我不知道 Ubuntu)。
如果使用 SSH,请确保您的 SSH 终端软件(例如 Putty)使用与服务器相同的编码。
\n然后,最关键的一步:手动使用 SSH 终端创建一个名称有问题的文件,以便 Windows 笔记本电脑上的 sftp 客户端可以看到它。
\n例如,回到您的问题,您可以Li\xc3\xa8ge.txt
在/tickets
目录 ( touch /tickets/Li\xc3\xa8ge.txt
) 中创建一个名为 name 的文件。再次使用 SSH 终端,仔细检查当您让 Ubuntu 列出该目录中的文件时文件名是否正确显示(ls -al /tickets
。
现在使用 Windows 笔记本电脑上的 sftp 客户端并检查它是否正确下载新创建的文件。
\n如果这有效,则意味着当 VisualCron 将文件传输到 Ubuntu 服务器时出现问题。如果不起作用,则问题出在您的 Windows 笔记本电脑和 Ubuntu 服务器之间。
\n在这两种情况下,都有一些工具可以帮助您分析情况。
\n例如,您可以通过使用convmv获得一些见解,它可以将文件名从一种编码转换为另一种编码。值得注意的是,您可以将文件名的编码从 UTF-8 转换为 UTF-8。当您执行此操作并且确定文件名已采用 UTF-8 编码时,它在转换过程中不得更改。
\n您可能还想看看chardet,它是一个 Python 库,它尝试猜测例如文件名的编码。我不是 Python 爱好者,所以我无法帮助你获取源代码。根据此问题的公认答案,您将有一行类似于chardet.detect(os.popen("ls yourfilename.txt").read())
Python 脚本的行,它将输出最可能的编码以及置信度评级。
总结一下:
\n按照上面显示的步骤并使用上面提到的工具,确保 Ubuntu 服务器上的文件名确实以 UTF-8 编码。
\n一旦您完全确定 Ubuntu 服务器上的文件名采用 UTF-8 编码,请检查笔记本电脑上的 sftp 客户端是否可以下载它们。如果没有,请尝试其他客户端,直到它有效为止。
\n如果您发现 Ubuntu 服务器上并非所有文件名都以 UTF-8 编码,请相应地调整 VisualCron 中的设置。我不了解 VisualCron,因此无法帮助您。
\n 归档时间: |
|
查看次数: |
9927 次 |
最近记录: |