magedu basic 第二次作业

1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。

1
2
3
4
[hzz@VM_203_97_centos ~]$ who|cut -d' ' -f1|sort -u
hzz
root
[hzz@VM_203_97_centos ~]$

2、取出当前系统上被用户当作其默认shell的最多的那个shell。

1
2
3
[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文件中。

1
2
3
4
5
6
7
8
9
10
11
12
13
[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命令的结果进行切分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 获取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目录下一级子目录或文件的总个数。

1
2
3
[hzz@e25f88eebde1 ~]$ ls /var|wc -w
20
[hzz@e25f88eebde1 ~]$

6、取出/etc/group文件中第三个字段数值最小的10个组的名字。

1
2
3
4
5
6
7
8
9
10
11
12
[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文件中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[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;

1
2
3
4
[hzz@e25f88eebde1 ~]$ sudo groupadd -g 2016 distro
[hzz@e25f88eebde1 ~]$ tail -1 /etc/group
distro:x:2016:
[hzz@e25f88eebde1 ~]$

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

1
2
3
4
[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;

1
2
3
4
[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;

1
2
3
4
[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,但保留其家目录;

1
2
3
4
[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;

1
2
3
4
5
[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;

1
2
3
4
5
6
[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;

1
2
3
4
5
6
7
[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天;

1
2
3
4
5
6
7
8
[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;

1
2
3
4
5
6
[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;

1
2
3
4
[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添加密码。

1
2
3
4
5
6
[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及其内部文件的属组和其它用户均没有任何访问权限。

1
2
3
4
5
6
7
8
9
10
[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开头的行;用两种方式;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 方法一:用-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的用户;

1
2
3
4
5
6
7
8
9
10
# 先使用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的用户;

1
2
3
4
5
6
# 先使用grep进行筛选,再使用cut裁切出用户名

[hzz@8eff5a75ccba ~]$ grep '/bin/bash$' /etc/passwd|cut -d: -f1
root
hzz
[hzz@8eff5a75ccba ~]$

13、找出/etc/passwd文件中的一位数或两位数;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 使用正则表达式相关知识
# [: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文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 使用正则表达式相关知识

# 方法一:
# \+ # 表示前面的字符至少存在一次
# [[: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’,后或跟空白字符结尾的行;

1
2
3
4
5
6
7
8
9
10
# 使用正则表达式相关知识
# $ # 以前一个字符结尾
# \+ # 至少有一个前面字符

[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相同的用户的信息;

1
2
3
4
5
6
7
8
9
10
11
12
# 使用正则表达式相关知识
# <[[: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

查看文件类型。

1
2
3
4
5
6
7
# 安装file命令

yum install -y file;

# 查看文件类型

file test.txt;

tee

使用tee可以在标准输出的同时,将输出重定向到文件。

1
2
3
4
# 用法

tee test.txt;
ls|tee test.txt;

mkdir

mkdir 的 -v选项,可以显示目录创建过程。

1
mkdir -pv /tmp/123/456/789

touch

时间戳管理工具,变更文件的访问时间,修改时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看文件状态

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

定义命令别名,使用命令行定义仅对当前会话有效。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 不带任何参数,默认显示当前会话别名

[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参数可以在遇到文件夹时,不显示其内容,只显示文件夹名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[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

字符替换或删除,可以批量转化指定字符,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 将文档中所有的小写字母转化成大写字母(后面不能直接跟文件,需要使用输入重定向来读取文件)

[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类似),并可指定输出分隔符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 以:为分隔,输出第一个字符

[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

对结果进行排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 常用参数:
# -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松开后再按.

1
2
3
4
5
6
7
[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; # 上述两者都生效

1
2
3
4
5
6
7
8
9
10
11
12
13
[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通配符

1
2
3
4
5
6
7
8
# 通配符:*,?,[]
# * # 任意长度的字符
# ? # 任意单个字符
# [] # 匹配指定范围内的单个字符
# [0-9] # 单个数字
# [a-z] # 不区分大小写
# [A-Z] # 大写字符
# [^] # 匹配指定范围外的单个字符

专用字符集合:

1
2
3
4
5
6
7
8
9
10
11
12
# 可以使用 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概念

1
2
3
4
# Account # 账号
# Authentication # 认证
# Authorization # 授权
# Audit # 审计

Linux用户和组相关的配置文件和概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# /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的值也在同一文件中修改。

1
2
3
4
5
6
[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目录中拷贝过去的,故修改此目录下的文件,可统一用于新建用户。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 示例:如果用户目录路径已存在,将不会从/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默认值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[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

1
2
3
4
5
6
7
8
[hzz@e25f88eebde1 ~]$ more /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
[hzz@e25f88eebde1 ~]$

检查/etc/passwd文件是否有问题

1
2
3
4
5
6
[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

文件或目录创建时的遮罩码

1
2
3
4
# 如果创建的是文件,则默认权限为:
# 666(777去除执行权限)-umask # 如果某类的用户的权限减得的结果中存在x权限,则将其权限+1
# 如果创建的是目录,则默认权限为:
# 777-umask

shell脚本运行机制

#!/bin/bash为shebang参数,其中#!为魔数(magic number),用于告诉内核,脚本内容用哪种程序运行。

1
2
3
# 比如:
./test.sh # 先通过"#!/bin/bash"获取执行程序,再把脚本内容通过执行程序运行。
bash test.sh # 手动指定执行程序,并把脚本内容运行,此时"#!/bin/bash"是无效的。

为什么1个汉字要占2个字节

最小的存储单元是字节(byte),1字节有8位二进制数(bit),而2的8次方只有256中变化,无法储存所有的中文字符,所以一个中文字符需要用16位来显示,故需要占用2个字节。

编码格式

约定俗成地使用二进制字节来代表字符。比如用01100001代表a,用100111000000000代表,每种编码格式都有自己的一份编码表。故若编写和解析的所用的编码不同,就会出现乱码。

grep

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# grep # 支持基本正则表达式
# egrep # 支持扩展正则表达式
# fgrep # 不支持正则表达式

# 常用选项:
# --color=auto # 对匹配到的文本着色显示
# -v # 显示不能够被pattern匹配到的行
# -i # 忽略字符大小写
# -o # 仅显示匹配到的字符串
# -q # 静默模式,不输出任何信息
# -P # 支持perl的正则表达式
# -A # after, 后n行
# -B # before, 前n行
# -C # context, 前后各n行

基本正则表达式

字符匹配:

1
2
3
# . # 匹配任意单个字符
# [] # 匹配指定范围内的任意单个字符
# [^] # 匹配指定范围外的任意单个字符

匹配次数:

1
2
3
4
5
6
7
8
9
# 用在要指定次数的字符后面,用于指定前面的字符要出现的次数
# * # 匹配前面的字符任意次
# .* # 任意长度的任意字符
# \? # 匹配其前面的字符0或1次
# \+ # 匹配其前面的字符至少1次
# \{m\} # 匹配前面的字符m次
# \{m,n\} # 匹配前面的字符至少m次,至多n次
# \{m,\} # 匹配前面的字符至少m次
# \{0,n\} # 匹配前面的字符至多n次

位置锚定

1
2
3
4
5
6
# ^ # 行首锚定,用于模式的最左侧
# $ # 行尾锚定,用于模式的最后侧
# ^PATTERN$ # 用于模式匹配整行
# \< 或 \b # 词首锚定,用于单词模式的左侧
# \> 或 \b # 词尾锚定,用于单词模式的右侧
# \<PATTERN\> # 匹配整个单词

分组

1
2
3
4
5
6
7
8
9
10
# \(\) # 将一个或多个字符捆绑在一起,当作一个整体进行处理

# Note:分组括号中的模式匹配到的内容(不是元字符本身)会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...

# \1 # 从左侧起,第一个左括号及与之匹配右括号之间的模式所匹配到的整体
# \2 # 从左侧起,第二个左括号及与之匹配右括号之间的模式所匹配到的整体

# 如:\(ab\+\(xy\)*\)
# \1所匹配的是:\(ab\+\(xy\)*\)
# \2所匹配的是:\(xy\)

扩展正则表达式

字符匹配:

1
2
3
# . # 匹配任意单个字符
# [] # 匹配指定范围内的任意单个字符
# [^] # 匹配指定范围外的任意单个字符

匹配次数:

1
2
3
4
5
6
7
8
9
# 用在要指定次数的字符后面,用于指定前面的字符要出现的次数
# * # 匹配前面的字符任意次
# .* # 任意长度的任意字符
# ? # 匹配其前面的字符0或1次
# + # 匹配其前面的字符至少1次
# {m} # 匹配前面的字符m次
# {m,n} # 匹配前面的字符至少m次,至多n次
# {m,} # 匹配前面的字符至少m次
# {0,n} # 匹配前面的字符至多n次

位置锚定

1
2
3
4
5
6
# ^ # 行首锚定,用于模式的最左侧
# $ # 行尾锚定,用于模式的最后侧
# ^PATTERN$ # 用于模式匹配整行
# \< 或 \b # 词首锚定,用于单词模式的左侧
# \> 或 \b # 词尾锚定,用于单词模式的右侧
# \<PATTERN\> # 匹配整个单词

分组

1
2
3
4
5
6
7
8
9
10
# () # 将一个或多个字符捆绑在一起,当作一个整体进行处理

# Note:分组括号中的模式匹配到的内容(不是元字符本身)会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...

# \1 # 从左侧起,第一个左括号及与之匹配右括号之间的模式所匹配到的整体
# \2 # 从左侧起,第二个左括号及与之匹配右括号之间的模式所匹配到的整体

# 如:(ab+(xy)*)
# \1所匹配的是:(ab+(xy)*)
# \2所匹配的是:(xy)

或者

1
2
3
4
# | # 左边或者右边,不是按字符,是按整个字段
# a|b # a或者b
# a|Abc # a或者Abc
# (a|A)bc # abc或者Abc

17-黄中章