You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OpenSSH时去除SFTP用户名中的BOM标记

使用OpenSSH时去除SFTP用户名中的BOM标记

我在Ubuntu 22.04上运行OpenSSH 1:8.9p1-3ubuntu0.1作为SFTP服务器,最近遇到一个反复出现的问题:不少Windows客户端连接时,用户名前面会被加上一个或多个UTF-8 BOM标记(也就是日志里显示的\357\273\277),导致登录失败——因为系统里根本不存在带BOM前缀的用户名。

询问下来这些用户都有个共同点:用Windows的便签(Sticky Notes)存储SFTP凭证,大概率是这个应用复制时自动加上了BOM。他们大多用WinSCP连接,但WinSCP的BOM设置好像只针对传输的文件,对登录用户名不起作用。

现在想请教两个方向的解决办法:

  1. 能不能在服务器端通过OpenSSH或者PAM来自动去除用户名开头的BOM标记?
  2. 如果是WinSCP客户端的问题,有没有什么设置可以让用户调整?

相关日志信息

Aug 28 16:13:25 sftp1 sshd[1670168]: Failed password for invalid user \357\273\277\357\273\277redacted_sftp_username from 165.165.165.165 port 35970 ssh2

服务器环境信息

  • 系统版本:
sftp1:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.3 LTS
Release:        22.04
Codename:       jammy
  • OpenSSH版本:
sftp1:~# dpkg -l | grep openssh
ii  openssh-client                     1:8.9p1-3ubuntu0.1                      amd64        secure shell (SSH) client, for secure access to remote machines
ii  openssh-server                     1:8.9p1-3ubuntu0.1                      amd64        secure shell (SSH) server, for secure access from remote machines
ii  openssh-sftp-server                1:8.9p1-3ubuntu0.1                      amd64        secure shell (SSH) sftp server module, for SFTP access from remote machines
  • 系统区域设置:
sftp1:~# 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=

解决办法

服务器端:用PAM自动去除BOM前缀

这个方法能一劳永逸,不用挨个找用户调整,直接在服务器端处理掉带BOM的用户名:

  1. 创建处理脚本:新建一个脚本/usr/local/bin/strip-bom-username.sh,内容如下:
#!/bin/bash
# 去除用户名开头的UTF-8 BOM标记
USERNAME=$(echo "$PAM_USER" | sed 's/^\xEF\xBB\xBF//')
# 将处理后的用户名传递给PAM
echo "$USERNAME"
exit 0
  1. 给脚本加执行权限:
chmod +x /usr/local/bin/strip-bom-username.sh
  1. 修改PAM配置:编辑/etc/pam.d/sshd,在文件最开头添加一行(要放在@include common-auth之前):
auth    required        pam_exec.so expose_authtok stdout /usr/local/bin/strip-bom-username.sh
  1. 确认OpenSSH的PAM设置:检查/etc/ssh/sshd_config里是否有UsePAM yes(默认应该已经开启,如果没有就加上)。
  2. 重启sshd服务:
systemctl restart sshd

这样以后不管用户传过来的用户名带多少个BOM前缀,脚本都会自动去掉,不影响正常登录。

客户端:避免BOM混入用户名

如果不想在服务器端改配置,也可以让用户做这些调整:

  • 别用Sticky Notes存凭证:Windows便签复制文本时确实会偷偷加BOM,建议改用记事本(保存时选「UTF-8无BOM」格式)或者专门的密码管理工具。
  • 粘贴后手动检查:如果一定要从便签复制,粘贴到WinSCP的用户名框后,按一下Home键到开头,删除那个看不见的字符(或者直接手动输入用户名更稳妥)。
  • 用纯文本编辑器中转:复制凭证后先粘贴到记事本,再从记事本复制到WinSCP,这样BOM会被自动过滤掉。

备注:内容来源于stack exchange,提问作者kmiller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 14:49:34