说到用户管理,不得不先介绍一下linux和windows操作系统的区别。
我们平时使用windows系统,账号管理其实只有自己,自己打游戏、上网、学习、改密码等等,若账号名不是管理员admin,那么在安装软件的时候,可能提示一个管理员权限确认,总之一切都是那么的方便,因为你是一个人。
但是,对于初识linux系统的小白来说,一切都变得复杂了,多用户、做用户组、多任务,甚至是多个桌面,一下子升了一个维度。正因为系统本身设计的更复杂,作为linux的使用者也更加高效,并能充分利用计算机资源。最简单的例子,我们可以多个人同时登陆、同时操作,做各自的事情。
接下来,我们从用户概念、账号设置、权限管理、登录操作等方面进行讲解,一起深入学习linux系统的用户知识。
linux系统中对于账号而言,实际上就是ID,系统不关心名称本身,我们可以随便的起名字,只要不重复就可以。账号的列表存放在/etc/passwd下面:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
我们选择其中的一行来看,比如root,一共有七段,每段都由分号分开,具体代表意义如下:
root #用户名称,代表用户,帐号名称不许重复
x #密码,用户登录时需要
0 #用户ID,系统内部用于来识别不同的用户的
0 #组ID,分组的唯一标识
root #描述信息,解释用户的相关信息,对系统操作没有用处
/root #用户根目录,登陆后默认进入的目录
/bin/bash #用户登陆shell,可查看操作命令集
在这里需要注意几个知识点:
1. 用户名称root是超级管理员,由系统直接设置。
2. 由于系统中/etc/shadow专门存放密码,因此在这里会用字母“x”表示。若用户没有密码,则该字段为空;若是字符“*”,则表示该用户被查封,无法登陆。
3. 用户ID0代表系统管理员。如果我们创建了一个新用户,并将此字段设置为0,则该用户有管理员权限。
4. root的用户根目录是/root,其余账号的根目录在/home/username下面。
最初,用户的密码是直接存放在passwd文件中的,并且密码是被加过密的。但是,对于passwd文件任何用户都是可以进行查看的(可读的),而随着技术发展加密算法变得可被破解,最终导致了极大的安全隐患。
后来,使用专门的一个文件存储用户的密码,既保证了普通用户查看passwd的文件权限,有避免了密码数据被泄露。存放密码的文件是/etc/shadow,该文件只有系统管理员才能看到。
那么,我们来看一下这个文件:
root:$6$E1XEwUOf$.LHgImaeOwBqEIGd8S7kGJMRylUftAt/RwXJHaMz7mjn2FM9Zr52m0R.eYhYwGx1LYR4HYxSWzk7FgxhA.OPO0:16288:0:99999:7:::
bin:*:15240:0:99999:7:::
daemon:*:15240:0:99999:7:::
adm:*:15240:0:99999:7:::
lp:*:15240:0:99999:7:::
sync:*:15240:0:99999:7:::
shutdown:*:15240:0:99999:7:::
halt:*:15240:0:99999:7:::
mail:*:15240:0:99999:7:::
uucp:*:15240:0:99999:7:::
我们选择其中的一行来看,比如root,一共有九段,每段都由分号分开,具体代表意义如下:
root #用户名称,同/etc/shadow
$6$E1X**** #用户密码,加过密的密码(原始密码六个1)
16288 #上次改动密码的日期,按照unix时间戳为起始日期(1970年1月1日),1971年1月1日即为366
0 #密码不可被改动的天数,设置后要经过该天数后才可更改密码
99999 #密码在规定天数内必须更改,99999可以理解为永不更改
7 #密码变更期限提醒,默认设置为提前7天提醒用户即将到期
#账号失效期,超过此时间未修改密码,账号将暂时失效
#账号取消时间,超过此时间后,账号无法使用
#保留字段,暂时没有用处
在这里需要注意几个知识点:
1. 密码字段,第一个字符为“!”表示该用户被禁用,为“*”表示该用户不可以登录,前两个字符为“!!”表示禁用(一般创建完未设置密码时使用),为空表示登录时不需要密码。
2. 一般收费服务商,会通过设置账号取消时间字段,来实现用户收费使用的时间标准。
3. 密码在规定时间内未做修改而导致无法登陆,需要找管理员修改。
我们为什么需要用户组,假设这样一个场景,有多个人在同一台机器做A事情,有另一波人也在这台机器做B事情,做A和B事情时大家需要的权限各不相同。我们知道,linux系统中可以为每个用户设置不同的权限,若我们要分别对所有用户设置相应的权限,那么问题来了,若A小组需要修改某个权限,我们要一个个分别做修改,效率非常低效;而且,每次新添加一个成员,也要重新设置相应的权限。
基于以上的种种问题,linux系统提供了用户组这个概念:
用户组是权限的容器,用户组下的所有用户,可以继承所在组的权限
用户组存储在/etc/group下面,那么,我们来看一下这个文件:
root:x:0:
bin:x:1:bin,daemon
daemon:x:2:bin,daemon
sys:x:3:bin,adm
adm:x:4:adm,daemon
tty:x:5:
disk:x:6:
lp:x:7:daemon
mem:x:8:
我们选择其中的一行来看,比如bin,一共有四段,每段都由分号分开,具体代表意义如下:
bin #群组名称,群识别标志
x #群组密码
1 #组ID,系统识别群的唯一标识
bin,daemon #群组下的账号列表
在这里需要注意几个知识点:
1. 群组密码我们平时很少使用,只有在需要用群组登陆时才会设置。该密码也保存在/etc/shadow中。
2. 如果在root组里面,将某个用户名加入到账号列表字段中,则该账号的组就变成了root。
接下来,我们介绍用户管理相关的操作。刚才看到的几个文件都和用户相关,因此我们可以通过修改这几个文件的内容,来实现用户管理的操作。
但是,在没有特殊的要求下,我们一定要避免直接操作修改这些文件/etc/passwd、/etc/shadow、/etc/group。一旦改坏了,用户系统就会出现各种问题,甚至无法登陆。
那么,linux系统都有哪些常用的指令呢?
adduser 添加用户
passwd 修改密码。
chfn 修改用户资料。
chsh 更改用户的shell
chmod 更改用户的权限
chown 更改所有者
chgrp 更改用户组
sudo 临时提升为root权限
who 显示当前谁在使用
whoami 显示自己是谁
我们通过举例,来深入了解这些命令。
首先创建一个账号,用到adduser指令,该指令常用参数如下。
useradd [options] username
options:
1.-u :指定UID
2.-g :指定GID
3.-d :指定用户目录,默认是/home/username
4.-s :指定用户所在的shell环境
设置密码用到passwd指令,后面加用户名即可。
#账号目录在/opt/testfolder下
#指定账号id为1234
#组权限为root
root@localhost [~] useradd -u1234 -groot -d/opt/testfolder mytest
#查看创建用户的相关信息
root@localhost [~] grep mytest /etc/passwd
mytest:x:1234:0::/opt/testfolder:/bin/bash
#自动创建了testfolder目录
root@localhost [~] ls -l /opt/testfolder/
total 0
#刚创建完用户,密码为'!!',表示被禁用
root@localhost [~] grep mytest /etc/shadow
mytest:!!:16514:0:99999:7:::
#设置密码
root@localhost [~] passwd mytest
Changing password for user mytest.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
#设置后再看,账号禁用已被取消
root@localhost [~] grep mytest /etc/shadow
mytest:$6$dk71Vi/2$Rg.YGkUZVQbGbXj5AMJWhkGd91GLFxIWvvYBNj/.Gj1jzltbK.pQpTo8KlZjawAOugCUYxQiL27SYgNpQ2nSy/:16514:0:99999:7:::
至此,mytest账号创建完毕。
登陆mytest账号,我们可以修改个人信息,指令是chfn,该指令常用参数如下。
chfn [options]
options:
1.-f :设置真实姓名
2.-h :设置家庭电话号码
3.-o :设置办公室的地址
4.-p :设置办公室的电话号码
若不指定任何参数,则chfn指令会进入问答式界面。
Changing finger information for mytest.
Password:
Name []: ranshy
Office []: 夏之冰雪工作室
Office Phone []: 88888888
Home Phone []: 66666666
Finger information changed.
#查看修改后的信息
mytest@localhost [~] grep mytest /etc/passwd
mytest:x:1234:0:ranshy,夏之冰雪工作室,88888888,66666666:/opt/testfolder:/bin/bash
更改使用者的shell路径,指令是chsh,该指令常用参数如下。
chsh [options]
options:
1.-l :列出系统目前所有的shell
2.-s :修改自己的shell
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
#修改mytest的bash
root@localhost [~] chsh -s /bin/sh mytest
Changing shell for mytest.
Shell changed.
#再次查看mytest信息,bash目录已经变化
root@localhost [~] grep mytest /etc/passwd
mytest:x:1234:0:ranshy,夏之冰雪工作室,88888888,66666666:/opt/testfolder:/bin/sh
linux系统下的所有文件,对不同用户都是有不同权限的,而控制用户权限的是chmod指令。介绍chmod指令前,我们首先了解下文件和目录的相关权限。
mytest@localhost [~] touch file
mytest@localhost [~] ls -l
total 4
-rw-r--r--. 1 mytest root 0 Mar 20 14:09 file
drwxr-xr-x. 2 mytest root 4096 Mar 20 14:09 folder
这里,我们用mytest分别创建了一个文件和一个目录,通过ls -l指令我们可以看到他们的详细信息,这些信息一共有九个,我们以folder为例,具体描述如下:
drwxr-xr-x. #文件类型和文件权限,第一个字符是文件的类型标志,后9个为权限标志
2 #硬链接数
mytest #文件或目录的拥有者
root #文件或目录所属的分组
4096 #文件或目录的大小
Mar #创建月
20 #创建日
14:09 #创建具体时间
folder #文件或目录的创建名称
在这里,重点讲解文件类型以及权限,需要注意几个知识点:
1. 第一个字符代表文件类型,“-”表示普通文件,“d”表示目录,“b”表示块设备文件,“c”为字符设备文件,“l”表示文件链接。
2. linux文件权限有三种,即可读、可写、可执行,对应的就是rwx,没有权限则用字符“-”标识,对于目录而言可执行代表可以cd进入。
3. 而文件权限的又分为三组,因此这里由九个字符组成rwxr-xr-x,红色为文件拥有者权限,绿色为文件所属用户组的权限,黄色代表其它用户的权限,root拥有所有文件拥有者的权限。
4. 文件权限采用八进制设计,各个权限的值代表的数字为r(4)、w(2)、x(1)、-(0),例如folder目录权限rwxr-xr-x对应的数字为755。
理解了权限相关知识,我们开始真正学习chmod指令,chmod指令可以改变文件的权限,在安全隐私等方面都有很大的用途。
chmod指令非常简单,可以直接配合之前所说的八进制,来修改具体的文件或文件夹。
total 4
-rw-r--r--. 1 mytest root 0 Mar 20 14:09 file
drwxr-xr-x. 2 mytest root 4096 Mar 20 14:09 folder
#修改文件权限为755
mytest@localhost [~] chmod 755 file
#若想修改目录以及子目录,需要加-R进行递归
mytest@localhost [~] chmod -R 777 file
mytest@localhost [~] ls -l
total 4
-rwxr-xr-x. 1 mytest root 0 Mar 20 14:09 file
drwxrwxrwx. 2 mytest root 4096 Mar 20 14:09 folder
当然,我们也可以直接使用字符r、w、x来进行权限修改,使用u表示修改所有者权限,使用g表示修改组权限,其它用户(other)使用o来表示,而所有人(all)使用a来表示。使用“+”来表示添加权限,“-”表示减少权限,“=”表示授予权限。
mytest@localhost [~] chmod u+x file
#给组和其它用户减去读权限
mytest@localhost [~] chmod go-r file
#文件对所有人拒绝访问
mytest@localhost [~] chmod a-rwx file
#文件对其他人仅只读
mytest@localhost [~] chmod o=r file
更改文件的所属对象,指令是chown,该指令常用参数如下。
chown [options] user:group file/folder
options:
1.-R :递归执行,修改对象为目录时,子目录同样被修改
total 4
-rw-r--r--. 1 mytest root 0 Mar 20 14:09 file
drwxr-xr-x. 2 mytest root 4096 Mar 20 14:09 folder
#修改文件的用户为root,组为nobody
mytest@localhost [~] chown root:nobody file
#修改目录的组为nobody
root@localhost [~] chmod :nobody folder
root@localhost [~] ls -l
total 4
-rw-r--r--. 1 root nobody 0 Mar 20 14:09 file
drwxr-xr-x. 2 mytest nobody 4096 Mar 20 14:09 folder
chgrp指令为修改文件或文件夹的所属组,比chown指令更灵活一下。但是,一般情况下,我们只需要使用chown命令即可完成组更改的任务。
查看当前用户名,使用whoami指令。
root
查看当前谁在登陆当前系统,使用who指令。
root pts/0 2015-03-22 09:21 (222.70.230.236)
mytest pts/1 2015-03-22 10:29 (222.70.230.236)
sudo指令可以临时使用root权限,一般使用一般用户登陆,而需要以管理员身份临时操作时使用。
切换账号,使用su指令。
mytest@localhost [~] su root
Password:
root@localhost [~] whoami
root
提高linux服务器的账号安全级别,我们通常是禁止root账号直接远程连接(如ssh),而仅提供普通用户连接权限。普通用户连接后,再通过切换账号来获得root权限。
禁止root远程连接的方法,是通过修改/etc/ssh/sshd_config文件来实现,千万注意不是/etc/ssh/ssh_config文件。文件查找“#PermitRootLogin yes”,将前面的“#”去掉,短尾“Yes”改为“No”,并保存文件,重启sshd即可。
AddressFamily inet
PermitRootLogin no
root@localhost [~] service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
对于su指令,还有一个sudo的指令,该指令可以不需要关心具体的管理员名称和管理员密码,直接升级为管理员。这种用户需要授予其权限,才能执行sudo指令。
赋予一个用户root权限,有多种方法,这里介绍一种最常用的、推荐的方法。修改/etc/sudoers文件,找到root设置那一行,在下面添加类似内容,保存即可。若加入NOPASSWD,则切换管理员时不需要密码。
root ALL=(ALL) ALL
ranshy ALL=(ALL) ALL
mytest@localhost [~] sudo su
Password:
root@localhost [~] whoami
root
root@localhost [~] exit
exit
#增加NOPASSWD选项,不需要输入密码
mytest@localhost [~] vi /etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
ranshy ALL=(ALL) NOPASSWD: ALL
mytest@localhost [~] sudo su
root@localhost [~] whoami
root
另外还有几种授权普通用户为root的方法,比如修改/etc/passwd文件把用户ID修改为0。
至此,linux系统用户相关知识,总结就到这里。
Leave a Reply