一、开关机相关:
shutdown -h now 立刻关机 -h +10 10分钟后关机 init 0 关机
halt 停止系统,需人工关闭;poweroff 停系统且关闭电源
reboot 重启;shutdown -r now 立刻重启;-r +1 1分钟后重启;init 6重启;
shutdown -h 20:00 shutdown -c 取消; logout注销
启动级别0-6 0关机;1单用户模式;2多用户模式;3文本模式 ;4未使用 ;5图形界面; 6重启
sysvinit 设置 :
systemctl get-default 查看开机启动级别
systemctl set-default multi-user.target #设置默认第3启劢级别
systemctl set-default graphical.target #设置默认第5启劢级别
systemctl isolate graphical.target #切换级别为图形界面
systemctl ioslate multi-user.target #切换级别为字符界面
runlevel查看当前级别 3 5 表示从3级切换到5级;
实战-加密 grub 防止黑客通过单用户系统破解 root 密码;
实战-通过 liveCD 进入救模式-重装 grub 修复损坏的系统;
实战-当 MBR 引导记录损坏后-重装 grub 进行修复;
实战-在 centOS8 下误删除 grub 文件进行修复;
设置服务器来电自动开机---bios设置 int per 项目--superIO --restoe on--改为power on
设置服务器自动开机 power man setup---wake up event set --resume by rtc alarm--enable
然后设置日期v
ctrl+a 行首;ctrl+e 行尾;ctrl+u清除光标前;ctrl+k清除光标后
ctrl +d 退出中端 相当于exit ctrl +R 搜索历史命令
ctrl+shit+T 打开一个中端,ctrl+shift+加号或者减号 增大或者减小字体
tty 查看中端; echo aaa > /dev/pts/1 不同的中端通讯
显示tty控制台中端(系统控制台登录) 显示 pts是伪终端(xshell登录)
who 查看登录 w 显示登录用户
wall “shutdown”全部中端广播将被关机
二、文件查看相关命令等:
scp /etc/hosts root@192.168.1.30:/etc/
scp remote@192.168.1.29:/usr/local/sin.sh /home/ 将远程主机拷贝到本地
cat /etc/shells 查看所有的shell类型;
cat tac反看 -n显示行号,-E显示换行符。nl aaa #nl是专门显示行号的
more aaa.txt #所有的读完退出来,不支持后退;
less 可以用pageup 和pagedown翻页 读完后按q退出
less -N 显示行号 q退出
head 默认只读前10行; head a.b -n3 读前三行
tail 默认只读后10行 tail a.b -n3 ;
tail -f /var/log/secure #在一个终端执行此命令动态查看文件内容 -f动态显示;
tailf /var/log/secure #在一个终端执行此命令动态查看文件内容
grep root /etc/passwd grep root < /etc/passwd 两种写法
> cpu.txt 清空一个文件
cat > a.txt << eof 以eof开始,直到再次输入eof结束
0:为STDIN 标准输入;1:STDOUT 标准输出; 2:STDERR 标准错误
错误重定向:ls /etc/passwd aaaa 2> ccc.txt 通常会提示没有该文件使用了2>标准错误
输出,是将错误信息保存到ccc.txt中, 2>> 也可以进项追加。
echo aaaa > /dev/null /dev/null 黑洞 ;zero
cat /etc/passwd xxx &> /dev/null 将标准输出和错误输出全部重定向到/dev/null 中,
也就是将产生的所有信息丢弃;
df -h | tee file.txt 将输出文件存入到file.txt中 ; df -h | tee -a disk.log 内容追加用-a
df -hT | cat >> disk.log 可以使用来记录日志;
echo jiajiakang | passwd haohao --stdin
echo 输入到屏幕 >清空 >>追加 echo www.baidu.com >a
echo aaa>aaa.txt echo aaaaa>>aaa.txt
printf "www\n" 输出换行 printf "%s\n" 1 2 3 4
三、查看相关信息等:
id aaa 查看用户id;su - haohao 切换用户同时修改环境变量 ;su切只换角色,默认是root
#表示root用户登陆 $表示普通用户
cat /etc/shells查看所有shell类型,可通过cat passwd查看使用哪个shell
rpm -q centos-release cat /etc/centos-release 查看版本
rpm -q redhat-release cat /etc/redhat-release
uname -a 查看内核; uname -m 查看位数;uname -r 具体内核;
hostname用户名;hostname abc.cn 临时修改用户名; vim /etc/hostname 永久生效;
df -h 查看硬盘 df -hi 查看inod ; ls /dev/sd* 查看所有连接的硬盘; df -hT 增加文件类型
du -sh /etc 查看文件大小
which ls ;whereis ls 所在的位置,脚本路径,查看位置及相关文件;whatis ls;man ls ;
man cd pinfo cd
ls --help 类似于网络中的?help cd 或者-h
pstree -p | grep http
hwclock显示bios时间、硬件时钟 hwclock -w 将硬件时钟设置为当前的系统时间
hwclock -s #以硬件时间为准,同步到系统时间
date 显示系统时间时间 ;date -s 设置系统日期时间; date -s "2020-10-01 16:00:00"
date -d '+1months'+%F 加一个月显示 date -d '+1day' 加一天显示
date +%F #显示格式为:2022-03-01
ntpdate ntp1.aliyun.com 同步系统时间到阿里云 yum -y install ntpdate
当前时区是 CTS 东八区
vim /etc/chrony.conf 修改系统同步(ntp)时间,按照如下操作
#pool 2.centos.pool.ntp.org iburst 修改为 server ntp.aliyun.com iburst
然后再:systemctl restart chronyd
time测试一个命令运行的时间 time ls -l /etc/ #real实际使用时间 user用户使用 sys内核使用
cal日历 ; cal 2020 ; cal -n7 ; -w第几周;-j 显示当年的第几天
dmidecode 可以采集有关硬件方便的所有信息;
如下为根下的目录介绍:
bin 存放二进制命令; sbin存放级别高的命令;dev存放设备文件;/boot存放内核启动;
etc存放配置文件;home用户家目录;lib库文件;mnt,media临时一般挂载存储设备;
tmp存放临时文件;var系统日志等;proc系统内存的映射,查看硬件信息;sys存放硬件文件;
opt可选; run系统运行时的数据;srv 服务目录一般是空的; usr自己安装的库文件;
lib lib64 一般是库文件,都在usr目录下;
tail -n3 /var/log/secure 查看谁登陆了我的电脑
查看登录 utmpdump /var/log/wtmp
指定用户 utmpdump /var/log/wtmp | grep root
指定IP utmpdump /var/log/wtmp | grep 192.168.1.100
登录失败 utmpdump /var/log/btmp
四、文档显示相关信息等:
cd . 进入自己的目录; cd .. 返回上级目录; cd或者 cd ~ 进入家目录; cd - 回退;./当前目录
快速查找命令:1、上下光标;2、ctrl+r 然后输入命令关键字 然后找到对应命令 再然后按右光标键;
3、 !数字 4、 !字符串,会匹配最近一次;
!1065 调用1065的命令; !-2 调用上上一个命令; !!调用上一个命令; !c 模糊匹配
ESC . 同时按调用上个命令后面的内容,或者用!$
ls -a所有文件;ls -l文件详细信息;ls -d当前目录信息;ls . 当前目录内容; ls .. 上级目录
ls -lh 以兆显示文件大小
-S 文件大小排序,默认从大到小排序 ls -lS /root/ -r 是文件名从小到大排序 ls -lSr
-t是表示时间 ls -ltr 表示时间从小到大,默认从大到小;
ls -ld /bin 查看软连接
ls -li 或者ls -i 看到文件名对应的 inode 号码 ; ls -i /etc 整个文件的inod; ls -id /etc文件目录的id
.bash 点表示隐藏文件 可以重命名+. 即可改为隐藏文件
history -c 全部清空 ; history -d 100; -w 保存命令到历史文件中,一般是家 .bash_history
修改历史命令 vim ~/.bash_history
source /root/.bashrc 仅设置当前用户的永久别名。或者 . /root/.bashrc
vim /etc/bashrc 或者vim /root/frofile 修改别名对所有用户都有效
五、权限和用户管理相关设置:
Linux 用户三种角色:超级用户(root),普通用户(系统用户和本地用户),虚拟用户(用来登录系统的)
root超级用户 ID=0;系统用户 ID=1-999 ,1-499centos6版本;本地用户1000以上;
group存放组信息; shadow存放密码;
useradd /groupadd 添加用户及组 -m创建用户家目录(默认);-u指定UID;-g指定GID基本组;
-G指定附加组;-s默认用户登陆shell的路径;-d指定家目录位置;-M不创建家目录;
adduser xuegod4 创建用户的另外一个命令
useradd -g xinxi zhangaho 指定用户组;useradd -G jjk,oracle,xinxi zhangho 指定附属组
passwd/gpasswd -l 锁定;-u解锁;-d删除密码;-n密码最少天;-x密码最多天
echo 123456 | passwd --stdin xuegod #不交互设置密码;
userdel/groupdel -r 删除用户的时候同时删除家目录;
usermod/groupmod 修改用户/组 -u修改uid;-g修改gid;-aG追加新的附加组;-s修改bash
-m修改家目录;-c修改注释;-e指定过期时间;-L锁定账号,类似于禁用;-U解锁账号
-d 宿主目录 -m 选项会自动创建新目录并且移内容到新目录里面
控制添加用户规则文件的两个文件:/etc/default/useradd 和 /etc/login.defs
例子:
egrep -v "^$|^#" /etc/login.defs
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999 #用户密码最长使用时间,多少天后会有提醒
PASS_MIN_DAYS 0 #用户密码最短使用时间,意思是多少天内不能修改密
cat /etc/default/useradd
/etc/default/useradd 文件中的内容如下:
GROUP=100 #新创建用户时默认初始组的 GID 号(公共组),现在使用的都是私有组机制
命令:chage 了解一下, 后期记不住时,可以直接 vim 修改 shadow 文件
-m:密码可更改的最小天数。为 0 时代表任何时候都可以更改密码
#注意:文件的拥有者一定可写入文件,如果修改为000,拥有者可写入,但是不能读取,root除外;
#安装完系统会生成 passwd备份文件。系统安装好后,新增加的用户不会写到/etc/passwd-
#安装完系统会生成 shadow备份文件。系统安装好后,新增加用户的密码信息不会写到/etc/shadow-
chown 修改所属用户和组 chown root:root aaa ; chown root:aaa ;chown :root aaa ;
chgrp root aaa 修改所属组 -R 递归修改(目录下所有内容都修改,否则只修改目录);
chmod 修改权限 chmod rwxrwxrwx aaa
chmod u=r-- aaa ; chmod g=r-- aaa ;chmod o=r-- aaa ;
chmod g-w aaa;chmod g+w aaa; chmod 777 aaa ;
chmod a+x aaa; 所有的都加执行权限;
特殊权限:suid ;sgid; stickybit(粘滞位)和文件扩展acl
suid:u+s或者u=4 chmod u+s /usr/bin/less 或者chmod 4755 /usr/bin/less只针对二进制;
s位是普通用户来继承root权限 chmod u+s /bin/rm 注意小s和大S区别,大S是当s位上没有小写x时
可执行权限,对目录无效。瞬间提升一下具有root权限 例子:passwd修改密码时;
chmod u-s /usr/bin/less #去掉 less 命令的 suid 权限;
sgid:g+s或者g=2; chmod 2664; chmod g+s test 可以给二进制程序设置,也可以针对目录
新创建的文件会继承上级目录的权限; sgid的权限显示就是大S ;有x的时候是小写的s;
chmod g+s /home/admins组成员继承sgid位;
stickybit:o+t 或者o=1;chmod 1777 /test 限定:只作用于目录
功能:目录下创建的文件只有 root、文件创建者、目录所有者才能删除。
chmod o+t glabfile 粘滞位权限字符t/T 类似于共享。
chattr +i aaa.sh 设置扩展属性,系统对他不能做任何修改; +a 只能追加内容>> ;+i 不能被修改;
+i 如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件
chattr -i aaa.sh 去掉属性; lsattr aaa.sh查看文件系统扩展属性、lsattr -d 查看目录;
扩展acl:查看getfacl /tmp/a.txt权限 前提是不改变文件权限的前提下。增加了扩展权限后面有+号;
setgacl aaa查看
setfacl -m u:zhang:rw,u:hao:--x aaa #针对不同用户设置 文件 访问权限
setfacl -m d:u:zhang:rw,d:u:hao:--x AAA #针对不同用户设置 目录 访问权限
-R 给目录下所有文件,一定要在m前加;
setfacl -x u:zhang:rw aaa去掉权限 setfacl -b u:zhang:rw aaa b是取消所有权限
setfacl -b aaa b是取消所有权限
六、rpm及yum相关配置:
在安装更新时用全名,查包、卸载包是用软件包名,默认在/var/lib/rpm目录下查询包的信息;
/etc/yum.repos.d yum 源位置
rpm -ivh http 安装程序;rpm -e http 删除安装软件--nodeps 忽略依赖包关系;建议用yum卸载;
rpm -ivh /mnt/Packages/zsh......
rpm -ivh –nodeps 忽略依赖包关系;--replacepkgs 重新安装替换;--force强行安装实现降级或重装;
rpm -Uvh 升级软件包,有老版本则升级否则安装;-Fvh 有老版则升级否则退出;
因为升级时会有一些依赖包要解决。 所以一般我们使用 yum update 包来升级;
rpm -q zip 查找相关的软件是否已经安装(-q与其他匹配使用) -qa查询所有已安装包;
-f(file)系统文件名(查询系统文件所属哪个软件包),反向查询
rpm -qf /usr/bin/find 查看find命令是由哪个安装包安装的;
rpm -qf /usr/bin/pstree 查看安装的包; rpm -qf `which vim` 把which vim 输出的结果查询;
rpm -qi zip-3.0-11.el7.x86_64已安装包的详细信息或者作用,已安装的用-qi,
rpm -qpi +rpm包 说未安装包的详细信息或者作用;
-qR 查询软件包的依赖性; -ql(list) 查询软件包中文件安装的位置;
rpm -qpl +rpm包 查看rpm安装后,将生成哪些文件;
rpm --rebuilddb 重建数据库;--initdb 初始化数据库;
rpm -V 检验安装的文件是否被修改,用于检验命令有没有被黑客修改;
rpm -Vf /usr/bin/find 查看该命令或文件,有没有被修改;
rpm -V findutils 检查包有没有被修改;
S.5....T. /usr/bin/find 注:如果出现的是点,表示测试这一项,没有被修改
rpm -Va 查看系统中所有安装包及文件是否被修改; rpm -Va > rpm_check.txt 重定向过去;
-K 验证合法性和完整性;
yum clean all 清空yum缓存; yum repolist 下载软件表单;
yum list 查看仓库中的软件包列表(未安装),同时生成缓存列表; yum list | grep zip
yum install -y zip 安装包,解决依赖关系;
yum list installed | grep zsh 查看已经安装的软件
yum list updates 列举出可升级的软件;
yum update zip.X86.64 升级软件包
yum -y remove zip.x86_64 删除已安装的 -----卸载包
yum info httpd 查询包的作用
yum provides /usr/bin/find 查看命令是哪个软件包安装的
yum search httpd 软件包的包名和详细描述信息中按关键字搜索,查找包括 httpd 字符的软件包
yum grouplist 查看有哪些软件包组
yum groupinstall GROUPNAME(组名称)
yum groupinstall 'Development tools' 安装开发工具软件包组
yum -y upgrade 升级所有包,不改变软件设置和系统设置,版本升级内核不改变(推荐)
yum -y update 升级所有包,改变软件设置和系统设置,系统版本内核都升级
yum install --downloadonly --downloaddir=/tmp/pages zsh 下载并且安装到指定位置
wget -O /etc/yum.repos.d/CentOS-Base.repo http://www.aliyun.com
下载文件,-O把下载的文件存到另一个文件中
wget http://test.com/testfile.zip ->下载指定文件到当前文件夹
wget -O wordpress.zip http://test.com/download ->指定保存名字
wget --limit-rate=300k http://www.linuxde.net/testfile.zip ->限制下载速度
wget -c http://www.linuxde.net/testfile.zip ->断点续传
wget -b http://www.linuxde.net/testfile.zip ->后台下载
vim /etc/yum.repord/CentOS-Base.repo找到如下:
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
$releasever等于系统版本 ;$basearch/等于x86_64
如果下载下来的repo不能用,打开阿里云http://mirrors.aliyun.com/centos/查看最新版本
然后进行替换sed -i 's/$releasever/7.4.1708/g' /etc/yum.repo.d/CentOS-Base.repo
源码编译安装3把斧:(lamp和lnmp时会用到)----也就是软件安装 tar.gz格式文件
1、tar xvf nginx-1.12 #cd nginx-1.12
./configure --prefix=/usr/local/nginx 指定安装路径,为了删除时方便 autoreconf先集成
(make clean执行错误时,需要执行清理)
2、make -j 4 四核编译; make tests 或者test ; echo $? 如果返回为0就没有问题;
3、make install 然后进行安装;
make clean //清除上次的 make 命令所产生的 object 和 Makefile 文件。使用场景:当需要重
新配置执行 configure 时,需要先执行 make clean。如下:
make clean (仅仅清除之前的可执行文件及配置文件)
rm -rf Makefile objs 删除安装路径文件;
./configure --prefix=/usr/local/nginx 重新进行配置
源码编译出错的5种完美解决办法:
1、./configure 编译时报错 某某extsfs...找不到
招一、cd /mnt/Packages/
招二、rpm -ivh extsfs 按tab自动补齐,然后进行rpm -ivh 安装缺少的包
招三、但如果无法补齐,使用如下招
2.2、然后再查ls *sfs* 如果能查到,然后进行rpm -ivh 安装缺少的包
招四、http://www.rpmseek.com/index.html 上查找缺少的包
招五、yum search extsfs (推荐) 查询具体包的名字,然后进行rpm -ivh 安装缺少的包
如果提示已经安装了,./configure时还是有问题,这种情况需要安装库的开发文件
rpm -ivh /mnt/Packages/e2fsprogs-devel-1.41.。。。。.rpm
然后再进行编译
如果你下载到的软件名是soft.bin,一般情况下是个可执行文件,安装方法如下:
1、打开一个终端,su -成root用户;2、chmod +x soft.bin;3、./soft.bin 运行这个命令
实战 2:
在 centos8 上,基于光盘镜像创建一个本地 yum 源。
在 CentOS8 光盘镜像中把 yum 软件源分成了两部分。
一个是 BaseOS 存储库以 RPM 格式提供操作系统核心功能的软件
一个是 AppStream 存储库以 RPM 格式提供用户空间中运行的软件
centos7光盘镜像rpm 软件安装包都是放在/mnt/Packages/下
centos8光盘镜像rpm 软件安装包分别放在/mnt/BaseOS/Packages/和/mnt/AppStream/Packages/下
例:安装 centos epel 扩展 yum 源。
注:epel 源是对 centos 系统中自带的 base 源的扩展。(因为不是所有软件包都放在 base 源里)
[root@xu ~]# yum -y install epel-release
[root@xu ~]# ls /etc/yum.repos.d/epel.repo 这就是安装的epel源阿里 epel 源安装;
https://developer.aliyun.com/mirror/epel
七、进程管理相关:
ps -aux 全部进程 a当前终端关联的所有进程,u详细内容信息,x显示非终端(系统)下所有进程,centos风格;
ps -ef 跟aux差不多 -e显示所有进程;-f显示完整格式输出 是linux分格;
进程下加方括号是内核态的进程,没有括号是用户态进程
PPID: 该进程的父进程的 ID; PID: 该进程的 ID;
VSZ进程占用的虚拟内存;RSS占用的物理内存; STAT进程状态;START进程启动的时间;TIME使用cpu时间
COMMAND该命令的实际指令,即进程的名字;
STAT目前的状态,分为五种:R正在运行;S可中断 睡眠中;T正在侦测或者停止; Z僵尸;D不可中断
五个基本状态后可加字母:<运行在高优先级;N低优先级;L锁定在内存中;l多线程;+进程运行在前台;
小写s控制线程
僵尸进程:父进程退出了,子进程没有退出,那么子进程就没有人管理了,就是僵尸进程
僵尸进程一般是重启, 几个没有关系,几百个需要重启。
ctrl-c 是发送 SIGINT 信号,终止一个进程
ctrl+z 是发送 SIGSTOP 信号,挂起一个进程 。 将作业放置到后台( 暂停) 前台进程收到这些信号,
就会采取相应动作 19信号 中端任务,挂起,随时可以唤醒;fg 1 恢复序号为1的;
fg 将后台中的命令调至前台继续运行; bg 将一个在后台暂停的命令,变成继续执行;
jobs 查看当前有多少在后台运行的进程.它是一个作业控制命令 ;
jobs 查看 fg 1(进程号)从后台调到前台,恢复挂起的;
ctrl-d 表示退出当前 shell
uptime 查看cpu负载的工具:第一个是当前时间;up 20days 系统运行时间20天;2user登陆用户数;
load....系统负载,及任务队列平均长度,三个平均值分别为1分钟,5分钟,15分钟前到现在的平局值
如果cpu为1核 ,1分钟的load值大约等于3负载过高,如果4核大约等于12则过高,这个是经验值
top:第一行和uptime显示内容一样;
第二行:us是用户使用,sy系统使用,ni调优;id空闲;wa等候占比,占用比较大(26.5)则是磁盘性能问题;
内存行:Mem物理内存总量;used使用的物理内存;free空闲内存总量;buff/cache用作内核缓存的内存量
Swap交换分区;
下列行:PID进程id;USER进程所有者的用户名;PR优先级 ;VIRT虚拟内存;RES实际使用内存;
SHR共享内存;S状态;%CPU上次更新到现在的 CPU 时间占用百分比;
%MEM 进程使用的物理内存百分比;TIME+进程使用的 CPU 时间总计,单位 1/100 秒;
COMMAND命令名/命令行;
top中的NI值为进程优先级, 负值优先级高(占用cpu资源打),正值优先级低,-19到20范围
进程的优先级管理:优先级取值范围为(-20,19),值越小优先级越高, 默认优先级是 0
renice -n 0 11327 修改优先级为0; nice -n 5 vim a.txt 指定运行 vim 的优先级为 5;
dd 可以生产制定大小的文件;
top 注意僵死和停止两个统计:
top快捷键 默认3s刷新一次;按空格立即刷新,按 s 修改刷新时间;q退出;按数字键1显示几个cpu;
u查看某个用户:输入mk h:帮助
top -p 9667 查看某个进程的动态信息,也可以输入进行名称;
T 按时间排序;
P – 以 CPU 占用率大小的顺序排列进程列表
M – 以内存占用率大小的顺序排列进程列表
N – 以 PID 的大小的顺序排列表示进程列表
s – 改变画面更新频率 输入1 即为每一秒刷新一次
l – 关闭或开启第一部分第一行 top 信息的表示
t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m – 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
h – 显示帮助;n – 设置在进程列表所显示进程的数量
q – 退出 top;s – 改变画面更新周期
free 显示系统中可用内存和已用内存的数量
free -m 以兆为单位查看;
第一行:total 是总内存量,used 是已经使用的内存量,free 是空闲的内存,shared 是多个进程共
享的内存总数,buffers 是缓冲内存数,cache 是缓存内存数。默认单位是 KB。available 实际可用;
pstree -p 显示带进程号的树形结构;
kill -l 显示相关信号; 3退出;TERM15终止;9强制退出(用的最多);CONT18继续;STOP19暂停
kill 970; kill -9 970 强制结束进程; kill -count 970 暂停进程
killall 加进程名字 ,pkill 加进程名字 用于杀死指定名字的进程
&&前一个命令执行完执行后一个;|| 前一个执行失败执行后一个; ’不具有变量功能 ”具有变量功能
ll /proc/进程id/fd 查看一个进程打开了那些文件?先的内容 0 1 2 一般都会显示
buff 加速读取,cache加速写入;
清理云服务器Linux下内存buff/cache占用过多问题解决;
通常内存关系是:普通机器:total=used+free 虚拟机器:total=used+free+buff/cache
比如说用腾讯云主机,就是total=used+free+buff/cache;
执行如下语句:在执行这三条命令之前一定要先执行sync命令
sync && echo 1 > /proc/sys/vm/drop_caches;echo 2 > /proc/sys/vm/drop_caches;
echo 3 > /proc/sys/vm/drop_caches
screen(必会)例如:xshell长时间连接后会中端,导致备份中断等(未工作完回家接着操作);
nohup 类似于screen yum安装screen,使用方法参照截图 ;
1、 yum -y install screen;2、[root@xue ~]# screen 3、# vim a.txt #执行你需要运行的备份命令
4、#在 screen 当前窗口键入快捷键 ctrl+a+d;
5、# screen -ls #查看已经建立的会话 ID;# screen -r 44074重新连接会话; # exit 不想使用 执行exit 退出
screen -S test 新建一个叫 test 的会话; screen -S 会话id -X quit -> 删除会话并退出;
yum install -y sysstat 安装sar
sar 全面系统分析工具之一
sar -u -o 5 3 每5s采用一次,连续3次,观察CPU使用情况;
sar -u -o monitor.cpu 5 3 结果存放到monitor.cpu中
sar -u -f monitor.cpu 查看内容
sar -r 5 3 监控内存和交换空间;
yum -y install lsof
lsof -i<条件>:列出符合条件的进程。(ipv4、ipv6、协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件;
lsof -p 43607(进程号)#进程 pid 一般用于查看木马进程,在读哪些文件;
lsof -i:22 用于查看端口,哪个进程在使用,或者查看黑客开启后门端口是哪个进程在使用
lsof -c vim 进程名,显示 vim 进程现在打开的文件 ,
lsof /test/.abc.txt.swp 显示占用文件.abc.txt.swp 的进程
八、文件创建复制移动等
touch 创建文件 -c文件不存在不创建 -a改访问时间;-t直接使用指定时间 -d指定创建时间
touch {1,2} {q,b} 有空格创建 1 2 q b; touch {1,2}{q,b} 没有空格,排列组合创建
touch file{1,2,....20} 创建为file1file2.。。。。。。
mkdir 1 2 3 -p 连续创建 ; rmdir 1 2 3 -p连续删除
mkdir -p /glab/aaa 分别创建(递归创建) mkdir /glab/ /galb/aaa
install abc -d创建目录 -t指定目标,再指定源 -m 复制文件的时候指定权限
rm -rf aaa.txt -r包含的目录一起删除,即为递归删除; -f强制删除;-i提示;
rmdir 删除目录; rm -rf file* rm -rf a.txt dir
cp ab .. 复制到上级目录 -f强制 -R递归复制目录;-p 复制文件保留属性(普通不保留管理员属性)
cp a b CCC 复制 a b 到文件夹CCC -a 保留所有的属性(归档复制,用于备份)
cp www /root/etc/pppp 复制的同时修改名字,剪切也一样。
cp abc ccc -r 把abc目录复制到ccc目录 -f强制复制,-r递归,复制目录必须加此选项;
\cp -r /boot/grub2 /etc/passwd /opt \反斜杠,覆盖文件,不提示,
\cp -rp /opt/!(dir1 | dir2) /root/ 除了 dir1 或 dir2 以外其他文件都复制到 root 目录下
install aaa aaaa 复制的aaaa具有可执行权限;
mv aaa bbb 重命名 mv aaa bbb CCC 移动 -f 强制剪切
mv /opt/!(file1 | file2) /root/ 除了 file1 或 file2 以外其他文件都移动到 root 目录下
nano a创建文件的方法 输入内容 ctrl+o 回车 ctrl+x
九、其他配置列
echo "TMOUT=300" >>/etc/profile 连接超时时间变量
echo "HISTSIZE=5" >>/etc/profile 命令历史记录的时间变量
alias 设置别名 alias cls=clear 临时有效 unalias去除别名
vim /root/.bashrc source /root/.bashrc 设置当前用户别名永久有效
例子:alias vimens160="vim /etc/sysconfig/network-scripts/ifcfg-ens160"
vim /etc/bashrc 然后再文件最后插入 全局使用配置的别名
echo $LANG 查看当前语言设置
LANG=en_US.UTF-8 切换为英文 LANG=zh_CN.UTF-8 切换为中文
locale 查看现有语言环境 -a所有语言环境
export 修改临时语言环境 export LANG=zh_US.UTF-8
ulimit -n 查看一个进程可以最多打开的文件数; 默认是1024; ulimit -a 显示所有的信息;
ulimit -n 2048 修改最多可以打开的数量,
type 判断是否为内置命令,非内置需要自己安装
file aaa 判断文件格式类型
stat aaa 最近一次访问,修改,改变 atime mtime ctime 三个时间;
atime 指文件上一次查看文件的时间,access time 。 如: cat a.sh
mtime 指文件内容上一次变动的时间,modify time (文件内容修改时间)
ctime 指 inode 上一次文件属性变动的时间,change time 。 比如: chmod +x a.sh
df -hi 看磁盘inod百分比; df -i 查看每个硬盘分区的 inode 总数和已经使用的数量;
stat /etc/passwd | grep IO 查看 Linux 系统块大小
大小:2053; 块:8 IO块:4096 普通文件; #block 到是 4K;
ln aaa aaa_ylj 创建硬链接 主要作用,对重要文件开后门,进行保护,怕误删。
ls -l 结果的第三列就是硬连接数;
注意:硬链接不能针对目录创建,硬链接不能跨分区建立;创建后可以跨分区移动,inod号变了
有时文件名包含特殊字符,无法正常删除。直接删除 inode 节点,就能起到删除文件的作用;
ln -s aaa aaa_s 创建软连接 ,类似于快捷方式,能跨分区创建(源文件必须写绝对路径)
locate mysql.sql locate 命令和 find -name 功能差不多,但要快的多,它搜索的是一个数据库
yum -y install mlocate 先安装;
updatedb 如果对当天文件查找,需要手动更新数据库 updated;
locate xuegod 查询;
13.4.2 实战:修复服务器文件系统
实战场景:公司服务器突然断电后,再次启动后,报如下错误
十、文件处理相关命令
读写顺序权限 : 用户本身 acl 用户组 其他用户
join bbb ccc ccc往bbb中合并输入
sort -n数值排序,默认-n从小到大排序; -r从大到小排序, -t指定字段分隔符 ;
-k指定从哪个字段;-u去重复显示一次; -f忽略大小写; -M按照月份排序(内容月份);
du -h /etc | sort -rh | more 找出etc目录下的所有文件,按从大到小排序;
wc -l 文本统计 -l统计行号 -w统计单词 -c字节 -m字符
tr 文本转换 tr 'a-z' 'A-Z' < /etc/passwd 把小写转化为大写;
cat /etc/passwd | tr -d "ato" -d 删除出现的字符; cat file | tr -d "snail" 删除出现字符集中的所有字符;
cut 命令用来显示行中的指定部分,删除文件中指定字段。
说明:该命令有两项功能,其一是用来显示文件的内容,它依次读取由参数 file 所指明的文件,将它
们的内容输出到标准输出上;其二是连接两个或多个文件,如 cut f1 f2 > f3 将把文件 f1 和 fn 的内容
合并起来,然后通过输出重定向符“>”的作用,将它们放入文件 f3 中。
-b:仅显示行中指定范围的字节数; -c:仅显示行中指定范围的字符;
-d:指定字段的分隔符,默认的字段分隔符为“TAB”; -f:显示指定字段的内容;
-b 表示字节; -c 表示字符; -f 表示定义字段
N-:从第 N 个字节、字符、字段到结尾;
N-M:从第 N 个字节、字符、字段到第 M 个(包括 M 在内)字节、字符、字段;
-M:从第 1 个字节、字符、字段到第 M 个(包括 M 在内)字节、字符、字段。
cut -d: -f1-3 /etc/passwd -d指定分隔符
cut -d: -f7 /etc/passwd | sort -u | wc -l 去除重复列,显示5行
cut -d: -f1-3 /etc/passwd | sort -t: -k3 -n 第三列数值排序
find 查找 -type类型; f是普通文件,d是目录,l是链接,p是管道文件;
-name 文件名, -iname 忽略大小写;-type 指定文件格式;
find / -type f -name test123 f是文件 d是目录; find . -name "*.txt"
find -user属主 -group属组 -nouser -nogroup ; 例子:find /root/ -user root
find /root -size -20k 查找小于20k的;
find /root -cmin +10 距离现在超10分钟; -cmin以分钟为单位,-ctime以天为单位;
-mtime -n 表示距离现在n天; +n 表示在n天以前 -1 昨天;1是前1天;+1是48小时以前;
atime是访问时间;mtime文件最后一次修改时间;ctime最后一次变化时间,也就是修改时间
find /root -user root -a -size +20k ; -a与 -o或 -not非 + 超过 - 低于
find /etc -size +20k -a -size -50k | wc –l
find /bin/ -perm -644 -perm按照权限,至少有644的权限
find /bin/ -maxdepth 1 -prem 777 只查第一层的
find /root -user root -exec cp {} /mnt \; -exec执行动作 -exec chmod g+w {} \;
注意{ }和 \;之间的空格,{}代表查到的内容;
find /tmp/backup -name "*.tar.gz" -mtime -3 |xargs ls -lh
xargs -i -i表示内容传递逐项处理,默认以空格为分隔符;
例如 find . -name aaa | xargs -i cp {} /opt
exec是对每个找到的文件执行一次命令;而xargs是把所有找到的文件名一股脑的转给命令;
常用的三个特殊符号:
;连续执行,不保障都执行成功; && 前面执行成功再执行后面 ;
|| 前面执行不成功执行后面的 ,前面执行成功后面不执行了;
tar 压缩 -c重新创建源文件不动 -z 压缩格式 -v压缩过程 -f压缩文件 可压缩多个文件
-z gzip格式,扩展名tar.gz -j bzip2扩展名tar.bz2; -J xz压缩,扩展名tar.xz 解压时要对应参数;
hao.tar 实际几乎没怎么压缩;hao.tar.gz 常用; hao.tar.bz2 常用;其次压缩比例依次增加----
.tar.xz 格式化压缩最高,压缩的时间是最长;
tar -cvf aaa.tar /boot/grub2 格式为 .tar格式 直接b归档
tar tf yasuo123 不解压直接看文件内容; tar xf yasuo123 直接解压出来;
tar -zcvf yasuo123 wwwbbb
tar -Jxf aaa.tar.xz -C /mnt -C 是解压到指定目录
tar -C /opt -xvf boot.tar.gz boot/grub2/grub.cfg 解压指定文件到指定目录
tar -C /opt -xvf boot.tar.gz --wildcards *.mo --wildccards 文件名匹配,使用通配符
tar -C /opt -xvf boot.tar.gz boot/grub2 --exclude=boot/grub2/i386-pc 排除指定文件并解压
zip aaa.zip /etc/passwd unzip aaa.zip -d解压到指定目录
zip all.zip *.jpg unzip ~/grub.zip -d /opt/
xz原文件 #默认删除原文件,只保留压缩文件; -k保留原文件
unxz 压缩文件 #删除压缩,保留原文件; xzcat 不解压直接查看文件内容
其他压缩工具gzip bzip2 加参数-d 是解压缩,创建和解压缩时源文件都不保留,-k保留源文件
十一、vim 文本编辑器
rpm -qf /usr/bin/vim which vim rpm -qf `which vim` #`反引号,esc 按键下的键
rpm -qf $(which vi) #$()可执行命令
首次进入文件 ----正常模式(Normal mode,俗称命令模式)
按下 i 键,出现 “Insert” ----插入模式(Insert mode ,俗称编辑模式)
按 Esc 键,再输入冒号: ----命令行模式(Command-line mode)
可视模式(Visual mode,俗称可视块模式)
yy复制p粘贴 2yy复制两行;dd删除或者剪切的意思;x向后删除一个字符;D从光标删除到行尾;
r替换;home到行首;end到行尾;:x保存退出;
set number 列出行号;set nonu去掉行号;noh 取消高亮显示;
:20快速定位到行号;G定位到末行;gg定位到首行;u撤回;ctrl+r 恢复,每按一次就恢复一次;
/abc 查找 n不断线下找; N向上查找;
:% s/lang/abc/gi %为所有的替换lang为abc g为全部替换 i为忽略大小写;
:1,3 s/bin/xuegad 只替换第一行到第三行第一个出现的 :3 s/xue/gad 只替换第三行;
先按30再按G 快速点位到30行;到右边第10个字符,先按10再按向右键;
O 在上方增加一行;o在下方插入一行;i在当前字符之前插入; I 行首插入;A行尾插入;
a 当前字符之后插入 (光标后);
x向后删除 类似于delete;X向前删除 r替换一个字符(非编辑模式)
hjkl 左下上右 方向键;
增加注释配置方法: 1、ctrl+v 进入视图模式; 2、向上向下移动光标,选中注释部分;
3、然后按大写I;4、在插入注释#符号;5、再按esc 就会全部注释或添加了 ;
删除注释的配置方: 1、ctrl+v 进入视图模式; 2、向上向下移动光标,选中注释部分;
3、然后按 d 就会删除注释符号;
另存为 w man.abc vim +3 bbb 定位到第3行进行编辑;只写+ 号是到最后一行;
调用外部文件或者命令::!ifconfig ens33 ; r /etc/hosts读文件,把其他文件中的内容追加到当前目录中
vim .viminfo 记录vim操作在家目录中
1、vim /home/.vimrc 2、se nu 只针对当前账号生效 打开默认显示行号;
vim /etc/.vimrc 全局有效 永久设置环境,配置全局用户有效;
vim -o /etc/passwd /etc/hosts 同时打开多个文件,以上下形式
vim -O /etc/passwd /etc/hosts 同时打开多个文件,以左右形式 crtl+ww左右两个切换
:qa! 同时退出两个打开的内容
方法一:diff /etc/passwd /etc/hosts 对比不同的;方法二:vimdiff /etc/passwd /etc/hosts 对比不同的
gedit nano emacs 其他的编辑器(不常用)
实战 1:解决上传 windows 中文文档乱码;
[root@xue ~]# iconv -f gb2312 -t utf8 aaa (到 linux下 vim 打开是乱码.txt) -o abc.txt
-f, --from-code=名称 原始文本编码 -t, --to-code=输出编码 -o, --output=FILE 输出文件名
实战 2:使用 xmanager 等远程连接工具管理 Linux
十二、分区格式化相关:
ls /dev/sda* lsof /sdb1查看谁在用 yum -y install lsof
1、fdisk /dev/sdb 格式化磁盘,p 查看当期那分区表;n 创建新的分区;p创建主分区;
+1G指定分区大小; w保存;m帮助 ;d删除分区;l显示分区类型;q不保存退出;t改变分区类型;
让新的分区生效,直接reboot ;或者 partx -a /dev/sdb 有的时候需要执行2遍;
在 centos8 下不需要执行以下命令,分区后立即生效的
2、mkfs.xfs -f /dev/sdb1 格式化分区,-f是强制格式化 mkfs.ext4 /dev/sdb1
3、mkdir /sdb1 创建挂载点
4、mount /dev/sdb1 /sdb1/挂载
5、vim /etc/fstab 开机自动挂载,再文档最后添加如下内容
/dev/adb1 /sdb1 xfs defaults 0 0
/dev/vdb1 /vdb1 xfs defaults 0 0
检测挂载是否成功 mount -a 然后再df -h中看到sdb1说明成功
/dev/vdb1 /vdb1 xfs defaults 0 0 阿里云、kvm系统的
mount /dev/sdb1 /mnt 挂载; umount /sdb1 卸载;
卸载问题:umount /dev/sdb1 报错--- #lsof /sdb1看谁在使用 # kill -9 bash对应的id;退出目录;
gdisk主要是容量大于2T的硬盘,两种类型的分区表:GPT和MBR(不支持4T);
GPT分区类型:全球唯一表示分区,默认128个分区
[root@xue ~]# yum -y install gdisk
[root@xue ~]# gdisk /dev/sdb
[root@xue ~]# mkfs.xfs /dev/sdb1 #格式化
blkid /dev/sda1 查看里面有文件系统类型,查看分区信息
lsblk 列出所有的块设备; lsblk -f 磁盘信息,查看uuid
df -hT 查看挂载分区类型
xfs 是centos7新特性 提供了xfsdump和xfsrestore来备份和恢复数据;
备份:1、xfsdump -f /opt/dump_sdb1(备份到的位置) /sdb1(要部分的文件,备份只能精确到备份的根);
2、然后输入标签位置-》dump_sdb1(还原时使用) 备份sdb1
指定备份时交互,方便后期做定时备份,类似于快照,快速回复。
-L dump.sdb1 -M sdb1 免交互
xfsdump -f /opt/dump_passwd /sdb1 -L dump_passwd(标签)-M sdb1(对设备备份的说明);
-s 加相对路径(只对指定的文件备份,备份填写相对路径 )
xfsdump -f /opt/dump_grup2 -s grub2/grub2/aaa.cfg(填写相对路径) /boot(对该分区) -L
上接。。。。。dump_grub2(标签)-M boot-sdb1(对设备备份的说明)
备份成功后 ls /var/lib/xfsdump/inventory/目录下查看生成的档案信息。
xfsdump -I 查看备份信息 大写的i
xfsrestore -f /opt/test-back2 -t 查看里面的内容
恢复:xfsrestore -f /opt/dump_sdb1(备份的文件) /sdb1(备份到的位置,要释放到哪里)
恢复单个文件xfsrestore -f /opt/dump_grub2 -s grub2/grub.cfg(对目录下文件或目录) /var/test
增量备份:1先做完全备份xfsdump -f /opt/test-full /sdb1 -L test-full -M dedia0
2、增加内容,如下再做第一次增量备份
3、xfsdump -l 1(第一次) -f /opt/test-back1 /sdb1 -L test-back1 -M media0
4、xfsdump -l 2(第2次) -f /opt/test-back2 /sdb1 -L test-back1 -M media0
增量备份恢复:1、先恢复完全备份;2、然后恢复1级别,再2级别 (如果同级别,恢复最后一个即可)
xfsrestore -f /opt/test-full /sdb1/ 恢复完全备份
xfsrestore -f /opt/test-back1 /sdb1/ 恢复1级别
xfsrestore -f /opt/test-back2 /sdb1/ 恢复2级别
注意:
/etc 你用df -hT 看下,他不是xfs文件系统,他是挂载到/ 下的, / 才是xfs文件系统;
xfsdump -f /sdb1/ceshi1 -s etc / -L 123 -M 123
xfsdump仅支持预设的文件系统备份,/etc不支持xfsdump备份,因为/etc不是一个独立的文件系统
十三、网络相关信息及配置:
ping -c 4 baidu.com ping百度4次
NetworkManger 网络服务管理进程
ens33 en表示ethernet以太网,nnn数字表示mac地址+主板信息计算得出
s表示如可拔插网卡,usb之类的;o主板板载网卡;p独立PCI网卡
ifconfig ens33 网卡地址 netmask 掩码 临时修改ip地址 掩码可加可以不加
ifconfig eth0 192.168.1.53/24 route add default gw 192.168.1.1
ifconfig ens33:0--1--2等 配置多个ip地址
ifconfig ens33:0 del ip地址
vim /etc/sysconfig/network-scripts/ifcfg-对应网卡
BOOTPROTO="none" 等号后面写dhcp 表示动态,satic 表示静态,none 不指定等于静态
bootproto=dhcp static 这是网卡获取地址方式或 none 无
NAME=ens33 #网卡名字
UUID=c713acec-674b-411d-9e61-646482a292ca #UUID 每个网上设备都不一样
DEVICE=ens33 #设备名字,在内核中识别的名字
ONBOOT=yes #开机启用该设备,如果 no,表示不启动此网络设备
IPADDR=192.168.1.63 #IP 地址
PREFIX=24 #子网掩码,24 相当于 255.255.255.0
GATEWAY=192.168.1.1 #默认网关
DNS1=114.114.114.114 #首选 DNS 地址
DNS2=223.5.5.5 #备用 DNS 地址
DNS3=8.8.8.8 #备用 DNS 地址
/ls /etc/sysconfig/network-scripts/ifcfg-lo 环回接口,centos8不存在
ifconfig ens33:0 192.168.1.111 netmask 255.255.255.0 修改临时ip地址
ip addr show 查看IP地址 ip add 查看IP地址
ifconfig -a -a 查看所有网络设备,包括没有启动的网卡设备
ip addr delete 192.168.1.110 dev ens33:0 #删除临时IP
ip a d 192.168.1.110 dev ens33:0 #简写删除临时IP
cat /etc/resolv.conf #查看本机DNS的地址 echo nameserver 8.8.8.8 > /etc/resolv.conf
centos7 重启网络服务使用 systemctl restart network,systemctl restart NetworkManager
centos8 用 ifdown ens160 && ifup ens160 来让网卡配置文件生效 centos7也可以
情况2:在centos8系统上
nmcli connection reload 重新加载网卡相关配置文件,或者用简写方式 nmcli c reload
nmcli connection down ens160 && nmcli connection up ens160 重启网卡,让配置生效。
nmcli connection 查看网卡连接信息、UUID等 或者用 nmcli con
nmcli device status 查看网卡物理连接是否正常;
vim /etc/sysconfig/network-scripts/ifcfg-ens33 编辑网卡信息
nmtui 中文配置网卡界面 nmcli 显示网卡信息
ifconfig ens38 down关闭指定网卡; ifconfig ens38 up 开启指定网卡;
vim /etc/services #此文件中,包含所有常见端口号及服务名称;
vim /etc/resolv.conf 临时修改重启完dns有没有了,直接修改ifcfg-ens33 才可以;
dns1=8.8.8.8 dns2=223.5.5.5必须这样配置dns默认情况下域名解析顺序:本地 hosts 文件-》DNS 查询;
vim /etc/hosts 修改主机名和ip绑定; 例:192.168.1.63 xuegod63 xuegod63.cn
vim /etc/hostname #此命令永久修改主机名, 也可以用 hostnamectl set-hostname xuegod63.cn
hostname aaa.com #临时修改主机名; nslookup www.baidu.com 查看域名对应的u、ip地址;
版本六 重启关闭网卡:service network restart
netstat -antup | grep 10050 ; netstat -tlunp 都是查看打开的端口(监听)
route -n 查看路由信息:
route add -net 192.168.2.0 netmask 255.255.255.0 dev ens38 添加路由
route del -net 192.168.2.0 netmask 255.255.255.0 删除路由
yum -y install traceroute traceroute baidu.com 路由跟踪:
ping -i 0.01 -c 20 192.168.1.1 -c 数目;-i 秒数;-w 等待指定时间后停;
ping -I 192.168.1.63 baidu.com -w 3 -I 指定发出 ping 命令的主机地址;
arping -I ens33 192.168.100.1 ping 向一个网关,mac 地址都是一样的,说明正常,I大写的i
但是 mac 地址不一样同一个 ip 地址解析出 2 个 mac 地址,那么就有人冒充网关了。
watch -d -n 1 'ifconfig ens33' 实时监测命令的运行结果,可以看到所有变化数据包的大小;
-d 高亮显示变化的区域(指令信息不同之处)-n 指定指令执行的间隔时间(秒)
watch -d -n 1 'ifconfig ens33' 每隔 1 秒高亮显示 ens33 网卡相关信息;
每秒显示 ens33 网卡信息,RXpackets 接收到的数据包, TXpackets 发送出的数据包
centos8 安装网络管理软件
1、yum install cockpit* 安装网络管理软件安装管理工具
2、开启systemctl enable --now cockpit
3、https://192.168.1.30:9090
内核调优小技巧:
实战:服务器上有大量 TIME_WAIT 连接,如何优化 TCP 连接,快速释放 tcp 连接 ?
netstat -antup | grep TIME_WAIT
cat /proc/sys/net/ipv4/tcp_fin_timeout 显示60秒
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout 通过缩短时间time_wait 时间来快速释放链接
十四、防火墙的相关操作:
iptables -F 清空防火墙
临时关闭 Selinux
getenforce 查看开关情况 ; 显示Enforcing为开启;
setenforce 0 设置临时关闭; setenforce: SELinux is disabled
vim /etc/selinux/config 永久关闭Selinux
改:7 SELINUX=enforcing #前面的 7,表示文档中第 7 行。 为:7 SELINUX=disabled
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' 永久关闭
reboot #必须重启系统,才可以真正的关闭 selinux
SELinux 模式模式:
enforcing 强制模式,只要 selinux 不允许,就无法执行; disabled 关闭模式 selinux
permissive 警告模式,你可以执行,但你所做事件全部记录;
systemctl start firewalld systemctl enable firewalld systemctl restart firewalld
systemctl stop firewalld systemctl disable firewalld systemctl status firewalld
systemctl enable firewalld --now #开机启动,同时启动服务
systemctl disable firewalld --now #开机不启动,同时关闭服务
systemctl is-enabled firewalld #查看开机是否启动
systemctl is-enabled sshd #查看ssh服务是否开机启动
systemctl list-unit-files --type service | grep enabled #查看开机启的服务
systemctl suspend 暂停系统; systemctl rescue 救援模式;
systemctl stop firewalld.service 关闭防火墙并设置开机不启动
systemctl disable firewalld.service
firewall-cmd --query-port=224/tcp 查看防火墙是否开启224端口
firewall-cmd --list-all 查看防火墙放行端口ports
vim /etc/services 查看端口对应的服务信息 /21 /80 查找
firewall-cmd –zone=public –add-port=224/tcp –permanent 永久添加
firewall-cmd --add-port=80/tcp --permanent(永久添加)
firewall-cmd --add-service=http --permanent(永久添加)
了解下面命令:
systemctl #列出当前已启动unit(单元),按q或ctrl+c退出
systemctl list-units #列出当前已启动unit(单元),按q退出
systemctl list-units -all #列出全部unit(单元)
systemctl list-units --type service #列出类型为.service(服务)的已经启动unit(单元)。
systemctl list-unit-files #列出全部unit及相关文件
十五、LVM 管理和 SSM 存储管理器使用
物理卷 PV;--- 卷组 VG ;-----逻辑卷 LV;
PE:PV 物理卷中可以分配的最小存储单元,PE 的大小是可以指定的,默认为4MB
LE:LV 逻辑卷中可以分配的最小存储单元,在同一个卷组中,LE 的大小和 PE 是相同的,并且一一对应
使用步骤:
多个磁盘/分区/raid-》多个物理卷 PV-》合成卷组 VG-》从 VG 划出逻辑卷 LV-》格式化 LV挂载使用;
PV 管理命令 :pvscan扫描 pvcreate创建 pvdisplay显示 pvremove(移除)
VG 管理命令:vgscan vgcreate vgdisplay vgremove vgextend扩展 vgreduce减少
LV 管理命令: lvscan lvcreate lvdisplay lvremove lvextend扩展 lvreduce减少
pvs查看物理卷;vgs 查看卷组; lvs查看逻辑卷
确保新创建的磁盘没有挂载。
[root@xue ~]# yum -y install lvm2
[root@xue ~]# pvcreate /dev/sdb{1,2,3,4} -y #创建 pv
[root@xue ~]# vgcreate vg01 /dev/sdb1 创建 vg 卷组;
[root@xue ~]# lvcreate -n lv01 -L 16M vg01 -y #大写 L 指定逻辑卷大小(常用)
[root@xue ~]# lvcreate -n lv02 -l 4 vg01 #小写 L 指定 LE 的数量(了解,不常用)
[root@xue ~]# ls /dev/vg01/ #查看逻辑卷的位置;
[root@xue ~]# ll /dev/vg01/lv01 #其实 lv01 是 dm-0 的软链接
[root@xue ~]# mkfs.ext4 /dev/vg01/lv01 ext4格式分区可以缩减lv大小,xfs分区不能
[root@xue ~]# mount /dev/vg01/lv01 /lv01 进行挂载;
[root@xue ~]# df -Th /lv01 显示
[root@xue ~]#echo "/dev/vg01/lv01 /lv01 ext4 defaults 0 0" >> /etc/fstab 设置自动挂载
vgcreate -s 16M vg02 /dev/sdb2 指定 PE 大小-s ,存储的数据都是大文件,PE 尽量调大,读取速度快
LV逻辑卷扩容:
lvextend -L +30m /dev/vg01/lv01 ;+30g 是扩容30g ;直接写30g是扩容到30g;
resize2fs /dev/vg01/lv01 #注意:需要更新文件系统,ext4 文件系统扩容使用命令语法: resize2fs 逻辑卷名称;
xfs_growfs /lv01 #注意:需要更新文件系统 xfs 文件系统扩容使用命令语法: xfs_growfs 挂载点;
lvextend -L 80m -r /dev/vg01/lv01 #直接扩容到 80M 空间,增加-r 参数,不用再用更新文件系统命令;
VG 卷组扩容:
[root@xue ~]# vgs vg 扩容的场景:vg 卷组中的空间不了够,需要添加新的硬盘进来
[root@xue ~]# pvcreate /dev/sdb3 -y # 创建 pv
[root@xue ~]# vgextend vg01 /dev/sdb3 #扩容成功
LVM 缩小:
互动:LVM 可以动态增加,可以动态缩小吗?
答:LVM 可以动态增加,ext4 是可以缩小,但是 XFS 不支持动态缩小,所以无法实现基于xfs 的动态缩小
lvreduce -L -20m -r /dev/vg01/lv01 ext4可以缩小;
vgreduce vg01 /dev/sdb1 #把 sdb1 物理卷从 vg01 卷组中移除
LVM 删除:
umount 卸载 -> lvremove lv 移出卷组中所有逻辑卷-> vgremove vg 移出卷组-> pvremove移出 pv
[root@xue ~]# umount /lv01
[root@xue ~]# lvremove /dev/vg01/lv01
[root@xue ~]# vgremove vg01 #直接移出卷组;
Do you really want to remove active logical volume vg01/lv02? [y/n]: y
如果卷组中还有 lv,移出时,会提示,是否也移出,咱们这里直接移出;
[root@xue ~]# pvremove /dev/sdb1 #已经移出
[root@xue ~]# pvs
实战-使用 SSM 工具创建可动态扩容的存储池
[root@xue ~]# yum -y install system-storage-manager 安装 SSM
[root@xue ~]# ssm list dev 查看磁盘信息
创建目录[root@xuegod72 ~]# mkdir /mail-lv
用的命令如下:
ssm create -s lv大小 -n lv名称 --fstype lv文件系统类型 -p卷组名 设备 挂载点
不需要手动创建物理卷,卷组,逻辑卷,格式化文件系统,挂载等操作
这条命令自动把设备变成 pv,创建 vg , lv ,格式化文件系统, 自动挂载
[root@xue ~]# ssm create -s 1G -n mail-lv --fstype xfs -p mail /dev/sdb[1-4] /mail-lv
[root@xue ~]# df -h /mail-lv/
[root@xue ~]# pvs [root@xue ~]# lvs
[root@xue ~]# lvextend -L +500m -r /dev/mail/mail-lv
[root@xue ~]# pvs [root@xuegod64 ~]# lvs
实例配置:
[root@xue ~]# pvcreate /dev/sdc
[root@xue ~]# vgcreate vg05 /dev/sdc
[root@xue ~]# lvcreate -n lv05 -L 1G vg05
[root@xue ~]# mkfs.xfs /dev/vg05/lv05
[root@xue ~]# blkid /dev/vg05/lv05
[root@xue ~]# mkdir /lv05
[root@xue ~]# mount /dev/vg05/lv05 /lv05
[root@xue ~]# lvextend -L +100M -r /dev/vg05/lv05
[root@xue ~]# df -hT && lvs
[root@xue ~]# lvextend -L +100M /dev/vg01/lv01
[root@xue ~]# df -hT && lvs
[root@xue ~]# xfs_growfs /lv01
[root@xue ~]# df -hT && lvs
十六、计划任务
ls /var/spool/at 查看定时任务内容
ls /var/spool/cron/ 查看都谁创建的计划任务
ll /etc/crontab 系统级别的计划任务;
/var/spool/cron/root 定时任务配置文件放此
at 和 crontab 这两个命令:
at:它是一个可以处理仅执行一次就结束的指令
crontab:它是会把你指定的工作或任务,比如:脚本等,按照你设定的周期一直循环执行下去
at 计划任务的使用
[root@xue ~]# yum -y install at
[root@xue ~]# systemctl start atd #开启 atd 服务
[root@xue ~]# systemctl status atd #查看 atd 服务状态
[root@xue ~]# systemctl is-enabled atd
#查看是否开始开机启动服务,如果弹出 enabled,说明开机启动此服务
[root@xue ~]# at 20:46 #注意:如果是上午时间,后面加上 am,9:20am
at> mkdir /tmp/xuegod #输入你要执行的命令
at> touch /tmp/xuegod/a.txt
结束:ctrl+d
[root@xue ~]# at -l 或者 atq #查看计划任务
[root@xue ~]# at -c 5 -c:打印任务的内容到标准输出, 查看 5 号计划任务具体内容
[root@xue ~]# ls /var/spool/at/ 查看定时任务内容
显示如下:a00003018452cb a0000501845084 spool
[root@xue ~]# atrm 3 5 删除计划任务3和5
at 计划任务的特殊写法:
at 20:00 2030-12-29 在某天 at now +10min 在10分钟后执行
at 17:00 tomorrow 明天下午5点执行 at 6:00 pm +3 days 在3天以后的下午6点执行
at 23:00 < /root/a.txt 把 a.txt 的内容输入给他也可以
crontab 定时任务的使用:
启动 crond 服务 systemctl start crond systemctl enable crond
crontab 的参数:
crontab -l #列出当前用户下的 cron 服务的详细内容
crontab -u user1 -l #列出指定用户 user1 下的 cron 服务的详细内容
crontab -r #删除 cron 服务
crontab -e #编辑 cron 服务,当前用户下
例如:
crontab -u root -l # root 查看自己的 cron 计划任务
crontab -u user1 -r # root 想删除 user1 的 cron 计划任务
crontab -e #编辑时的语法
分 时 日 月 周
星期日用 0 或 7 表示
* 代表取值范围内的数字 (任意/每)
/ 指定时间的间隔频率 0-23/2 放在小时下(在 0-23 点之间,每间隔 2 小时执行一次)
10-20/2 放在号下 ( 在 10-20 号之间,每间隔 2 天执行一次)
*/10 放在分钟下 (每间隔 10 分钟执行一次)
- 代表从某个数字到某个数字 8-17 8 到 17 之间执行
,分开几个离散的数字 6,10-13,20 6 执行,10 到13之间执行,20 执行
注:所有用户的计划任务,都会在/var/spool/cron/下产生对应的文件
[root@xue ~]# ll /var/spool/cron/
所以后期可以使用这一招排查,黑客是否在你的机器中安装了定时任务
系统级别的计划任务:也可以直接在/etc/crontab 中添加计划任务
ll /etc/crontab vim /etc/crontab 系统级别计划任务
0 21 * * * /etc/init.d/httpd restart 每天晚上 21:00 重启 apache
45 4 1,10,22 * * /etc/init.d/httpd restart 每月 1、10、22 日的 4 : 45 重启 apache。
45 4 1-10 * * /etc/init.d/httpd restart 每月 1 到 10 日的 4 : 45 重启 apache。
3,15 8-11 */2 * * /etc/init.d/httpd restart 每隔两天的上午 8 点到 11 点的第 3 和第 15 分钟重启 apache
0 23-7/1 * * * /etc/init.d/httpd restart 晚上 11 点到早上 7 点之间,每隔一小时重启 apache
15 21 * * 1-5 mail -s "hi" root@localhost < /etc/fstab 周一到周五每天晚上 21:15 寄一封信给 root@localhost
https://tool.lu/crontab 查询计划任务计算网址,可以查看接下来 7 次的执行日期;
案例要求:
每天 22:00 备份 /etc/目录到/tmp/backup 下面,将备份命令写入一个脚本中,
每天备份文件名格式:2017-08-19_etc.tar.gz
在执行计划任务时,不要输出任务信息,存放备份内容的目录要求只保留三天的数据
[root@xue ~]# vim backup.sh
#!/bin/bash
[ -d /tmp/backup ] || mkdir -p /tmp/backup
[ -f /tmp/backup/`date +%F`_etc.tar.gz ] || tar czf /tmp/backup/`date+%Y-%m-%d`_etc.tar.gz /etc
find /tmp/backup -name "*.tar.gz" -mtime +3 -exec rm -rf {} \;
find /tmp/backup -name "*.tar.gz" -mtime -3 |xargs ls –lh
[root@xue ~]# crontab -l
0 22 * * * sh /root/backup.sh &>/dev/null
0 22 * * * /root/backup.sh & &>/dev/null 或者
注:工作中备份的文件不要放到/tmp,因为过一段时间,系统会清空备/tmp 目录
-mtime -1, 当前时间为 2021-04-10 22:31, 2021-04-09 22:31~ 2021-04-10 22:31 之间修改的文件
-mtime 1, 当前时间为 2021-04-10 22:31, 2021-04-08 22:31~ 2021-04-09 22:31 之间修改的文件
-mtime +1,当前时间为 2021-04-10 22:31, 2021-04-08 22:21 之前修改的文件
日志的种类和记录的方式自定义 ssh 服务日志类型存储位置
/var/log/message 大多数系统日志消息记录在此处。
/var/log/secure 安全和身份验证相关的消息和登录失败的日志文件,ssh 远程连接的日志
/var/log/maillog 与邮件服务器相关的消息日志文件
/var/log/cron 与定期执行任务相关的日志文件
/var/log/boot.log 与系统启动相关的消息记录
grep Failed /var/log/secure
grep Failed /var/log/secure|awk '{print $11}'|uniq -c 登录失败错误统计
uniq 命令用于报告或忽略文件中的重复行,-c 或——count:在每列旁边显示该行重复出现的次数;
last 显示到目前为止,成功登录系统的记录 或者 last -f /var/log/wtmp
lastb 查看暴力破解系统的用户 last -f /var/log/btmp
查看恶意 ip 试图登录次数:lastb | awk '{ print $3}' | uniq -c | sort -n
打印第三列 去重并显示复次数 按字符串数值大小排序
iptables -A INPUT -i ens33 -s 192.168.1.63(暴力破解地址)-j DROP 发现后使用防火墙拒绝掉;
清空日志:
方法 1:[root@xue ~]# > /var/log/btmp
方法 2:rm -rf /var/log/btmp && touch /var/log/btmp
rsyslog 日志服务: 编辑日志配置文件 vim /etc/rsyslog.conf
local0-local7 8 个系统保留的类, 供其它的程序使用或者是用户自定义
编码 优先级 严重性
7 debug 信息对开发人员调试应用程序有用,在操作过程中无用
6 info 正常的操作信息,可以收集报告,测量吞吐量等
5 notice 注意,正常但重要的事件,
4 warning 警告,提示如果不采取行动。将会发生错误。比如文件系统使用 90%
3 err 错误,阻止某个模块或程序的功能不能正常使用
2 crit 关键的错误,已经影响了整个系统或软件不能正常工作的信息
1 alert 警报,需要立刻修改的信息
0 emerg 紧急,内核崩溃等严重信息
实战-使用 logrotate 进行 ssh 日志分割
定义了 ssh 日志存储在/var/log/sshd 的基础上执行:
vim /etc/logrotate.d/sshd #创建一个sshd 配置文件,插入内容:
/var/log/sshd.log
{ #指定日志文件位置,可用正则匹配
missingok #在日志轮循期间,任何错误将被忽略
weekly #调用频率,有:daily,weekly,monthly 可选
create 0600 root root 以指定的权限创建全新的日志文件
minsize 1M 每1兆
rotate 3 一次将存储 3个归档日志
}
[root@xue ~]#systemctl restart rsyslog
[root@xue ~]# logrotate -d /etc/logrotate.d/sshd #预演,不实际轮询(切割)
[root@xue ~]# logrotate -vf /etc/logrotate.d/sshd #强制轮询(切割),也就
是说即使轮循条件没有满足,也可以通过加-f 强制让 logrotate 轮循日志文件
实战-使用 logrotate 进行 nginx 日志分割
crontab -e 每一份钟分割日志
*/1 * * * * logrotate -vf /etc/logrotate.d/sshd
配置远程日志服务器-实现日志集中的管理
1、服务端打开tcp udp 514端口;
2、客户端 # vim /etc/rsyslog.conf #在 90 行之后,插入
*.* @@192.168.1.63:514 #写入服务端的 ip 地址
注: *.* 所有类别和级别的日志; @@192.168.1.63:514 运端 tcp 协议的日志服务端的 IP 和端口
实战-配置公司内网服务器每天定时自动开关机
定时关机:
[root@xue ~]# crontab -e #写入以下内容
0 23 * * * /usr/sbin/shutdown -h now
定时开机:
Power Management Setup,就进入电源管理设置了- Wake Up Event Setup,
回车选择 Press Enter--继续找到 Resume By RTC Alarm,回车选择一下,
将 Disabied 更改为 Enabled,然后配置开机时间;
十七: shell脚本学习
shell 脚本(一)
vim test.sh 编写脚本
#!/bin/bash 告诉脚本使用的是哪种命令解释器
# This is shell. 注释
echo "hello world"
chmod +x test.sh可执行权限
./test.sh #执行shell
创建 shell 程序的步骤:
第一步:创建一个包含命令和控制结构的文件。
第二步:修改这个文件的权限使它可以执行。 使用 chmod +x test.sh
第三步:检测语法错误 bash -x abc.sh
第四步:执行 ./example
shell 脚本的执行通常有以下几种方式
1、/root/test.sh 或者 ./test.sh (当前路径下执行脚本的话要有执行权限 chmod +x test.sh)
2、bash test.sh 或 sh test.sh (这种方式可以不对脚本文件添加执行权限)
3、source test.sh (可以没有执行权限) . test.sh
4、sh < test.sh 或者 cat test.sh |sh(bash)
变量的设置规则:
1.变量名称通常是大写字母,它可以由数字、字母(大小写)和下划线_组成。变量名区分大小写;
但是大家要注意变量名称不能以数字开头
2.等号 = 用于为变量分配值,在使用过程中等号两边不能有空格
3.变量存储的数据类型是整数值和字符串值
4.在对变量赋于字符串值时,建议大家用引号将其括起来。因为如果字符串中存在空格符号。需要使
用单引号或双引号
5.要对变量进行调用,可以在变量名称前加美元符号$
6.如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用
${变量名}包含;
按照变量的作用分成 4 类:1、用户自定义变量;2、环境变量;3、位置参数变量;4、预定义变量;
按照变量作用域分成 2 类:全局变量和局部变量
[root@xue ~]# var1=123
[root@xue ~]# echo $var1
[root@xue ~]# echo ${var1}db.log #输出为123db.log
调用命令的输出替换,使用$()或反引号 echo `date` echo $(date)
例 1:给变量值赋于多个单词,需要使用单引号和双引号 var8='xuegod user1'
例 2:赋值时单引号和双引号的区别
var8='xuegod user1 $var1' var9="xuegod user1 $var1"
[root@xue ~]# echo $var8 结果为 xuegod user1 $var1
[root@xue ~]# echo $var9 结果为 xuegod user1 123
单引号之间的内容原封不动赋值给变量,双引号之间的内容如有特殊符号会保留它的特殊含义
注意:一定要看最外层的值;
[root@xue ~]# unset var1 删除变量
环境变量:
全局变量:对于 shell 会话和所有的子 shell 都是可见的; 局部变量: 它只在自己的进程当中使用;
[root@xue ~]# export var1=xuegod 定义全局变量;
我们设置了 export 全局变量,但是新开的 xshell 连接中,还是读不到变量 var1,怎么办?
下面开始插入永久变量:
[root@xue ~]# vim /etc/profile 在文件的最后插入;
export var1=xuegod =等号两边不能有空格
[root@xue ~]# source /etc/profile 重新加载 profile 文件,新打开的链接中也有了;
设置 PATH 环境变量:/opt/backup PATH=/opt/:$PATH backup 命令直接执行即可;
[root@xue ~]# vim /etc/profile 在文件最后追加以下内容,永久生效
export PATH=/opt/:$PATH
[root@xue ~]# source /etc/profile 重新加载配置文件,使用配置生效;
shell 位置变量:
$0 获取当前执行 shell 脚本文件的文件名,包括脚本路径,命令本身
$n 获取当前脚本的第 n 个参数 n=1,2.....n 当 n 大于 9 时 用${10}表示
例子:[root@xue ~]# ./print.sh 111 222 a.txt 444 后面的数字是输入的;
特殊变量(预定义变量)
[root@xue ~]# vim test_var.sh
#!/bin/bash
echo "$* 显示这个程序的所有参数"
echo "$# 表示这个程序的参数个数"
echo "$$ 表示当前进程的进程号 PID"
echo "$! 表示上一个后台运行的进程的 PID"
echo "$? 表示上一个程序执行返回结果"
[root@xue ~]# bash test_var.sh 1 2 3 4 5
1 2 3 4 5 表示这个程序的所有参数
5 表示这个程序的参数个数
22385 表示当前进程的进程号 PID
22387 表示上一个后台运行的进程的 PID
0 表示上一个程序执行返回结果
常用的环境变量:
[root@xue ~]# cd /opt
[root@xuegod63 opt]# vim env.sh
#!/bin/bash
echo \$HOME 变量值是$HOME
echo \$PATH 变量值是$PATH
echo \$PWD 变量值是$PWD
[root@xuegod63 opt]# bash env.sh
$HOME 变量值是/root
$PATH 变量值是/opt/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
$PWD 变量值是/opt
declare 声明变量类型:
declare [+/-] [选项] 变量名
- : 给变量设定类型属性
+: 取消给变量设定类型属性
-i 将变量声明为整数型
-x 将变量声明为环境变量 等同于 exprot
-r 将变量声明为只读变量
-p 显示指定变量的被声明类型
[root@xuegod83 ~]# declare -i num
[root@xuegod83 ~]# num=1
[root@xuegod83 ~]# echo $num
1
[root@xuegod83 ~]# num=abc
[root@xuegod83 ~]# echo $num
0
[root@xuegod83 ~]# declare +i num 取消声明整数型;
[root@xuegod83 ~]# num=abc
[root@xuegod83 ~]# echo $num 结果为abc
数学运算符:
expr命令:对数字的基本计算,做比较时,输出结果假为0,1为真;特殊符号用转义符
expr 2 \> 5 结果为0 expr 3 \* 5结果为15
对字符串的处理:
[root@xue ~]# expr length "ni hao" 结果为6,输出字符长度;
[root@xue ~]# expr substr "ni hao" 2 4 从第 2 个开始,截取 4 个字符出来 i ha
字符串提取:
第一种模式:${var:num},这种模式时,shell 在var中提取第 n 个字符到末尾的所有字符。
若 n为正数,从左边 0 处开始;若 n 为负数,从右边开始提取字串,但必须使用在冒号后面
加空格或整个n加上小括号,如${var: -2}、${var:(-2)}。
[root@xue ~]# var=http://www.xuegod.cn/123.htm
[root@xue ~]# echo ${var:(-5)} 结果为:3.htm 后五个
第二种模式:${var:n1:n2},n1 是位置,n2 是长度。表示从$var 字符串的第$n1 个位置开始提取
长度为$n2 的子串。不能为负数。
[root@xue ~]# echo ${var:0:5}
结果为:http:
字符串替换:具体查看第十九章的匹配实例;
第一种模式:${var/pattern/pattern} 将 var 字符串的第一个匹配的 pattern 替换为另一个pattern。
[root@xue ~]# echo ${var/cn/com}
http://www.xuegod.com/123.htm
第二种模式:${var//pattern/pattern} 将 var 字符串中的所有能匹配的 pattern 替换为另一个pattern。
[root@xue ~]# echo ${var//w/opt}
http://optoptopt.xuegod.cn/123.htm
% 是去掉右边,最小匹配;
%% 是去掉右边,最大匹配;
[root@xue ~]# echo ${var%w*m} 最短匹配
http://ww
[root@xue ~]# echo ${var%%w*m} 最长匹配
http://
# 是去掉左边,最小匹配
[root@xue ~]# echo ${var#*w}
ww.xuegod.cn/123.htm
## 是去掉左边,最大匹配
[root@xue ~]# echo ${var##*w}
.xuegod.cn/123.htm
$(( ))应用
格式:$((表达式 1,表达 2))
特点:
1、在双括号结构中,所有表达式可以像 c 语言一样,如:a++,b--等。a++ 等价于 a=a+1
2、在双括号结构中,所有变量可以不加入:“$”符号前缀。
3、双括号可以进行逻辑运算,四则运算
4、双括号结构 扩展了 for,while,if 条件测试运算
5、支持多个表达式运算,各个表达式之间用“,”分开
常用的算数运算符
运算符 意义
++ -- 递增及递减,可前置也可以后置 + - ! ~ 一元运算的正负号 逻辑与取反 + - * / % 加减乘除与余数
< <= > >= 比较大小符号 == != 相等 不相等 >> << 向左位移 向右位移
& ^ | 按位的与,按位的异或按位的或 && || 逻辑与 逻辑或 ? : 条件判断
b=$((1+2)) echo $b 结果为3
a=1 for i in {1..10}; do echo $((a++)); done;
检查语法是否有错:
bash -v test.bash 查看 bash 是否存在语法错误;
bash -x test.bash 查看 bash 详细的执行过程;
实战-升级系统中的 java 版本到 1.8 版本
shell 脚本(二)
read 命令键盘读取变量的值
从键盘读取变量的值,通常用在 shell 脚本中与用户进行交互的场合。该命令可以一次读取多个变量
的值,变量和输入的值都需要使用空格隔开。
例 1: read a b 键盘输入该字符hello world echo $a $b 显示为 hello world
例 2: read -s passwd 加参数隐藏输入;
例 3: read -n 2 test 最多只接受2个字符;
read 选项:
-p “提示信息”:等待 read 输入时,输出提示信息。
-t 秒数:read 命令会一直等待用户输入,使用此选项可以指定等待时间。
-n 字符数:read 命令只接受指定的字符数量,然后就会执行。
-s 隐藏输入内容,适用于机密信息的输入。
-r 参数输入,允许让输入中的内容包括: 斜线识别为普通字符
[root@xue ~]# read -p "please input: " pass
please input: 123456
[root@xue ~]# echo $pass
123456
流程控制语句 if
[root@bogon ~]# vim if1.sh
#!/bin/bash
read -p "检查目录是否存在,请输入目录:" dir
if ls $dir 2> /dev/null 1>&2
then
echo "目录存在"
else
echo "目录不存在"
fi
多分支 if 语句
[root@xue ~]# vim if4.sh
#!/bin/bash
read -p "input a user:" user
if grep $user /etc/passwd ; then
echo "用户 $user 已存在"
elif ls -d /home/$user > /dev/null 2>&1 ; then
echo "$user 不存在,但家目录存在"
else
echo "用户 $user 不存在"
echo "$user 家目录不存在"
fi
test 测试命令:
注意:数值比较
如果结果是对的,也叫结果为真,用$?=0 表示,反之为假,用非 0 表示
-eq 等于则为真 [ “$a” -eq “$b” ]
-ne 不等于则为真 [ “$a” -ne “$b” ]
-gt 大于则为真 [ “$a” -gt “$b” ]
-ge 大于等于则为真 [ “$a” -ge “$b” ]
-lt 小于则为真 [ “$a” -lt “$b” ]
-le 小于等于则为真 [ “$a” -le “$b” ]
[root@ xuegod63 ~]# vim test2.sh
#!/bin/bash
read -p "请输入第一个整数" a
read -p "请输入第二个整数" b
if [ $a -eq $b ];then
echo "$a 等于$b,两个数字相等"
else
echo "$a 不等于$b,两个数字不相等"
fi
注意:字符串比较:
== 等于则为真 [ “$a” == “$b” ]
!= 不相等则为真 [ “$a” != “$b” ]
-z 字符串. 字符串的长度为零则为真 [ -z “$a” ]
-n 字符串 字符串的长度不为空则为真 [ -n “$a” ]
str1 > str2 str1 大于 str2 为真 [ str1 \> str2 ]
str1 < str2 str1 小于 str2 为真 [ str1 \< str2 ]
注意:文件比较:注意两边都有空格
-e 文件名. 如果文件或目录存在则为真 [ -e file ]
-r 文件名. 如果文件存在且可读则为真 [ -r file ]
-w 文件名. 如果文件存在且可写则为真 [ -w file ]
-x 文件名. 如果文件存在且可执行则为真 [ -x file ]
-s 文件名. 如果文件存在且至少有一个字符则为真 [ -s file ]
-d 文件名. 如果文件存在且为目录则为真 [ -d file ]
-f 文件名. 如果文件存在且为普通文件则为真 [ -f file ]
-c 文件名. 如果文件存在且为字符型文件则为真 [ -c file ]
-b 文件名.. 如果文件存在且为块特殊文件则为真 [ -b file ]
file1 -nt file2 检查 file1 是否比 file2 新 [ file1 -nt file2 ]
file1 -ot file2 检查 file1 是否比 file2 旧 [ file1 -ot file2 ]
清空日志:
保留最近 100 行的日志内容。
tail -100 /var/log/messages > /var/log/mesg.tmp
日志清空
> /var/log/messages
mv /var/log/mesg.tmp /var/log/messages
echo "log clean up"
exit #退出 bash,并返回一个值 注:退出码 exit ,取值范围是 0-255,超过后值循环 0-255
流程控制过程中复杂条件和通配符:
方法一
#!/bin/bash
if [ -d /etc ] && [ -d /root ];then
echo "etc 和 root 目录都存在"
fi
if [ -d /etc ] || [ -d /root ];then
echo "etc 或 root 目录至少有一个存在"
fi
方法二:
#!/bin/bash
if [ -d /etc -a -d /root ];then
echo "etc 和 root 目录都存在"
fi
if [ -d /etc -o -d /root ];then
echo "etc 或 root 目录至少有一个存在"
fi
方法三:
#!/bin/bash
if [[ -d /etc && -d /root ]];then
echo "etc 和 root 目录都存在"
fi
if [[ -d /etc || -d /root ]];then
echo "etc 或 root 目录至少有一个存在"
fi
() 单小括号 (())双小括号 [] 单中括号 [[]] 双中括号 {} 大括号
[[… ]] 运算符是[… ]运算符的扩充;[[… ]]能够支持 *,< 、>等符号且不需要转义符
多条命令执行:
括号中的命令将会新开一个子 shell 顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括
号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
单小括号,(cmd1;cmd2;cmd3) 新开一个子 shell 顺序执行命令 cmd1,cmd2,cmd3, 各命令之间
用分号隔开, 最后一个命令后可以没有分号。
[root@xue ~]# (cc=1;dd=2,ee=3)
[root@xue ~]# echo $cc $dd $ee
多条命令执行:
{} 花括号,大括号,{ cmd1;cmd2;cmd3;} 在当前 shell 顺序执行命令 cmd1,cmd2,cmd3, 各命
令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开。
[root@xue ~]# { c=1;d=2;e=3;}
[root@xue ~]# echo $c $d $e
1、所有的字符与逻辑运算符直接用“空格”分开,不能连到一起。
2、在[… ]表达式中,常见的> 、<需要加转义符\,大小比较
3、进行逻辑运算符&& 、||比较时;如果用的[ ]符号,则用在外面,如[… ] && [… ] || [ …]如果
在[…]里面进行逻辑与或的比较,则用-a、-o 进行表示,如[ x = y –a x < z –o x > m ]
4、[[… ]] 运算符只是[… ]运算符的扩充;能够支持< 、>符号运算不需要转义符;它还是以字符串
比较大小。里面支持逻辑运算符 || 、 && , 不再使用-a 、-o
5、[[…]] 用 && 而不是 -a 表示逻辑“与”;用 || 而不是 -o 表示逻辑“或”
6、[[… ]]可以进行算术扩展,而[ ... ]不可以
7、[[...]]能用正则,而[...]不行
8、双括号(( ))用于数学表达式
9、双方括号号[[ ]]用于高级字符串处理,比如“模糊匹配”
10、[[]]对于字符串的比较支持并不好,尤其在使用[[]]和<>符号进行比较的时候会出现返回值错误的情况。
shell常见通配符:
字符含义
* 匹配0或多个字符
? 匹配任意一个字符
[abcd] 匹配 abcd 中的任意单一字符;
[!abcd] 匹配除 abcd 中的任意单一字符;
[0-9] 匹配 0-9 中的任意单一字符 如:[a-z]
{string1,string2,...} 匹配 sring1 或 string2 (或更多)其中一个字符串
大括号拓展。(通配)将对大括号中的文件名做扩展。在大括号中,不允许有空白,除非这个空白被引
用或转义。第一种:对大括号中的以逗号分割的文件列表进行拓展。如 touch {a,b}.txt 结果为 a.txt
b.txt。第二种:对大括号中以点点(..)分割的顺序文件列表起拓展作用,如:touch {a..d}.txt 结果为
a.txt b.txt c.txt d.txt
实战 1:编写脚本检查服务器运行状态
实战 2: 根据学生的成绩判断学生的优劣
实战 3:每周一晚上 3:00 ,备份数据库服务器上 webdb 库的所有数据到系统的/mysqlbak 目录里,
使用系统日期做备份文件名。
shell 脚本(三)
流程控制语句:case
执行流程:
首先使用“变量或表达式”的值与值 1 进行比较,若取值相同则执行值 1 后的命令序列,直到遇见
双分号“;;”后跳转至 esac,表示分支结束;
若与值 1 不相匹配,则继续与值 2 进行比较,若取值相同则执行值 2 后的命令序列,直到遇见双分
号“;;”后跳转至 esac,表示结束分支。
依次类推,若找不到任何匹配的值,则执行默认模式“ *) ”后的命令序列,直到遇见 esac 后结束分支
注意事项:
“变量或表达式”后面必须为单词 in,每一个“变量或表达式”的值必须以右括号结束。取值可以
为变量或常数。匹配发现取值符合某一模式后,所有命令开始执行直至 ;;匹配中的值可以是多个值,
通过“|”来分隔。
#!/bin/bash
read -p "请输入您的选择: " OP
case $OP in
1|backup)
echo "BACKUP......"
;;
2|copy)
echo "COPY....."
;;
3|quit)
exit
;;
*)
echo error
esac
循环语句: for-do-done
语法格式:列表内容,循环一遍输出
for var in list ###:for 后跟 var(var 相当于一个变量)list(相当于一个列表)
do
commands
done
或:
for var in list ; do
commands
done
例子1:
#!/bin/bash
for var in a1 b1 c1 d1
do
echo the text is $var
done
例子2:从变量中取值
#!/bin/bash
list="a1 b1 c1 d1"
for i in $list
do
echo list is a $i
done
例子:4、从命令中取值
[root@xue ~]# vim for5.sh #默认以以空格做分隔符
#!/bin/bash
for i in `cat /etc/hosts`
do
echo "$i"
done
例子:5 自定义 shell 分隔符
注:$'\n'与'\n'时的区别
IFS='\n' #将字符\和字符 n 作为字段分隔符。
IFS=$'\n' #使用换行符做为字段分隔符。
[root@xue ~]# vim for6.sh #指定以\n 回车做为 for 语句的分隔符
#!/bin/bash
IFS=$'\n'
for i in `cat /etc/hosts`
do
echo "$i"
done
[root@xue ~]# vim for6.sh #以:冒号做分隔符
#!/bin/bash
IFS=:
for i in `cat /etc/hosts`
do
echo $i
done
例子:6 C语言风格的for
语法格式:
for ((i=0;i<10;i++))
do
commmands
done
while 循环语句和循环嵌套:
while-do-done
重复测试指令的条件,只要条件成立就反复执行对应的命令操作,直到命令不成立或为假;
例 1:降序输出 10 到 1 的数字
[root@xue ~]# vim while1.sh
#!/bin/bash
var=10
while [ $var -gt 0 ]
do
echo $var
var=$[$var-1]
#var=$(($var-1)) 另外表达方式
#let var-- 自减 另外表达方式 自增操作 let var++
done
例 2 :打印九九乘法表
注:外层循环循环行,内层循环循环列
规律: 内层循环的变量<=外层循环的变量
echo -n 代表不换行
[root@xue ~]# vim forfor.sh
#!/bin/bash
for i in `seq 9`
do
for j in `seq $i`
do
echo -n "$i*$j= `echo $(($i*$j))` "
done
echo " "
done
实战-3 个 shell 脚本实战
1、实战-将/opt 目录下所有的日志文件全自动打包
2、实战-找出 192.168.1.1-10 网段中,服务器已经关机的 IP 地址
3、批量创建帐号并生成随机密码
shell 脚本(四)
跳出循环 break 和 continue :
break:跳出整个循环,continue:跳过本次循环,进行下次循环
break 概述:跳出当前整个循环或结束当前循环,在 for、while 等循环语句中,用于跳出当前所在
的循环体,执行循环体之后的语句,后面如果什么也不加,表示跳出当前循环等价于 break 1,也可以在
后面加数字,假设 break 3 表示跳出第三层循环
continue 概述:忽略本次循环剩余的代码,直接进行下一次循环;在 for、while 等循环语句中,
用于跳出当前所在的循环体,执行循环体之后的语句。
Shift 参数左移指令:
shift 命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然
后进行相应处理(常见于 Linux 中各种程序的启动脚本)
作用:每执行一次参数序列顺次左移一个位置,$#的值减 1,用于分别处理每个参数,移出去的参数不再可用
例子:加法计算器
[root@xue ~]# vim shift.sh
#!/bin/bash
if [ $# -le 0 ];then
echo "没有足够的参数"
exit
fi
sum=0
while [ $# -gt 0 ]
do
sum=$(( sum + $1 ))
shift
#shift 2
done
echo "结果是" $sum
函数的使用
方法 1:
function name {
commands
}
方法 2:name 后面的括号表示你正在定义一个函数
name(){
commands
}
注意:函数名的使用,如果在一个脚本中定义了重复的函数名,那么以最后一个为准
[root@xue ~]# vim fun2.sh
#!/bin/bash
function fun1 {
echo "this is function"
}
function fun1 {
echo "this is 2222222"
}
fun1
[root@xue ~]# bash fun2.sh
this is 2222222
返回值:使用 return 命令来退出函数并返回特定的退出码,状态码的取值范围(0~255)
ls /etc/passwd
return 3
echo "我不会被执行"
[root@xue ~]# echo $?
3
exit 整个脚本就直接退出,返回数字
return 只是在函数最后添加一行,然后返回数字,只能让函数后面的命令不执行,
无法强制退出整个脚本。
例子:把函数值赋给变量使用,函数名就相当于一个命令
例子:函数的参数传递,通过脚本传递参数给函数中的位置参数$1
第二种:调用函数时直接传递参数
[root@xue ~]# touch /root/a.txt #创建一个测试文件
[root@xue ~]# vim fun5.sh
#!/bin/bash
fun1(){
rm -rf $1
}
fun1 /root/a.txt
[root@xue ~]# bash fun5.sh #测试
[root@xue ~]# ls /root/a.txt
ls: 无法访问/root/a.txt: 没有那个文件或目录
第三种:函数中多参数传递和使用方法
[root@xue ~]# vim fun6.sh
#!/bin/bash
fun() {
echo $[$1*5]
echo $[$2*2]
echo $[$3*3]
}
fun 5 6 $3
[root@xue ~]# bash fun6.sh 1 2 7 #测试
25
12
21
函数中变量的处理:函数使用的变量类型有两种:局部变量、全局变量
全局变量,默认情况下,你在脚本中定义的变量都是全局变量,你在函数外面定义的变量在函数
内也可以使用;
局部变量:不能被引用到函数外,只在函数内生效,定义方法:local value
22.4 实战自动备份 mysql 数据库脚本和 nginx 服务启动脚本
expect 实现无交互登录:略
Shell 中的色彩处理
shell 脚本中 echo 显示内容带颜色显示,echo 显示带颜色,需要使用参数-e
格式 1:echo -e “\033[背景颜色;文字颜色 m 要输出的字符 \033[0m”
格式 2:echo -e “\e[背景颜色;文字颜色 m 要输出的字符\e[0m”
十九:网络三剑客--正则表达式 grep awk sed
grep 和 egrep:文本过滤的
sed:流编辑器,实现编辑的
awk:文本报告生成器,实现格式化文本输出
grep正则表达式的使用
$ 匹配输入字符串的结尾位置。要匹配 $ 字符本身,请使用 \$
^ 匹配输入字符串的 开始 位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。
要匹配 ^ 字符本身,请使用 \^
( ) 标记一个子表达式的开始和结束位置。要匹配这些字符,请使用 \( 和 \)
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+
. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \.
[ 标记一个中括号表达式的开始。要匹配 [,请使用 \[
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。
例如,'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("
{ 标记限定符表达式的开始。要匹配 {,请使用 \{
| 指明两项之间的一个选择。如:Y | y,要匹配 |,请使用 \|
定位符
^ 匹配输入字符串开始的位置
$ 匹配输入字符串结尾的位置
非打印字符
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符
grep a bbb 显示bbb带有a的行
grep .* bbb 表示任意,全部显示 .表示任意字符 .*匹配所有字符
grep ^a$ bbb 已a开始以a结束 显示空行
grep ^a 以a开头 按行显示
grep "games\|root" /etc/passwd | wc -l | 表示或者的意思 注: \ 表示转义符
grep -E "nologin|root" /etc/passwd | wc -l -E增强版,不需要转义符;
grep [ab] bbb 有a或b的显示
grep [^ab] bbb 非a和b的显示
grep “\.com” bbb \转义字符 以.com 结尾
grep "a\{2,3}" bbb -E 把a 重复2到3次 以行输出 加-o显示匹配的字符
grep 6 bbb -A2 显示带有6的行和后面2行 -B 2前面2行 -C 前后两行
-i忽略大小写;-E 使用扩展的正则表达式;-n 显示行号;-o只显示匹配的; -v 取反
-A num 显示匹配的和后num行;-B显示匹配和前num行;-C num显示匹配和前后的
grep -v “^$”bbb 显示非空行
grep "." bbb 表示任意字符 显示整行。
grep "\.$" bbb 把.转义为.输出行 以.结尾 “\.” bbb
grep ".*" bbb 整行输出包括空行 *重复0次
grep "[a-b]" bbb -n a到b所有字符,显示行号
grep“[^a-z]”bbb -n -i 非a-z同时忽略大小写
grep “a*” a重复0次 所有都输出
grep “8{3}” bbb -nE 8重复3次匹配输出
grep "8[4,5]" bbb -nE 8重复4-5次匹配输出
grep \(ab\).*\1 分组,以ab为一个组,向后引用重复1次的行;
例子:显示包含root的集中写法:
[root@xue ~]# grep 'ro\+t' /etc/passwd
[root@xue ~]# grep 'ro\(o\)\?t' /etc/passwd
[root@xue ~]# egrep 'ro+t' /etc/passwd
[root@xue ~]# egrep 'ro(o)?t' /etc/passwd
例:统计/etc/ssh/sshd_config 文件中除去空行和#号开头的行的行数
[root@xue ~]# grep -v "^$" /etc/ssh/ssh_config | grep -v "^#" | wc -l
[root@xue ~]# grep -v "^$\|^#" /etc/ssh/ssh_config | wc -l #使用基础正则表达式
[root@xue ~]# grep -E -v "^$|^#" /etc/ssh/ssh_config | wc -l #扩展正则表达式
[root@xue ~]# egrep -v "^$|^#" /etc/ssh/ssh_config | wc -l #扩展正则表达式
sed 流编辑器
sed 编辑器是一行一行的处理文件内容的,文件内容并没有改变,除非你使用重定向存储输出。
Sed 主要用来自动编辑一个或多个文件;简化对文件的反复操作;
sed 也是支持正则表达式的,如果要使用扩展正则加参数-r
语法格式:sed [options]‘[commands]’filename
sed option 'AddressCommand' file.......
sed -n "23,34p" bbb 只显示23-34行
[root@xue ~]# echo "this is apple" | sed 's/apple/dog/'
输出为this is dog g为全部替换
sed 命令参数详解,选项如下:
-a 在当前行下面插入文件
-n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令(取消默认输出)
-e 执行多个 sed 指令
-f 运行脚本
-i 编辑文件内容 ***
-i.bak 编辑的同时创造.bak 的备份
-r 使用扩展的正则表达式
命令如下:
i 在当前行上面插入文件
c 把选定的行改为新的指定的文本
p 打印 *** w 另存 s 查找 y 替换
d 删除 ***
r/R 读取文件/一行
h 拷贝模板块的内容到内存中的缓冲区。
H 追加模板块的内容到内存中的缓冲区。
g 获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面
D 删除\n 之前的内容
P 打印\n 之前的内容
替换标记:
数字:表明新文本将替换第几处模式匹配的地方
g:表示新文本将会替换所有匹配的文本
\1:子串匹配标记,前面搜索可以用元字符集\(..\),
&:保留搜索到的字符用来替换其它字符
sed 匹配字符集
^ 匹配行开始,如:/^sed/匹配所有以 sed 开头的行。
$ 匹配行结束,如:/sed$/匹配所有以 sed 结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配 s 后接一个任意字符,最后是 d。
* 匹配 0 个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟 sed 的行。
例 1:单行替换,将第 2 行中 bin 替换成 xuegod
[root@xue ~]# sed '2s/bin/xuegod/' passwd | head -2
例 2:多行替换,用逗号表示行间隔。 将第 2 行到最末行中 bin 替换成xuegod,$匹配行结束
[root@xue ~]# sed '2,$s/bin/xuegod/' /etc/passwd | more
例3:d 删除行第 2 行到第 4 行的内容
[root@xue ~]# sed '2,4d' /etc/hosts
命令 i(insert 插入),在当前行前面插入一行 i\
命令 a(append 附加),在当前行后面添加一行 a\
例 1:插入
[root@xue ~]# echo "hello world" | sed 'i\xuegod '
xuegod
hello world
例 2:追加
[root@xue ~]# echo "hello world"|sed 'a\xuegod'
hello world
xuegod
例 3:在文件最后追加内容
[root@xue ~]# sed '$a\192.168.100.100 xuegod100.cn' /etc/hosts
修改行命令 c (change) c\
例 2:将第 2 行到最后全部修改成 aaaaa bbbb
[root@xue ~]# sed '2,$c\aaaaa bbbb' /etc/hosts
(6)打印,直接打印文件中的内容
例 1:打印第 2-5 行内容
[root@xue ~]# sed -n '2,5p' /etc/hosts
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
例 2:输出文件中含有 games 的行
[root@xue ~]# sed -n '/games/p' /etc/passwd
例 3:输出文件中 games 与 nobody 间的部分,包含 games 与 nobody
[root@xue ~]# sed -n '/games/,/nobody/p' /etc/passwd
(7)将修改或过滤出来的内容保存到另一个文件中
例 2:将 passwd 中的包括 root 字样的行保存到 c.txt 中
[root@xue ~]# sed -n '/root/w c.txt' /etc/passwd
(8)-i 对原文件修改,保存(必会)使用场景:替换或修改服务器配置文件
[root@xue ~]# sed -i 's/root/xuegod/' passwd
[root@xue ~]# head -1 passwd
xuegod:x:0:0:root:/root:/bin/bash
修改 IP 地址为 192.168.1.65
[root@xue ~]# sed -i 's/IPADDR=192.168.100.63/IPADDR=192.168.1.65/'
/etc/sysconfig/network-scripts/ifcfg-ens33
awk 高级应用
awk 基本应用
awk [options] 'BEGIN{ print "start" } ‘pattern{ commands }’ END{ print "end" }' file
其中:BEGIN END 是 AWK 的关键字部,因此必须大写;这两个部分开始块和结束块是可选的
模式:
正则表达式 : /root/ 匹配含有 root 的行 /*.root/
关系表达式: < > && || + *
匹配表达式: ~ !~
动作:变量 命令 内置函数 流控制语句
它的语法结构如下:
awk [options] 'BEGIN{ print "start" } ‘pattern{ commands }’ END{ print "end" }' file
其中:BEGIN END 是 AWK 的关键字部,因此必须大写;这两个部分开始块和结束块是可选的
awk 内置变量:
AWK 支持两种不同类型的变量:内建变量,自定义变量
$n 当前记录的第 n 个字段,比如: $1 表示第一个字段,$2 表示第二个字段
FS 字段分隔符(默认是空格)
NF 表示字段数,在执行过程中对应于当前的字段数,NF:列的个数,也就是最后一列;
NR 表示记录数,在执行过程中对应于当前的行号 , NR :行号
$0 这个变量包含执行过程中当前行的文本内容
FILENAME 当前输入的文件名
FNR 各文件分别计数的行号
OFS 输出字段分隔符(默认值是一个空格)
ORS 输出记录分隔符(默认值是一个换行符)
RS 记录分隔符(默认是一个换行符)
常用的命令选项:
-F fs 指定分隔符
-v 赋值一个用户自定义变量
-f 指定脚本文件,从脚本中读取 awk 命令
[root@xue ~]# awk -F: '{print $1}' /etc/passwd 以:分隔,打印第1列用户名
例 2:指定多个分隔符
[root@xue ~]# echo "12AxAbADXaAD52" | awk -F"[aA]" '{print $1}' 输出为:12
[root@xue ~]# echo "12AxAbADXaAD52" | awk 'BEGIN {FS="aA"} {print $2}' 输出为D52
例 4:过滤出本系统的 IP 地址
[root@xue ~]# ifconfig ens33 | grep netmask
inet 192.168.1.63 netmask 255.255.255.0 broadcast 192.168.1.255
[root@xue ~]# ifconfig ens33 | grep netmask | awk '{print $2}' 输出为:192.168.1.6
[root@xue ~]# echo "one two three four" | awk '{print $NF}' 打印最后一列 four
例 2:打印出 passwd 文件中用户 UID 小于 10 的用户名和它登录使用的 shell
[root@xue ~]# awk -F: '$3<10{print $1 "<======>" $NF}' /etc/passwd
例 2:打印出系统中 UID 大于 1000 且登录 shell 是/bin/bash 的用户
[root@xue ~]# awk -F: '$3>=1000 && $NF=="/bin/bash"{print $1"\t"$NF}' /etc/passwd
命令格式:
awk [-F | -f | -v ] ‘BEGIN {} / / {command1;command2} END {}’ filename
-F 指定分隔符 -f 调用脚本 -v 定义变量 ‘{}’ 引用代码块
{…} 命令代码块,包含一条或多条命令; BEGIN 初始化代码块
/ str / 匹配代码块,可以是字符串或正则表达式
{print A;print B} 多条命令使用分号分隔
END 结尾代码块
在 awk 中,pattern 有以下几种:
empty 空模式,这个也是我们常用的
/regular expression/ 仅处理能够被这个模式匹配到的行
例:打印以 root 开头的行
[root@xue ~]# awk -F: '/^root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
行范围匹配 startline,endline
例 1:输出行号大于等于 3 且行号小于等于 6 的行
[root@xue ~]# awk -F: '(NR>=3&&NR<=6){print NR,$0}' /etc/passwd
内置变量的特殊用法:
$0 表示整个当前行
NF 字段数量 NF(Number 数量 ; field 字段) ;NF:列的个数
NR 每行的记录号,多文件记录递增 Record [? ?rek? ?:d] NR :行号
\t 制表符
\n 换行符
~ 匹配
!~ 不匹配
-F'[:#/]+' 定义三个分隔符
[root@xue ~]# ifconfig ens33 | awk 'NR==2{print $2}'
192.168.1.63
注:NR==2 表示行号为第 2 行
例 2:NR 与 FNR 的区别
[root@xue ~]# awk '{print FNR"\t" $0}' /etc/hosts /etc/hostname
1 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
2 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
1 xuegod63.cn
注:对于 NR 来说,在读取不同的文件时,NR 的计数是一直加的 ;
对于 FNR 来说,在读取不同的文件时,它读取下一个文件时,FNR 的计数会从 1 开始重新计算的
例 4:匹配,使用 awk 查出以包括 root 字符的行
[root@xue ~]# awk -F: '/root/{print $0}' /etc/passwd
[root@xue ~]# awk -F: '/^root/{print $0}' /etc/passwd 以 root 开头的行:
[root@xue ~]# route -n | awk 'NR!=1 {print $0}' sed 1d #删除第 1 行的内容
例 1:如果 passwd 中 UID 小于 10,则给变量 USER 赋值成 aaa,否则赋值成 bbb
[root@xue ~]# awk -F: '{$3<10? USER="aaa":USER="bbb";print $1,USER}' /etc/passwd
[root@xue ~]# awk -F: '{if($3<10){print "user=>"$1}else{print "pass=>"$1}}' /etc/passwd
~ 匹配 !~ 不匹配
例:查出 UID 小于等于 5 且包括 bin/bash 的行
[root@xue ~]# awk -F: '{if($3<=5 && $NF ~ "bin/bash"){print $1,$NF}}' /etc/passwd
例 2:换行输出
[root@xue ~]# awk -F: '{printf "%s\n",$1}' /etc/passwd
例 5:对$1和$NF 都做格式化输出,在$1 和$NF 两者之间添加一串====字符进行输入
[root@xue ~]# awk -F: '{printf "USERNAME: %s=========%s\n",$1,$NF}' /etc/passwd
USERNAME: root=========/bin/bash
USERNAME: bin=========/sbin/nologin
二十:其他命令汇总
编码问题:windows上传到linux打开乱码:
iconv -f gb2312(源文件编码) -t utf8(转以后) aaa.txt -o aaaok.txt (输出的新文件);
iconv -f gb2312(源文件编码) -t utf8(转以后) aaa.txt -f --from-code=名称 原始文本编码
-l --list 列举出所有已知的字符集;
linux上脚本导到windows上打开串行的问题(原因是回车处理方法不同)解决方法:
yum install dos2unix #安装dos2unix
unix2dos abc 在Linux编辑的文档到windows下没有换行.sh
sz abc在Linux编辑的文档到windows下没有换行.sh #发送到windows本地 显示正常。
rpm -ivh /mnt/Packages/dos2unix-6.0 然后
unix2dos aaa.sh linux转windwos;
dos2unix windows转linux
rz上传 sz 加要下载的文件名 下载
apt install lrzsz
env 查看环境变量
crontab -u atom -e 指定用户执行脚本
sudo -l 查看能够用到哪些密码
curl -I baidu.com 查看server服务器类型
ab -n 1000 -c 10 http://192.168.1.121/
iptables -L -n -F清空防火墙,服务器默认没有放80端口
zabbix_agentd -p | grep vfs.fs.size
echo -e "xue \ngod\a"
.或者source test.sh 执行编写的shell .和source一样 bash在没有权限的时候执行
echo $PATH 查看变量
1/bin/ls 2别名 3type pwd 4echo $PATH 命令查询顺序
hash 哈希表
:set paste kali下进行粘贴
/etc/init.d/ssh restart update-rc.d ssh enable 开机启动
systeminfo 查看windows系统已经安装的补丁
447




被折叠的 条评论
为什么被折叠?



