一. Linux系统用户配置文件/etc/passwd简介
Linux系统中的/etc/passwd文件,是系统用户配置文件。打开这个文件,可以看到其包含如下内容:
# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
syslog:x:104:108::/home/syslog:/bin/false
_apt:x:105:65534::/nonexistent:/bin/false
messagebus:x:106:110::/var/run/dbus:/bin/false
uuidd:x:107:111::/run/uuidd:/bin/false
ntp:x:108:114::/home/ntp:/bin/false
sshd:x:109:65534::/var/run/sshd:/usr/sbin/nologin
nginx:x:998:996:nginx user:/var/cache/nginx:/sbin/nologin
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
_chrony:x:110:119:Chrony daemon,,,:/var/lib/chrony:/bin/false
dancen:x:1000:1000::/home/dancen:
可以看出,/etc/passwd文件中存储的是一些系统用户信息,每行记录对应一个用户,包括root用户,以及普通用户dancen。
这里大家可能会有疑问,除了前面指出的两个用户之外,并没有为在系统中添加过其他用户,这里为什么会有这么多用户呢?
事实上,/etc/passwd包括了系统中所有用户的基本信息,除root用户之外,其中的大多数用户并非系统管理员手动添加的普通用户,而是系统或者其它软件正常运行所必需的用户,例如以下内容包含的分别是对应ssh、nginx、mysql的用户。
sshd:x:109:65534::/var/run/sshd:/usr/sbin/nologin
nginx:x:998:996:nginx user:/var/cache/nginx:/sbin/nologin
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
以nginx为例,查看nginx进程即可发现,nginx业务进程就是以用户“nginx”的身份运行的。
# ps -ef|grep nginx
root 10943 1 0 Jun30 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 10944 10943 0 Jun30 ? 00:05:13 nginx: worker process
nginx 10945 10943 0 Jun30 ? 00:05:37 nginx: worker process
nginx 10946 10943 0 Jun30 ? 00:05:42 nginx: worker process
nginx 10948 10943 0 Jun30 ? 00:05:45 nginx: worker process
这一类用户通常称为系统用户或伪用户。系统用户无法用来登录系统,但也不能随意删除,因为一旦删除,依赖这些用户运行的软件可能就无法正常运行了。
具体而言,/etc/passwd文件中的每行内容,以":"作为分隔符,可以划分为7个字段,每个字段含义如下:
用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell
以下是每个字段的具体解释。
用户名
即用户名称,用户名仅是为了方便用户记忆,Linux系统通过UID来识别用户身份,分配用户权限。/etc/passwd文件将易于记忆的用户名和UID关联起来。
密码
该字段表示密码,但密码字段并非存储真正的密码,"x"表示此用户设有密码,留空表示此用户没有密码。
在UNIX早期,正如/etc/passwd的文件名称的显性含义,这里保存的就是真正的经过加密的密码串,但由于所有程序都能读取此文件,这就增加了密码数据被窃取并破解的风险。如今,系统把真正的加密密码串放置在/etc/shadow文件中,/etc/shadow文件只有root用户有权浏览和操作。
如果对应用户的该字段留空,并且允许对应的用户登录系统,那么对应的用户只需要提供用户名而不用输入密码就可以登录系统。
UID
UID,也就是用户ID。是一个0~65535之间的数字,每个用户都有唯一的一个UID,Linux系统通过UID来识别不同的用户,不同范围的数字表示不同的用户身份,具体如下:
0:
超级用户。如果将多个用户的UID都修改为0,那么这些用户都会成为管理员账号。
1~499:
系统用户/伪用户。此范围的UID保留给系统使用。其中,1~99用于系统自行创建的账号;100~499分配给有系统账号需求的用户。
500~65535:
普通用户。
GID
Group ID,即组ID,表示用户初始组的组ID号,它对应着/etc/group文件中的一条用户组记录。和初始组相对应的用户组为附加组,以下是初始组和附加组的概念:
初始组:
每个用户的初始组只能有一个,通常就是在创建用户时指定所属的用户组。
附加组:
在初始组之外,用户可以加入多个其他的用户组,并拥有这些组的权限,这些用户组就是这个用户的附加组。
描述
记录用户的一些信息,例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。
主目录
用户的起始工作目录,它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行权限,其他用户对此目录的访问权限则根据具体情况设置。
例如,root超级管理员账户的主目录为/root,普通用户的主目录为/home/[userName]。
默认Shell
Shell就是Linux的命令解释器,是用户和Linux内核之间沟通的桥梁。用户登录Linux系统后,命令解释器Shell负责将用户的输入转换成系统可以识别的语言。
Linux系统中有多种不同的Shell实现,如sh、csh、bash、dash等。
sh
sh是UNIX最初使用的shell,并且在每种UNIX上都可以使用。
bash
bash是大多数Linux操作系统缺省的shell,并且将/bin/sh作为bash的符号链接。bash可以提供如命令补全、命令编辑和命令历史表等功能,有很友好的用户界面。
# cd /bin && ll sh
lrwxrwxrwx 1 root root 4 Sep 26 2014 sh -> bash
dash
有些Linux系统使用了dash作为默认Shell,并将/bin/sh指向它,以获得更快的脚本执行速度。如Debian,以及其继承者Ubuntu。
查看当前系统Shell:
# echo $0
bash
在我们的例子中,root用户的Shell为bash。普通用户的Shell字段为空,代表该用户使用的是系统默认的Shell,由于操作系统为Ubuntu,则用户dancen的默认Shell为dash。
root:x:0:0:root:/root:/bin/bash
dancen:x:1000:1000::/home/dancen:
默认Shell字段除了可以指定shell程序之外,还有一些特殊取值,有特殊意义,如:
ntp:x:108:114::/home/ntp:/bin/false
sshd:x:109:65534::/var/run/sshd:/usr/sbin/nologin
nginx:x:998:996:nginx user:/var/cache/nginx:/sbin/nologin
/sbin/nologin或者/usr/sbin/nologin:
禁止登录和su切换。
/bin/false:
禁止登录和su切换,并且不会有任何提示。
/usr/bin/passwd:
用户可以登录,但登录之后就只能修改自己的密码。
Shell字段不能随便写入其它的命令,如ls,系统不会识别这些命令,这个用户将无法登录。
二. Ubuntu默认Shell问题
问题描述
使用普通用户登录Ubuntu系统后,你可能会发现无法使用Tab键补全功能,同时,方向键、Backspace删除键等只会输出乱码。
$ ^[[C^[[C^[[C^[[C^[[C^[[D^[[D^[[D^[[D^[[D^[[D^[[D^H^H^H^H^H
而在将普通用户切换为root用户之后,一切恢复正常了。
正如前文所述,这是因为Ubunt系统普通用户默认的Shell程序为dash,而root用户的Shell程序为bash。由于dash不支持Tab健、方向键等,实际使用起来体验就是一坨屎。
解决方案
编辑系统用户配置文件/etc/passwd,修改对应用户的默认Shell字段,将用户的默认Shell程序由dash修改为bash,然后重新登录系统即可。
# vi /etc/passwd
root:x:0:0:root:/root:/bin/bash
......
dancen:x:1000:1000::/home/dancen:/bin/bash