LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4851|回复: 32

[tip] 使用中文用户名

[复制链接]
发表于 2008-10-6 22:09:42 | 显示全部楼层 |阅读模式
您有没有想过在 GNU/Linux 系统中使用中文用户名?

还是母语亲切,我们下面就使自己的系统支持中文用户名。

在中文环境下,如在 gnome-terminal 下,以 root 用户执行
  1. useradd -m 测试
复制代码
如果成功,是我火星,您不必看下去了。

如果您是熟练用户,完全可以用自己心爱的编辑器按/etc/passwd、/etc/group、/etc/shadow、/etc/gshadow格式手工建立中文用户名的用户,然后手工建立该用户的家目录,并设置适当权限,用passwd设置该用户的密码,如果您用 gdm 之类的登录系统,您会发现该用户可用。
这说明系统底层可以接受中文用户名。
唯一的障碍是useradd。

useradd 来自 shadow 软件包,这里使用 debian 软件仓库中的软件,很幸运 debian 提供了满足我们要求的补丁。
  1. wget -c http://ftp.debian.org/debian/pool/main/s/shadow/shadow_4.1.1.orig.tar.gz
  2. wget -c http://ftp.debian.org/debian/pool/main/s/shadow/shadow_4.1.1-5.diff.gz
  3. #如果你想要校验下载的软件包
  4. wget -c http://ftp.debian.org/debian/pool/main/s/shadow/shadow_4.1.1-5.dsc
  5. tar -xvf shadow_4.1.1.orig.tar.gz
  6. cat shadow_4.1.1-5.diff.gz | gunzip | patch -p0
  7. cd shadow-4.1.1/
  8. patch -p1 < debian/patches/506_relaxed_usernames
  9. #之后按照正常方法重新配置、编译、安装 shadow
复制代码
附件是上面提到的补丁。

此时,您已经可以建立中文用户名的用户。
再试试
  1. useradd -m 测试
  2. passwd 测试
复制代码
应当可以正常工作拉。

遗留问题:
使用中文作密码,无法通过 gdm 登录,可输入中文用户名,无法输入中文密码。
字符界面需中文支持软件。
中文用户名与您使用的编码有关。
与正统 *nix-like 系统不兼容,从不支持中文的系统无法直接远程登录(ssh/telnet)自己的机器。
单选投票, 共有 45 人参与投票
42.22% (19)
53.33% (24)
4.44% (2)
您所在的用户组没有投票权限

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2008-10-6 22:48:51 | 显示全部楼层
弱问:

1. 如果系统不带 gdm,如 LFS 的文字界面或 Debian 不带图型界面等,能本地登陆否?

2. 用户既然未登陆,编码是怎样设置呢?
回复

使用道具 举报

发表于 2008-10-6 23:14:52 | 显示全部楼层
是额, 没编码环境,没输入法。。。怎么登陆额。。。
回复

使用道具 举报

 楼主| 发表于 2008-10-7 11:21:50 | 显示全部楼层
Post by d00m3d;1891173
  1. 如果系统不带 gdm,如 LFS 的文字界面或 Debian 不带图型界面等,能本地登陆否?

字符界面,通过中文支持软件(zhcon、cce之类)应该可以做到,前提是中文支持软件要先于 agetty、login 运行。
youbest 的字符界面中文补丁不错,如果再有一个基于内核的中文输入法就更好拉。

图形界面的话,gdm + scim 是没问题的,我这里 gtk 程序默认绑定的中文输入法就是 scim,gdm 界面下可以直接用热键激活 scim,前提是执行 gdm 时要指明 中文 locale,比如在 /etc/init.d/rc.local 中添加:
  1. /usr/bin/env - LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8 /usr/sbin/gdm
复制代码

用别的 *dm 、输入法 的话,要额外添加输入法需要的环境变量。
Post by d00m3d;1891173
  2. 用户既然未登陆,编码是怎样设置呢?
编码一直是存在的,不做特殊处理,系统启动后默认的 locale 是 LANG=C LC_ALL=C,我们需要做的只是改变默认值,设置方法上面已给出例子。
回复

使用道具 举报

发表于 2008-10-7 11:44:52 | 显示全部楼层
可以给一个UID映射两个用户名。不能使用中文的时候就用英文的..
回复

使用道具 举报

 楼主| 发表于 2008-10-7 11:46:18 | 显示全部楼层
用 *dm 登录系统的话,还有另一种选择,配置登录界面显示允许登录的用户,gdm、kdm 均有该功能,此时,不需中文输入法。
回复

使用道具 举报

发表于 2008-10-7 16:39:04 | 显示全部楼层
难道按几个英文字母有那么难么?
回复

使用道具 举报

 楼主| 发表于 2008-10-8 01:21:52 | 显示全部楼层
经验证,字符界面暂无 简单、安全 方法使用中文用户名登录。

zhcon 安装配置简单,以其为基础修改较简单。
  1. wget -c http://superb-east.dl.sourceforge.net/sourceforge/zhcon/zhcon-0.2.5.tar.gz
  2. wget -c http://superb-east.dl.sourceforge.net/sourceforge/zhcon/zhcon-0.2.5-to-0.2.6.diff.gz
  3. tar -xvf zhcon-0.2.5.tar.gz
  4. zcat zhcon-0.2.5-to-0.2.6.diff.gz | patch -p0
  5. cd zhcon-0.2.5
  6. echo "#include <string.h>" >> src/display/fblinear4.h
  7. echo "#include <string.h>" >> src/display/fblinear8.h
  8. echo "#include <string.h>" >> src/basefont.h
  9. echo "#include <stdlib.h>" >> src/graphdev.h
  10. sed -i 's@PREFIX "/etc/zhcon.conf"@"/etc/zhcon.conf"@' src/zhcon.cpp
  11. ./configure --prefix=/usr --sysconfdir=/etc
  12. make
  13. make install
  14. mv /usr/bin/zhcon /bin/
复制代码

思路大体如下:
init -> openvt -> zhcon -> agetty -> login -> shell
以 root 用户执行
  1. openvt -c 8 -e -s -f -- zhcon --utf8
复制代码
可以直接在 虚拟控制台8 开启zhcon,直接得到一个可以显示中文的 root shell。
暂时无法激活输入法,原因暂不清楚。

需要修改 zhcon 的地方是使其接受型如上面 openvt 命令中 "-- zhcon --utf8" 这样的命令行参数,在程序中 fork->exec 指定的命令,使其可以用热键激活输入法。

最后替换 /etc/inittab 中 agetty 相关的行
  1. 1:2345:respawn:/sbin/agetty -I '\033(K' tty1 38400
复制代码
如下:
  1. 1:2345:respawn:/bin/openvt -c 8 -e -s -f -- /bin/zhcon --utf8 -- /sbin/agetty -I '\033(K' tty1 38400
复制代码

cce 也可做类似动作,可能更简单,其命令行下可以接受命令做参数,不需要像 zhcon 那样的修改,不过验证过程中无法在字符界面下激活输入法,X下倒是可以激活输入法。

PS:
字符界面使用 zhcon、cce 不是好主意,他们都是 suid 程序,存在安全问题。
图形界面建议使用 gdm,gdm 默认以 非特权用户gdm 身份运行,激活的输入法也以相同身份运行,较安全。
回复

使用道具 举报

发表于 2008-10-9 08:17:37 | 显示全部楼层
想法很不错的。不过,我觉得还要考虑到别的程序是否支持这个东西,除了登录好还有其他程序会用到这些数据的,mail/http/ftp 等服务认证也许都要用到(也许PAM已经支持了?)。当然,也许他们都支持,我也没研究过,只是提出我的看法而已。:)。
回复

使用道具 举报

 楼主| 发表于 2008-10-9 15:23:23 | 显示全部楼层
Post by 晨想;1891946
想法很不错的。不过,我觉得还要考虑到别的程序是否支持这个东西,除了登录好还有其他程序会用到这些数据的,mail/http/ftp 等服务认证也许都要用到(也许PAM已经支持了?)。当然,也许他们都支持,我也没研究过,只是提出我的看法而已。:)。

用户认证最底层与 libc 有关,首贴中手工添加中文用户部分说明 glibc 是支持中文用户名的。

gdm 使用 PAM,使用中文用户名登录很正常。

我的本意是在本地主机,或自己可以远程控制的主机使用中文用户名。
还没想过把范围扩展到服务器,这个应该有不少工作要做。

作为客户端,访问 http/ftp 正常。
做 http/ftp 服务器还没试过,理论上使用标准用户名是没问题的,至于中文用户名需要客户端支持才行。

mail地址如果出现中文会怎么样,还真没想过,不知有没有 RFC 文档描述这种情况。
姓名@domain、姓名@域名 不知大家看到这样的邮件地址怎么想。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表