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 ~]#