周游Linux操作系统——指令实战3

作者:Rhythm_2019

Emial:rhythm_2019@163.com

学习时间:2021.02.07

上一篇文章主要讲述了一些常用的指令,今天主要整理一下Linux的权限管理、任务调度、磁盘管理和网络配置

权限管理

Linux的权限针对的是每一个文件/目录,大家可以使用指令ls -alh查看文件所属的用户和组

查看文件所属用户和组.png

一个文件被创建时,该文件属于创建者,同时归属于创建者当时所在组

在之前的用户管理章节中我们有说过下面几个指令

  • 创建用户时归属到指定用户组 useradd -g 组名 用户名,该组必须已存在
  • 创建组 groupadd 组名
  • 修改组名 groupmod -l 新名字 旧名字

查看文件权限

其实使用ls命令的时候已经可以看到了,我们随便找一行款看

1
drwxr-xr-x.  3 root root   18 Apr 10  2020 .config

从前往后看

  • 第0个字符:文件类型,d表示目录,-表示普通文件,l表示软连接,c表示字符设备(键盘),b表示快文件(硬盘)
  • 第1-3个字符:文件创建者所拥有权限
  • 第4-6个字符:文件创建者所在组成员权限
  • 第7-9个字符:其他组其他成员所有权限

权限相关就上面这些,其他的也说一下

  • 紧跟后面的数字:如果是文件表示硬链接的个数,如果是目录则表示内部子目录的个数
  • 所属用户
  • 所属组
  • 文件大小(如果是文件夹则固定是4096)
  • 最新修改日期
  • 文件名

大家会发现前面三个三个一组的权限是由字母rwx组成的

  1. rwx作用于文件:

    • 【r】表示可查看
    • 【w】表示可修改,但是不一定能删除,能不能删除得看用户对当前目录有没有写的操作
    • 【x】表示可被执行
  2. rwx作用于目录

    • 【r】表示可读取,可以用ls查看文件结构
    • 【w】表示可以在目录里面创建、删除文件,重命名目录
    • 【x】表示可以进入目录

    我尝试了一下,如果只有x只能进入目录不能ls

修改文件权限

我们可以使用chmod修改文件的权限,当然了只有创建者才能修改。该命令有两种用法:

  1. + 、 -、 = 变更权限

    u:所有者 g:所有组 o:其他人 a:所有人(u、 g、 o 的总和)

    1
    chmod u+r g=rx 文件名
  2. 通过数字变更权限

    规则: r=4 w=2 x=1 ,rwx=4+2+1=7

    1
    chmod u=rwx,g=rx,o=x 文件目录名

    相当于

    1
    chmod 751 文件目录名

修改文件拥有者

更改文件的拥有者

1
chown newonwer file

如果文件比较多可以使用-R递归修改,该指令还可以修改文件所在组

1
chown newowner:newgroup file

修改文件所属组

修改文件所属组

1
chgrp newgroup file

一样的可以用R递归修改

最佳实战

这是老师的课堂练习,大家可以敲一敲体验一下

建立四个用户 (唐僧,悟空,八戒,沙僧)

1
2
useradd wukong
...

设置密码

1
passwd

把悟空,八戒放入妖怪 唐僧,沙僧放在神仙

1
2
3
4
groupadd yaoguai
...
usermod -g wukong yaoguai
...

用悟空建立一个文件 ( monkey.java 该文件要输出 i am monkey)

1
echo "i am monkey" >>  monkey.java

给八戒一个可以 r w 的权限

1
chmod g=rw monkey.java

八戒修改 monkey.java 加入一句话( i am pig)

1
echo "i am pig" >>  monkey.java

把 沙僧 放入妖怪组

1
usermod -g yaoguai shaseng

让沙僧 修改 该文件 monkey, 加入一句话 (“我是沙僧,我是妖怪!”)

1
echo "我是沙僧,我是妖怪" >>  monkey.java

任务调度

说到定时任务,大家应该会想到Spring Task那些吧,我们先复习一下cron表达式

普通cron表达式

这部分内容纯属复习,我后来才发现crontab里面的表达式好像不支持以秒为单位的

cron结构

corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份

字段 允许值 允许的特殊字符
秒(Seconds) 0~59的整数 , - * / 四个字符
分(Minutes 0~59的整数 , - * / 四个字符
小时(Hours 0~23的整数 , - * / 四个字符
日期(DayofMonth 1~31的整数(但是你需要考虑你月的天数) ,- * ? / L W C 八个字符
月份(Month 1~12的整数或者 JAN-DEC , - * / 四个字符
星期(DayofWeek 1~7的整数或者 SUN-SAT (1=SUN) , - * ? / L C # 八个字符
年(可选,留空)(Year 1970~2099 , - * / 四个字符

特殊字符

  • *:表示匹配该域的任意值。假如在Minutes域使用*, 即表示每分钟都会触发事件。
  • ?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用,如果使用表示不管星期几都会触发,实际上并不是这样。
  • -:表示范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次
  • /:表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.
  • ,:表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。
  • L:表示最后,只能出现在DayofWeek和DayofMonth域。如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。
  • W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。
  • LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
  • #:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。

例子

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
(1)0 0 2 1 * ? *   表示在每月的1日的凌晨2点调整任务

  (2)0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作业

  (3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作

  (4)0 0 10,14,16 * * ? 每天上午10点,下午2点,4点

  (5)0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时

  (6)0 0 12 ? * WED 表示每个星期三中午12点

  (7)0 0 12 * * ? 每天中午12点触发

  (8)0 15 10 ? * * 每天上午10:15触发

  (9)0 15 10 * * ? 每天上午10:15触发

  (10)0 15 10 * * ? * 每天上午10:15触发

  (11)0 15 10 * * ? 2005 2005年的每天上午10:15触发

  (12)0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发

  (13)0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发

  (14)0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发

  (15)0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发

  (16)0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发

  (17)0 15 10 ? * MON-FRI 周一至周五的上午10:15触发

  (18)0 15 10 15 * ? 每月15日上午10:15触发

  (19)0 15 10 L * ? 每月最后一日的上午10:15触发

  (20)0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发

  (21)0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发

  (22)0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发

参考:https://www.cnblogs.com/yanghj010/p/10875151.html

cron指令

表达式如下,他是不支持秒的

1
* * * * * ommand

分  时  日  月  周  命令

第1列表示分钟1~59 每分钟用*或者 */1表示

第2列表示小时1~23(0表示0点)

第3列表示日期1~31

第4列表示月份1~12

第5列标识号星期0~6(0表示星期天)

第6列要运行的命令

如果你想要用秒来执行可以这样

1
2
3
4
5
6
7
# crontab -e
* * * * * /bin/date >>/tmp/date.txt
* * * * * sleep 10; /bin/date >>/tmp/date.txt
* * * * * sleep 20; /bin/date >>/tmp/date.txt
* * * * * sleep 30; /bin/date >>/tmp/date.txt
* * * * * sleep 40; /bin/date >>/tmp/date.txt
* * * * * sleep 50; /bin/date >>/tmp/date.txt

我们可以通过该指令创建任务

1
conrtab -e

打开编辑器,写下任务

1
cron表达式 命令或指定shell文件

保存后生效

  • conrtab -r 终止任务
  • crontab -l 列出所有任务
  • service crond restart 重启任务
  • service crond start //启动服务
  • service crond stop //关闭服务
  • service crond reload //重新载入配置

举两个例子吧

  1. 定时输出日期到文件中

    1
    */1 * * * *; date >> /home/date.txt
  2. 定时备份MySQL,先编写Shell脚本

    1
    /usr/local/mysql/bin/mysqldump -u root -proot testdb > /tmp/mydb.bak

    然后加入任务

    1
    0 2 * * *; /home/my.sh

磁盘管理

先说一下几个概念

分区

分区有两种模式:

  1. MBR分区
    1. 最多支持4个主分区(放操作系统的分区)
    2. 系统只能安装在主分区上
    3. 扩展分区要装在主分区上
    4. MBR最大只支持2TB,但拥有较好的兼容性
  2. GTP分区
    1. 支持无限多个主分区(但是操作系统还是会限制分区数量)
    2. 最大支持18EB大容量
    3. 需要操作系统支持

对于Linux来说,他的分区需要挂载到某一个目录使用的,会议Linux的目录结构,一切目录最后都是由根目录/来的,所以所有分区都是文件系统的一部分

分区与目录关系.png

硬盘

  • Linux 硬盘分 IDE 硬盘和 SCSI 硬盘,目前基本上是 SCSI 硬盘 2)对于 IDE 硬盘
  • 驱动器标识符为“hdx~”,其中“hd”表明分区所在设备的类型,这里是指IDE硬盘。 “x”为盘号( a 为基本盘, b为基本从属盘, c 为辅助主盘, d 为辅助从属盘) ,“~”代表分区,前四个分区用数字 1 到 4 表示,它们是主分区或扩展分区,从 5 开始就是逻辑分区。例: hda3 表示为第一个 IDE 硬盘上的第三个主分区或扩展分区,hdb2 表示为第二个 IDE 硬盘上的第二个主分区或扩展分区
  • 对于 SCSI 硬盘则标识为“sdx~”, SCSI 硬盘是用“sd”来表示分区所在设备的类型的,其余则 和 IDE 硬盘的表示方法一样

lsblk指令

老师说这个指令叫做:老师不离开,他可以查看当前硬盘情况。带上f参数可以看到UUID和挂载目录

1
lsblk -f

添加一块硬盘

主要是下面五个步骤即可

  1. 在虚拟机中加入硬盘

    这个在虚拟机设置里面添加一块就好,添加完重启一下,就能看到那块硬盘了

    添加一块新硬盘1.png

  2. 对新硬盘进行分区

    1
    fdisk /dev/sdb

    该指令由四个比较重要的选项

    • m 显示命令列表
    • p 显示磁盘分区 同 fdisk –l
    • n 新增分区
    • d 删除分区
    • w 写入并退出

    所以我们是先输入n,他会问我们是主分区还是拓展分区,我们选择主分区就好,剩下的默认选择就行

    然后就多了一块分区

    添加一块新硬盘2.png

  3. 格式化新的分区

    1
    mkfs -t ext4 /dev/sdb1

    格式化后就会产生UUID了

    添加一块新硬盘3.png

  4. 挂载到文件系统

    1
    mount /dev/sdb1/  /home/newDisk

    添加一块新硬盘4.png

  5. 设置开机自动挂载

    打开/etc/fstab,添加一行

    1
    /dev/sdb1 /home/newDisk ext4 defaults 0 0

    然后输入命令

    1
    mount -a

    就可以了

对了,使用umount可以解除挂载哈

1
umount /dev/sdb1

df指令

该指令可以查看硬盘的使用情况

1
df -h

这里h还是让人看的意思

du指令

查看当前目录占用硬盘的情况

1
du -h /home

-s 指定目录占用大小汇总

-h 带计量单位

-a 含文件

–max-depth=1 子目录深度

-c 列出明细的同时,增加汇总值

例如

1
du -ach --max-depth=1 /opt

统计文件数

查看当前目录下文件夹的个数

1
ls -al | grep "^-" | wc -

如果需要包括子目录,在ls后面带上r即可

显示树形结构

和window一样

1
tree

如果没有这个指令就yum install tree按照一下

网络配置管理

界面操作的化大家参考老师的视频吧,这里说两个

防火墙

搭建一些环境的时候就需要这个,以前防火墙是iptables,现在用的是firewallD

服务操作

  1. 查看防火状态

    1
    2
    systemctl status firewalld
    service iptables status
  2. 暂时关闭防火墙

    1
    2
    systemctl stop firewalld
    service iptables stop
  3. 永久关闭防火墙

    1
    2
    systemctl disable firewalld
    chkconfig iptables off
  4. 重启防火墙

    1
    2
    systemctl enable firewalld
    service iptables restart

关于iptables大家可以参考这篇文章:https://www.cnblogs.com/datastart/p/10509184.html

端口操作

对于firewalld,我们可以使用

1
iptables -Ln

查看所有端口的状态,在/etc/config/iptables中添加

1
2
3
-A INPUT -m state --state NEW -m tcp -p tcp --dport 10000 -j ACCEPT 

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10000 -j ACCEPT

然后重启服务即可

对于firewalld来说,打开某一个需要使用指令

1
firewall-cmd --zone=public --add-port=80/tcp --permanent

重新载入

1
firewall-cmd --reload

查看

1
firewall-cmd --zone=public --query-port=80/tcp

删除

1
firewall-cmd --zone=public --remove-port=80/tcp --permanent

这个在跑跑服务器的时候很有用

固定IP地址

有时候XShell突然连不上可能就是IP变了的原因,我们可以去/etc/sysconfig/network-scripts/ifcfg-ens33修改一下,我的文件名和老师的不一样

固定IP.png

这样就好了,我们再使用ifconfig就能看到我们的IP


好啦,下一节讲述的是Linux的进程管理,感觉三天好像有点极限,还想着回家之前看完的