文章目录[隐藏]
- 1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。
- 2、取出当前系统上被用户当作其默认shell的最多的那个shell。
- 3、将/etc/passwd中的第三个字段数值最大的后10个用户的信息全部改为大写后保存至/tmp/maxusers.txt文件中。
- 4、取出当前主机的IP地址,提示:对ifconfig命令的结果进行切分。
- 5、显示/var目录下一级子目录或文件的总个数。
- 6、取出/etc/group文件中第三个字段数值最小的10个组的名字。
- 7、将/etc/fstab和/etc/issue文件的内容合并为同一个内容后保存至/tmp/etc.test文件中。
- 8、请总结描述用户和组管理类命令的使用方法并完成以下练习:
- (1)、创建组distro,其GID为2016;
- (2)、创建用户mandriva, 其ID号为1005;基本组为distro;
- (3)、创建用户mageia,其ID号为1100,家目录为/home/linux;
- (4)、给用户mageia添加密码,密码为mageedu;
- (5)、删除mandriva,但保留其家目录;
- (6)、创建用户slackware,其ID号为2002,基本组为distro,附加组peguin;
- (7)、修改slackware的默认shell为/bin/tcsh;
- (8)、为用户slackware新增附加组admins;
- (9)、为slackware添加密码,且要求密码最短使用期限为3天,最长为180天,警告为3天;
- (10)、添加用户openstack,其ID号为3003, 基本组为clouds,附加组为peguin和nova;
- (11)、添加系统用户mysql,要求其shell为/sbin/nologin;
- (12)、使用echo命令,非交互式为openstack添加密码。
- 9、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。
- 10、显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式;
- 11、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
- 12、显示/etc/passwd文件中其默认shell为/bin/bash的用户;
- 13、找出/etc/passwd文件中的一位数或两位数;
- 14、显示/etc/rc.d/rc.local文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
- 15、打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;
- 16、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;
- 相关笔记:(不与作业周期同步)
- 17-黄中章
1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。
[hzz@VM_203_97_centos ~]$ who|cut -d' ' -f1|sort -u
hzz
root
[hzz@VM_203_97_centos ~]$
2、取出当前系统上被用户当作其默认shell的最多的那个shell。
[hzz@8eff5a75ccba ~]$ cut -d: -f7 /etc/passwd|sort|uniq -c|sort|tail -1|cut -d' ' -f7
/sbin/nologin
[hzz@8eff5a75ccba ~]$
3、将/etc/passwd中的第三个字段数值最大的后10个用户的信息全部改为大写后保存至/tmp/maxusers.txt文件中。
[hzz@e25f88eebde1 ~]$ sort -t: -k3 -n /etc/passwd|tail -10|tr [a-z] [A-Z] > /tmp/maxusers.txt
[hzz@e25f88eebde1 ~]$ more /tmp/maxusers.txt
HALT:X:7:0:HALT:/SBIN:/SBIN/HALT
MAIL:X:8:12:MAIL:/VAR/SPOOL/MAIL:/SBIN/NOLOGIN
OPERATOR:X:11:0:OPERATOR:/ROOT:/SBIN/NOLOGIN
GAMES:X:12:100:GAMES:/USR/GAMES:/SBIN/NOLOGIN
FTP:X:14:50:FTP USER:/VAR/FTP:/SBIN/NOLOGIN
DBUS:X:81:81:SYSTEM MESSAGE BUS:/:/SBIN/NOLOGIN
NOBODY:X:99:99:NOBODY:/:/SBIN/NOLOGIN
SYSTEMD-NETWORK:X:998:997:SYSTEMD NETWORK MANAGEMENT:/:/SBIN/NOLOGIN
SYSTEMD-BUS-PROXY:X:999:998:SYSTEMD BUS PROXY:/:/SBIN/NOLOGIN
HZZ:X:1000:1000::/HOME/HZZ:/BIN/BASH
[hzz@e25f88eebde1 ~]$
4、取出当前主机的IP地址,提示:对ifconfig命令的结果进行切分。
# 获取IP地址有两种方式
# 第一种如题所述,对ifconfig结果进行切分
[hzz@e25f88eebde1 ~]$ ifconfig -a|grep -w 'inet'|cut -d' ' -f10
172.17.0.2
127.0.0.1
[hzz@e25f88eebde1 ~]$
# 第二种方式为通过正则表达式获取
[hzz@e25f88eebde1 ~]$ ifconfig -a|egrep -o '\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])\>(\.\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\>){2}\.\<([1-9]|[1-9][0-9]|1[0-9]2|2[0-4][0-9]|25[0-4])\>'
172.17.0.2
127.0.0.1
[hzz@e25f88eebde1 ~]$
5、显示/var目录下一级子目录或文件的总个数。
[hzz@e25f88eebde1 ~]$ ls /var|wc -w
20
[hzz@e25f88eebde1 ~]$
6、取出/etc/group文件中第三个字段数值最小的10个组的名字。
[hzz@e25f88eebde1 ~]$ sort -t: -k3 -n /etc/group|head -10|cut -d: -f1
root
bin
daemon
sys
adm
tty
disk
lp
mem
kmem
[hzz@e25f88eebde1 ~]$
7、将/etc/fstab和/etc/issue文件的内容合并为同一个内容后保存至/tmp/etc.test文件中。
[hzz@e25f88eebde1 ~]$ cat >> /tmp/etc.test < /etc/fstab
[hzz@e25f88eebde1 ~]$ cat >> /tmp/etc.test < /etc/issue
[hzz@e25f88eebde1 ~]$ cat /tmp/etc.test
#
# /etc/fstab
# Created by anaconda on Wed Nov 2 12:44:22 2016
#
# 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
#
UUID=ec4bb1bc-edb2-46c4-8e97-fe0c917cbd03 / ext4 defaults 1 1
\S
Kernel \r on an \m
[hzz@e25f88eebde1 ~]$
8、请总结描述用户和组管理类命令的使用方法并完成以下练习:
(1)、创建组distro,其GID为2016;
[hzz@e25f88eebde1 ~]$ sudo groupadd -g 2016 distro
[hzz@e25f88eebde1 ~]$ tail -1 /etc/group
distro:x:2016:
[hzz@e25f88eebde1 ~]$
(2)、创建用户mandriva, 其ID号为1005;基本组为distro;
[hzz@e25f88eebde1 ~]$ sudo useradd -u 1005 -g distro mandriva
[hzz@e25f88eebde1 ~]$ tail -1 /etc/passwd
mandriva:x:1005:2016::/home/mandriva:/bin/bash
[hzz@e25f88eebde1 ~]$
(3)、创建用户mageia,其ID号为1100,家目录为/home/linux;
[hzz@e25f88eebde1 ~]$ sudo useradd -u 1100 -d /home/linux mageia
[hzz@e25f88eebde1 ~]$ tail -1 /etc/passwd
mageia:x:1100:1100::/home/linux:/bin/bash
[hzz@e25f88eebde1 ~]$
(4)、给用户mageia添加密码,密码为mageedu;
[hzz@e25f88eebde1 ~]$ sudo su - -c "echo 'mageedu'|passwd --stdin mageia"
Changing password for user mageia.
passwd: all authentication tokens updated successfully.
[hzz@e25f88eebde1 ~]$
(5)、删除mandriva,但保留其家目录;
[hzz@e25f88eebde1 ~]$ sudo userdel mandriva
[hzz@e25f88eebde1 ~]$ ls -ld /home/mandriva
drwx------ 2 1005 distro 59 Dec 17 07:35 /home/mandriva
[hzz@e25f88eebde1 ~]$
(6)、创建用户slackware,其ID号为2002,基本组为distro,附加组peguin;
[hzz@e25f88eebde1 ~]$ sudo groupadd peguin
[hzz@e25f88eebde1 ~]$ sudo useradd slackware -u 2002 -g distro -G peguin
[hzz@e25f88eebde1 ~]$ sudo id slackware
uid=2002(slackware) gid=2016(distro) groups=2016(distro),2017(peguin)
[hzz@e25f88eebde1 ~]$
(7)、修改slackware的默认shell为/bin/tcsh;
[hzz@e25f88eebde1 ~]$ cat /etc/passwd|grep slackware
slackware:x:2002:2016::/home/slackware:/bin/bash
[hzz@e25f88eebde1 ~]$ sudo usermod slackware -s /bin/tcsh
[hzz@e25f88eebde1 ~]$ cat /etc/passwd|grep slackware
slackware:x:2002:2016::/home/slackware:/bin/tcsh
[hzz@e25f88eebde1 ~]$
(8)、为用户slackware新增附加组admins;
[hzz@e25f88eebde1 ~]$ sudo groupadd admins
[hzz@e25f88eebde1 ~]$ id slackware
uid=2002(slackware) gid=2016(distro) groups=2016(distro),2017(peguin)
[hzz@e25f88eebde1 ~]$ sudo usermod -a -G admins slackware
[hzz@e25f88eebde1 ~]$ id slackware
uid=2002(slackware) gid=2016(distro) groups=2016(distro),2017(peguin),2018(admins)
[hzz@e25f88eebde1 ~]$
(9)、为slackware添加密码,且要求密码最短使用期限为3天,最长为180天,警告为3天;
[hzz@e25f88eebde1 ~]$ sudo su - -c "echo 'h59Rd&oi818M'|passwd --stdin slackware;passwd -n 3 -x 180 -w 3 slackware"
Changing password for user slackware.
passwd: all authentication tokens updated successfully.
Adjusting aging data for user slackware.
passwd: Success
[hzz@e25f88eebde1 ~]$ sudo cat /etc/shadow|grep slackware
slackware:$6$ovWygZb6$sprN42rvH9GH6V8rjyLG.PGlkDWK.0eZml0H9PvuRmhrKOuujZxd7.3WcOyE3sg02q2OiUfvZ6Ugl4wp9JXSi1:17153:3:180:3:::
[hzz@e25f88eebde1 ~]$
(10)、添加用户openstack,其ID号为3003, 基本组为clouds,附加组为peguin和nova;
[hzz@e25f88eebde1 ~]$ sudo groupadd clouds
[hzz@e25f88eebde1 ~]$ sudo groupadd nova
[hzz@e25f88eebde1 ~]$ sudo useradd -u 3003 -g clouds -G peguin,nova openstack
[hzz@e25f88eebde1 ~]$ id openstack
uid=3003(openstack) gid=2019(clouds) groups=2019(clouds),2017(peguin),2020(nova)
[hzz@e25f88eebde1 ~]$
(11)、添加系统用户mysql,要求其shell为/sbin/nologin;
[hzz@e25f88eebde1 ~]$ sudo useradd -r -s /sbin/nologin mysql
[hzz@e25f88eebde1 ~]$ cat /etc/passwd|grep mysql
mysql:x:997:996::/home/mysql:/sbin/nologin
[hzz@e25f88eebde1 ~]$
(12)、使用echo命令,非交互式为openstack添加密码。
[hzz@e25f88eebde1 ~]$ sudo su - -c "echo 'h59Rd&oi818M'|passwd --stdin openstack"
Changing password for user openstack.
passwd: all authentication tokens updated successfully.
[hzz@e25f88eebde1 ~]$ sudo cat /etc/shadow|grep openstack
openstack:$6$VwEO0Tj/$l7EXOEOYuPpwDYaXhCNrT4QEqCHKt3LLw4pW0HYjZEtLcC7wonZ4eFPi9IARESI9w4aF/aT1mYVK7w0xkhylj/:17153:0:99999:7:::
[hzz@e25f88eebde1 ~]$
9、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。
[hzz@e25f88eebde1 ~]$ sudo cp -a /etc/skel /home/
[hzz@e25f88eebde1 ~]$ sudo chmod -R go= /home/skel
[hzz@e25f88eebde1 ~]$ sudo ls -la /home/skel/
total 12
drwx------ 2 root root 59 Nov 2 12:45 .
drwxr-xr-x 8 root root 86 Dec 18 06:47 ..
-rw------- 1 root root 18 Aug 2 16:00 .bash_logout
-rw------- 1 root root 193 Aug 2 16:00 .bash_profile
-rw------- 1 root root 231 Aug 2 16:00 .bashrc
[hzz@e25f88eebde1 ~]$
10、显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式;
# 方法一:用-i参数进行大小写忽略
[hzz@8eff5a75ccba ~]$ grep -i '^s' /proc/meminfo
SwapCached: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Shmem: 8672 kB
Slab: 68768 kB
SReclaimable: 53708 kB
SUnreclaim: 15060 kB
[hzz@8eff5a75ccba ~]$
# 方法二:使用正则表达式忽略大小写
[hzz@8eff5a75ccba ~]$ grep '^[s,S]' /proc/meminfo
SwapCached: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Shmem: 8672 kB
Slab: 68776 kB
SReclaimable: 53716 kB
SUnreclaim: 15060 kB
[hzz@8eff5a75ccba ~]$
11、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
# 先使用grep -v进行筛选,再使用cut裁切出用户名
# $ # 表示以前面字符串结尾
[hzz@8eff5a75ccba ~]$ grep -v '/sbin/nologin$' /etc/passwd|cut -d: -f1
root
sync
shutdown
halt
hzz
[hzz@8eff5a75ccba ~]$
12、显示/etc/passwd文件中其默认shell为/bin/bash的用户;
# 先使用grep进行筛选,再使用cut裁切出用户名
[hzz@8eff5a75ccba ~]$ grep '/bin/bash$' /etc/passwd|cut -d: -f1
root
hzz
[hzz@8eff5a75ccba ~]$
13、找出/etc/passwd文件中的一位数或两位数;
# 使用正则表达式相关知识
# [:digit:] # 匹配数字
# \{1,2\} # 匹配1-2次
# \<[[:digit:]]\{1,2\}\> # 将匹配到的数字进行捆绑
# 可用-o选项将数字直接输出
[hzz@8eff5a75ccba ~]$ grep -o '\<[[:digit:]]\{1,2\}\>' /etc/passwd
0
0
1
1
2
2
3
4
4
7
5
0
6
0
7
0
8
12
11
0
12
14
50
99
99
81
81
[hzz@8eff5a75ccba ~]$
14、显示/etc/rc.d/rc.local文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
# 使用正则表达式相关知识
# 方法一:
# \+ # 表示前面的字符至少存在一次
# [[:space:]] # 表示空格
[hzz@8eff5a75ccba ~]$ grep '^#[[:space:]]\+.*' /etc/rc.d/rc.local
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
[hzz@8eff5a75ccba ~]$
# 方法二:
# 也可以用具体空格代替[[:space:]]
[hzz@8eff5a75ccba ~]$ grep '^# \+.\+' /etc/rc.d/rc.local
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
[hzz@8eff5a75ccba ~]$
# 方法三:
# \{1,\} # 也可表示前面的字符至少存在一次
[hzz@8eff5a75ccba ~]$ grep '^# \{1,\}.\{1,\}' /etc/rc.d/rc.local
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
[hzz@8eff5a75ccba ~]$
15、打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;
# 使用正则表达式相关知识
# $ # 以前一个字符结尾
# \+ # 至少有一个前面字符
[hzz@8eff5a75ccba ~]$ nc -l 10010 &
[1] 71
[hzz@8eff5a75ccba ~]$ netstat -tan|grep 'LISTEN *$'
tcp 0 0 0.0.0.0:10010 0.0.0.0:* LISTEN
tcp6 0 0 :::10010 :::* LISTEN
[hzz@8eff5a75ccba ~]$
16、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;
# 使用正则表达式相关知识
# <[[:alnum:]]\+\> # 匹配任意用户名
# ^\(\<[[:alnum:]]\+\>\) # 将匹配到的用户名进行捆绑,并以此用户名开头
# \1$ # 引用前面捆绑的用户名,并以此用户名结尾
[hzz@8eff5a75ccba ~]$ grep '^\(\<[[:alnum:]]\+\>\).*\1$' /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:1001:1001::/home/bash:/bin/bash
nologin:x:1004:1004::/home/nologin:/sbin/nologin
[hzz@8eff5a75ccba ~]$
相关笔记:(不与作业周期同步)
file
查看文件类型。
# 安装file命令
yum install -y file;
# 查看文件类型
file test.txt;
tee
使用tee可以在标准输出的同时,将输出重定向到文件。
# 用法
tee test.txt;
ls|tee test.txt;
mkdir
mkdir 的 -v选项,可以显示目录创建过程。
mkdir -pv /tmp/123/456/789
touch
时间戳管理工具,变更文件的访问时间,修改时间。
# 查看文件状态
stat ks-script-1holkM
Access: 2016-11-02 12:47:51.000000000 +0000 # 访问时间(文件被访问)
Modify: 2016-11-02 12:47:51.000000000 +0000 # 修改时间(文件被修改)
Change: 2016-11-30 02:44:13.784509931 +0000 # 变更时间(时间元数据发生改变)
# 修改访问时间
touch -a -t 201612081312.50 ks-script-1holkM
# 修改文件修改时间
touch -m -t 201612081312.50 ks-script-1holkM
alias
定义命令别名,使用命令行定义仅对当前会话有效。
# 不带任何参数,默认显示当前会话别名
[hzz@e25f88eebde1 ~]$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
[hzz@e25f88eebde1 ~]$ alias showlove='echo loveIsUnbreakable'
[hzz@e25f88eebde1 ~]$ showlove
loveIsUnbreakable
[hzz@e25f88eebde1 ~]$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias showlove='echo loveIsUnbreakable'
[hzz@e25f88eebde1 ~]$
# 撤销别名,使用unalias
[hzz@e25f88eebde1 ~]$ unalias showlove # 撤销单个别名
[hzz@e25f88eebde1 ~]$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
[hzz@e25f88eebde1 ~]$ unalias -a # 撤销全部别名
[hzz@e25f88eebde1 ~]$ alias
[hzz@e25f88eebde1 ~]$
# 如别名和源命令重名,使用\command执行原命令。
ls
ls的-d参数可以在遇到文件夹时,不显示其内容,只显示文件夹名。
[hzz@e25f88eebde1 ~]$ ls -ld /var/*
drwxr-xr-x 2 root root 6 Aug 12 2015 /var/adm
drwxr-xr-x 5 root root 41 Dec 9 16:25 /var/cache
drwxr-xr-x 3 root root 32 Dec 9 08:07 /var/db
drwxr-xr-x 2 root root 6 Aug 12 2015 /var/empty
drwxr-xr-x 2 root root 6 Aug 12 2015 /var/games
drwxr-xr-x 2 root root 6 Aug 12 2015 /var/gopher
drwxr-xr-x 3 root root 17 Nov 2 12:46 /var/kerberos
-rw-r--r-- 1 root root 0 Dec 11 01:32 /var/l321abctest.txt
drwxr-xr-x 12 root root 140 Nov 2 12:47 /var/lib
drwxr-xr-x 2 root root 6 Aug 12 2015 /var/local
lrwxrwxrwx 1 root root 11 Nov 2 12:45 /var/lock -> ../run/lock
drwxr-xr-x 3 root root 71 Dec 9 08:08 /var/log
lrwxrwxrwx 1 root root 10 Nov 2 12:45 /var/mail -> spool/mail
drwxr-xr-x 2 root root 6 Aug 12 2015 /var/nis
drwxr-xr-x 2 root root 6 Aug 12 2015 /var/opt
drwxr-xr-x 2 root root 6 Aug 12 2015 /var/preserve
lrwxrwxrwx 1 root root 6 Nov 2 12:45 /var/run -> ../run
drwxr-xr-x 4 root root 27 Nov 2 12:45 /var/spool
drwxrwxrwt 3 root root 27 Dec 9 16:32 /var/tmp
drwxr-xr-x 2 root root 6 Aug 12 2015 /var/yp
[hzz@e25f88eebde1 ~]$
tr
字符替换或删除,可以批量转化指定字符,如:
# 将文档中所有的小写字母转化成大写字母(后面不能直接跟文件,需要使用输入重定向来读取文件)
[hzz@e25f88eebde1 ~]$ tr 'a-z' 'A-Z' < /etc/fstab
#
# /ETC/FSTAB
# CREATED BY ANACONDA ON WED NOV 2 12:44:22 2016
#
# 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
#
UUID=EC4BB1BC-EDB2-46C4-8E97-FE0C917CBD03 / EXT4 DEFAULTS 1 1
[hzz@e25f88eebde1 ~]$
cut
指定字符按列进行分隔(和awk -F
类似),并可指定输出分隔符。
# 以:为分隔,输出第一个字符
[hzz@e25f88eebde1 ~]$ cut -d: -f1 /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-bus-proxy
systemd-network
dbus
hzz
[hzz@e25f88eebde1 ~]$
# 以:为分隔,输出第1-3个字符
[hzz@e25f88eebde1 ~]$ cut -d: -f1-3 /etc/passwd
root:x:0
bin:x:1
daemon:x:2
adm:x:3
lp:x:4
sync:x:5
shutdown:x:6
halt:x:7
mail:x:8
operator:x:11
games:x:12
ftp:x:14
nobody:x:99
systemd-bus-proxy:x:999
systemd-network:x:998
dbus:x:81
hzz:x:1000
[hzz@e25f88eebde1 ~]$
# 以:为分隔,输出第1-3个字符并以|分隔
[hzz@e25f88eebde1 ~]$ cut -d: -f1-3 /etc/passwd --output-delimiter=\|
root|x|0
bin|x|1
daemon|x|2
adm|x|3
lp|x|4
sync|x|5
shutdown|x|6
halt|x|7
mail|x|8
operator|x|11
games|x|12
ftp|x|14
nobody|x|99
systemd-bus-proxy|x|999
systemd-network|x|998
dbus|x|81
hzz|x|1000
[hzz@e25f88eebde1 ~]$
sort
对结果进行排序。
# 常用参数:
# -f # 忽略字符大小写
# -r # 逆序
# -t # 字段分隔符
# -k # 以指定字段标准排序
# -n # 以数值大小进行排序(默认会按照ASCII码表中的排序进行)
# -u # 去重
# 示例:将passwd文件内容以:为分隔符,对第三个字段进行数值排序,并输出该字段
[hzz@e25f88eebde1 ~]$ sort -t: -k3 -n /etc/passwd|cut -d: -f3
0
1
2
3
4
5
6
7
8
11
12
14
81
99
998
999
1000
[hzz@e25f88eebde1 ~]$
快速使用上一条命令的参数
使用!$
或先按esc
松开后再按.
。
[hzz@VM_203_97_centos ~]$ ls -l /usr/local/
...
[hzz@VM_203_97_centos ~]$ cd !$
cd /usr/local/
[hzz@VM_203_97_centos local]$ pwd
/usr/local
[hzz@VM_203_97_centos local]$
控制记录进history的命令
通过$HISTCONTROL
变量控制:
export HISTCONTROL=ignoredups; # 忽略连续重复的命令
export HISTCONTROL=ignorespace; # 忽略以空格开头的命令
export HISTCONTROL=ignoreboth; # 上述两者都生效
[hzz@VM_203_97_centos ~]$ history -c
[hzz@VM_203_97_centos ~]$ export HISTCONTROL=ignoreboth
[hzz@VM_203_97_centos ~]$ ls # 此命令不记录
test.sh
[hzz@VM_203_97_centos ~]$ echo 111
111
[hzz@VM_203_97_centos ~]$ echo 111 # 此重复命令不记录
111
[hzz@VM_203_97_centos ~]$ history
1 2016-12-08 22:30:50 export HISTCONTROL=ignoreboth
2 2016-12-08 22:31:05 echo 111
3 2016-12-08 22:31:10 history
[hzz@VM_203_97_centos ~]$
glob通配符
# 通配符:*,?,[]
# * # 任意长度的字符
# ? # 任意单个字符
# [] # 匹配指定范围内的单个字符
# [0-9] # 单个数字
# [a-z] # 不区分大小写
# [A-Z] # 大写字符
# [^] # 匹配指定范围外的单个字符
专用字符集合:
# 可以使用 man 7 glob查看。
# [:digit:]:任意数字,相当于0-9
# [:lower:]:任意小写字母
# [:upper:]:任意大写字母
# [:alpha:]:任意大小写字母
# [:alnum:]:任意数字或字母
# [:space:]:空格字符
# [:punct:]:标点符号
# 注意用法:
[hzz@e25f88eebde1 ~]$ ls -d /var/l*[0-9]*[[:lower:]] # 需要放入中括号内。
bash快捷键
ctrl+l
:清屏
ctrl+a
:光标跳到命令首部
ctrl+e
:光标跳到命令尾部
ctrl+c
:取消命令执行
ctrl+u
:删除光标前面的命令
ctrl+k
:删除光标后面的命令
4A概念
# Account # 账号
# Authentication # 认证
# Authorization # 授权
# Audit # 审计
Linux用户和组相关的配置文件和概念
# /etc/passwd # 用户及其属性信息(名称、UID、基本组ID等等)
# /etc/group # 组及其属性信息
# /etc/shadow # 用户密码及其相关属性
# /etc/gshadow # 组密码及其相关属性
[hzz@e25f88eebde1 ~]$ head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 用户名:密码:UID:GID:GECOS:主目录:默认shell
[hzz@e25f88eebde1 ~]$
[hzz@e25f88eebde1 ~]$ head -1 /etc/group
root:x:0:
# 组名:组密码:GID:以当前组为附加组的用户列表(分隔符为逗号)
[hzz@e25f88eebde1 ~]$
[hzz@e25f88eebde1 ~]$ sudo head -1 /etc/shadow
root:!!$6$7HEYpoDY$Ha6f7RWHfT5b8PMRBkGKGhmEVtxOhavDNWJsoFQj/3ycZT7wKx.k02nDEysHPzh.fVF1dzZHiHBVdv7uroDrP/:17107:0:99999:7:::
# 用户名:加密了的密码:最近一次更改密码的日期(从1970/1/1到当前密码修改日期的天数):密码的最小使用期限:最大密码使用期限:密码警告时间段:密码禁用期:账户过期日期:保留字段
[hzz@e25f88eebde1 ~]$
# 密码保存机制
[hzz@e25f88eebde1 ~]$ sudo head -1 /etc/shadow|cut -d: -f2
!!$6$7HEYpoDY$Ha6f7RWHfT5b8PMRBkGKGhmEVtxOhavDNWJsoFQj/3ycZT7wKx.k02nDEysHPzh.fVF1dzZHiHBVdv7uroDrP/
# !! # 表示禁止登录
# 6 # sha256加密
# 7HEYpoDY # 为了使相同的密码加密不同而加的随机数,每个账号都不同
# Ha6f7RWHfT5b8PMRBkGKGhmEVtxOhavDNWJsoFQj/3ycZT7wKx.k02nDEysHPzh.fVF1dzZHiHBVdv7uroDrP/ # 密码加入杂质后重新加密而成的密文
[hzz@e25f88eebde1 ~]$
修改最小UID和最大UID值
最小和最大GID的值也在同一文件中修改。
[hzz@e25f88eebde1 ~]$ cat /etc/login.defs|grep UID
UID_MIN 1000
UID_MAX 60000
SYS_UID_MIN 201
SYS_UID_MAX 999
[hzz@e25f88eebde1 ~]$
修改用户默认配置属性
每个新建用户的$HOME
目录初始文件,都是从/etc/skel
目录中拷贝过去的,故修改此目录下的文件,可统一用于新建用户。
# 示例:如果用户目录路径已存在,将不会从/etc/skel目录拷贝$HOME相关的文件到指定目录
[hzz@e25f88eebde1 ~]$ mkdir -p /tmp/test
[hzz@e25f88eebde1 ~]$ sudo useradd -d /tmp/test test
[sudo] password for hzz:
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
[hzz@e25f88eebde1 ~]$
# /etc/skel目录中保存的默认配置
[hzz@e25f88eebde1 ~]$ ls -a /etc/skel/
. .. .bash_logout .bash_profile .bashrc
[hzz@e25f88eebde1 ~]$
修改useradd默认值
[hzz@e25f88eebde1 ~]$ cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[hzz@e25f88eebde1 ~]$
# 也可以使用useradd -D选项来修改
[hzz@e25f88eebde1 ~]$ sudo useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[hzz@e25f88eebde1 ~]$
查看用户可用的默认shell
[hzz@e25f88eebde1 ~]$ more /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
[hzz@e25f88eebde1 ~]$
检查/etc/passwd文件是否有问题
[hzz@e25f88eebde1 ~]$ sudo pwck
user 'ftp': directory '/var/ftp' does not exist
user 'slackware': program '/bin/tcsh' does not exist
user 'mysql': directory '/home/mysql' does not exist
pwck: no changes
[hzz@e25f88eebde1 ~]$
umask
文件或目录创建时的遮罩码
# 如果创建的是文件,则默认权限为:
# 666(777去除执行权限)-umask # 如果某类的用户的权限减得的结果中存在x权限,则将其权限+1
# 如果创建的是目录,则默认权限为:
# 777-umask
shell脚本运行机制
#!/bin/bash
为shebang参数,其中#!
为魔数(magic number),用于告诉内核,脚本内容用哪种程序运行。
# 比如:
./test.sh # 先通过"#!/bin/bash"获取执行程序,再把脚本内容通过执行程序运行。
bash test.sh # 手动指定执行程序,并把脚本内容运行,此时"#!/bin/bash"是无效的。
为什么1个汉字要占2个字节
最小的存储单元是字节(byte),1字节有8位二进制数(bit),而2的8次方只有256中变化,无法储存所有的中文字符,所以一个中文字符需要用16位来显示,故需要占用2个字节。
编码格式
约定俗成地使用二进制字节来代表字符。比如用01100001
代表a
,用100111000000000
代表一
,每种编码格式都有自己的一份编码表。故若编写和解析的所用的编码不同,就会出现乱码。
grep
# grep # 支持基本正则表达式
# egrep # 支持扩展正则表达式
# fgrep # 不支持正则表达式
# 常用选项:
# --color=auto # 对匹配到的文本着色显示
# -v # 显示不能够被pattern匹配到的行
# -i # 忽略字符大小写
# -o # 仅显示匹配到的字符串
# -q # 静默模式,不输出任何信息
# -P # 支持perl的正则表达式
# -A # after, 后n行
# -B # before, 前n行
# -C # context, 前后各n行
基本正则表达式
字符匹配:
# . # 匹配任意单个字符
# [] # 匹配指定范围内的任意单个字符
# [^] # 匹配指定范围外的任意单个字符
匹配次数:
# 用在要指定次数的字符后面,用于指定前面的字符要出现的次数
# * # 匹配前面的字符任意次
# .* # 任意长度的任意字符
# \? # 匹配其前面的字符0或1次
# \+ # 匹配其前面的字符至少1次
# \{m\} # 匹配前面的字符m次
# \{m,n\} # 匹配前面的字符至少m次,至多n次
# \{m,\} # 匹配前面的字符至少m次
# \{0,n\} # 匹配前面的字符至多n次
位置锚定
# ^ # 行首锚定,用于模式的最左侧
# $ # 行尾锚定,用于模式的最后侧
# ^PATTERN$ # 用于模式匹配整行
# \< 或 \b # 词首锚定,用于单词模式的左侧
# \> 或 \b # 词尾锚定,用于单词模式的右侧
# \<PATTERN\> # 匹配整个单词
分组
# \(\) # 将一个或多个字符捆绑在一起,当作一个整体进行处理
# Note:分组括号中的模式匹配到的内容(不是元字符本身)会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
# \1 # 从左侧起,第一个左括号及与之匹配右括号之间的模式所匹配到的整体
# \2 # 从左侧起,第二个左括号及与之匹配右括号之间的模式所匹配到的整体
# 如:\(ab\+\(xy\)*\)
# \1所匹配的是:\(ab\+\(xy\)*\)
# \2所匹配的是:\(xy\)
扩展正则表达式
字符匹配:
# . # 匹配任意单个字符
# [] # 匹配指定范围内的任意单个字符
# [^] # 匹配指定范围外的任意单个字符
匹配次数:
# 用在要指定次数的字符后面,用于指定前面的字符要出现的次数
# * # 匹配前面的字符任意次
# .* # 任意长度的任意字符
# ? # 匹配其前面的字符0或1次
# + # 匹配其前面的字符至少1次
# {m} # 匹配前面的字符m次
# {m,n} # 匹配前面的字符至少m次,至多n次
# {m,} # 匹配前面的字符至少m次
# {0,n} # 匹配前面的字符至多n次
位置锚定
# ^ # 行首锚定,用于模式的最左侧
# $ # 行尾锚定,用于模式的最后侧
# ^PATTERN$ # 用于模式匹配整行
# \< 或 \b # 词首锚定,用于单词模式的左侧
# \> 或 \b # 词尾锚定,用于单词模式的右侧
# \<PATTERN\> # 匹配整个单词
分组
# () # 将一个或多个字符捆绑在一起,当作一个整体进行处理
# Note:分组括号中的模式匹配到的内容(不是元字符本身)会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
# \1 # 从左侧起,第一个左括号及与之匹配右括号之间的模式所匹配到的整体
# \2 # 从左侧起,第二个左括号及与之匹配右括号之间的模式所匹配到的整体
# 如:(ab+(xy)*)
# \1所匹配的是:(ab+(xy)*)
# \2所匹配的是:(xy)
或者
# | # 左边或者右边,不是按字符,是按整个字段
# a|b # a或者b
# a|Abc # a或者Abc
# (a|A)bc # abc或者Abc