day13
第9章 软链接和硬链接
一. 标识符.
[root@oldboyedu ~]# ls -lhi
total 32K
33631870 -rw-r--r--. 1 root root 4 Mar 13 2019 a.txt
第二列结尾的. 是标识selinux的符号
1、selinux是什么?
安全规则,让Linux系统更安全的一套规则。
这个规则太严格了,一般的情况下都会关闭selinux。
自己开启防火墙啊,用其他手段来实现同样的安全目的。
2、怎么关掉Selinux?
查看方法:
[root@oldboyedu ~]# getenforce
Enforcing
临时关掉:
[root@oldboyedu ~]# setenforce
usage: setenforce [ Enforcing | Permissive | 1 | 0 ]
[root@oldboyedu ~]# setenforce 0
[root@oldboyedu ~]# getenforce
Permissive
永久关闭:
vim /etc/selinux/config
[root@oldboyedu ~]# grep dis /etc/selinux/config
# disabled - No SELinux policy is loaded.
SELINUX=disabled
Linux里防火墙C6 iptables C7 firewalld
作用:防护计算机,防止被入侵。
systemctl status firewalld.service
开启firewalld(C6 service iptables start 或者/etc/init.d/iptables start)
[root@oldboyedu ~]# systemctl start firewalld.service
[root@oldboyedu ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: active (running) since Sun 2020-10-04 20:48:49 CST; 1s ago
Docs: man:firewalld(1)
Main PID: 7003 (firewalld)
CGroup: /system.slice/firewalld.service
└─7003 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
Oct 04 20:48:48 oldboyedu systemd[1]: Starting firewalld - dynamic firewall daemon...
Oct 04 20:48:49 oldboyedu systemd[1]: Started firewalld - dynamic firewall daemon.
让firewalld开机自启动
[root@oldboyedu ~]# systemctl enable firewalld.service
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.
C6用法:chkconfig iptables off
C7就是一个命令systemctl
[root@oldboyedu ~]# ls -lhi
total 32K
33631870 -rw-r--r--. 1 root root 4 Mar 13 2019 a.txt
二. 硬链接数
1、什么是硬链接?
具有相同inode节点号的文件互为硬链接。
一个文件的两个入口。
[root@oldboyedu ~]# ls -ldi test test/.
16964029 drwxr-xr-x. 2 root root 4096 Oct 1 14:07 test
16964029 drwxr-xr-x. 2 root root 4096 Oct 1 14:07 test/.
[root@oldboyedu /data]# ls -ldi oldboy
33631853 drwxr-xr-x. 5 root root 45 Oct 4 21:03 oldboy
[root@oldboyedu /data]# ls -ldi oldboy oldboy/. oldboy/test{1..3}/..
33631853 drwxr-xr-x. 5 root root 45 Oct 4 21:03 oldboy
33631853 drwxr-xr-x. 5 root root 45 Oct 4 21:03 oldboy/.
33631853 drwxr-xr-x. 5 root root 45 Oct 4 21:03 oldboy/test1/..
33631853 drwxr-xr-x. 5 root root 45 Oct 4 21:03 oldboy/test2/..
33631853 drwxr-xr-x. 5 root root 45 Oct 4 21:03 oldboy/test3/..
2、硬链接原理。
3、测试
创建硬链接:
ln 源文件 硬链接文件
a.文件硬链接
[root@oldboyedu /data]# echo "I am oldboy." >oldboy.txt
[root@oldboyedu /data]# cat oldboy.txt
I am oldboy.
[root@oldboyedu /data]# ln oldboy.t
oldboy.tar.gz oldboy.txt
[root@oldboyedu /data]# ln oldboy.txt oldboy_hard_link
[root@oldboyedu /data]# ls -lirt
total 20
33631860 -rw-r--r--. 1 root root 0 Oct 1 00:19 5.txt
33631855 -rw-r--r--. 1 root root 0 Oct 1 00:19 4.txt
33631847 -rw-r--r--. 1 root root 0 Oct 1 00:19 3.txt
33631845 -rw-r--r--. 1 root root 0 Oct 1 00:19 2.txt
33631841 -rw-r--r--. 1 root root 0 Oct 1 00:19 1.txt
33656236 -rw-r--r--. 1 root root 18 Oct 1 09:01 paichu.txt
33631869 -rw-r--r--. 1 root root 187 Oct 1 09:01 oldboy.tar.gz
33656257 -rwxr-xr-x. 1 root root 14 Oct 1 11:07 test.txt
33631853 drwxr-xr-x. 5 root root 45 Oct 4 21:03 oldboy
33656238 -rw-r--r--. 2 root root 13 Oct 4 21:10 oldboy.txt
33656238 -rw-r--r--. 2 root root 13 Oct 4 21:10 oldboy_hard_link
作用:
1、备份,防止误删。
[root@oldboyedu /data]# ln /etc/hostname /opt/hostname
[root@oldboyedu /data]# cat /opt/hostname
oldboyedu
[root@oldboyedu /data]# rm -f /etc/hostname
[root@oldboyedu /data]# cat /etc/hostname
cat: /etc/hostname: No such file or directory
[root@oldboyedu /data]# cat /opt/hostname
oldboyedu
[root@oldboyedu /data]# ln /opt/hostname /etc/hostname
[root@oldboyedu /data]# cat /etc/hostname
oldboyedu
b.目录硬链接
不支持人工创建目录硬链接。
[root@oldboyedu /data]# ln oldboy oldgirl
ln: ‘oldboy’: hard link not allowed for directory
老男孩的思考:
/etc/目录,对应一个分区
/home目录,还可能对应一个分区。
ln /etc/ /home/oldboy
软链接:
本质是快捷方式,指向源文件实体,本身和源文件是不同的文件。
实践:
文件
[root@oldboyedu /data]# !echo
echo "I am oldboy." >oldboy.txt
[root@oldboyedu /data]# cat oldboy.txt
I am oldboy.
[root@oldboyedu /data]# ln -s oldboy.txt oldboy_soft_link
目录:是工作中的重点
[root@oldboyedu /data]# mkdir oldboy
[root@oldboyedu /data]# touch oldboy/test.txt
[root@oldboyedu /data]# ln -s oldboy oldboy_soft_link_dir
[root@oldboyedu /data]# ls oldboy_soft_link_dir/
test.txt
[root@oldboyedu /data]# ls oldboy
test.txt
工作中为什么会使用软链接。
第一个用途:
安装软件:/application/nginx-1.10
过半年:/application/nginx-1.20
导致一个问题,工作中,开发等引用/application/nginx-1.10路径。
安装软件:/application/nginx-1.10===>/application/nginx(让开发用)
过半年: /application/nginx-1.20===>/application/nginx(让开发用)
第二个用途:
/etc/对应的分区要满了,没法放很多文件,但是程序还想通过/etc/目录访问文件。
此时,我们可以把文件放入/opt/oldboy下,然后做一个到/etc/oldboy的软链接。
[root@oldboyedu /data]# mkdir /opt/oldboy
[root@oldboyedu /data]# touch /opt/oldboy/{1..3}.txt
[root@oldboyedu /data]# ln -s /opt/oldboy/ /etc/oldboy
[root@oldboyedu /data]# ls /etc/oldboy
1.txt 2.txt 3.txt
[root@oldboyedu /data]# ll /opt/oldboy
total 0
-rw-r--r--. 1 root root 0 Oct 4 22:02 1.txt
-rw-r--r--. 1 root root 0 Oct 4 22:02 2.txt
-rw-r--r--. 1 root root 0 Oct 4 22:02 3.txt
必会面试题:软链接和硬链接的区别?
(1)答分类:在Linux系统中,链接分为两种:一种称为硬链接,另一种被称为符号连接或软链接。
(2)答概念:硬链接文件与源文件的Inode节点号相同,而软链接相当于Windows下面的快捷方式。
(3)答创建:默认不带参数的情况下,ln命令创建的是硬链接,ln -s创建的是软链接。
(4)答特点:a.对目录能创建软链接,不能创建硬链接,对目录创建软链接会经常用到。
b.软链接可以跨文件系统(分区),硬链接不可以跨文件系统。
c.删除软链接文件,对源文件及硬链接文件无任何影响。
d.删除文件的硬链接文件,对源文件及软链接文件无任何影响。
e.删除文件的源文件,对硬链接文件无任何影响,会导致其软链接失效(红底白字闪烁状)。
f.同时删除源文件及其硬链接文件,整个文件才会被真正的删除。
(5)答案例:硬链接用处不多,可以用来对重要文件做快照防止误删,且对目录建立软链接在工作中常用。例如:安装软件会用nginx-1.10作为目录,安装完后设置软链接为nginx,即保持了版本号标识,又方便使用,以及方便后续软件升级。
Linux文件删除原理:
1、静态文件:没有进程或程序正在访问的文件。
所有的硬链接数为0(i_link),即所有硬链接都被干掉了,包括自身。
硬链接的数量的代表变量符号i_link
rm -f oldboy.txt oldboy_hard_link
执行完 其实文件也没删,关机停止运行。
a.系统定时清理没有文件名的inode。
b.磁盘检查会清理。
c.增加新文件时优先占用没有文件名的inode。
恢复的工具:debugfs,ext3grep等等。
亡羊补牢其实不可取的,违反运维的三大核心原则。
多备份,操作前备份,异服务器和异地备份。
流浪地球,人类备份。
光一秒30w公里
月地距离 38万公里
日地距离 1.5亿公里 8分钟
太阳系大小
第二近的恒星 4光年
地球 46亿年了。42亿前。
太阳处于中年 寿命70亿年。大到太阳吞噬地球。
银河系大小 10万光年
宇宙大小 可探测到的直径1000亿光年
2、动态文件:有程序或进程访问的文件
删除原理:
a.所有硬链接删除。i_link为0.
b..i_count是进程调用文件的数量(引用计数)。所有进程调用都要停止取消。i_count为0
3、实践文件删除原理
环境准备,命令集合如下:
mkdir -p /app/logs #<==创建用于挂载的目录。
dd if=/dev/zero of=/dev/sdc bs=8K count=10 #<==创建指定大小的文件。
mkfs.ext4 /dev/sdc #<==格式化。
mount -o loop /dev/sdc /app/logs #<==挂载。
df -h #<==检查挂载结果。
实践:
[root@oldboyedu /data]# cd /app/logs/
[root@oldboyedu /app/logs]# touch nginx.log
[root@oldboyedu /app/logs]# tail -f nginx.log
[root@oldboyedu /app/logs]# cat /etc/services >>nginx.log
cat: write error: No space left on device
[root@oldboyedu /app/logs]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 1.9G 18G 10% /
devtmpfs 980M 80K 980M 1% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.5M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda1 253M 136M 118M 54% /boot
tmpfs 199M 0 199M 0% /run/user/0
/dev/loop0 73K 71K 0 100% /app/logs
明明删除了,结果还是100%。
[root@oldboyedu /app/logs]# rm -f nginx.log
[root@oldboyedu /app/logs]# lsof|grep nginx
tail 7927 root 3r REG 7,0 57344 12 /app/logs/nginx.log (deleted)
[root@oldboyedu /app/logs]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 1.9G 18G 10% /
devtmpfs 980M 80K 980M 1% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.5M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda1 253M 136M 118M 54% /boot
tmpfs 199M 0 199M 0% /run/user/0
/dev/loop0 73K 71K 0 100% /app/logs
重来:
模拟进程读文件:
[root@oldboyedu /app/logs]# touch nginx.log
[root@oldboyedu /app/logs]# tail -f nginx.log
ln nginx.log nginx_hard.log
当前:
i_link=2
i_count=1
模拟把文件变大,让分区满
[root@oldboyedu /app/logs]# cat /etc/services >>nginx.log
cat: write error: No space left on device
[root@oldboyedu /app/logs]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 1.9G 18G 10% /
devtmpfs 980M 80K 980M 1% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.5M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda1 253M 136M 118M 54% /boot
tmpfs 199M 0 199M 0% /run/user/0
/dev/loop0 73K 71K 0 100% /app/logs
分区满了:清理,删除。
删除源文件
[root@oldboyedu /app/logs]# rm -f nginx.log
结果:
i_link=1
i_count=1
ctrl+c 中断 进程调用文件
结果:
i_link=1
i_count=0
删除硬链接文件
[root@oldboyedu /app/logs]# rm -f nginx_hard.log
结果:
i_link=0
i_count=0
[root@oldboyedu /app/logs]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 1.9G 18G 10% /
devtmpfs 980M 80K 980M 1% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.5M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda1 253M 136M 118M 54% /boot
tmpfs 199M 0 199M 0% /run/user/0
/dev/loop0 73K 14K 54K 21% /app/logs
第10章 通配符与特殊符号
通配符知识:
1、基本含义
通配符简单说就是键盘上的一些特殊字符,可以实现某些特殊的功能,
例如,可以用*代表所有,来模糊搜索系统中的文件。
2、范围:通配符试用范围是命令行中【普通命令】或脚本编程中。
3、
第一组 模糊匹配:
准备:
[root@oldboyedu /data]# touch a.txt b.txt aa.txt test.txt
[root@oldboyedu /data]# ls
aa.txt a.txt b.txt test.txt
* 所有
两个5000工资 保险公积金 多交1600以上 13200
一个10000的 11600
笔记本多发了一个 位置多占一个 电多用 管理复杂了。
[root@oldboyedu /data]# a="oldboy"
[root@oldboyedu /data]# echo '$a'
$a
[root@oldboyedu /data]# echo "$a"
oldboy
[root@oldboyedu /data]# echo $a
oldboy
[root@oldboyedu /data]# echo "$a is a teaher."
oldboy is a teaher.
[root@oldboyedu /data]# echo $a is a teacher.
oldboy is a teacher.
[root@oldboyedu /data]# echo date
date
[root@oldboyedu /data]# echo `date`
Sun Oct 4 23:54:38 CST 2020
[root@oldboyedu /data]# 希望系统把字符串当做命令就用反引号
day14
一.基本正则(BRE)
3W1H:
1、什么是正则表达式?
作用和特殊字符一样。
正则表达式是为处理大量的字符串及文本而定义的一套规则和方法。
开发者
假设"@"代表“I am”,"!"代表“oldboy”,
则执行echo "@!"的结果就是输出“I am oldboy”。
发明语言:
上了火星,发明火星语。
! 我喜欢你
@ 滚
2、提高效率,快速获取到想要的内容。
3、适用于三剑客命令 grep(egrep),sed,awk
以行为单位处理。
4、实践来讲解
易混淆事项
1、和通配符区别。
2、开发人员正则,一般是Perl兼容正则表达式。
3、Linux系统三剑客正则表达式******。
环境准备:
export LC_ALL=C
分类:
1、BRE grep(查看,过滤)
2、ERE egrep
^:用法^m,表示匹配以m单词开头的行
[root@oldboydu ~]# grep "^m" oldgril.txt(过滤以m单词开头的行)
mkbbvcxtuwiou
m.jdiuyu
mmmmm
$:用法ss$,表示匹配以ss单词结尾的行
[root@oldboydu ~]#grep "ss$" oldgril.txt(过滤以ss单词结尾的行)
sdddddssdss
^$:空行(逻辑解释是以^结尾的行,或者以$开头的行)
[root@oldboydu ~]#grep "^$" oldgril.txt
空白(这里还没开始就结束了,所以这里是空白)
.:点号,表示匹配任意一个且只有一个字符(但是不能匹配空行)(.本身就代表一个目录)
[root@oldboydu ~]#grep "^." oldgril.txt(过滤任意一个开头的行)
jihh
jhcu
kom
1274
98957180
jfuhacjm
mkbbvcxtuwiou
m.jdiuyu
ljdiusgl
jiohoi
njochlvo
kkkkkki
lllllo
nnnnn
mmmmm
cccc
sdddddssdss
[root@oldboydu ~]# grep ".$" oldgril.txt(过滤任意结尾的行)
jihh
jhcu
kom
1274
98957180
jfuhacjm
mkbbvcxtuwiou
m.jdiuyu
ljdiusgl
jiohoi
njochlvo
kkkkkki
lllllo
nnnnn
mmmmm
cccc
sdddddssdss
\:用法\.和\$和\*,让有特殊含义的字符脱掉马甲,现出原形,还原本意。
[root@oldboydu ~]#grep "\." oldgril.txt(.在正则表达式里是代表匹配任意一个字符,但在这里条命令只是过滤带有.的行)
m.jdiuyu
*:匹配所有内容
[root@oldboydu ~]#egrep "1*" oldgril.txt
jihh
jhcu
kom
1274
98957180
jfuhacjm
mkbbvcxtuwiou
m.jdiuyu
ljdiusgl
jiohoi
njochlvo
kkkkkki
lllllo
nnnnn
mmmmm
cccc
sdddddssdss
.*:表示所有内容
[root@oldboydu ~]# egrep ".*" oldgril.txt
jihh
jhcu
kom
1274
98957180
jfuhacjm
mkbbvcxtuwiou
m.jdiuyu
ljdiusgl
jiohoi
njochlvo
kkkkkki
lllllo
nnnnn
mmmmm
cccc
sdddddssdss
^.*:匹配以任意0个多个字符开头的内容
.*$:以任意0个或多个字符结尾
二.扩展正则(ERE)
(grep默认不支持扩展正则,在扩展正则里用grep -E或egrep,推荐使用egrep)
+:匹配前一个字符1次或多次
[root@oldboydu ~]#egrep "k+" oldgril.txt (过滤出+的前一个字符k1次或1次以上:过滤包含k的字符)
kom
mkbbvcxtuwiou
kkkkkki
【:/】+:匹配括号内的:或/字符1次或1次以上
[root@oldboydu ~]#sed 's#[abc]+#,#g' -r a.txt (把abc替换成,sed:修改。s###g:把前面的修改成后面的。s#a#b#g:把a修改成b。)
123
,
q,
,
,`
?:匹配前一个字符0次或1次
[root@oldboyedu ~/test]# ls /data
a.txt aa.txt b.txt c.txt f.txt test.txt
[root@oldboyedu ~/test]# mkdir /data/oldboy
[root@oldboyedu ~/test]# ls -l /data
total 0
-rw-r--r--. 1 root root 0 Oct 4 23:28 a.txt
-rw-r--r--. 1 root root 0 Oct 4 23:28 aa.txt
-rw-r--r--. 1 root root 0 Oct 4 23:28 b.txt
-rw-r--r--. 1 root root 0 Oct 4 23:38 c.txt
-rw-r--r--. 1 root root 0 Oct 4 23:38 f.txt
drwxr-xr-x. 2 root root 6 Oct 5 01:08 oldboy
-rw-r--r--. 1 root root 0 Oct 4 23:28 test.txt
[root@oldboyedu ~/test]# ls -l /data|grep "^d"
drwxr-xr-x. 2 root root 6 Oct 5 01:08 oldboy
es? 匹配e es
es* 匹配e es ess essssss essssssssss 更多s。
?0
0?
代表 自身是 .代表任意一个字符。
匹配 ? 匹配前一个字符。
e*s* 和e?s?
e* 空 e ee eeee eeeeee
s* 空 s ss sss ssssssssssssss
e*s* 空 es e s ees essssss
e?s? 空 e s es
e? 空 e
s? 空 s
=========================================
e+ e ee eee eeeee .........
e* 空 e ee eeee eeeeee .........
e? 空 e
=========================================
a{n,m} 匹配前一个字符最少n次,最多m次
a{n,} 匹配前一个字符最少n次
a{n} 匹配前一个字符正好n次
a{,m} 匹配前一个字符最多m次
(0)===\1
(0)(0) \1 \2
第一个括号 第二个括号
egrep -o "(e)(s)\1\2" oldboy.txt ===== egrep -o "eses" oldboy.txt
特殊预定义中括号表达式
[root@oldboyedu ~/test]# egrep "[0-9]" oldboy.txt
my qq num is 49000448.
not 4900000448.
[root@oldboyedu ~/test]#
[root@oldboyedu ~/test]# egrep "[[:digit:]]" oldboy.txt
my qq num is 49000448.
not 4900000448.
[root@oldboyedu ~/test]# egrep "[[:lower:]]" oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu ~/test]# egrep "[[:upper:]]" oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu ~/test]# egrep "\boldboy\b" oldboy.txt
I am oldboy teacher!
[root@oldboyedu ~/test]# egrep "oldboy" oldboy.txt
I am oldboy teacher!
our site is http://www.oldboyedu.com
[root@oldboyedu ~/test]# egrep -w "oldboy" oldboy.txt
I am oldboy teacher!
评书:三侠剑 老好了。
侠客、剑客
Linux三剑客
awk sed grep
sed
Sed是操作、过滤和转换文本内容的强大工具。
常用功能有对文件实现快速增删改查(增加、删除、修改、查询),
其中查询的功能中最常用的2大功能是过滤(过滤指定字符串)和取行(取出指定行)。
sed [选项] [sed内置命令字符] [文件]
选项:
-n 取消默认sed的输出,常与sed内置命令的p连用※
-i 直接修改文件内容,而不是输出到终端。
如果不使用-i选项sed只是修改在内存中的数据,并不会影响磁盘上的文件※
sed的内置命令字符说明
s 替换
g 全局global
p 打印print
d 删除delete
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
[root@oldboyedu ~/test]# cat oldgirl.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
问题1:输出oldboy.txt的第2-3行内容※。
sed -n '2,3p' oldgirl.txt
问题2:过滤出含有oldboy字符串的行※。
sed -n '/oldboy/p' oldgirl.txt
问题3:删除含有oldboy字符串的行※。
sed '/oldboy/d' oldgirl.txt
sed /oldboy/d oldgirl.txt
问题4:将文件中的oldboy字符串全部替换为oldgirl※。
vim替换:
:%s#oldboy#oldgirl#g
sed 's#想替换啥#用啥替换#g' oldgirl.txt
sed 's#oldboy#oldgirl#g' oldgirl.txt
修改文件:
sed -i 's#oldboy#oldgirl#g' oldgirl.txt
问题5:将文件中的oldboy字符串全部替换为oldgirl,同时将QQ号码49000448改为31333741。
sed -e 's#oldboy#oldgirl#g' -e 's#49000448#31333741#g' oldgirl.txt I
环境:
[root@oldboyedu ~/test]# cat oldgirl.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
问题1:输出oldboy.txt的第2-3行内容※。
问题2:过滤出含有oldboy字符串的行※。
问题3:删除含有oldboy字符串的行※。
问题4:将文件中的oldboy字符串全部替换为oldgirl※。
问题5:将文件中的oldboy字符串全部替换为oldgirl,同时将QQ号码49000448改为31333741。
day15
删除指定行
sed -i '3d' oldgirl.txt (加-i是永久修改)
[root@oldboydu~]# cat oldgril.txt
ooa ooooo jdjj jkds kjodc
jihh
jfuhacjm
mkbbvcxtuwiou
m.jdiuyu
ljdiusgl
jiohoi
njochlvo
kkkkkki
lllllo
nnnnn
mmmmm
cccc
sdddddssdss
[root@oldboydu~]# sed -i '3d' oldgril.txt (删除第三行)
[root@oldboydu~]# cat oldgril.txt
ooa ooooo jdjj jkds kjodc
jihh
mkbbvcxtuwiou
m.jdiuyu
ljdiusgl
jiohoi
njochlvo
kkkkkki
lllllo
nnnnn
mmmmm
cccc
sdddddssdss
sed -i '5,8d' oldgirl.txt
[root@oldboydu~]# cat oldgril.txt
ooa ooooo jdjj jkds kjodc
jihh
mkbbvcxtuwiou
m.jdiuyu
ljdiusgl
jiohoi
njochlvo
kkkkkki
lllllo
nnnnn
mmmmm
cccc
sdddddssdss
[root@oldboydu~]# cat oldgril.txt
jihh
lllllo
nnnnn
mmmmm
cccc
sdddddssdss
sed '2d' oldgril.txt (临时删除)
[root@oldboydu~]#sed '2d' oldgril.txt (临时删除)
jihh
nnnnn
mmmmm
cccc
sdddddssdss
[root@oldboydu~]# cat oldgril.txt
jihh
lllllo
nnnnn
mmmmm
cccc
sdddddssdss
[root@oldboydu~]# sed -i '5,8d' oldgril.txt (删除5-8行)
[root@oldboydu~]# cat oldgril.txt
ooa ooooo jdjj jkds kjodc
jihh
mkbbvcxtuwiou
m.jdiuyu
lllllo
nnnnn
mmmmm
cccc
sdddddssdss
环境:
[root@oldboyedu ~/test]# cat oldgirl.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
问题1:输出oldboy.txt的第2-3行内容※。
[root@oldboyedu ~/test]#sed -n '2,3p' oldgirl.txt (-n p:输出)
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
[root@oldboyedu ~/test]#head -3 oldgirl.txt |tail -2
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
问题2:过滤出含有oldboy字符串的行※。
[root@oldboyedu ~/test]#sed -n '/oldboy/p' oldgirl.txt
I am oldboy teacher!
our site is http://www.oldboyedu.com
[root@oldboyedu ~/test]#grep oldboy oldgirl.txt
I am oldboy teacher!
our site is http://www.oldboyedu.com
问题3:删除含有oldboy字符串的行※。
[root@oldboyedu ~/test]#sed '/oldboy/d' oldgirl.txt
I like badminton ball ,billiard ball and chinese chess!
my qq num is 49000448.
[root@oldboyedu ~/test]#grep -v "oldboy" oldgirl.txt
I like badminton ball ,billiard ball and chinese chess!
my qq num is 49000448.
问题4:将文件中的oldboy字符串全部替换为oldgirl※。
[root@oldboyedu ~/test]# sed 's#oldboy#oldgirl#g' oldgirl.txt(s###g:把前面的替换成后面的)
I am oldgirl teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldgirledu.com
my qq num is 49000448.
vim替换:
问题5:将文件中的oldboy字符串全部替换为oldgirl,同时将QQ号码49000448改为31333741。
[root@oldboyedu ~/test]#sed -e 's#oldboy#oldgirl#g' -e 's#49000448#31333741#g' oldgirl.txt (-e 参数,多项编辑功能,不需要多次管道了)
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 31333741.
问题6:在oldboy.txt文件的第2行后追加文本I teacher linux。
[root@oldboyedu ~/test]#sed '2a I teacher linux.' oldgirl.txt (2a:在第二行的后面追加)
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
I teacher linux.
our site is http://www.oldboyedu.com
my qq num is 49000448.
[root@oldboyedu ~/test]# cat oldgirl.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
[root@oldboyedu ~/test]#sed -i '2a I teacher linux.' oldgirl.txt
[root@oldboyedu ~/test]# cat oldgirl.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
I teacher linux.
our site is http://www.oldboyedu.com
my qq num is 49000448.
[root@oldboyedu ~/test]#sed '2i I teacher linux.i' oldgirl.txt
I am oldboy teacher!
I teacher linux.i
I like badminton ball ,billiard ball and chinese chess!
I teacher linux.
our site is http://www.oldboyedu.com
my qq num is 49000448.
问题1:取出Linux中执行ifconfig eth0后对应的IP地址(只能输出IP地址)。
练习sed
正则是贪婪匹配模式,人性是贪婪的。
方法1:
[root@oldboyedu ~/test]# ifconfig eth0|sed -n 2p|sed 's#^.*inet ##g'|sed 's# netm.*$##g'
10.0.0.201
方法:要取一个目标,删除目标两边的,就得到了目标:
先匹配上,然后在删除
[root@oldboyedu ~]# ifconfig eth0|sed -n 2p|sed 's#^.*inet ##g'|sed 's# netm.*$##g'
10.0.0.201
[root@oldboyedu ~]# ifconfig eth0|sed -n 2p|sed -e 's#^.*inet ##g' -e 's# netm.*$##g'
10.0.0.201
[root@oldboyedu ~]# ifconfig eth0|sed -ne 's#^.*inet ##g' -e 's# netm.*$##gp'
10.0.0.201
[root@oldboyedu ~]# ifconfig eth0|sed -nr '2s#^.*inet (.*) netm.*$#\1#gp' ((.*)代表自己,\1是应用()里面的内容)
10.0.0.201
验证是否懂了的练习题:
stat /etc/hosts自行取其中的644
[root@oldboyedu ~]# stat /etc/hosts
File: ‘/etc/hosts’
Size: 158 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 16829878 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-10-06 20:40:18.463001804 +0800
Modify: 2013-06-07 22:31:32.000000000 +0800
Change: 2019-03-04 11:15:49.426692303 +0800
Birth: -
[root@oldboyedu ~]#stat /etc/hosts|sed -rn 's#^.*\(0(.*)/-.*$#\1#gp'
644
考试:ip add的输出取出IP。
[root@oldboyedu ~]# ip add|sed -rn 's#^.*net (.*)/24.*$#\1#gp'
10.0.0.201
1、象棋,教学,比赛,活动
2、踢毽子,比赛。最牛的单人前三,小组前三。
三剑客自身有特长的。
grep 过滤查找内容。筛子
sed 取行,替换,删除,追加
awk 取列
cut 按列切割
-d 指定分隔符 -f指定哪列,多列用逗号
[root@oldboyedu ~]# cat a.txt
1 2 3 4 5 6 7 8 9 10
[root@oldboyedu ~]# cut -d" " -f1,3,5 a.txt
1 3 5
[root@oldboyedu ~]# cut -d" " -f3-5 a.txt
3 4 5
练习
[root@oldboyedu ~]# sed -n '1,5p' /etc/passwd >oldboyedu.txt
[root@oldboyedu ~]# cat oldboyedu.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@oldboyedu ~]# cut -d":" -f3,4 /etc/passwd
0:0
1:1
2:2
[root@oldboyedu ~]# cat b.txt
oldboy 49000448
[root@oldboyedu ~]# cut -c1-6,8- b.txt
oldboy4900044
awk语法:
awk [option] 'pattern{action}' file ...
awk [参数] '条件{动作}' 文件 ...
参数:
-F 指定分隔符
打印第一列:
[root@oldboyedu ~]# awk -F ":" '{print $1}' oldboyedu.txt
root
bin
daemon
adm
lp
[root@oldboyedu ~]# awk -F ":" '{print $3,$5}' oldboyedu.txt
0 root
1 bin
2 daemon
3 adm
4 lp
列:$1第一列 $2第二列 以此类推....
$0 整行
$NF 最后一列 倒数第一列
$(NF-1) 倒数第二列
[root@oldboyedu ~]# awk -F ":" '{print $NF}' oldboyedu.txt
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
[root@oldboyedu ~]# awk -F ":" '{print $0}' oldboyedu.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
练习:打印 1 2 和最后一列。
[root@oldboyedu ~]# awk -F ":" '{print $1,$2,$NF}' oldboyedu.txt
root x /bin/bash
bin x /sbin/nologin
daemon x /sbin/nologin
adm x /sbin/nologin
lp x /sbin/nologin
问题1:取test.txt文件的第2行到第3行的内容。
[root@oldboyedu ~]# awk 'NR>1&&NR<4' oldboyedu.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@oldboyedu ~]# awk 'NR==2,NR==3' oldboyedu.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
问题2:过滤出含有root字符串的行※。
[root@oldboyedu ~]# awk '/root/' oldboyedu.txt
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# awk /root/ oldboyedu.txt
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]#
[root@oldboyedu ~]# awk "/root/" oldboyedu.txt
root:x:0:0:root:/root:/bin/bash
问题3:删除含有root字符串的行※。
[root@oldboyedu ~]# awk '/^[^r]/' oldboyedu.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[^r] 非r
^[^r] 以非r字符卡头
问题4:取文件的第一列、第三列和最后一列内容,并打印行号※。
[root@oldboyedu ~]# awk -F ":" '{print NR,$1,$3,$NF}' oldboyedu.txt
1 root 0 /bin/bash
2 bin 1 /sbin/nologin
3 daemon 2 /sbin/nologin
4 adm 3 /sbin/nologin
5 lp 4 /sbin/nologin
问题5:取出Linux中执行ifconfig eth0后对应的IP地址(只能输出IP地址)。
[root@oldboyedu ~]# ifconfig eth0|awk 'NR==2{print $2}'
10.0.0.201
C6
[root@oldboy ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:D0:87:20
inet addr:10.0.0.202 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fed0:8720/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:243 errors:0 dropped:0 overruns:0 frame:0
TX packets:67 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:20674 (20.1 KiB) TX bytes:8706 (8.5 KiB)
[root@oldboy ~]# ifconfig eth0|awk 'NR==2{print $2}'
addr:10.0.0.202
[root@oldboy ~]# ifconfig eth0|awk 'NR==2{print $2}'|awk -F ":" '{print $2}'
10.0.0.202
[root@oldboy ~]# ifconfig eth0|awk -F "[: ]+" 'NR==2{print $4}'
10.0.0.202
问题6:过滤文件中第一列内容匹配root的字符串,把符合的行的最后一列输出
awk -F ":" '$1~/root/ {print $NF}' test.txt
~匹配
问题1:取test.txt文件的第2行到第3行的内容。
问题2:过滤出含有root字符串的行※。
问题3:删除含有root字符串的行※。
问题4:取文件的第一列、第三列和最后一列内容,并打印行号※。
问题5:取出Linux中执行ifconfig eth0后对应的IP地址(只能输出IP地址)。
问题6:过滤文件中第一列内容匹配root的字符串,把符合的行的最后一列输出
问题7:过滤下列test1.txt文件中第三列内容分数大于70,并且小于95的人名和性别。
day16
Linux基础权限是9个字符。
[root@oldboyedu ~]# ls -lhi
total 36K
33631870 -rw-r--r--. 1 root root 21 Oct 6 22:54 a.txt
33631871 -rw-r--r--. 1 root root 16 Oct 6 23:02 b.txt
33631857 -rw-r--r-- 1 root root 61 Oct 7 00:11 c.txt
rw-r--r--
rw-r--r--
rw-r--r--
分3组:
前三个字符是表示用户(属主)权限位 user(用户) u
中三个字符是表示用户组权限位 group(用户组) g
后三个字符是其它用户权限位 others(其他用户) o
同一组的三个字符权限也是有位置的:
r-- 第一个字符的位置读的权限位
第二个字符的位置写的权限位
第三个字符的位置是执行的权限位。
r 4
w 2
x 1
- 0
【文件】权限详细说明:****
【目录】权限详细说明:****
测试准备:
incahome(家、组)
oldboy 家庭男主人,用来代表用户(User)角色,是文件的所有者
oldgirl 女主人(和所有者oldboy属于相同组,oldboy的家人)用来代表用户组incahome的角色
test 其他人 其他(others)人,用来代表其他用户角色
[root@oldboyedu ~]# groupadd incahome
[root@oldboyedu ~]# useradd oldboy
useradd: user 'oldboy' already exists
[root@oldboyedu ~]# usermod -g incahome oldboy
[root@oldboyedu ~]# id oldboy
uid=1000(oldboy) gid=1004(incahome) groups=1004(incahome),1000(oldboy)
如果此前没有创建oldboy,可以执行下面命令,而不需要usermod命令。
[root@oldboyedu ~]# useradd oldboy -g incahome
[root@oldboyedu ~]# useradd oldgirl -g incahome
useradd: user 'oldgirl' already exists
[root@oldboyedu ~]# id oldgirl
uid=1001(oldgirl) gid=1001(oldgirl) groups=1001(oldgirl)
[root@oldboyedu ~]# usermod -g incahome oldgirl
[root@oldboyedu ~]# id oldgirl
uid=1001(oldgirl) gid=1004(incahome) groups=1004(incahome)
[root@oldboyedu ~]# useradd test
useradd: user 'test' already exists
准备环境:
[root@oldboyedu ~]# mkdir -p /oldboy
[root@oldboyedu ~]# echo "echo oldboyLinux" >/oldboy/test.sh
[root@oldboyedu ~]# chmod +x /oldboy/test.sh
1. 测试默认情况下不同用户的对应权限
[root@oldboyedu /oldboy]# chown oldboy.incahome test.sh
[root@oldboyedu /oldboy]# ls -l
total 4
-rwxr-xr-x 1 oldboy incahome 22 Oct 7 21:18 test.sh
权限修改:
777 +x -x u=w g-x
Linux权限有两种表现形式:
1、数字表示法 称为8进制权限
r 4
w 2
x 1
- 0
实际的权限表示就是将每3位相加即可。
rwxr-xr-x 755
rwx 7
r-x 5
r-x 5
2、字符表示法
rw-rw-r-x 代表的数字权限为665
--xr-x-wx 代表的数字权限为153
-wx--x--x 代表的数字权限为311
而以下数字权限表示的字符权限如下:
755 代表的字符权限为rwxr-xr-x
644 代表的字符权限为rw-r--r--
134 代表的字符权限为--x-wxr--
修改文件属性的用户和组
chown 用户.用户组 文件 这里的点可以用:替换。
chown 用户 文件
chown .用户组 文件 ====chgrp 用户组 文件
chgrp incahome test.txt
[root@oldboyedu /oldboy]# chown oldboy test.sh
[root@oldboyedu /oldboy]# ls -l
total 4
---x--x--x 1 oldboy root 12 Oct 7 22:16 test.sh
[root@oldboyedu /oldboy]# chown .incahome test.sh
[root@oldboyedu /oldboy]# ls -l
total 4
---x--x--x 1 oldboy incahome 12 Oct 7 22:16 test.sh
[root@oldboyedu /oldboy]# chown root:root test.sh
[root@oldboyedu /oldboy]# ls -l
total 4
---x--x--x 1 root root 12 Oct 7 22:16 test.sh
[root@oldboyedu /oldboy]#
安全权限临界点:
文件不想被修改被执行:644
[root@oldboyedu /oldboy]# touch oldboy.txt
[root@oldboyedu /oldboy]# ls -l
total 4
-rw-r--r-- 1 root root 0 Oct 7 23:21 oldboy.txt
目录不想被修改(删除移动创建)被执行(进入):755
博客:写博客。。。服务器的博客目录和文件的权限,防止被恶意篡改。
企业真实案例:网站文件被恶意修改了。。。。打开网站后有弹窗广告(不是你网站的)
用户打开网站,报警。
原因:权限设置不到位。chmod -R 777 目录 开发人员习惯
解决方案:
1、备份
tar zcvf /opt/oldboy_$(date +%F).tar.gz ./oldboy/
2、找到被修改的文件
[root@oldboyedu /]# find /oldboy -type f |xargs grep 'ddddddddddddd'
/oldboy/oldboy.txt:<script>ddddddddddddd</scripts>
/oldboy/test.sh:<script>ddddddddddddd</scripts>
3、批量删除
[root@oldboyedu /]# find /oldboy -type f |xargs sed -i '/ddddddddddddd/d'
[root@oldboyedu /]# find /oldboy -type f |xargs grep 'ddddddddddddd'
4、找到文件被篡改来源,并优化调整。
亡羊补牢。
5、写总结 故障报告。
控制默认权限的东西 umask
[root@oldboyedu /oldboy]# umask
022
创建文件默认最大的权限为666 (-rw-rw-rw-),其默认创建的文件没有可执行权限x位。
666
022 -
--------------------
644 默认权限
[root@oldboyedu /oldboy]# umask 044 ====临时
[root@oldboyedu /oldboy]# touch abc
[root@oldboyedu /oldboy]# ls -l abc
-rw--w--w- 1 root root 0 Oct 7 23:42 abc
[root@oldboyedu /oldboy]# umask 044
[root@oldboyedu /oldboy]# touch abc
[root@oldboyedu /oldboy]# ls -l abc
-rw--w--w- 1 root root 0 Oct 7 23:42 abc
[root@oldboyedu /oldboy]# umask
0044
[root@oldboyedu /oldboy]# umask 043
[root@oldboyedu /oldboy]# umask
0043
[root@oldboyedu /oldboy]# touch a
[root@oldboyedu /oldboy]# ls -l a
-rw--w-r-- 1 root root 0 Oct 7 23:44 a
当umask中存在奇数位的时候,在计算完毕,奇数位加1
666
011
-------------------
655
11
-----------------
666
基于文件:默认权限规则 了解
从666计算
umask都为偶数 默认权限用减法
umask有奇数 默认权限用减法 然后奇数位加1
基于目录:默认权限规则
从777计算
默认权限用减法
Linux系统特殊权限位知识
9位基础权限
还有3位特殊权限位
suid位:
suid(setuid)位通过S字符标识,
存在于基本权限的用户权限位的x权限对应的位置,
如果用户权限位对应的x权限位上有x权限,则suid就用小写的s标识,
suid的s对应的数字权限为4,完整权限用八进制数4000表示。
sgid位:
sgid(setgid)位同样是通过S字符来标识,
但是,sgid位存在于基本权限的用户组权限位的x权限对应的位置,
如果用户组权限位对应的x权限位上有x权限,则sgid就用小写的s标识,
suid的s对应的数字权限为2,完整的权限用八进制数2000表示。
sticky(粘滞位)知识简介
sticky(粘滞)位通过字符T标识,存在于基本权限的其他用户位对应的x权限位上,
如果其他用户位的x权限位上有x权限,
则sticky(粘滞)位通过小写的t标识,对应的数字权限是1,
完整的权限用八进制数1000表示。
4 2 1,加和放在基础权限数字的前面。
修改方法:
[root@oldboyedu /oldboy]# chmod 7755 abc
预测:-rwsr-sr-t
[root@oldboyedu /oldboy]# chmod 7755 abc
[root@oldboyedu /oldboy]# ls -l abc
-rwsr-sr-t 1 root root 0 Oct 7 23:42 abc
[root@oldboyedu /oldboy]# chmod 7644 abc
[root@oldboyedu /oldboy]# ls -l abc
-rwSr-Sr-T 1 root root 0 Oct 7 23:42 abc
工作中有啥用?
suid到底有什么作用
简单地说,suid的作用就是让普通用户可以在执行某个设置了suid位的命令或程序时,
拥有和root管理员一样的身份和权限(默认情况)。
[oldgirl@oldboyedu /]$ ll -ld oldboy/
dr-x-wxrw-. 2 oldboy incahome 6 Oct 7 22:15 oldboy/
oldgirl属于incahome,增加一个用户属于incahome,是不是也和oldgirl有同样权限。
oldboy 给一个新用户设置suid,这个新用户的权限就和oldboy一样。
回顾重点:
【文件】权限详细说明:*****
【目录】权限详细说明:*****
字符和数字(8进制)权限知识*****
chmod chown chgrp命令使用。*****
企业真实案例:网站文件被恶意修改了*****
umask默认权限控制*
特殊权限,suid** sgid sticky*
重点suid
下节内容:
1、sgid sticky
2、
跟老男孩学linux运维:核心基础实战_第13章_Linux系统定时任务Cron(d)服务应用实践
不能自学 就算找到工作,会被开掉。3-6个月。
day17
作用之一:
sgid的作用就是让普通用户可以在执行某个设置了sgid位的命令时,
拥有和命令对应用户组(一般为root用户组)一样的身份和权限(默认)。
locate搜索内容,默认从updatedb对应的数据库中查找
updatedb 更新locate查找内容对应的数据库。
[root@oldboyedu ~]# yum -y install mlocate(安装数据库)
[root@oldboyedu ~]# updatedb ([apudeitaide]更新资料库(系统指令))
[root@oldboyedu ~]# ls -l /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 1977042 Oct 8 00:47 /var/lib/mlocate/mlocate.db
[root@oldboyedu ~]# file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: data
sgid基于目录的作用:
让不同的人创建文件属于相同的用户组,从而可以互相共享文件的权限。
12.9 本章重点
1)Linux基本9位权限之文件和目录权限详细说明。
2)Linux基本9位权限之字符和数字(8进制)权限知识。
3)权限及用户用户组属性修改命令chmod、chown、chgrp。
4)默认权限umask以及系统目录安全案例。
5)特殊权限Suid知识掌握,Sgid和sticky知识了解即可。
day17
3W1H 框架
Linux系统定时任务:
1、什么是定时任务?
周期性的执行任务计划的软件,Linux定时任务的常用软件crond。
2、使用定时任务软件,可以每天,每小时按你需求重复的执行一项工作。
例如:备份 都是0点以后,2点爬起来备份,4点以后睡觉。
需要写一个程序实现自动备份,然后让定时任务软件帮你执行。
闹钟。。。。可以追女朋友。。。
3、怎样用。
(1)系统定时任务计划
1.不用管理员干预,系统自动执行。
2.也可以利用系统任务为管理员服务。
[root@oldboy ~]# ll /var/log/messages*
-rw-------. 1 root root 96594 Mar 21 12:40 /var/log/messages
-rw-------. 1 root root 485249 Mar 20 10:46 /var/log/messages-20190320
[root@oldboy ~]# ll /var/log/secure*
-rw-------. 1 root root 1430 Mar 21 12:50 /var/log/secure
-rw-------. 1 root root 2695 Mar 20 10:46 /var/log/secure-20190320
[root@oldboyedu /etc/cron.daily]# ll /etc/cron.daily/logrotate /etc/logrotate.conf
-rwx------. 1 root root 219 Oct 31 2018/etc/cron.daily/logrotate
-rw-r--r--. 1 root root 662 Jul 31 2013 /etc/logrotate.conf
按天切割日志,就可以用logrotate。
(2)用户定时任务计划
在Linux系统中,
cron是定时任务的软件名,
crond是服务进程名,真正实现定时任务服务。
crontab命令是用来设置定时任务规则的配置命令。
要想配置定时任务,首先启动crond服务。
systemctl start crond.service
systemctl stop crond.service
systemctl status crond.service
开启自启动:
systemctl disable crond.service
systemctl enable crond.service
[root@oldboyedu ~]# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-10-08 01:56:12 CST; 2min 26s ago
Main PID: 13189 (crond)
CGroup: /system.slice/crond.service
└─13189 /usr/sbin/crond -n
Oct 08 01:56:12 oldboyedu crond[13189]: (CRON) INFO (RANDOM_DELAY will be...)
Oct 08 01:56:12 oldboyedu systemd[1]: Started Command Scheduler.
Oct 08 01:56:12 oldboyedu crond[13189]: (CRON) INFO (running with inotify...)
Oct 08 01:56:12 oldboyedu crond[13189]: (CRON) INFO (@reboot jobs will be...)
Hint: Some lines were ellipsized, use -l to show in full.
crontab命令是用来设置定时任务规则的配置命令。
内容存放哪里了。定时任务内容存放的位置/var/spool/cron/
以当前用户名作为文件名
[root@oldboyedu ~]# ll /var/spool/cron/
total 8
-rw------- 1 oldboy oldboy 10 Oct 8 02:04 oldboy
-rw------- 1 root root 6 Oct 8 02:02 root
[root@oldboyedu ~]# cat /var/spool/cron/oldboy
###oldboy
-l l列表 查看已经设置的定时任务*
-e edit 编辑定时任务*
-u user 查看特定用户下定时任务
root:
crontab -l == cat /var/spool/cron/root
crontab -e == vim /var/spool/cron/root
编写定时任务的语法:
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * (command to be executed)
共六列:
第一列:分 minute (0 - 59)
第二列:时 hour (0 - 23)
第三列:日 day of month (1 - 31)
第四列:月 month (1 - 12) OR jan,feb,mar,apr ...
第五列:周 day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
第六列:要执行的任务命令或程序
特殊符号:
* 表示的 每或每一 的意思
00 23 * * * cmd
- 连续区间 1-10
00 8-23 * * * cmd
, 列举 1,2,3,4,8
00 1,2,3,4,8 * * * cmd
/n n是数字。
n代表自然数字,即“每隔n单位时间”,例如:每10分钟执行一次任务可以写成
*/10 * * * * cmd
=============================================
*/1 * * * * /bin/sh /scripts/data.sh
30 3,12 * * * /bin/sh /scripts/oldboy.sh
30 */6 * * * /bin/sh /scripts/oldboy.sh
30 8-18/2 * * * /bin/sh /scripts/oldboy.sh
30 21 * * * 最强大脑
45 4 1,10,22 * * /application/apache/bin/apachectl graceful
10 1 * * 6,0 /application/apache/bin/apachectl graceful
0,30 18-23 * * * /application/apache/bin/apachectl graceful
00 */1 * * * /application/apache/bin/apachectl graceful
#################
* 23,00-07/1 * * * /application/apache/bin/apachectl graceful
00 */1 * * *
00 11 * 4 1-3 /application/apache/bin/apachectl graceful
每周日上午9:30去老男孩教育上课
每天上午8:30去老男孩教育上课,这是脱产班的上课频率。
命令实例1:*/1 * * * * /bin/sh /scripts/data.sh
在本例中除了数字与命令脚本外,还使用到了符号"*",*号的意思“每一”。
第一列的意思为分钟,特殊符号“/”表示每隔的意思,即表示每隔一分钟执行/bin/sh /scripts/data.sh程序。
命令实例2:30 3,12 * * * /bin/sh /scripts/oldboy.sh
在本例中,第一列为30,表示30分钟;第二列为 3,12,这代表3点及 12点,此定时任务的意思是每天凌晨3点和中午12点的半点时刻(或描述为每天凌晨3:30和中午12:30)执行/scripts/oldboy.sh脚本。
命令实例3:30 */6 * * * /bin/sh /scripts/oldboy.sh
在本例中,第一列为30,表示30分钟;第二列*/6代表每6个小时,也相当于 6、12、18、24 的作用。此定时任务的意思是每隔6个小时的半点时刻执行/scripts/oldboy.sh脚本任务。
命令实例4:30 8-18/2 * * * /bin/sh /scripts/oldboy.sh
在本例中,其中的第一列为30,表示30分钟;第二列8-18/2代表在早晨8点到下午18点之间每隔2小时,也相当于把8、10、12、14、16、18单独列出。
那么,此定时任务的意思就是早晨8点到下午18点之间,每隔2小时的半点时刻执行/scripts/oldboy.sh脚本任务。
命令实例5:30 21 * * * /application/apache/bin/apachectl graceful
本例表示每晚的21:30重启apache。
命令实例6:45 4 1,10,22 * * /application/apache/bin/apachectl graceful
本例表示每月1、10、22日的凌晨4 : 45分重启apache。
命令实例7:10 1 * * 6,0 /application/apache/bin/apachectl graceful
本例表示每周六、周日的凌晨1 : 10分重启apache。
命令实例8:0,30 18-23 * * * /application/apache/bin/apachectl graceful
本例表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
命令实例9:00 */1 * * * /application/apache/bin/apachectl graceful
本例表示每隔一小时整点重启apache
命令实例10:* 23,00-07/1 * * * /application/apache/bin/apachectl graceful
本例并不表示晚上23点和早上0-7点之间每隔一小时重启Apache。
要说明的是,以上结果是不规范的,也是不对的。大家想想为什么?
以上定时任务的第一列为*,表示每分都执行任务即晚上23点和早上0-7点之间每隔一小时的每分都重启Apache,很可怕吧。
命令实例11:00 11 * 4 1-3 /application/apache/bin/apachectl graceful
本例表示4月的每周一到周三的上午11点整重启Apache。
命令实例12:30 09 * * 0 去老男孩教育上课
本例表示每周日上午9:30去老男孩教育上课,这是周末班的上课频率。
命令实例13:30 08 * * *去老男孩教育上课
本例表示每上午8:30去老男孩教育上课,这是脱产班的上课频率。
通过上述13个例子,相信读者已经能够理解定时任务的配置规则了。
实践:
1、每分钟追加一次oldboy字符串到/tmp/oldboy.log里。
解答:大象放冰箱分三步
a.命令行执行成功。
[root@oldboyedu ~]# echo "oldboy">>/tmp/oldboy.log
[root@oldboyedu ~]# cat /tmp/oldboy.log
oldboy
[root@oldboyedu ~]# echo "oldboy">>/tmp/oldboy.log
[root@oldboyedu ~]# cat /tmp/oldboy.log
oldboy
oldboy
b.配置定时任务crontab -e 编辑配置
[root@oldboyedu ~]# crontab -l
#####
* * * * * echo "oldboy">>/tmp/oldboy.log
c.检查
[root@oldboyedu ~]# tail -f /tmp/oldboy.log
oldboy
oldboy
oldboy
老男孩思想:
1)先输入* * * * *
2)先命令行操作成功。
3)拷贝命令到定时任务编辑里。
范例13-2:让服务器时间每5分钟和互联网时间做一次同步。
安装时间服务软件:yum install ntpdate -y
更新互联网时间 /usr/sbin/ntpdate ntp1.aliyun.com
/dev/null 黑洞设备
MH370>/dev/null
&>/dev/null 等价>/dev/null 2>&1
[root@oldboyedu ~]# crontab -l
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null
范例13-3:每天晚上0点,把站点目录/var/www/html下的内容打包备份到/data目录下,并且要求每次生成不同的备份包名。
至少分三步:
1.命令行稿成功
准备工作:
[root@oldboyedu ~]# mkdir /var/www/html /data -p
具体命令:
[root@oldboyedu ~]# tar zcvf /data/html_$(date +%F).tar.gz /var/www/html/
tar: Removing leading `/' from member names
/var/www/html/
[root@oldboyedu ~]# ll /data
total 4
-rw-r--r-- 1 root root 117 Mar 22 11:59 html_2019-03-22.tar.gz
2、编写定时任务
[root@oldboyedu ~]# crontab -l
00 00 * * * tar zcvf /data/html_$(date +%F).tar.gz /var/www/html/
错了,不执行。。。。
看报错日志。。。错误日志
定时任务没有执行,出错了日志在哪里?
出错日志/var/log/cron
Mar 22 12:03:01 oldboyedu CROND[18770]: (root) CMD (tar zcvf /data/html_$(date +)
定时任务对%的要求,百分号要转义。\%
正确答案:
[root@oldboyedu ~]# crontab -l
00 00 * * * tar zcvf /data/html_$(date +\%F).tar.gz /var/www/html/
优秀的答案(企业里):
1.命令行执行
cd /var/www
tar zcf /data/html_$(date +%F).tar.gz ./html
2.尽量用脚本文件实现
#mkdir /server/scripts -p #存放脚本的文件
运维规范:
脚本位置:/server/scripts
软件位置:/server/tools
编译位置:/application/软件名字-版本,然后要软链接。
cd /server/scripts
#cat bak.sh
cd /var/www
tar zcf /data/html_$(date +%F).tar.gz ./html
命令行执行:
/bin/sh /server/scripts/bak.sh
3、编辑定时任务
#bak html dir by oldboy at 2020108
00 00 * * * /bin/sh /server/scripts/bak.sh &>/dev/null
[root@oldboyedu /server/scripts]# crontab -l|tail -2
#bak html dir by oldboy at 2020108
00 00 * * * /bin/sh /server/scripts/bak.sh &>/dev/null
4、检查正式结果
[root@oldboyedu /server/scripts]# ls -l /data
13.5生产环境下的定时Cron书写要领
13.5.1 要领1:为定时任务规则加必要的注释
13.5.2 要领2:所有的定时任务尽量都以脚本的形式执行
13.5.3 要领3:在执行的Shell脚本前加上/bin/sh
13.5.4 要领4:定时任务中命令或脚本的结尾加>/dev/null 2>&1
13.5.5 要领5:在指定用户下执行相关定时任务
13.5.6 要领6:生产任务计划程序中不要随意打印输出信息,有输出的想法去掉。
13.5.7 要领7:定时任务执行的脚本要存放到规范路径下
13.5.8 要领8:配置定时任务要规范操作过程,减少出错
13.5.9 要领9:定时任务脚本中程序命令及路径尽量用全路径
13.5.10 要领10:时间变量%号要用反斜线转义(只有定时任务里是命令时需要)
13.5.11 要领11:若脚本中调用了系统环境变量,要重新定义
13.5.11 要领12:出错或无法执行,就检查/var/log/cron日志
1) 在每周6的凌晨3:15执行/home/shell/collect.pl,并将标准输出和标准错误输出到/dev/null设备,请写出crontab中的语句。
2) crontab在11月份内,每天的早上6点到12点中,每隔2小时执行一次/usr/bin/httpd.sh,怎么实现 ?
3) crontab文件由六个域组成,每个域之间用空格分割,其排列正确的为( )
A、MIN HOUR DAY MONTH YEAR COMMAND
B、MIN HOUR DAY MONTH DAYOFWEEK COMMAND
C、COMMAND HOUR DAY MONTH DAYOFWEEK
D、COMMAND YEAR MONTH DAY HOUR MIN
考试:考到定时任务。
下周:
============================
用户管理:1天
磁盘管理:2-3天
三剑客深入:1-2天
Shell基础:2天
进程管理命令、安装命令 1天
============================
Linux网络基础:4天 2天基础 两天实践
第一大阶段结束:
第二大阶段,搭建集群。