使用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设置好像只针对传输的文件,对登录用户名不起作用。
现在想请教两个方向的解决办法:
- 能不能在服务器端通过OpenSSH或者PAM来自动去除用户名开头的BOM标记?
- 如果是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的用户名:
- 创建处理脚本:新建一个脚本
/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
- 给脚本加执行权限:
chmod +x /usr/local/bin/strip-bom-username.sh
- 修改PAM配置:编辑
/etc/pam.d/sshd,在文件最开头添加一行(要放在@include common-auth之前):
auth required pam_exec.so expose_authtok stdout /usr/local/bin/strip-bom-username.sh
- 确认OpenSSH的PAM设置:检查
/etc/ssh/sshd_config里是否有UsePAM yes(默认应该已经开启,如果没有就加上)。 - 重启sshd服务:
systemctl restart sshd
这样以后不管用户传过来的用户名带多少个BOM前缀,脚本都会自动去掉,不影响正常登录。
客户端:避免BOM混入用户名
如果不想在服务器端改配置,也可以让用户做这些调整:
- 别用Sticky Notes存凭证:Windows便签复制文本时确实会偷偷加BOM,建议改用记事本(保存时选「UTF-8无BOM」格式)或者专门的密码管理工具。
- 粘贴后手动检查:如果一定要从便签复制,粘贴到WinSCP的用户名框后,按一下Home键到开头,删除那个看不见的字符(或者直接手动输入用户名更稳妥)。
- 用纯文本编辑器中转:复制凭证后先粘贴到记事本,再从记事本复制到WinSCP,这样BOM会被自动过滤掉。
备注:内容来源于stack exchange,提问作者kmiller
相关产品推荐
相关产品推荐

