Linux系统用户配置文件/etc/passwd简介以及Ubuntu默认Shell问题

38 篇文章 1 订阅

一. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值