开始学习操作系统了,把寒假学习的linux整理巩固一下
管理员的工作中,相当重要的一环就是管理帐号。在管理Linux主机的帐号时,我们必须先来了解一下linux到底是如何辨别每一个用户的
你的ID与帐号的对应就在/etc/passwd当中
[root@study lidengyin]# id lidengyin
uid=1000(lidengyin) gid=1000(lidengyin) groups=1000(lidengyin),10(wheel)
linux用户如果需要登录主机以获取shell的环境来工作时,他需要如何进行?
首先他必须在计算机前面利用tty1-tty6的终端提供的终端提供的登录接口,并且输入帐号和密码之后才能够登录。如果是通过网络的话那么用户至少就要需息ssh这个功能。那么你输入了用户名和密码,系统帮你做了什么呢?
[root@study lidengyin]# head -n 4 /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
adm:x:3:4:adm:/var/adm:/sbin/nologin
可以看出每一行用:隔开
1.账户名称。提供给对数自不敏感的人使用来的登录系统的,需要用来对应UID,如root的UID对应是0
2.密码,已经转移到/etc/shadow中
3.UID, 可用登录帐号UID是1000~60000
4.GID,这个与/etc/group有关,其实/etc/group与/etc/passwd差不多,只是用来规范祖名和GID的对应而已
5.用户信息说明栏
解释帐号的意义
6.家目录
这是用户的家目录
以上面为例,root的家目录在/root,所以root登录后,就会立刻跑到/root目录中。呵呵!如果你有个帐号使用空间特别大,你想要将帐号的家目录移动到去其他硬盘去,没错,可以在这个字段修改。默认用户家目录在/home/yourlDname
7.shell
我们在BASH中提到过很多次,用户登录之后就会获取一个shell来与系统的内核沟通以进行用户的操作任务。那么默认shell为何会选择bash?就是在这个字段指定的。
root:$6$NE7zSyDvPjjVaYV2$zFS9gkx2oPjr9KAHOXrCKnT4cYr.h822N0svE3PBoAiGAUkg.qz8fFvJyFZBsEHPnj82Mn1bgFmoxU7L6NMlk/::0:99999:7:::
bin:*:18078:0:99999:7:::
daemon:*:18078:0:99999:7:::
adm:*:18078:0:99999:7:::
基本上shadow同样以:作为分隔符,如果数一下就会发现共有9个字段,这9个字段的用途如下
1.帐号名称
必须与/etc/passwd相同
2.密码,这个密码才是真正的密码,为了避免密码被破解这个文件的默认权限是[–rw-------]或者[-----------],即只有root可以读写。
3.最近最近修改密码时间
1970年1.1距今的天数
[root@study lidengyin]# echo $(($(date +%s)/86400))
18330
[root@study lidengyin]# echo $(($(date +%s)/86400+1))
18331
[root@study lidengyin]#
86400为一天的秒数
4.密码不可被修改的天数
5.密码重新修改的天数
6.密码修改期限前的警告参数
7.密码过期之后的帐号宽限时间
8.帐号失效时间
9.保留
认识了与帐号有关的两个文件/etc/passwwd之后,你也许会觉得奇怪,那么用户组的文件在那呢?还有/etc/passwd的第四栏不是所谓的GID码,哪有是啥,呵呵,这就需要了解/etc/group 与/etc/gshadow
-/etc/group 的文件结构
[root@study lidengyin]# head -n 4 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
这个文件每一行代表一个用户组,也就是以冒号作为分隔符,工分为四栏,每一个字段的意义如下
1.组名,同样用来给人使用,基本上需要与第三个字段GID对应使用
2.用户组密码,通常不需要设置,这个设置通常是给用户管理员使用的,目前很少有这个机会设置用户组管理员,同样,密码已经移动到/etc/gshadow中
3.GID
就是用户组ID.我们/etc/passwd的第四个字段就是使用GID对应的用户组名,就是有这里对应出来的
4.此用户组支持的帐号名称
我们知道,一个帐号可以a加入多个用户组,如果某个帐号想要加入此用户组,将帐号填入这个字段即可。
距离来说我想讲lidengyin也加入root用户组,那么在第一行的最后面加上[lidengyin]即可,注意不要有空格,使其成为[root❌0:lidengyin]就可以
至于/etc/group的特色就在于第四栏,因为每个用户都可以拥有所个支持的用户组,这里可能有疑问:假如我加入多个用户组,那么我在作业的时候,到底是以那个用户组为准呢?下面我们来谈谈有效用户组的概念
注意:新版linux的/etc/group的第四个字段为空
-有效用户组(effective group)与初始用户组(initial group)
每个用户在他的/etc/passwd里面的第四栏有所谓的GID,那个GID就是所谓的初始用户组(initial group)。也就是说,当用户一登录系统,就会拥有这个用户组的相关权限。举例来说,我们上面提到lidengyin这个用户的 /etc/passwd与/etc/group还有/ etc/gshadow相关的内容如下:
[root@study lidengyin]# usermod -a -G users lidengyin
[root@study lidengyin]# grep lidengyin /etc/passwd /etc/gro
groff/ group group-
[root@study lidengyin]# grep lidengyin /etc/passwd /etc/group /etc/gshadow
/etc/passwd:lidengyin:x:1000:1000:lidengyin:/home/lidengyin:/bin/bash
/etc/group:wheel:x:10:lidengyin//次要用户组设置,安装时指定
/etc/group:users:x:100:lidengyin//次要用户组设置
/etc/group:lidengyin:x:1000://因为是初始用户组,所以第四栏位不需要输入帐号
/etc/gshadow:wheel:::lidengyin//次要用户组设置
/etc/gshadow:users:::lidengyin//次要用户组设置
/etc/gshadow:lidengyin:!::
初始用户组 /etc/group不需要在第四个字段写入用户名
但是非初始用户组的其他用户组就不可以了。举个例子来说,我们将lidengyin加入users这个用户组中,由于users这个用户组并非是lidengyin的初始用户组,因此,我必须要在/etc/group这个文件中找到users这一行,并且将lidengyin这个帐号加入第四栏,这样lidengyin才能加入users这个用户组。
那么这个例子中,因为我的lidengyin帐号同时支持lidengyin,wheel,users这都三个用户组,因此,再读取,写入,执行文件时,针对用户的部分,只要是users,wheel和lidengyin这三个用户组拥有的功能,lidengyin用户都额能拥有,者了解了码?
不过这是针对已经存在的文件而言,如果今天我建立一个新文件或者新目录,请问一下,新目录的用户组,是lidengyin,wheeel还是users?呵呵,这就要检查一下当时的有效用户组了(effective group)
如果我登录之后如何知道我所支持的用户组呢?很简单,直接输入groups就可以了。注意,groups有加s,结果向这样:
[lidengyin@study ~]$ groups
lidengyin wheel
有问题,没有显示users
在输出信息中,可以知道lidengyin同时属于lidengyin,wheel这两个用户组,而且第一个输出的用户组即为有效用户组(effective group)。yehjisuhishuo我的有效用户组时lidengyin,如果我以touch去新建一个文件,例如touch test, 那么这个文件的拥有者就是lidengyin,而用户组也是lidengyin
lidengyin@study ~]$ ls -l| test
[lidengyin@study ~]$ ls -l| grep test
-rw-rw-r--. 1 lidengyin lidengyin 0 Mar 9 12:27 test
这样是否可以了解有效用户组了呢?通常有效用户组的作用时新建文件,那么有效用户组是否能够变换?
[lidengyin@study ~]$ newgrp users
[lidengyin@study ~]$ groups
users wheel lidengyin
[lidengyin@study ~]$ touch test2
[lidengyin@study ~]$ ll test*
-rw-rw-r--. 1 lidengyin lidengyin 0 Mar 9 12:27 test
-rw-r--r--. 1 lidengyin users 0 Mar 9 13:40 test2
[lidengyin@study ~]$ exit
exit//注意退出newgrp环境
[lidengyin@study ~]$ touch test3
[lidengyin@study ~]$ ll test*
-rw-rw-r--. 1 lidengyin lidengyin 0 Mar 9 12:27 test
-rw-r--r--. 1 lidengyin users 0 Mar 9 13:40 test2
-rw-rw-r--. 1 lidengyin lidengyin 0 Mar 9 13:42 test3
此时lidengyin的有效用户组就成为users了,我们额外讨论newgrp这个命令,这个命令可以修改当前用户的有效用户组,而且是以另一个shell来执行这个功能,所以,以上例子来来说,lidengyin这个用户就是以另一个shell登录的,而且新shell基于lidengyin有效GID为users,如果以图例来看就如图:
虽然用户的环境配置不会有影响,但是用户的用户组权限将会被重新计算,
需要注意,由于是新货去一个shell,因此如果你想回到原来的环境,请输入exit
[lidengyin@study ~]$ head -n 4 /etc/gshadow
head: cannot open '/etc/gshadow' for reading: Permission denied
[lidengyin@study ~]$ su root
Password:
[root@study lidengyin]# head -n 4 /etc/gshadow
root:::
bin:::
daemon:::
sys:::
还是冒号分隔,氛围四个字端
好,!!既然要管理好账户,当然从新增和删除用户开始,下面我们分别来谈一谈如何新增,删除与修改用户的相关信息把
要如何在linux系统新增一个用户呢?呵呵!真是太简单了,我们登录系统时会输入(1)帐号和(2)密码
所以建立一个可用的帐号同样需要这两个数据。帐号可以使用useradd来新建,密码则是用passwd这个命令来新建。这两个命令执行方法如下
[root@study lidengyin]# useradd vbird1
[root@study lidengyin]# ll -d /home/vbird1/
drwx------. 3 vbird1 vbird1 78 Mar 9 14:18 /home/vbird1/
[root@study lidengyin]# grep vbird1 /etc/passwd /ect/group/ /etc/shadow
/etc/passwd:vbird1:x:1001:1001::/home/vbird1:/bin/bash
grep: /ect/group/: No such file or directory
/etc/shadow:vbird1:!!:18330:0:99999:7:::
[root@study lidengyin]# grep vbird1 /etc/passwd /etc/group/ /etc/shadow
/etc/passwd:vbird1:x:1001:1001::/home/vbird1:/bin/bash
grep: /etc/group/: Not a directory
/etc/shadow:vbird1:!!:18330:0:99999:7:::
[root@study lidengyin]# grep vbird1 /etc/passwd /etc/group /etc/shadow
/etc/passwd:vbird1:x:1001:1001::/home/vbird1:/bin/bash
/etc/group:vbird1:x:1001:
/etc/shadow:vbird1:!!:18330:0:99999:7:::
//系统默认会默认建立一个与帐号一模一样的用户组名
其实用户已经帮我们设置好了非常多的默认值,所以我们可以简单使用useradd帐号来建立用户。在centos这些默认值会帮我们处理一下几个选项:
[root@study lidengyin]# useradd -r vbird3
[root@study lidengyin]# ll -d /home/vbird3
ls: cannot access '/home/vbird3': No such file or directory
[root@study lidengyin]# grep vbird3 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird3:x:978:976::/home/vbird3:/bin/bash
/etc/shadow:vbird3:!!:18330::::::
/etc/group:vbird3:x:976:
[root@study lidengyin]#
系统帐号默认不会建立家目录
总计:会修改的目录
如果用userdel去删除一个帐号,且该帐号所属的初始用户组已经没有人隶属于该用户组,那就删掉这个用户组
[root@study lidengyin]# passwd vbird1
Changing password for user vbird1.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@study lidengyin]#
root果然是最伟大的人物,当我们设置用户密码时,可以用root来设置即可。
如果用户自己要该密码呢?
?包括root也是这样修改的
[lidengyin@study ~]$ su vbird1
Password:
[vbird1@study lidengyin]$ passwd
Changing password for user vbird1.
Current password:
New password:
BAD PASSWORD: The password is the same as the old one
passwd: Authentication token manipulation error
> ^C
[root@study lidengyin]# usermod -c "lidengyin's test" vbird1
[root@study lidengyin]# grep vbird1 /etc/passwd
vbird1:x:1001:1001:lidengyin's test:/home/vbird1:/bin/bash
[root@study lidengyin]# usermod -e "2020-12-31" vbird1
[root@study lidengyin]#
find / -user username
查出整个系统内属于username的文件,然后再加以删除。
id [username]
实例
[root@study lidengyin]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@study lidengyin]# id lidengyin
uid=1000(lidengyin) gid=1000(lidengyin) groups=1000(lidengyin),10(wheel),100(users)
[root@study lidengyin]#
OK!了解帐号的新增,删除,修改与查询之后,下面聊一聊用户组的相关内容
[root@study lidengyin]# groupadd group1
[root@study lidengyin]# grep group1 /etc/group /etc/gshadow
/etc/group:group1:x:1002:
/etc/gshadow:group1:!::
[root@study lidengyin]# groupmod -n group2 group1
[root@study lidengyin]#
[root@study lidengyin]# groupmod -n group2 group1
[root@study lidengyin]# groupdel group2
[root@study lidengyin]# groupdel vbird1
groupdel: cannot remove the primary group of user 'vbird1'
[root@study lidengyin]#
为什么vbird1不能删除?原因很简单,某个帐号(/etc/passwd)的初始化用户组使用该用户组。当然无法删除,否则vbird1这个用户登陆系统就会,就会找不到GID,如果要删除,你必须确认 /etc/passwd内的帐号内没有任何人使用该用户作为初始用户组才可以
所以你要:
如何让一般身份成为root呢?
su是一个简单的用户切换命令。它可以进行任何身份的转换!!
方法如下:
单纯使用su可以切换为root的身份,读取变量设置为非登录shell的方式
[root@study lidengyin]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@study lidengyin]# env | grep lidengyin
USERNAME=lidengyin
USER=lidengyin
PWD=/home/lidengyin
XDG_DATA_DIRS=/home/lidengyin/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
MAIL=/var/spool/mail/lidengyin
LOGNAME=lidengyin
PATH=/home/lidengyin/.local/bin:/home/lidengyin/bin:/home/lidengyin/.local/bin:/home/lidengyin/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin
单纯使用[su]不规范,一些功能也无法使用,所以切换身份切记使用一下方式
[lidengyin@study ~]$ su -
Password:
[root@study ~]# env | grep root
USER=root
PWD=/root
HOME=/root
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
MAIL=/var/spool/mail/root
LOGNAME=root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@study ~]#
[lidengyin@study ~]$ su - -c 'head -n 4 /etc/shadow'
Password:
root:$6$NE7zSyDvPjjVaYV2$zFS9gkx2oPjr9KAHOXrCKnT4cYr.h822N0svE3PBoAiGAUkg.qz8fFvJyFZBsEHPnj82Mn1bgFmoxU7L6NMlk/::0:99999:7:::
bin:*:18078:0:99999:7:::
daemon:*:18078:0:99999:7:::
adm:*:18078:0:99999:7:::
[lidengyin@study ~]$
好,那接下来,如果我是root或者其他人,想要切换成某些特殊的符号,可以使用方式来切换
[lidengyin@study ~]$ sudo useradd ldy
[sudo] password for lidengyin:
[lidengyin@study ~]$ passwd ldy
passwd: Only root can specify a user name.
[lidengyin@study ~]$ sudo passwd ldy
Changing password for user ldy.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[lidengyin@study ~]$ su -l ldy
Password:
[ldy@study ~]$ su -
Password:
[root@study ~]# id sshd
uid=74(sshd) gid=74(sshd) groups=74(sshd)
[root@study ~]# id sshd
uid=74(sshd) gid=74(sshd) groups=74(sshd)
[root@study ~]# su -l sshd
This account is currently not available.
[root@study ~]# finger sshd
bash: finger: command not found...
Failed to search for file: Cannot update read-only repo
[root@study ~]# exit
logout
[ldy@study ~]$ exit
logout
[lidengyin@study ~]$
sudo介绍完毕,总结一下他的用法
su - username
或者
su -l username
才会同PATH,USER,MAIL等变量都转换成新用户的环境
su - -c "命令串"
的方式来处理
相比于su需要了解新切换的用户密码,通常是root的密码,sudo的执行则只需要自己的密码即可。甚至可以不设需要密码即可执行sudo,。由于sudo可以让你以其他用户的身份执行命令,通常是root,因此并不是所有人都能够执行sudo,而是仅有规范到/etc/shdoers内的用户能够执行sudo这个命令。
[lidengyin@study ~]$ su -
Password:
[root@study ~]# sudo -u sshd touch /tmp/mysshd
[root@study ~]# ll /tmp/mysshd
-rw-r--r--. 1 sshd sshd 0 Mar 9 17:32 /tmp/mysshd
[root@study ~]#
sudo可以让你切换身份来执行某项任务,例如上面的两个范例,范例中我们使用sshd的权限去执行某项任务。要注意我们无法使用
su -sshd
去切换系统帐号,这个时候sudo真的是好用。
但是sudo默认仅有root能执行,为什呢么?
因为sudo的执行时这样的流程:
[root@study ~]# su - ldy
[ldy@study ~]$ /etc/shadow
-bash: /etc/shadow: Permission denied
[ldy@study ~]$ sudo /etc/shadow
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for ldy:
ldy is not in the sudoers file. This incident will be reported.
[ldy@study ~]$
root ALL=(ALL) ALL
ldy ALL=(ALL) ALL
有趣把?
其实visudo只是利用vi 将 /etc/sudoers文件调出来修改而已。这个文件设置其实很简单
如上图所示,如果你找到98行左右,看到的数据就是
root ALL=(ALL) ALL
ALL是个特殊的关键词,代表任何身份,主机和命令的意思。所以我们想要ldy可以进行任何身份的任何命令,就如同上表特殊字体写的那样,其实就是复制上述默认值那一行,再将root改成ldy即可,此时[ldy不论l来自那台主机登录,它可以切换身份成任何人,且可以进行系统上面的任何命令]。修改完请保存后退出vi,并且ldy登录系统后,进行一下命令测试:
[root@study ~]# su - ldy
[ldy@study ~]$ /etc/passwd
-bash: /etc/passwd: Permission denied
[ldy@study ~]$ sudo /etc/passwd
[sudo] password for ldy:
Sorry, try again.
[sudo] password for ldy:
sudo: /etc/passwd: command not found
[ldy@study ~]$ sudo cat /etc/shadow
root:$6$NE7zSyDvPjjVaYV2$zFS9gkx2oPjr9KAHOXrCKnT4cYr.h822N0svE3PBoAiGAUkg.qz8fFvJyFZBsEHPnj82Mn1bgFmoxU7L6NMlk/::0:99999:7:::
bin:*:18078:0:99999:7:::
daemon:*:18078:0:99999:7:::
adm:*:18078:0:99999:7:::
lp:*:18078:0:99999:7:::
%wheel ALL=(ALL) ALL
%代表后面接的是一个用户组之意,改完请保存后退出
实际案例如下
[root@study ~]# useradd ldy1
[root@study ~]# passwd ldy1
Changing password for user ldy1.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@study ~]# usermod -a -G wheel ldy1
[root@study ~]#
上面的命令会造成任何简爱如wheel这个用户组的用户,就能够使用sudo切换任何身份来执行任何命令,你当然也可以将wheel换成你自己想要的用户名。接下来,请切换身份成为ldy1试试sudo的运行
[root@study ~]# su - ldy1
[ldy1@study ~]$ sudo cat /etc/shadow
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for ldy1:
root:$6$NE7zSyDvPjjVaYV2$zFS9gkx2oPjr9KAHOXrCKnT4cYr.h822N0svE3PBoAiGAUkg.qz8fFvJyFZBsEHPnj82Mn1bgFmoxU7L6NMlk/::0:99999:7:::
bin:*:18078:0:99999:7:::
注意!
centos7开始已经默认开放了wheel用户组的全部权限
我现在到这里基本够用了
------------以后在继续深入学吃饭--------
最后实践