Linux运维之用户管理、用户身份切换(包括用户权力的下放)及 Linux 主机上的用户信息传递

一、实验环境(rhel7.0版本)

主机环境:rhel7.0

各主机信息

主机名IP
server172.25.254.1

 

二、/etc/passwd文件,/etc/shadow文件,/etc/group文件,/etc/gshadow文件介绍

 

1、/etc/passwd文件(权限为644)

[root@server1 /]# ll -d /etc/passwd
-rw-r--r--. 1 root root 1950 May 16 14:46 /etc/passwd

[root@server1 /]# 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. 密码(早期UNIX系统的密码就是放在这字段上,但是因为这个文件的特性是所有的程序都能够读取,这样一来很容易造成密码数据被窃取,因此后来就将这个字段的密码数据改放到/etc/shadow中了,所以这里会看到一个【x】。)
  3. UID(用户标识符,下面通过表格详细介绍)
  4. GID(这个与/etc/group有关,其实/etc/group的概念与/etc/passwd差不多,只是它是用来规范组名与UID的对应而已)
  5. 用户信息说明栏(这个字段基本上没有什么重要用途,只是用来接时这个帐号的意义而已。不过,如果您要提供使用finger的功能时,这个字段可以提供很多的信息)
  6. 家目录(这是用户的家目录,以上面为例,root的家目录在/root,所以当root登录之后,就会立刻跑到/root目录里面。如果你有个帐号的使用空间特别大,你想要将该帐号的家目录移动到其他的硬盘去该怎么做?没有错,可以在这个字段进行修改。默认的用户家目录在/home/yourIDname)
  7. shell(当用户登录系统后就会获取一个shell来与系统的内核沟通以进行用户的操作任务。那为何默认shell会使用bash呢?就是在这个字段指定的。这里比较需要注意的是,有一个shell可以使帐号在登录时无法获得shell环境,那就是/sbin/nologin这个东西。这也可以用来制作纯pop邮件帐号的数据)
ID范围该ID用户特性

0(系统管理员)

当UID是0时,代表这个帐号是【系统管理员】,所以当你要让其他的帐号名称也具有root的权限时,将该帐号的UID改为0即可。这也就是说,一台系统上面的系统管理员不见得只有root,不过,很不建议有多个帐号的UID是0,容易让系统管理员混乱
1-999(系统帐号)

保留给系统使用的ID,其实除了0之外,其他的UID权限与特性并没有不一样。默认1000以下的数字留给系统作为帐号只是一个习惯。

由于系统上面启动的网络服务或后台服务希望使用较小的权限去运行,因此不希望使用root的身份去执行这些服务,所以我们就得要提供这些运行中程序的拥有者帐号才行。这些系统帐号通常是不可登录的,所以才会有/sbin/nologin这个特殊的shell的存在。

根据系统帐号的由来,通常这类帐号又大概被区分为两种:

  1. 1~200:由Linux发行版自性建立的系统帐号;
  2. 201~999:若用户有系统帐号需求时,可以使用的帐号UID。
1000-60000(可登录帐号)给一般用户使用。事实上,目前的Linux内核(3.10.x版)已经可以支持到4294967295(2^32-1)这么答的UID号码。

 

2、/etc/shadow文件(权限为000)

[root@server1 /]# ll -d /etc/shadow
----------. 1 root root 1143 May 16 12:47 /etc/shadow

[root@server1 /]# tail -n 4 /etc/shadow
postfix:!!:18028::::::
sshd:!!:18028::::::
tcpdump:!!:18028::::::
student:$6$T1dYrfEl$EAgXMcgdLkGdbMaoA7V0dD4KoFYJU2qfgDefnJYem83LkLvy8c5MlkZ1Oielr03JDTux4RBFMeAm3JHIQb5XM0:18031:1:2:3:4::

基本上,shadow同样以【:】作为分隔符,如果数一数,会发现共有九个字段,这九个字段的用途是这样的:

  • 账户名称(由于密码也需要与账户对应,因此,这个文件的第一栏就是账户,必须要与/etc/passwd相同才行)
  • 密码(这个字段内的数据才是真正的密码,而且是经过编码的密码(摘要)。你只会看到一些特殊符号的字母。需要特别留意的是,虽然这些加密过的密码难被破解,但是【很难】不等于【不会】,所以这个文件的默认权限是【-rw-------】或是【----------】,即只有root在可以读写。你得随时注意,不要不小心修改了这个文件的权限。另外,由于各种密码编码的技术不一样,因此不同的编码系统会造成这个字段的长度不相同。举例来说,旧式的DES、MD5摘要算法产生的密码长度就与目前常用的SHA不同。SHA的密码长度明显比较长一些。由于固定的摘要算法产生的密码是特定的,因此【当你修改这个字段之后,该密码就会失效(算不出来)】。很多软件通过这个功能,在此字段前加上!或*修改密码字段,就会让密码【暂时失效】
  • 最近修改密码的日期(这个字段记录了【修改密码那一天的日期】,不过,很奇怪呀,18031【18031的单位是秒】呢?这个是因为计算Linux日期的时间时以1970年1月1日作为1而累加的日期,1971年1月1日则为366。得注意一下这个数据,上述的18031指的就是2019-05-15这一天。值与想要之道某个日期的累计日数,可以使用如下的程序计算:)
[root@server1 /]# echo $(($(date --date="2019/05/15" +%s)/86400+1))
18031
上述命令中,2019/05/15为你想要计算的日期,86400为每一天的秒数,%s为1970/01/01以来的累积总秒数。由于bash仅支持整数,因此最终需要加上1补齐1970/01/01当天
  • 密码不可被修改的天数(与第三字段相比)(第四个字段记录了这个帐号的密码在最近一次被更改后需要经过几天才可以被修改。如果是0的话,表示密码随时可以修改,这个限制是为了怕密码被某些人一改再改而设计的。如果设置为20天的话,那么当你设置了密码之后,20天之内都无法再修改这个密码)
  • 密码需要重新修改的天数(与第三字段相比)(经常修改密码是个好习惯。为了强制要求用户修改密码,这个字段可以指定在最近一次更改密码后,在多少天数内需要再次修改密码才行。你必须在这个天数内重新设置你的密码,否则这个帐号的密码将会【变为过期特性】。如果这个字段的值设置为99999(计算为273年)的话,那就表示密码的修改没有强制性之意。)
  • 密码需要修改期限前的警告天数(与第五字段相比)(当帐号的密码有效期快要到的时候(第五子段),系统会根据这个字段的设置,发出【警告】信息给这个帐号,提醒它【再过n天你的密码就要过期了,请尽快重新设置你的密码】)
  • 密码到期后的帐号宽限时间(密码失效日)(与第五字段相比)(密码有效日期为【更新日期(第三个字段)】+【重新修改日期(第五个字段)】,过了该期限后用户依旧没有更新密码,那该密码就算过期了。虽然密码过期但是该帐号还是可以用来执行其他的任务,包括登录系统获取bash。不过如果密码过期了,那当你登录系统时,系统会强制要求你必须要重新设置密码才能登录继续使用,这就是密码过期特性。
  • 帐号失效日期(这个日期跟第三个字段一样,都是使用1970年以来的总天数。这个字段表示:这个帐号在此字段规定的日期之后,将无法再使用。就是所谓的【帐号失效】,此时不论你的密码是否过期,这个【帐号】都不能再被使用。这个字段会被使用通常在【收费服务】的系统中,你可以规定一个日期让该帐号不能再使用)
  • 保留(最后一个字段是保留的,看以后有没有新功能加入)

另外,由于Linux的新旧版本差异颇大,旧的版本(Centos 5.x以前)还活在很多服务器内,因此,如果你想要知道shadow是使用哪种加密的机制时,可以通过下面的方法去查询。

[root@server1 /]# authconfig --test | grep hashing
 password hashing algorithm is sha512

 

3、/etc/group文件(权限为644)

[root@server1 /]# ll -d /etc/group
-rw-r--r--. 1 root root 832 May 16 16:23 /etc/group

[root@server1 /]# head -n 4 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:

这个文件每一行代表一个用户组,也是以【:】作为字段的分隔符,共分为四栏,每一个字段的意义是:

  1. 组名(就是组名,同样用来给人使用,基本上需要与第三子段的UID对应)
  2. 用户组密码(通常不需要设置,这个设置是给【用户组管理员】使用,目前很少有这个机会设置用户组管理员。同样,密码已经移动到/etc/gshadow中,因此这个字段只会存在一个【x】而已)
  3. GID(就是用户组ID。我们/etc/passwd第四个字段使用的GID对应的用户组名,就是由这里对应出来的)
  4. 此用户组支持的账户名称(我们知道一个帐号可以加入多个用户组,如果某个帐号想要加入此用户组时,将该账户填入这个字段即可。举例来说,如果我们想要让dmtsai与alex也加入root这个用户组,那么在第一行的最后面加上【dmtsai,alex】,注意不要有空格,使其成为【root:x:0:dmtsai,alex】就可以)

请注意,新版的Linux中,初始用户组的用户群已经不会加入第四个字段了。例如我们知道root这个帐号的主要用户组为root,但是在上面的范例中,你已经不会看到root这个【用户】的名称在/etc/group的root那一行的第四个字段内,这点还请留意一下。

 

4、/etc/gshadow文件(权限为000)

[root@server1 /]# ll -d /etc/gshadow
----------. 1 root root 670 May 16 16:23 /etc/gshadow

[root@server1 /]# head -n 4 /etc/gshadow
root:::
bin:::
daemon:::
sys:::

这个文件内同样还是使用冒号【:】来作为字段的分隔符,而且你会发现,这个文件几乎与/etc/group一模一样。是这样没错,不过,要注意的大概就是第二个字段吧,第二个字段是密码栏,如果密码栏上面时是【!】或为空时,表示该用户组不具有用户组管理员。至于第四个字段也就是支持的帐号名称,这四个字段的意义为:

  1. 组名
  2. 密码栏,同样的,开头为!表示无合法密码,所以无用户组管理员
  3. 用户组管理员的帐号
  4. 有加入该用户组支持的所属帐号(与/etc/group内容相同)

 

三、添加用户——useradd

[root@server1 ~]# which useradd 
/usr/sbin/useradd
[root@server1 ~]# ll -d /usr/sbin/useradd 
-rwxr-x---. 1 root root 114064 Feb 12  2014 /usr/sbin/useradd

 

useradd [-u UID] [-g 初始用户组] [-G 次要用户组] [-mM] [-c 说明栏] [-d 家目录绝对路径] [-s shell] 使用者账户名
useradd -D

选项与参数:
-u:后面接的是UID,是一组数字,直接指定一个特定的UID给这个帐号。
-g:后面接的用户组就是上面提到的初始用户组,该用户组的GID会被放到/etc/passwd的第四个栏位内
-G:后面接的用户组则是该帐号还可加入的用户组,这个选项与参数会修改到/etc/group内
-M:强制,不要建立使用者家目录。(系统帐号默认值)
-m:强制,要建立使用者家目录。(一般帐号默认值)
-c:这个就是/etc/passwd的第五栏的说明内容,可以随便我们设置的。
-d:指定某个目录称为家目录,而不要使用默认值,务必使用绝对路径
-r:建立一个系统帐号,这个帐号的UUID会有限制。(参考/etc/login.defs)
-s:后面接一个shell,若没有指定则默认是/bin/bash。
-e:后面接一个日期,格式为[YYY-MM-DD]此选项可写入shadow第八位,亦即帐号失效日期的设置选项
-f:后面接shadow的第七栏位选项,指定密码是否会失效,0位立刻失效
    -1为永远不失效(密码只会过期而强制于登录时重新设置而已)
-D:查看useradd命令的默认设定值

 

1、useradd a     添加用户a(用户信息默认,默认的uid和gid相同)

监控界面(打开监控的命令: watch  -n  1  "tail  -n  3  /etc/passwd  /etc/group;echo ===;ls  -l  /home;echo ==="


 

2、useradd -u uid b    添加用户b(给定用户的uid)

监控界面(打开监控的命令: watch  -n  1  "tail  -n  3  /etc/passwd  /etc/group;echo ===;ls  -l  /home;echo ==="

 

3、useradd -g gid|组名 c    添加用户c(给定用户的gid,值的注意的是gid或组名必须存在)

监控界面(打开监控的命令: watch  -n  1  "tail  -n  3  /etc/passwd  /etc/group;echo ===;ls  -l  /home;echo ==="


 

4、useradd -G gid|组名 d   添加用户d(给定用户的附加组,值的注意的是gid或组名必须存在)

监控界面(打开监控的命令: watch  -n  1  "tail  -n  3  /etc/passwd  /etc/group;echo ===;ls  -l  /home;echo ==="

 

5、useradd -c 'String' e   添加用户e(给定用户的说明信息)

监控界面(打开监控的命令: watch  -n  1  "tail  -n  3  /etc/passwd  /etc/group;echo ===;ls  -l  /home;echo ==="

 

6、useradd -d 用户的家目录 f    添加用户f(给定用户的家目录)

监控界面(打开监控的命令: watch  -n  1  "tail  -n  3  /etc/passwd  /etc/group;echo ===;ls  -l  /home;echo ==="

 

7、useradd -s 用户给定的shell g     添加用户g(给定用户所使用的shell)

监控界面(打开监控的命令: watch  -n  1  "tail  -n  3  /etc/passwd  /etc/group;echo ===;ls  -l  /home;echo ==="

 

例如:useradd -s /sbin/nologin h       添加用户h(给定用户所使用的shell为/sbin/nologin,表示禁止用户a交互式登陆)

 

8、useradd -M i            创建用户i,并且默认不创建i这个用户的家目录

监控界面(打开监控的命令: watch  -n  1  "tail  -n  3  /etc/passwd  /etc/group;echo ===;ls  -l  /home;echo ==="

 

9、useradd -r j          创建系统帐号j,系统帐号默认不创建用户的家目录,并且uid在201到999之间

监控界面(打开监控的命令: watch  -n  1  "tail  -n  3  /etc/passwd  /etc/group;echo ===;ls  -l  /home;echo ==="

 

10、useradd -e 2019-05-20 k       添加用户k,并设置用户k的帐号失效期为2019-05-20

 

11、useradd -f 30 l         添加用户l,并指定用户l的密码失效日期为30天

第二个字段为!!,这表示用户l的密码还没有被设定。如果密码已经设定,则就会有一串加密过的数字;如果这一串加密过的数字前面加了!或*,则表示这个密码失效了。

 

12、useradd -D              查看useradd命令的默认设定值。该命令的结果与/etc/default/useradd文件中的内容是一致的

参数解释:

  • GROUP=100:新建帐号的初始用户组使用GID为100,针对用户组的角度有两种不同的机制,这两种机制分别是:
  1. 私有用户组机制:系统会建立一个与帐号一样的用户组作为初始用户组。这种用户组的设置机制会比较有保密性,这是因为用户都有自己的用户组,而且家目录权限将会设置为700(仅有自己可进入自己的家目录),使用这种机制将不会参考GROUP=100这个设置值,代表性的发行版有RHEL、Fedora、CentOS等
  2. 公共用户组机制:就是以GROUP=100这个设置值作为新建帐号的初始用户组,因此每个帐号都属于users(GID为100)这个用户组,且默认家目录通常的权限会是【drwxr-xr-x  ...  username  users  ...】,由于每个账户都属于users用户组,因此大家都可以共享家目录中的数据,代表发行版入SUSE等。
  • HOME=/home:用户家目录的基准目录(basedir)。用户的家目录通常是与帐号同名的目录,这个目录将会放置在此设置值的目录后,所以a用户的家目录会在/home/a。
  • INACTIVE=-1:密码过期后是否会失效的设置值。shadow文件的第七个字段的设置值将会影响到密码密码过期后,在多久时间内还可以使用就密码登录,这个选项就是在指定该天数。如果是0代表密码过期立刻失效;如果是-1则代表密码永远不会失效;如果是数字如30,则表示过期30天后才失效
  • EXPIRE=:帐号失效日期。就是shadow文件内的第八字段,你可以直接设置帐号在哪个日期后就直接失效,而不会里会密码的问题,通常不会设置此选项,但如果是付费的会员制系统,或许这个字段可以设置。
  • SHELL=/bin/bash:默认使用的shell程序文件名。系统默认的shell就写在这里。假如你的系统为邮件服务器,你希望每个帐号都只能使用手法邮件功能,而不允许用户登录系统获取shell,那么可以将这里设置为/sbin/nologin,如此一来,新建的用户默认就无法登录,也免去后续使用usermod进行修改的操作。
  • SKEL=/etc/skel:用户家目录参考基准目录。这个东西就是指定用户家目录的参考基准目录,例如上面创建的用户a的家目录/home/a内的各项数据(隐藏文件),都是/etc/skel所复制过去的,所以,未来如果我想要新增用户时,该用户的环境变量~/.bashrc设置妥当的话,您可以到/etc/skel/.bashrc去编辑一下,也可以建立/etc/skel/www这个目录,那么未来新增用户后,在它的家目录下就会有www那个目录了。
  • CREATE_MAIL_SPOOL=yes:建立用户的mailbox。你可以使用【ll  /var/spool/mail/a】看一下,会发现有这个文件的存在,这就是用户的邮箱。

 


注意:
(1)3和4两行代码中,给出的gid|组名必须存在,如果不存在,则要添加组;
(2)1,2,5,6,7代码中,添加用户,不仅仅生成用户,也会生成相同名字的组
(3)3和4的区别在于:3生成的用户,不会生成相应的组;4生成的用户,会生成相应的组。
(4)五个文件:/etc/passwd——用户的密码信息   /etc/group——用户的组信息   /etc/shadow ——用户的密码认证信息   /etc/gshdow——用户组的密码认证信息 /etc/skel——用户的骨架文件

(5)监控代码:watch - n 1 "tail -n 3 /etc/passwd /etc/group;echo====;ls -l /home;echo===="
这行代码表示的是:每隔1秒监控/etc/passwd 和/etc/group文件的最后3行以及/home目录下的文件的详细信息,并打印出来,其中echo相当于print
(6)查看系统所有的shell:cat  /etc/shells
(7)添加完用户之后会在/home目录下自动创建相应的目录。如果不指定用户的家目录,那么生成的目录名与目录名相同;如果指定了用户的家目录,那么生成的目录名就是指定的用户的家目录的名字。
(8)一个组下面可以有多个用户,这多个用户的初始组gid可以和该组的gid不同。

(9)查看/etc/shadow文件中的默认设定值

[root@server1 /]# grep -v ^# /etc/login.defs | sed -n '/^$/!p' 
MAIL_DIR	/var/spool/mail      <==使用者默认邮箱放置目录
PASS_MAX_DAYS	99999                <==/etc/shadow内的第5栏,多久需要修改密码日期
PASS_MIN_DAYS	0                    <==/etc/shadow内的第4栏,多久不可重新设置密码日数
PASS_MIN_LEN	5                    <==密码最短的字符长度,已被pam模块替换,已经弃用该参数
PASS_WARN_AGE	7                    <==/etc/shadow内的第6栏,过期前会警告的天数
UID_MIN                  1000        <==使用者最小的UID,意即小于1000的UID为系统保留
UID_MAX                 60000        <==使用者能够用的最大UID
SYS_UID_MIN               201        <==保留给使用者自行设置的系统帐号最小值UID
SYS_UID_MAX               999        <==保留给使用者自行设置的系统帐号最大值UID
GID_MIN                  1000        <==使用者自定义用户组的最小GID,小于1000为系统保留
GID_MAX                 60000        <==使用者自定义用户组的最大GID
SYS_GID_MIN               201        <==保留给使用者自行设置的系统帐号最小值GID
SYS_GID_MAX               999        <==保留给使用者自行设置的系统帐号最大值UID
CREATE_HOME	yes                  <==在不加-M及-m时,是否主动建立使用者家目录
UMASK           077                  <==使用者家目录建立的umask,因此权限会是700
USERGROUPS_ENAB yes                  <==使用userdel删除时,是否会删除初始用户组
ENCRYPT_METHOD SHA512                <==密码加密的机制使用的是SHA-512

要注意的是:系统设置一个帐号UID时,它是(1)先参考UID_MIN设置值获取最小数值;(2)由/etc/passwd查找最大的UUID数值,将(1)与(2)相比,找出最大的那个再加1就是新帐号的UID了。比如,我们已经做出UID为2000的用户b,如果再使用【useradd  c】时,用户c的UID为2001。所以中间的1000-1999的号码就空下来了。


 

四、删除用户——userdel

[root@server1 ~]# which userdel 
/usr/sbin/userdel
[root@server1 ~]# ll -d /usr/sbin/userdel 
-rwxr-x---. 1 root root 80320 Feb 12  2014 /usr/sbin/userdel

 

userdel命令的功能太简单了,目的在删除用户的相关数据,而用户的数据有:

  • 用户账户/密码相关参数:/etc/passwd、/etc/shadow
  • 用户组相关参数:/etc/group、/etc/gshadow
  • 用户个人文件数据:/home/username、/var/spool/mail/username
userdel -r username

选项与参数:
-r:连同使用者的家目录一起删除

 

1、userdel -r a     删除a用户(-r表示:删除该用户下的所有信息)


注意:
删除用户时,同时也删除了与该用户同名的组,同时也删除了/home目录下相应的目录

  1. 一般而言,如果帐号只是【暂时不启用】的话,那么将/etc/shadow里面的帐号失效日期(第八字段)设置为0就可以让该帐号无法使用,但是所由跟该帐号有关的数据都会留下来。
  2. 使用userdel的时机通常是【你真的确定不要让该用户在主机上面使用任何数据了】
  3. 如果想要将某个帐号完整删除,最好在执行userdel  -r  username之前,先用【find  /  -user  username】查出整个系统内属于username的文件,然后再加以删除吧!

 

五、用户信息的修改——usermod

[root@server1 ~]# which usermod 
/usr/sbin/usermod
[root@server1 ~]# ll -d /usr/sbin/usermod 
-rwxr-x---. 1 root root 113792 Feb 12  2014 /usr/sbin/usermod

 

我们可以到/etc/passwd和/etc/shadow文件中修改相应字段的数据。当然也可以使用命令usermod进行修改。

usermod [-cdegGalsuLU] username

选项与参数:
-c:后面接帐号的说明,即/etc/passwd第五栏的说明栏,可以加入一些帐号的说明
-d:后面接帐号的家目录,即修改/etc/passwd的第六栏
-e:后面接日期,格式是YYYY-MM-DD,也就是/etc/shadow内的第八个栏位的内容
-f:后面接天数,为shadow的第七栏位
-g:后面接初始用户组,修改/etc/passwd的第四个栏位,亦即是GID的栏位
-G:后面接次要用户组,修改这个使用者能够支持的用户组,修改的是/etc/group
-a:与-G合用,可【增加次要用户组的支持】而非【设置】
-l:后面接账户名称,亦即修改账户名称,/etc/passwd第一栏
-s:后面接shell的实际文件,例如/bin/bash或/bin/sh等。
-u:后面接UID数字,即/etc/passwd第三栏的数据
-L:暂时将使用者的密码冻结,让它无法登录,其实仅该/etc/shadow密码栏    ##同passwd -l
-U:将/etc/shadow密码栏的感叹号(!)拿掉,解锁。                    ##同passwd -u

 

1、usermod -c 'String1' b          把用户b的说明信息修改为'String1'

 

2、usermod -d 用户的家目录1 b       把用户b的家目录修改为家目录1

但实际的家目录仍然为/home/b目录。

 

3、usermod -e 2019-05-20 b      修改b用户的帐号失效日期为2019-05-20

 

4、usermod -f 20 b     设置b用户的密码失效期为20天。即非活跃天数

 

5、usermod -g gid1|组b b      把用户b的gid修改为gid1

 

6、usermod -G gid1|组d b      把用户b的附加组改为组id为gid1的用户,或者d组(默认显示两个组)

 

7、usermod -aG gild1|组d  b      把用户b的附加组改为组id为gid1的用户,或者d组(可以显示多个组)

 

8、usermod -l bbbbbb  b     把用户b的名字修改为bbbbbb(只是修改了用户名而已,别的所有信息都没有发生变化)

 

9、usermod -s shell1 bbbbb     把用户bbbbbb的shell修改为shell1

 

10、usermod -u uid1 bbbbbb       把用户b的uid修改为uid1

 

11、usermod -L bbbbbb 或 passwd -l bbbbbb    把用户bbbbbb锁定(冻结帐号)

 

12、usermod -U a 或 passwd -u a      把用户a解锁(解锁帐号)

 


注意:
(1)2命令虽然看到的监控里面的家目录发生了变化,但实际上在/home目录下并没有新建出来相应的文件夹
(2)6命令,如果一个用户不属于其他组,那么第一次执行【6】命令,会给这个用户添加到指定的其他组;第二次执行【6】命令相当于修改这个用户所在的刚刚制定的组,那么原先所在的那个组就消失了;如果这个用户本身就属于某个其他组,那么【】6命令就是修改这个用户所在的其他组,那么原先的那个组就消失了
(3)而【7】命令与【6】命令是有区别的,【7】命令是不改变用户所在的其他组,另外给其添加到某它组中。

(4)添加的用户会在/home目录下新建相应的文件夹,但是添加的组不会在/home下新建相应的文件夹
(5)usermod不会改变/home下的相应文件夹。


 

六、修改,设置用户的密码——passwd和chage

 

1、passwd命令

[root@server1 ~]# which passwd
/usr/bin/passwd
[root@server1 ~]# ll -d /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27832 Jan 30  2014 /usr/bin/passwd

 

passwd:修改密码

passwd [--stdin] [帐号名称]       <==所有人均可使用来改自己的密码
passwd [-l] [-u] [--stdin] [-S] [-n 天数] [-x 天数]  [-w 天数] [-i 天数] 帐号名称   <==root功能
选项与参数:
--stdin:可以通过来自前一个管道的数据,作为密码输入,对shell脚本有帮助
-l:是Lock的意思,会将/etc/shadow第二栏最前面加上!使密码失效。
-u:与-l相比,是Unlock的意思
-S:列出密码相关参数,即shadow文件内的大部分信息
-n:后面接天数,shadow的第4栏位,永久不可修改密码天数
-x:后面接天数,shadow的第5栏位,多久内必须要修改密码
-w:后面接天数,shadow的第6栏位,密码过期前的警告天数
-i:后面接天数,密码过期的非活跃天数

 

(1)如果登录的是root用户,那么既可以为root用户修改密码,也可以为普通用户修改密码。

 

【1】、输入命令:passwd—为root用户修改密码

 

【2】、输入命令:passwd student—为student用户修改密码

 

(2)但是如果登录的是普通用户,那么只能修改自己的密码(但是passwd命令后面不能跟用户名,并且密码的位数要求大于8位),既不能修改普通用户的密码,也不能修改root用户的密码。

 


补充:如何非交互式修改用户的密码

<1>如果登陆的是root用户,那么既可以为root用户修改密码,也可以为普通用户修改密码。

 

echo   student   |  passwd  --stdin  student           修改student用户的密码为student

 

echo   redhat   |  passwd  --stdin  root           修改root用户的密码为redhat

 

<2>但是如果登录的是普通用户,那么只能修改自己的密码(但是passwd命令后面不能跟用户名,并且密码的位数要求大于8位),既不能修改普通用户的密码,也不能修改root用户的密码。


 

(3)passwd的一些参数

 

【1】、passwd   -S     student         查看student用户的密码信息 (显示PS)

 

【2】、passwd  -l   student           锁定student用户的账号(显示LK)        

 

【3】、passwd   -u   student        解锁student用户的账号(显示PS)

 

【4】、passwd  -n  1   student       设置student用户密码最短有效期为1,即永远不可修改密码的天数为1

 

【5】、passwd  -x  2  student        设置student用户密码最长有效期为2,即2天内必须修改密码

 

【6】、passed  -w  3  student        设置student用户密码的警告期为3

 

【7】、passwd  -i   4   student       设置student用户密码的非活跃天数为4(非活
                                          跃天数是指,密码到期后,还能用的天数)

 

【8】、passwd  -d   student           删除student用户密码(显示NP)

 

2、用户认证信息的控制——chage命令

[root@server1 ~]# which chage 
/usr/bin/chage
[root@server1 ~]# ll -d /usr/bin/chage 
-rwsr-xr-x. 1 root root 64184 Feb 12  2014 /usr/bin/chage

 

chage [-ldEImMW] 账户名

选项与参数:
-l:列出该帐号的详细密码参数
-d:后面接日期,修改shadow第三栏位(最近一次修改密码的日期),格式YYYY-MM-DD
-E:后面接日期,修改shadow第八栏位(帐号失效i日),格式YYYY-MM-DD
-I:后面接天数,修改shadow第七栏位(密码失效日期)
-m:后面接天数,修改shadow第四栏位(密码最短保留天数)
-M:后面接天数,修改shadow第五栏位(密码多久需要进行修改)
-W:后面接天数,修改shadow第六栏位(密码过期前警告日期)

 

1、chage -l student      查看student用户的密码的详细信息

 

2、chage -d YYYY-MM-DD student       修改student用户的最近一次修改密码日期为YYYY-MM-DD

 

3、chage -E YYYY-MM-DD student        修改student用户的账户过期时间为YYYY-MM-DD

 

4、chage -I 4 student 或 passwd -i 4 student    修改student用户密码的非活跃天数(用户密码到期后还能使用的天数)

 

5、chage -m 8 student 或 passwd -n 1 student    修改student用户密码的最短有效期为8


 

6、chage -M 2 student 或 passwd -x 2 student    修改student用户密码的最长有效期为2


 

7、chage -W 3 student 或 passwd -w 3 student    修改student用户密码的警告期

 

 

6、用户在第一次登录时,强制它们一定要修改密码后才能够使用系统资源           
chage -d 0 student 


[root@server1 ~]# chage -d 0 student
[root@server1 ~]# chage -l student   #此时帐号的密码建立时间会被该为1970/01/01,所以会有问题
Last password change					: password must be changed   
Password expires					: password must be changed
Password inactive					: password must be changed
Account expires						: Jun 20, 2020
Minimum number of days between password change		: 8
Maximum number of days between password change		: 16
Number of days of warning before password expires	: 5

[root@server1 ~]# su - student
Last login: Thu May 16 16:05:48 CST 2019 on pts/1
[student@server1 ~]$ su - student   #尝试以student用户的身份登录的情况
Password: 
You are required to change your password immediately (root enforced)
Changing password for student.
(current) UNIX password:    <==这个帐号被强制要求必须要改密码
New password: 
BAD PASSWORD: The password is shorter than 8 characters
New password: 
Retype new password: 
Last login: Fri May 17 11:06:57 CST 2019 on pts/0
Last failed login: Fri May 17 11:07:53 CST 2019 on pts/0
There were 3 failed login attempts since the last successful login.
[student@server1 ~]$ logout
[student@server1 ~]$ logout


[root@server1 ~]# chage -l student
Last password change					: May 17, 2019   <==帐号密码最近一次修改日期改为了这次修改密码的当日
Password expires					: Jun 02, 2019
Password inactive					: Jun 10, 2019
Account expires						: Jun 20, 2020
Minimum number of days between password change		: 8
Maximum number of days between password change		: 16
Number of days of warning before password expires	: 5

 

七、用户功能——id、chfn和chsh

useradd、usermod、userdel都是系统管理员所能够使用的命令,如果我是一般身份用户,那么我是否除了密码之外,就无法修改其他的数据?当然不是。这里我们介绍几个一般身份用户常用的帐号数据修改与查询命令

 

1、——用户id信息的查看(id)

[root@server1 ~]# which id
/usr/bin/id
[root@server1 ~]# ll -d /usr/bin/id
-rwxr-xr-x. 1 root root 41440 Jan 25  2014 /usr/bin/id

 

id这个命令可以查询某人或自己的相关UID/GID等信息

 

1、id        查看root自己的相关ID信息。即如果后面不接用户名,则默认就是当前登录的用户

上面信息其实是同一行数据,包括显示UID/GID以及支持的所有用户组。

至于后面那个context=...则是SELINUX的内容,先不要理会它

 

2、id root            查看root用户的ID信息,并且不显示SELINUX的内容

 

3、id  student     查看用户student的id信息(包括uid、gid、groups,其中groups可以有多个)

 


 

4、id -a student      查看用户student的所有信息(该命令同2,3)

 

5、id -u student      查看用户student的uid信息


 

6、id -g student        查看用户student的初始组的gid信息


 

7、id -G student       查看用户student的所有组的gid信息

 

2、chfn命令

chfn [-foph] [账户名]

-f:后面接完整的大名
-o:您办公室的房间号码
-p:办公室的电话号码
-h:家里的电话号码
[student@server1 ~]$ chfn 
Changing finger information for student.
Name []: student             <==输入你想要呈现的全名
Office []: student           <==办公室号码
Office Phone []: student     <==办公室电话
Home Phone []: student       <==家里电话号码

Password:                    <==确认身份,所以输入自己的密码
Finger information changed.


[student@server1 ~]$ grep ^student: /etc/passwd   #修改了student用户的passwd的第五栏
student:x:1000:1000:student,student,student,student:/home/student:/bin/bash

这个命令说实在的,除非是你的主机有很多用户,否则倒真是用不着这个程序。不过还是可以自己玩一玩,尤其是用来提醒自己的相关数据。

 

3、chsh命令

chsh就是chage  shell的简写

chsh [-ls]

选项与参数:
-l:列出目前系统上面可用的shell,其实就是/etc/shells的内容
-s:设置修改自己的shell。

 

1、chsh -l        列出系统中所有的shell

 

2、chsh -s /bin/csh student       修改student用户的shell为/bin/csh

 


[student@server1 ~]$ ll -d /etc/passwd
-rw-r--r--. 1 root root 2328 May 17 11:43 /etc/passwd

不论是chfn还是chs,都能够让一般用户修改/etc/passwd这个系统文件(权限是644)。所以你猜猜这两个文件的权限是什么,一定是SUID的功能。

[student@server1 ~]$ ll -d $(which chfn)
-rws--x--x. 1 root root 23960 Mar 28  2014 /bin/chfn
[student@server1 ~]$ ll -d $(which chsh)
-rws--x--x. 1 root root 23856 Mar 28  2014 /bin/chsh

 

八、有效与初始用户组,groups,newgr

还记得每个用户在/etc/passwd里面的第四栏有所谓的GID吧,那个GID就是所谓的【初始用户组】。也就是说,当用户一登录系统,立刻就会拥有这个用户组的相关权限。举例来说,我们创建一个用户xin,然后添加xin用户的次要用户组,再查看该用户的/etc/passwd与/etc/group还有/etc/gshadow的相关内容

[root@server1 ~]# useradd xin
[root@server1 ~]# id xin
uid=6667(xin) gid=6667(xin) groups=6667(xin)
[root@server1 ~]# usermod -aG e xin
[root@server1 ~]# usermod -aG f xin
[root@server1 ~]# usermod -aG g xin
[root@server1 ~]# id xin
uid=6667(xin) gid=6667(xin) groups=6667(xin),2003(e),2004(f),2005(g)


[root@server1 ~]# grep xin /etc/passwd /etc/group /etc/gshadow
/etc/passwd:xin:x:6667:6667::/home/xin:/bin/bash
/etc/group:e:x:2003:xin
/etc/group:f:x:2004:bbbbbb,xin
/etc/group:g:x:2005:bbbbbb,xin
/etc/group:xin:x:6667:
/etc/gshadow:e:!::xin
/etc/gshadow:f:!::bbbbbb,xin
/etc/gshadow:g:!::bbbbbb,xin
/etc/gshadow:xin:!::

仔细看上面这个表格,在/etc/passwd里面,xin这个用户所属的用户组为GID=6667,查找一下/etc/group得到6667是那个名为xin的用户组,这就是初始用户组,用户一登录就会主动获取,不需要在/etc/group的第四个字段写入该帐号。

但是非初始用户组的其他用户组可就不同了,举上面的这个例子来说,我将xin加入e、f、g用户组中,由于e、f、g用户组并非是xin的初始用户组,因此,我必须在/etc/group这个文件中,分别找到e、f、g这即行,并且将xin这个帐号加入第四栏,这样xin才能够加入e、f、g这几个用户组。

那么在这个例子当中,因为我的xin帐号同时支持xin、e、f、g这四个用户组,因此,在读取、写入、执行文件时,针对用户组部分,只要是xin、e、f、g这四个用户组拥有的功能,xin这个用户都能够拥有。不过针对已经存在的文件而言,如果今天我要建立一个新的文件或是新的目录,请问一下,新文件的用户组是xin、e、f还是g呢?这就要检查一下当时的有效用户组了。

 

1、有效和支持用户组的观察命令——groups

[root@server1 ~]# su - xin
[xin@server1 ~]$ groups    第一个输出的用户组就是有效用户组,通常有效用户组的作用是新建文件
xin e f g



[xin@server1 ~]$ touch file
[xin@server1 ~]$ ll -d file    file文件的所属组是xin
-rw-rw-r--. 1 xin xin 0 May 17 12:37 file

 

2、有效用户组的切换——newgrp

[xin@server1 ~]$ newgrp e   你想要切换的用户组必须是你已经有支持的用户组


[xin@server1 ~]$ touch file2
[xin@server1 ~]$ ll -d file2    #file2的所属组是e
-rw-r--r--. 1 xin e 0 May 17 12:39 file2

[xin@server1 ~]$ exit      记得退出newgrp环境(因为newgrp命令是以一个shell来提供这个功能的)
[xin@server1 ~]$ 

 

九、添加组——groupadd

groupadd [-g gid] [-r] 用户组名称

选项与参数:
-g:后面接某个指定的GID,用来直接设置某个GID
-r:建立系统用户组,与/etc/login.defs内的GID——MIN有关

 

1、groupadd chen        建立chen这个用户组

用户组的GID也是会由1000以上最大GID+!来决定

 

2、groupadd -g gid hello    添加组hello,组id为指定的gid  

 

3、groupadd -r world        建立系统用户组world

 

十、用户组信息的修改——groupmod

groupmod [-g gid] [-n group_name] 用户组名

选项与参数:
-g:修改既有的GID数字
-n:修改既有的用户组名称

 

1、groupmod -g gid1 -n mygroup_chen chen     将chen这个用户组的组id修改为gid1,并将名字修改为mygroup_chen

 

十一、删除组——groupdel     

groupdel [groupname]

 

1、groupdel world     删除world这个组

 

2、groupdel xin       删除xin这个用户组

 

为什么world可以删除,但是xin就不能删除呢?原因很简单,【有某个帐号(/etc/passwd)的初始用户组使用该用户组】。如果查看一下,你会发现/etc/passwd内的xin的第四栏的GID就是/etc/group内的xin那个用户组的GID。所以,当然无法删除,否则xin这个用户登录系统后,就会找不到GID,那可是会造成很大的困扰。那么如果硬要删除xin这个用户组呢?你【必须要确认/etc/passwd内的帐号没有任何人使用该用户组作为初始用户组】才行。所以,你可以:

  1. 修改xin这个组的GID
  2. 删除xin这个用户
  3. 修改xin这个用户的GID


注意:
删除组时,必须先删除该组下的所有用户,否则会提示错误

 

十二、用户组管理员功能——gpasswd

如果系统管理员太忙碌了,导致某些帐号想要加入某个选项时找不到人帮忙,这个时候可以建立【用户组管理员】。什么是用户组管理员,就是让某个用户组具有一个管理员,这个用户组管理员可以管理哪些帐号可以加入/移出该用户组。那要如何【建立一个用户组管理员】?就得要通过gpasswd。

#关于系统管理员(root)做的操作
gpasswd groupname
gpasswd [-A user1,...] [-M user3,...] groupname
gpasswd [-rR] groupname
选型与参数:
  :若没有任何参数,表示设置groupname密码(/etc/gshadow)
-A:将groupname的管理权交由后面的使用者管理(该用户组的管理员)
-M:将某些帐号加入这个用户组中
-r:将groupname的密码删除
-R:让groupname的密码栏失效

#关于用户组管理员做的操作
gpasswd [-ad] groupname
选项与参数:
-a:将某位使用者加入到groupname这个用户组当中
-d:将某位使用者删除出groupname这个用户组当中

 

1、gpasswd mygroup_chen        设置mygroup_chen这个用户组的密码

 

2、gpasswd -A xin mygroup_chen     设置xin这个用户作为mygroup_chen这个用户组的用户组管理员

 

3、gpasswd -M l mygroup_chen     将l用户添加到mygroup_chen这个用户组当中

 

4、gpasswd -R mygroup_chen      删除mygroup_chen这个用户组的密码

 

5、gpasswd -r mygroup_chen      删除mygroup_chen这个用户组的密码

 

[root@server1 ~]# ll -d /etc/gshadow
----------. 1 root root 796 May 17 16:10 /etc/gshadow

 

6、gpasswd -d l mygroup_chen      将l这个用户从mygroup_chen这个用户组当中删除

 

7、gpasswd -a l mygroup_chen      将l这个用户添加到mygroup_chen这个用户组中

 

十三、用户身份切换——su与sudo(即用户权力的下放)

如何让一般用户转变身份成为root呢?主要有两种方式

  1. 通过【su  -】直接将身份变成root即可,但是这个命令却需要root的密码,也就是说,如果你要通过su变成root的话,你的一般用户九必须要有root的密码才行。
  2. 通过【sudo  命令】执行root的命令串,由于sudo需要事先设置妥当,且sudo需要输入用户自己的密码,因此多人共管同一台主机时,sudo要比su来的好,至少root密码不会流出去。

 

1、su命令

su是最简单的身份切换命令,它可以进行任何身份的切换。方法如下:

su [-lm] [-c 命令] [username]

选项与参数:
-:单纯使用-如【su -】代表使用login-shell的变量文件读取方式来登录系统。
   若使用者名称没有加上去,则代表切换为root身份
-l:与-类似,但后面需要加欲切换的使用者帐号,也是login-shell的方式
-m:-m与-p是一样的,表示【使用目前的环境变量设置,而不读取新使用者的配置文件】
-c:仅进行一次命令,所以-c后面可以加上命令

这个su的用法当中,有没有加上那个减号【-】差很多,因为涉及可登录shell与非登录shell的变量读取方法。

 

1、su          使用nono--login-shell的方式


[xin@server1 ~]$ su      <==注意提示字符,是xin的身份
Password:                <==这里输入root的密码
[root@server1 xin]# id   <==提示字符的目录是xin
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@server1 xin]# env | grep xin    
USER=xin                 <==竟然还是xin这个家伙
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/xin/.local/bin:/home/xin/bin                 <==这个影响最大
MAIL=/var/spool/mail/xin <==收到的mailbox是xin
PWD=/home/xin            <==并非root的家目录
LOGNAME=xin
#虽然你的UID已经是具有root的身份,但是看到上面的输出信息吗?
#还是有一堆变量为原本的xin的身份,所以很多数据还是无法直接利用
[root@server1 xin]# exit   <==使用exit/logout/Ctrl+d退出
exit
[xin@server1 ~]$ 

单纯使用【su】切换成为root的身份,读取的变量设置方式为非登录shell的方式,这种方式很多原本的变量不会被修改,尤其PATH这个变量。由于没有修改成为root的环境,因此很多root常用的命令就只能使用绝对路径来执行。其他的还有MAIL这个变量,你输入mail时,收到的邮件竟然还是xin的,而不是root本身的邮件,是否觉得很奇怪?所以切换身份时,请务必使用如下的范例二:

 

2、su -           使用login-shell的方式


[xin@server1 ~]$ su -
Password:       <==这里输入root的密码
Last login: Fri May 17 16:54:12 CST 2019 on pts/1
[root@server1 ~]# env | grep root
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=root
[root@server1 ~]# env | grep xin
[root@server1 ~]# logout   <==使用exit/logout/Ctrl+d退出
[xin@server1 ~]$ 

 

3、su -l student       切换倒student用户身份(同su - student)

 

4、su -m root     切换用户身份为root,但是不修改环境变量(将原来使用者的环境变量该为现使用者的环境变量)

 

5、su -c "tail -1 /etc/gshadow"        以root用户的身份查看/etc/gshdow文件的第一行内容

 

总结一下su的用法:

  • 若要完整地切换倒新用户的环境,必须要使用【su  -  username】或【su  -l  username】,才会连同PATH、USER、MAIL等变量都转换成新用户的环境
  • 如果仅想要执行一次root命令,可以利用【su  -c  "命令串"】的方式来处理。
  • 使用root切换成为任何用户时,并不需要输入新用户的密码

 

2、sudo命令

相比于su需要了解新切换的用户密码(常常是需要root的密码),sudo的执行则仅需要自己的密码即可。甚至可以设置不需要密码即可执行sudo。由于sudo可以让你以其他用户的身份执行命令(通常是使用root的身份来执行命令),因此并非所有人都能够执行sudo这个命令。

 

(1)sudo的命令

由于一开始系统默认仅有root可以执行sudo。因此下面的范例我们先以root的身份执行,等谈到visudo时,再以一般用户来讨论其他sudo的用法,sudo的语法如下:

sudo [-b] [-u 新使用者帐号]

选项与参数:
-b:将后续的命令放到后台中让系统自行执行,而不与目前的shell产生影响
-u:后面可以接欲切换的使用者,若无此选项则代表切换身份为root

 

1、sudo -u sshd touch /tmp/mysshd      使用sshd用户的身份创建文件/tmp/mysshd

因为我们无法使用【su  -  sshd】去切换系统帐号(因为系统帐号的shell是/sbin/nologin),这个时候sudo真是好用,立刻以sshd的权限在/tmp下面建立文件。查看一下文件权限你就可以了解其意义。

 

sudo默认仅有root能使用,为什么?因为sudo的执行是这样的流程:

  1. 当用户执行sudo时,系统于/etc/sudoers文件中查找该用户是否有执行sudo的权限
  2. 若用户具有可执行sudo的权限后,便让用户【输入用户自己的密码】来确认
  3. 若密码输入成功,便开始进行sudo后续接的命令(但root执行sudo时,不需要输入密码)
  4. 若欲切换的身份与执行者身份相同,那也不需要输入密码。

 

(2)visudo与/etc/sudoers

从上面我们可以之道,除了root之外的其他帐号,若想要使用sudo执行属于root权限的命令,则root需要去修改/etc/sudoers,让该帐号能够使用全部或部分的root命令功能。为什么要使用visudo呢?这是因为/etc/sudoers是设置过语法的,如果设置错误就会造成无法使用sudo命令的后果。因此才会使用visudo去修改,并且在结束退出修改界面时,操作系统会去检验/etc/sudoers的语法是否正确。

 

一般来说,visudo的设置有几种简单的方法,下面我们以几个简单的例子来说明一下:

 

<1>单一用户可使用root所有命令

 

1、在系统中超级用户可以下放普通用户不能执行的操作给普通用户,下放权力文件:/etc/sudoers

2、下放权力的方法:

 

(1)编辑下放权力文件,即:vim /etc/sudoers  按:wq!保存退出;或visudo  按:wq保存退出

 

(2)输入:99,切换到99行,输入如下99行对应的内容

99行的内容解释如下:
root                                                          ALL=(ALL)                        ALL      <==这是默认值
使用者帐号               登录者的来源主机名称=(可切换的身份)       可执行的命令     

上面这一行的四个组件意义是:

  1. 【用户账户】:操作系统的那个帐号可以使用sudo这个命令
  2. 【登录者的来源主机名】:当这个帐号由哪台主机连接到Linux主机,意思是这个帐号可能是由哪一台网络主机连接过来的,这个设置可以指定客户端计算机(信任的来源的意思),默认值root可来自任何一台网络主机
  3. 【可切换的身份】:这个帐号可以切换成什么身份来执行后续的命令,默认root可以切换成任何人
  4. 【可执行的命令】:可用该身份执行什么命令?这个命令务必使用绝对路径,默认root可以切换成任何人。

 

3、执行下放权限命令

(1)切换到student用户

(2)执行sudo命令(sudo useradd username),第一次执行的时候需要输入当前用户的密码(已经添加成功),执行第二次也会成功

 


注意:
当下放的是useradd的权限时,默认具有userdel(既可以删除普通用户所建的用户,也可以删除root用户所建的用户)的权力

删除自己所建的用户

删除root用户所建的用户


 

 

一个一个设置太麻烦了,能不能使用用户组的方式来设置,参考下面的第二种方式

 

<2>利用whell用户组以及面密码的功能处理visudo

 

1、在系统中超级用户可以下放普通用户不能执行的操作给普通用户,下放权力文件:/etc/sudoers

2、下放权力的方法:

 

(1)编辑下放权力文件,即:vim /etc/sudoers  按:wq!保存退出;或visudo  按:wq保存退出

 

(2)输入:105,切换到105行,查看105行的内容,内容如下:

 

3、测试

 

 

 

当然,你也可以将wheel这个用户组改成你想要的用户组

 


不过,我们既然都信任这些sudo的用户了,能否实现【不需要密码即可使用sudo】呢?

可以通过如下的方式:

[root@server1 ~]# visudo
    105 %wheel  ALL=(ALL)       NOPASSWD: ALL


 

<3>有限制的命令操作

上面两点都可以让用户能够利用root的身份进行任何事情。这样总是不太好,如果我想让用户仅能够进行部分系统任务。比方说,系统上面的love用户仅能够帮root修改其他用户的米阿玛时,即【当用户仅能使用passwd这个命令帮忙root修改其他用户的密码】时,你该如何编写?可以这样做:

[root@server1 ~]# which passwd
/usr/bin/passwd

[root@server1 ~]# visudo 
    100 love    ALL=(root)      /usr/bin/passwd     <==最后命令务必用绝对路径


[root@server1 ~]# passwd love
Changing password for user love.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@server1 ~]# su - love
Last login: Fri May 17 20:05:36 CST 2019 on pts/0


[love@server1 ~]$ sudo passwd student
[sudo] password for love: 
Changing password for user student.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

[love@server1 ~]$ sudo passwd 
Changing password for user root.
New password:

恐怖!我们竟然让root的密码被love用户给修改了。下次root回来竟无法登录系统,欲苦无泪,怎么办?我们必须要限制用户的命令参数。修改方法如下:

[root@server1 ~]# visudo
    100 love    ALL=(root)      !/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root

 

<4>通过别名创建visudo

如果我有15个用户需要加入刚刚的管理员行列,那么我是否要将上述那长长的设置写入15行呢?而且如果想要修改命令或是新增命令时,如果每行都需要重新设置,则很麻烦。有没有更简单的方式?通过别名即可。visudo的别名可以是【命令别名、账户别名、主机别名】等。

 

假设我的c、d、e要加入上述的密码管理员的sudo列表中,那我可哟创立一个账户,别名为ADMPW,然后将这个名称处理一下,处理方式如下:

[root@server1 ~]# visudo 
    101 User_Alias ADMPW=c,d,e
    102 Cmnd_Alias ADMPWCOM=!/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/
        passwd root
    103 ADMPW   ALL=(root)      ADMPWCOM


[root@server1 ~]# passwd e
Changing password for user e.
New password: 
BAD PASSWORD: The password is a palindrome
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@server1 ~]# su - e


[e@server1 ~]$ sudo passwd xjj

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 e: 
Changing password for user xjj.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.



[e@server1 ~]$ sudo passwd
Sorry, user e is not allowed to execute '/bin/passwd' as root on server1.

值的注意的是:

User_Alias建立的账户名称一定要使用大写字符来处理,包括Cmnd_Alias(命令别名)、Host_Alias(来源主机名别名),都需要使用大写字符。

 

<5>sudo的时间间隔问题

我们会发现,如果我们使用同一个帐号在短时间内重复操作sudo来运行命令的话,在第二次执行sudo时,并不需要输入自己的密码,sudo还是会正确运行。为什么?第一次执行sudo都需要输入密码,是担心由于用户暂时离开座位,但有人跑来你的座位使用你的帐号操作系统,所以需要你输入密码重新确认一次身份。

两次执行sudo的间隔在5分钟内,那么再次执行sudo时就不需要重新输入密码了,这是因为系统相信你在5分钟内不会离开,所以执行sudo的是同一个人,真是很人性化的设计。不过如果两次sudpo操作的间隔超过5分钟,那就得要重新输入一次你的密码了。

 

<6>sudo搭配su的使用方式

很多时候我们需要大量执行很多root的工作,所以一直使用sudo觉得很烦。那有没有办法使用sudo搭配su,一口气将身份转为root,而且还用用户自己的密码来变成root呢?有!而且方法很简单。我们建立一个ADMINS账户别名,然后这样做

[root@server1 ~]# visudo
    104 User_Alias ADMINS=c,d,e
    105 ADMINS ALL=(root)       /bin/su -


[root@server1 ~]# su - e
Last login: Fri May 17 20:40:53 CST 2019 on pts/0
[e@server1 ~]$ sudo su -
[sudo] password for e:       <==输入用户e的密码
Last login: Fri May 17 20:41:08 CST 2019 on pts/0
[root@server1 ~]# 
 

十四、 Linux 主机上的用户信息传递

 

1、查询用户:w、who、last、lastb、lastlog

 

(1)w  -f        查看目前已登录在系统上面的用户,使用来源

第一行显示目前的时间,启动(up)多久,几个使用者在系统上平均负载等等;

第二行只是各个选项的说明;

第三行以后,每行代表一个使用者。

 

(2)w  -i        查看目前已登录在系统上面的用户,显示IP

 

(3)who        查看目前已登录在系统上面的用户

 

(3)last           查看使用过并退出的用户信息

 

(4)lastb          查看试图登陆但没有成功的用户

 

(5)lastlog           查看每个账号最近登录的时间

 

2、用户对谈:write、mesg、wall

 

(1)write 命令

 

write 使用者账号 [使用者所在终端界面]
[root@server ~]# who
(unknown) :0           2019-06-15 11:00 (:0)
root     pts/0        2019-06-15 11:00 (172.25.254.7)
student  pts/1        2019-06-15 13:04 (172.25.254.7)
[root@server ~]# write student pts/1
hello
world
# 结束时,请按下 [Ctrl]+d 来结束输入,此时在 student 的画面中,会出现如下的界面
[student@server ~]$ 
Message from root@server on pts/0 at 13:04 ...
hello
world
EOF   #按下 Enter 键 即可退出该界面
 
[student@server ~]$ 

 

(2)mesg 命令

 

如果,student 这个人不想要接收任何信息,直接执行这个操作:

[student@server ~]$ mesg n
[student@server ~]$ mesg 
is n

 

不过 mesg 的功能对 root  传送来的信息没有阻止的能力,所以如果是  root  传送信息, student 还是得要收下。但是如果  root  的 mesg 是 n 的,那么  student  写给 root  的信息会变成这样:

[root@server ~]# mesg n
[root@server ~]# mesg 
is n

[student@server ~]$ mesg 
is y
[student@server ~]$ write root pts/0
write: root has messages disabled on pts/0

 

如果想要启用的话,再次执行【mesg  y】就好。

 

(3)wall 命令

 

相对于  write  是针对一个用户来发送【短信】,我们还可以【对所有系统上面的用户发送短信】,如何执行?用  wall 即可,它的语法很简单。

 

[root@server ~]# wall "I am root"

 

然后,你就会发现所有的人都会收到这个短信,连发送者自己也会收到。

 

3、用户邮箱:mail

 

我们可以寄、收  mailbox  内的邮件。一般来说,mailbox  都会放置在  /var/spoll/mail  里面,一个账号一个  mailbox(文件)。举例来说,student  就具有 /var/spoll/mail/student  这个  mailbox。

 

(1)发送邮件——只能给本机的用户发信息,不能给别的主机的用户发送消息

 

那么我该如何寄出邮件呢?直接使用  mail  这个命令即可。这个命令的用法很简单,直接执行【mail  username@localhost】或【mail  -s  "邮件主题"  username@localhost】即可。一般来说,如果是寄给本机上的用户,基本上连 【@localhost】都不用写。举例来说,我以  root  寄信给  student ,邮件主题是【nice  to  meet   you】,则:

[root@server ~]# mail -s "nice to meet you" student
hello
You are so nice. byebye!
.        <== 这里很重要,结束时,最后一行输入小数点 . 即可
EOT
[root@server ~]# 

你或许觉得  mail  这个程序不好用,因为在邮件的编写过程中,如果写错字按下回车进入下一行,前一行的数据很难删除,那怎么办?没关系,我么使用数据流重定向,呵呵!利用小于符号(<)就可以达到替换键盘输入的要求了。也就是说,你可以先用  vim  将邮件内容编好,然后再以 “mail  -s   "nice  to  meet  you"  student  <  filename” 来传输文件内容即可。

 

(2)接收邮件

 

如何接收邮件呢?呵呵!同样使用  mail 。

如果我以  student  的身份登录主机,然后输入  mail  后,会得到什么?

[student@server ~]$ mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/student": 1 message 1 new
>N  1 root                  Sat Jun 15 17:15  19/629   "nice to meet you"
&     <==这里可以输入很多的命令,如果要查看帮助,输入 ? 即可。

在  mail  当中的提示字符是  &  符号,输入  mail  之后,我可以看到我有一封邮件,这封邮件的前面 那个 >  代表目前处理的邮件,而在大于符号的有变那个  N  代表该封邮件尚未读过。如果想要知道这个  mail  内部的命令有哪些,在 &  之后输入【?】就可以看到如下的画面:

& ?
               mail commands
type <message list>             type messages
next                            goto and type next message
from <message list>             give head lines of messages
headers                         print out active message headers
delete <message list>           delete messages
undelete <message list>         undelete messages
save <message list> folder      append messages to folder and mark as saved
copy <message list> folder      append messages to folder without marking them
write <message list> file       append message texts to file, save attachments
preserve <message list>         keep incoming messages in mailbox even if saved
Reply <message list>            reply to message senders
reply <message list>            reply to message senders and all recipients
mail addresses                  mail to specific recipients
file folder                     change to another folder
quit                            quit and apply changes to folder
xit                             quit and discard changes made to folder
!                               shell escape
cd <directory>                  chdir to directory or home if none given
list                            list names of all available commands

A <message list> consists of integers, ranges of same, or other criteria
separated by spaces.  If omitted, mail uses the last message typed.
& 

比较常见的命令是:

命令意义
h列出邮件标头,如果要查看40封邮件左右的邮件标头,可以输入【h  40】
d删除后续接的邮件号码,删除第10封是【d  10】,删除20~40 封则为【d  20-40】。不过,这个操作要生效的话,必须要配合 q 这个命令才行(参考下面说明)
s将邮件存储为文件。例如我想将第 5 封邮件的内容存成 ~/.mail.file 【s 5  ~/.mail.file】
x或输入 exit  都可以,这个是【不做任何操作退出 mail 程序】的意思。不论你刚刚删除了什么邮件或读过什么,使用 exit  都会直接退出 mail,所以刚刚进行的删除与阅读工作都会无效。如果您只是查看一下邮件的话,一般来说,建议使用这个退出,除非你真的要删除某些邮件
q相对于 exit  是不操作退出,q 则会实际执行你刚刚所执行的操作(尤其是删除)

如果,只是想要读取这封邮件的话,直接输入邮件编号 1  即可。所示内容如下:

& 1
Message  1:
From root@server.localdomain  Sat Jun 15 17:15:16 2019
Return-Path: <root@server.localdomain>
X-Original-To: student
Delivered-To: student@server.localdomain
Date: Sat, 15 Jun 2019 17:15:16 +0800
To: student@server.localdomain
Subject: nice to meet you
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: root@server.localdomain (root)
Status: R

hello
You are so nice. byebye!

& 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值