Linux文本处理和用户组管理

本文介绍如何在Linux系统中管理用户和组,包括创建、删除、修改用户和组的方法,以及如何使用passwd命令管理用户密码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。
who | cut -d” ” -f1 | sort | uniq -c | sort

[root@localhost ~]# who | cut -d' ' -f1 | sort | uniq -c
      1 jerry
      1 root
      2 tom
[root@localhost ~]# 

who命令查看当前系统登录用户信息;cut取第一段信息,-d表示分隔符,如果是空格符,需带引号,-f表示取第几段信息,后面可直接跟数字;sort排序,-r表示逆序排序;uniq统计重复行,-c表示显示重复的行数。

2、取出最后登录到当前系统的用户的相关信息。
last | head -1

[root@localhost ~]# last | head -1
centos   pts/2        10.9.3.194       Thu Aug  9 09:04   still logged in   
[root@localhost ~]# last
centos   pts/2        10.9.3.194       Thu Aug  9 09:04   still logged in   
tom      pts/3        10.9.3.194       Thu Aug  9 08:44   still logged in   
jerry    pts/1        10.9.3.194       Thu Aug  9 08:44   still logged in 

last命令用于显示最后一次登录的用户的信息列表,默认是从离当前时间最近的,显示在第一行,故用head命令查看第一行即可,模式head命令是查看的前10行。

3、取出当前系统上被用户当作其默认shell的最多的那个shell。
cut -d: -f7 /etc/passwd | sort | uniq -c | sort -n -r | head -1

[root@localhost ~]# cut -d: -f7 /etc/passwd | sort | uniq -c | sort -n -r | head -1
     15 /sbin/nologin
[root@localhost ~]# 

passwd文件下第7个字段为默认shell,排序统计重复行,按逆序再次排序头一个就是最多的,也可按顺序排,那就是tail -1。这里经过的我的实验证实,取出字段的时候,需要先sort。

[root@localhost ~]# cut -d: -f7 /etc/passwd | uniq -c
      1 /bin/bash
      4 /sbin/nologin
      1 /bin/sync
      1 /sbin/shutdown
      1 /sbin/halt
     11 /sbin/nologin
      3 /bin/bash
[root@localhost ~]# cut -d: -f7 /etc/passwd | sort | uniq -c 
      4 /bin/bash
      1 /bin/sync
      1 /sbin/halt
     15 /sbin/nologin
      1 /sbin/shutdown

因为uniq只能对连续重复的行进行统计,如不sort直接uniq,/sbin/nologin出现过4次,也出现过11次,这是因为/etc/passwd文件下是以用户名和UID进行排序的,出现的默认登录shell是不统一的,所以取出第7个字段时,必须得先sort再uniq,在sort -n按数字排序,-r逆序排序,取出第一行,或者不sort -r,直接sort -n,tail -1取最后一行,也是默认登录shell最多的。

4、将/etc/passwd中的第三个字段数值最大的后10个用户信息全部改为大写后保存至/tmp/maxusers.txt。
sort -t: -k3 -n /etc/passwd | tail | tr [a-z] [A-Z] > /tmp/maxusers.txt

[root@localhost ~]# sort -t: -k3 -n /etc/passwd | tail | tr [a-z] [A-Z] > /tmp/maxuser.txt
[root@localhost ~]# 
[root@localhost ~]# cat /tmp/maxuser.txt
TSS:X:59:59:ACCOUNT USED BY THE TROUSERS PACKAGE TO SANDBOX THE TCSD DAEMON:/DEV/NULL:/SBIN/NOLOGIN
SSHD:X:74:74:PRIVILEGE-SEPARATED SSH:/VAR/EMPTY/SSHD:/SBIN/NOLOGIN
DBUS:X:81:81:SYSTEM MESSAGE BUS:/:/SBIN/NOLOGIN
POSTFIX:X:89:89::/VAR/SPOOL/POSTFIX:/SBIN/NOLOGIN
NOBODY:X:99:99:NOBODY:/:/SBIN/NOLOGIN
SYSTEMD-NETWORK:X:192:192:SYSTEMD NETWORK MANAGEMENT:/:/SBIN/NOLOGIN
POLKITD:X:999:997:USER FOR POLKITD:/:/SBIN/NOLOGIN
TOM:X:1000:1000::/HOME/TOM:/BIN/BASH
JERRY:X:1001:1001::/HOME/JERRY:/BIN/BASH
CENTOS:X:1002:1002::/HOME/CENTOS:/BIN/BASH
[root@localhost ~]# 

sort可直接指定分隔符进行指定字段排序,-t与cut -d用法一样,后面直接跟分隔符号,-k指定比较字段,-n进行数值大小比较;而后tail后10行,tr命令是直接转换输出格式,但未改变原文件,[a-z]表示所有小写字母,[A-Z]表示所有大写字母;输出重定向至文本文件,>表示将输出内容覆盖到文本文件中,maxuser.txt文件不存在,可直接指定,如指定到已存在文件,>表示覆盖的,很危险,如果要追加到原文件,使用>>即可。

5、取出当前主机的IP地址,提示:对ifconfig命令的结果进行切分。
ifconfig | grep inet | xargs -n2 | cut -d” ” -f2 | head -1

[root@localhost ~]# 
[root@localhost ~]# ifconfig | grep inet
        inet 10.9.3.72  netmask 255.255.255.0  broadcast 10.9.3.255
        inet6 fe80::ad19:1d60:686:b40b  prefixlen 64  scopeid 0x20<link>
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
[root@localhost ~]# ifconfig | grep inet | xargs -n2
inet 10.9.3.72
netmask 255.255.255.0
broadcast 10.9.3.255
inet6 fe80::ad19:1d60:686:b40b
prefixlen 64
scopeid 0x20<link>
inet 127.0.0.1
netmask 255.0.0.0
inet6 ::1
prefixlen 128
scopeid 0x10<host>
[root@localhost ~]# 
[root@localhost ~]# ifconfig | grep inet | xargs -n2 | cut -d' ' -f2 | head -1
10.9.3.72
[root@localhost ~]# 

这个有大神帮忙,用到个新命令xargs,将输入数据流空白行转换为空白字符,大概就是这个意思,cut以空白字符分割,取IP地址。这里我根据输出结果判断 xargs -n#表示以#个字段为单位进行切割行重新构建成单独的行,从标准输入构建和执行命令行,当然这样取值,一定要对ifconfig结果充分了解。

6、列出/etc目录下所有以.conf结尾的文件的文件名,并将其名字转换为大写后保存至/tmp/etc.conf文件中。
ls /etc/*.conf | cut -d/ -f3 | tr [a-z] [A-Z] > /tmp/etc.conf

[root@localhost ~]# ls /etc/*.conf | cut -d/ -f3 | tr [a-z] [A-Z] > /tmp/etc.conf
[root@localhost ~]# 
[root@localhost ~]# cat /tmp/etc.conf
ASOUND.CONF
DRACUT.CONF
E2FSCK.CONF

这里直接用cut进行裁剪,-d指定分隔符为/,-f这里取的是第三个字段,/etc前面的空格也认为是第一个字段,那么etc就是第二个字段,其下的目录名为第三个字段;dirname,basename命令其后跟的参数是路径名。

7、显示/var目录下一级子目录或者文件的总个数。

[root@localhost ~]# find /var -type f -print | wc -l
3942
[root@localhost ~]# find /var/ -type f -print | wc -l
3942
[root@localhost ~]# ls /var | wc -l
20
[root@localhost ~]# 

这里用了find命令,按文件类型查找/var目录下的所有文件;用wc统计行数,默认不加选项,是显示行数,单词数,字节数,-l只显示行数,-w只显示单词数,-c只显示字节数。

8、取出/etc/group文件中第三个字段数值最小的10个组的名字。
sort -t: -k3 -n /etc/group | head | cut -d: -f1

[root@localhost ~]# sort -t: -k3 -n /etc/group | head
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9: 
[root@localhost ~]# sort -t: -k3 -n /etc/group | head | cut -d: -f1
root
bin
daemon
sys
adm
tty
disk
lp
mem
kmem
[root@localhost ~]# 

9、将/etc/fstab和/etc/issue文件的内容合并为同一个内容后保存至/tmp/etc.test文件中。

[root@localhost ~]# cat /etc/issue /etc/fstab 
\S
Kernel \r on an \m


#
# /etc/fstab
# Created by anaconda on Tue Jun 26 13:23:51 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=d8b88bd6-6098-4398-aa8e-d3180f4d579b /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost ~]# cat /etc/issue /etc/fstab > /tmp/etc.test 
[root@localhost ~]# cat /tmp/etc.test
\S
Kernel \r on an \m


#
# /etc/fstab
# Created by anaconda on Tue Jun 26 13:23:51 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=d8b88bd6-6098-4398-aa8e-d3180f4d579b /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost ~]# 

这里用到了cat查看命令后面跟两个参数,合并查看,之后用输出重定向到指定的文件中。

10、请总结描述用户和组管理类命令的使用方法并完成以下练习:

useradd,userdel,usermod,groupadd,groupdel,groupmod,passwd。

用户相关管理命令:

useradd,userdel,usermod

 

添加用户:useradd [options] USERNAME;直接创建一个用户还有用户的私有组,同名用户名;

-u UID:直接创建时指明需要创建用户的UID;(其中CentOS 6中1~499为系统用户,500~6W为登录用户;CentOS 7中1~999为系统用户,1000~6W为登录用户;1~65535为普通用户,0为管理员;GID也是如此;UID,GID表示名称解析用户名和组名)

-g GID:指定用户的基本组GID,此组必须事先存在;(用户所在的组有两种,一个基本组(私有组),一个附加组(公有组),基本组里包括有用户自己,附加组里可有多个用户;)

-G group1,group2,...:为用户添加附加组,可以添加多个,此些组也必须事先存在;

-c:指明注释信息;例如:-c administrator等,可在/etc/passwd文件中的第5个字段查看其信息;

-d HOME_DIR:指定用户的家目录,通过复制/etc/skel此目录并重命名完成,指定的家目录如果存在,则不会为用户复制环境配置文件;

-s SHELL:指定用户的默认shell,可用的shell在/etc/shells文件下可查看列表;

-r systemuser:创建系统用户;

-m,-M,-f:表示指定彻底锁定前的用户使用时间期限;

-D:表示显示并改变创建用户的默认配置信息;(创建用户的诸多默认设定配置文件为/etc/login.defs,修改结果保存在/etc/default/useradd文件中)

 

删除用户:userdel [options] USERNAME

-r :删除用户时一并删除用户的家目录,默认是不删除的;

 

更改用户属性:usermod [options] LOGIN

-u UID:修改用户的UID号;

-g group:修改用户的基本组,此组必须事先存在;

-G:修改用户的附加组,原来的附加组将会被覆盖,如果为用户追加新的附加组则使用-G -a一起组合使用;

-c:修改注释信息;

-d:修改用户的家目录,用户家目录原有的文件将不会存在,如果移动至新目录的话,使用-d -m一起组合使用,将原来的文件一直移动至新的家目录下;

-l:修改用户名;

-s:修改用户的默认shell;

-L:锁定用户的密码;即禁止用户登录,实际上就是在用户原来的密码字符串前添加“!”作为标识;

-U:解锁用户的密码;

 

组相关的管理命令:

groupadd,groupdel,groupmod

 

创建新组:groupadd [options] groupname

-g GID:指定GID,默认是上一个GID号加1;

-r:创建系统组;

删除组:groupdel [options] groupname

修改组属性:groupmod [options] group

-g GID:修改GID;

-n new_name:修改新的组名;

 

有关密码相关命令:passwd (不带选项,表示修改自己的密码)

passwd USERNAME:修改指定用户的密码;(仅有root有此权限,而且不用知道用户之前的密码,可以为所有用户修改)

-l,-u:锁定,解锁用户;

-d:删除用户密码;

-e:指定用户的密码过期期限,后面跟日期;

-i:指定用户的非活动期限,一般是天数范围;

-n:指定密码的最短使用期限;

-x:指定密码的最长使用期限;

-w:指定密码的警告期限;

--stdin:一般用户标准输出重定向给用户指定密码等;例:echo "PASSWD" | passwd --stdin USERNAME;

gpasswd group:给组添加密码;

-a USERNAME:向组中添加用户;

-d USERNAME:从组中删除用户;

 

(1)、创建组distro,其GID为2016;
groupadd -g 2016 distro

(2)、创建用户mandriva,其ID号为1005;基本组为distro;
useradd -u 1005 -g distro mandriva

(3)、创建用户mageia,其ID号为1100,家目录为/home/linux;
useradd -u 1100 -d /home/linux mageia

(4)、给用户mageia添加密码,密码为mageedu;
echo “mageedu” | passwd –stdin mageia

(5)、删除mandriva,但保留其家目录;
userdel mandriva

(6)、创建用户slackware,其ID号为2002,基本组为distro,附加组peguin;
groupadd peguin 先创建组

useradd -u 2002 -g distro -G peguin slackware

(7)、修改slackware的默认shell为/bin/tcsh;
usermod -s /bin/tcsh slackware

(8)、为用户slackware新增附加组admins。
usermod -a -G admins slackware 添加附加组,追加新组需要-a配合,而且得在-G前面,不加-a为替换附加组,以实验证明,我用的是CentOS 7。


[root@localhost ~]# groupadd -g 2016 distro
[root@localhost ~]# useradd -u 1005 -g distro mandriva
[root@localhost ~]# useradd -u 1100 -d /home/linux
[root@localhost ~]# useradd -u 1100 -d /home/linux mageia
[root@localhost ~]# echo "mageedu" | passwd --stdin mageia
Changing password for user mageia.
passwd: all authentication tokens updated successfully.
[root@localhost ~]# userdel mandriva
[root@localhost ~]# useradd -u 2002 -g distro -G peguin slackware
useradd: group 'peguin' does not exist
[root@localhost ~]# groupadd peguin
[root@localhost ~]# useradd -u 2002 -g distro -G peguin slackware
[root@localhost ~]# usermod -s /bin/tcsh slackware
[root@localhost ~]# usermod -G admins
usermod: group 'admins' does not exist
[root@localhost ~]# groupadd admins
[root@localhost ~]# usermod -G admins slackware
[root@localhost ~]# usermod -G -a peguin slackware
usermod: group '-a' does not exist
[root@localhost ~]# usermod -a -G peguin slackware
[root@localhost ~]# id slackware
uid=2002(slackware) gid=2016(distro) groups=2016(distro),2017(peguin),2018(admins)
[root@localhost ~]# 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值