如何更改我的 SFTP 服务器正在使用的编码?

Joh*_*man 5 windows linux encoding sftp

\n

我有一个 Ubuntu 服务器,它.png使用 SFTP 托管一些文件。

\n

Force UTF-8当我尝试使用 FileZilla 或 WinSCP 从 Windows 笔记本电脑访问这些文件时,如果选中(Site Manager \xe2\x86\x92 Custom Charset),则文件无法成功传输:

\n

这些文件来自在 Windows Server 上运行的 VisualCron,虽然我已在 VisualCron 中将编码更改为 UTF-8,但我不确定它是否适用,因为这是它们可以开始出现的唯一位置编码不同。

\n

设置:\n在此输入图像描述

\n
    \n
  • OpenSSH sshd_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
  • \n
\n

请注意,我已注释掉:AcceptEnv LANG LC_*。根据here,这意味着服务器将不允许客户端传递区域设置环境变量。在这种情况下,即使使用VisualCron 的 Windows Server 使用“错误”编码发送文件,服务器也不应该接受它,而应使用 UTF-8。正确的?

\n
    \n
  • Ubuntu 服务器的区域设置:\n
    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)\n
  • \n
  • FileZilla:
    使用 时,文件名中ISO-8859-15包含\xc3\xa8和等字符的文件将被传输,但传输的文件会出现启用错误:\n\xc3\xa9Force 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
  • \n
\n


在哪里可以查看 SFTP 服务器用于文件列表的编码以及如何将其更改为 UTF-8?

\n

Bin*_*rus 3

初步评论:

\n
    \n
  • sftp必须使用 UTF-8 作为文件名编码(例如,请参阅此处作为参考)。但是,有些客户端和服务器不遵循该要求并违反规范,这可能是导致您的问题的原因。

    \n
  • \n
  • 您写道:“请注意,我已注释掉:AcceptEnv LANG LC_*。根据此处,这意味着服务器将不允许客户端传递区域设置环境变量。”

    \n

    对于它的工作原理和用途可能存在误解。每当两台机器通信时,它们必须使用相同的数据格式。例如,假设 VisualCron 将编码为 ISO 8859-1 的文件名放入其发送到 Ubuntu 服务器的字节流中,但您强制 Ubuntu 服务器将传入的(文件名)字节流解释为以 UTF- 编码。 8. 这不会解决问题,反而会引发问题。

    \n
  • \n
\n

话虽如此:

\n

我首先会尝试找出问题到底出在哪里。我强烈假设您可以通过 SSH 访问,甚至可以通过物理方式(键盘)访问 Ubuntu 服务器。然后

\n
    \n
  • en_US.UTF-8检查Ubuntu 服务器上是否安装了语言环境。请注意,仅设置LC_LANG环境变量并不会安装区域设置。

    \n

    相反,您可以在操作系统安装期间或通过类似的方式安装区域设置dpkg-reconfigure locales(在 debian 上 - 我不知道 Ubuntu)。

    \n
  • \n
  • 如果使用 SSH,请确保您的 SSH 终端软件(例如 Putty)使用与服务器相同的编码。

    \n
  • \n
  • 然后,最关键的一步:手动使用 SSH 终端创建一个名称有问题的文件,以便 Windows 笔记本电脑上的 sftp 客户端可以看到它。

    \n

    例如,回到您的问题,您可以Li\xc3\xa8ge.txt/tickets目录 ( touch /tickets/Li\xc3\xa8ge.txt) 中创建一个名为 name 的文件。再次使用 SSH 终端,仔细检查当您让 Ubuntu 列出该目录中的文件时文件名是否正确显示(ls -al /tickets

    \n
  • \n
  • 现在使用 Windows 笔记本电脑上的 sftp 客户端并检查它是否正确下载新创建的文件。

    \n

    如果这有效,则意味着当 VisualCron 将文件传输到 Ubuntu 服务器时出现问题。如果不起作用,则问题出在您的 Windows 笔记本电脑和 Ubuntu 服务器之间。

    \n
  • \n
\n

在这两种情况下,都有一些工具可以帮助您分析情况。

\n

例如,您可以通过使用convmv获得一些见解,它可以将文件名从一种编码转换为另一种编码。值得注意的是,您可以将文件名的编码从 UTF-8 转换为 UTF-8。当您执行此操作并且确定文件名已采用 UTF-8 编码时,它在转换过程中不得更改。

\n

您可能还想看看chardet,它是一个 Python 库,它尝试猜测例如文件名的编码。我不是 Python 爱好者,所以我无法帮助你获取源代码。根据此问题的公认答案,您将有一行类似于chardet.detect(os.popen("ls yourfilename.txt").read())Python 脚本的行,它将输出最可能的编码以及置信度评级。

\n

总结一下:

\n
    \n
  • 按照上面显示的步骤并使用上面提到的工具,确保 Ubuntu 服务器上的文件名确实以 UTF-8 编码。

    \n
  • \n
  • 一旦您完全确定 Ubuntu 服务器上的文件名采用 UTF-8 编码,请检查笔记本电脑上的 sftp 客户端是否可以下载它们。如果没有,请尝试其他客户端,直到它有效为止。

    \n
  • \n
  • 如果您发现 Ubuntu 服务器上并非所有文件名都以 UTF-8 编码,请相应地调整 VisualCron 中的设置。我不了解 VisualCron,因此无法帮助您。

    \n
  • \n
\n