Linux基础运维常用命令-手工整理版

Linux基本运维汇总 基本使用汇总 阅读详情

一、开关机相关:

     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系统已经安装的补丁

告别手动核查!用Golin一键生成Linux/Windows等保三级合规报告(附实战命令) 本文详细介绍了如何使用Golin工具自动化生成Linux/Windows等保三级合规报告,大幅提升安全合规工作效率。通过实战命令演示和报告解读,帮助运维团队快速掌握自动化核查技术,解决传统人工核查效率低、标准不一等痛点,实现从基础检查到报告生成的全流程自动化。 阅读详情

相关推荐

VulnWhisperer:自动化漏洞数据管道,实现扫描报告统一管理与可视化

在安全运维和渗透测试领域,漏洞扫描是基础且关键的环节,但不同扫描工具生成的报告格式各异,数据分散,导致漏洞管理效率低下。其核心原理在于通过标准化解析引擎,将Nessus、OpenVAS、Nexpose等主流扫描器的原始输出(XML、CSV等)转化为统一的结构化数据。这一技术价值在于打通了漏洞发现与风险处置的管道,实现了数据的集中化与规范化。在应用场景上,它尤其适用于需要将多源漏洞数据聚合分析、构建统一可视化仪表盘的安全团队。通过将标准化后的数据推送至Elasticsearch等后端,结合Kibana可快速构

aoe41606的博客 447

Linux命令(持续更新)

Linux命令总结一 程序作为人与内核之间交互的翻译官,硬件通过内核控制,内核通过API接收程序的指令,程序就实现展示满足人的需求。 理解:命令属于一种动作,而参数则可是对命令的补充,对象则属于被命令影响的事物。参数的目的则是让命令更好的贴合于工作(参数会必须存在的)。mkdir -p /a/b/c 参数的长短格式:–、- 。(ls -l -a 同于 ls --list --all) # 查看系统内核本 cat /etc/redhat-release rpm #安装、升级、卸载服务程序:软件包管理器

清晨@暖阳 369

30分钟快速部署DefectDojo:Docker Compose实战漏洞管理平台

漏洞管理是现代安全运维的核心环节,旨在系统化地跟踪、评估和修复软件中的安全缺陷。其核心原理是通过集中化平台,将分散的漏洞数据(如来自Nessus、Burp Suite等工具的扫描报告)进行聚合、去重、风险评级和流程跟踪,从而将零散的手工操作转化为自动化、可度量的管理闭环。这一过程的技术价值在于显著提升安全团队效率,降低人为错误,并实现漏洞生命周期的可视化与可控。在应用场景上,它尤其适用于需要处理大量自动化扫描报告的中小团队或个人安全研究者,帮助其构建标准化的安全运营基础。本文聚焦于如何通过Docker Co

weixin_30924239的博客 361

使用 utmpdump 监控 CentOS 用户登录历史

保留、维护和分析日志(如某个特定时期内发生过的,或正在发生的帐号事件),是Linux系统管理员最基础和最重要的任务之一。对于用户管理,检查用户的登入和登出日志(不管是失败的,还是成功的)可以让我们对任何潜在的安全隐患或未经授权使用系统的情况保持警惕。例如,工作时间之外或放假期间的来自未知IP地址或帐号的远程登录应当发出红色警报。在CentOS系统上,用户登录历史存储在以下这些...

weixin_34319999的博客 292

Linux基础知识(三)

今天我们来讲一下linux中有关用户登陆信息的一些知识。首先我们来了解一下,一般的用户的登录信息所存放的位置。一般来说,linux的用户登录信息存放在以下三个文件中:ut...

tongtongjing1765的博客 1689

Linux痕迹清除技术

系统入侵后要对操作痕迹进行清除,如果上传工具和木马文件要做隐藏和伪装,以免引起警觉甚至丢失目标,“清道夫”的工作虽有些烦杂,但这些工作直接影响到目标控守的持久性。

Captain_RB的博客 7620

详解Linux运维---3 数据库基本操作习题

一.概述 1.数据库: ①是用户存放数据、访问数据、操作数据的存储仓库,用户的各种数据被有组织的存放在数据库中。可以随时被有权限的用户查询、统计、添加、删除、和修改。 ②长期存储在计算机内的,有组织、可共享的数据集合。数据库系统是由普通的文件系统发展而来的。 ③数据库系统具有较高的数据独立性,即不依赖于特定的数据库应用程序 ④数据库系统的数据冗余小,可以节省数据的存储空间;另外数据库系统还很容易实现多个用户的数据共享 2.数据库发展: ①初始阶段-----人工管理 人力手工整理存储数据 ②萌芽阶段-----

weixin_42540999的博客 1129

Linux服务器边界防护实战:从iptables到eBPF的可信防火墙构建

防火墙是操作系统网络边界的首要控制机制,其本质是基于IP、端口与连接状态的访问控制策略系统。传统iptables依赖过程式规则叠加,易引发冲突与维护盲区;而nftables通过声明式语法和原子加载保障策略一致性,结合ipset实现毫秒级动态封禁。进一步地,eBPF技术使内核态应用层协议识别(如HTTP Header、gRPC方法、TLS SNI)成为可能,支撑认证前置、资产感知与实时响应等高阶安全能力。该能力广泛应用于SaaS后端、IoT设备管理及微服务架构中,尤其适配缺乏专职安全团队的中小技术团队。本文以

weixin_29741447的博客 515

ScriptSentry是什么:一条PowerShell命令审计Active Directory危险登录脚本的完整指南

ScriptSentry 是一款面向 Active Directory(AD)环境的安全审计工具,只需一条 PowerShell 命令,即可扫描域内的 NETLOGON/SYSVOL 共享与组策略(GPO)登录脚本,快速找出**误配置和危险的登录脚本**:明文密码、权限过大的脚本文件、指向不存在共享的映射路径,甚至可被攻击者利用的管理员登录脚本。对于负责域安全运维、渗透测试或等保整改的人员来说,它

gitblog_00241的博客 216

提升安全测试效率,用快马生成kali自动化助手实现批量扫描与智能报告

现在只需要把nmap的扫描结果文件拖进去,工具就能自动解析XML格式,提取关键信息生成结构化的HTML报告。最棒的是支持自定义模板,我们团队常用的漏洞评级标准、公司logo都能直接嵌入模板。安全测试中有太多可以自动化的环节,把重复性工作交给工具,才能把有限的时间用在真正需要人工判断的地方。每次用kali进行渗透测试,都要手动整理nmap、nessus等工具的输出结果,再复制粘贴到报告模板里,效率实在太低了。工具的比对功能可以自动分析两次扫描结果的差异,用红色标注新增开放的端口,蓝色显示已修复的漏洞。

SilvermistFalcon19的博客 23

Kimi Claw:云原生AI智能体实现自然语言驱动的工作流自动化

AI智能体(Agent)是大模型从对话工具迈向自主执行的关键演进,其核心在于多步推理、工具调用与长期记忆的协同。自然语言调度让非技术人员可通过日常对话定义复杂任务,而持久化智能体则保障任务在云端持续运行、定时触发、状态可溯。ClawHub技能生态进一步解耦领域逻辑与推理能力,支持快速扩展AI工作流边界。这类技术显著降低AI工程门槛,广泛应用于信息监控、竞品分析、科研辅助等知识密集型场景。Kimi Claw正是这一范式的典型落地——以Kimi K2.5 Thinking模型为大脑,以云托管架构为基座,将AI工

weixin_33912638的博客 373

技术人十年成长路径:从写代码到定义问题的三次跃迁

软件工程师的成长,本质是从‘工具使用者’向‘系统构建者’演进的过程。它始于对基础编程能力的掌握,深化于对操作系统、网络、数据库等底层原理的理解,其技术价值在于将抽象知识转化为解决真实故障与业务瓶颈的确定性能力。典型应用场景包括线上事故快速定位、高并发系统权衡设计、跨职能需求本质挖掘等。这一过程高度依赖问题驱动的学习机制、可验证的知识沉淀和面向协作的技术表达——正如文中反复强调的‘画依赖图’‘算经济账’‘给财务讲备份’,正是技术人突破CRUD瓶颈、建立不可替代性的关键跃迁。

diaozhiwa5526的博客 359

Gemini 3.1 Pro多模态推理架构解析:HAR与DMC如何重塑长上下文理解

多模态推理是当前大模型从感知走向认知的关键跃迁,其核心在于跨文本、图像、表格等异构信息的统一表征与协同推理。Gemini 3.1 Pro通过分层注意力路由机制(HAR)实现动态焦点调度,显著提升长上下文理解效率;结合动态记忆压缩器(DMC),将原始token转化为符号、模式与意图三类可编辑记忆形态,突破传统‘堆长度’瓶颈。该技术路径不仅支撑百万级token稳定召回,更在财报分析、技术文档因果推理、跨源商业情报整合等高价值场景中展现出接近专家级的结构化思维能力。本文深入拆解HAR与DMC的工程实现逻辑及其在真

weixin_30723433的博客 309

AI样本驱动数据清洗:用Code Interpreter实现脏数据到干净结果的逆向工程

数据清洗是数据分析和建模前的关键环节,其本质是将非结构化、不一致、含噪声的原始数据,转换为符合业务语义与技术规范的高质量结构化数据。传统方法依赖人工编写正则表达式、pandas链式操作与显式规则定义,面临语义鸿沟、组合爆炸与隐性知识难以编码等瓶颈。而基于样本驱动的数据清洗范式,通过向AI(如ChatGPT的Code Interpreter)同时提供‘脏数据’与对应‘干净结果’,激发其跨模态对齐与逆向工程能力,自动归纳清洗逻辑并生成可验证、可复用的Python脚本。该方法无需深度编程经验,却要求精准的样本对齐

weixin_30876945的博客 388

摩尔线程显卡适配文心ERNIE-Image文生图模型实战指南

文生图模型是多模态AI落地的核心技术,其推理性能高度依赖硬件加速与框架协同优化。ERNIE-Image作为百度飞桨生态下的中文增强型扩散模型,具备双路径文本编码、动态分辨率调度和混合精度隐式依赖等独特设计,对国产GPU的算子支持、显存管理与FP16数值一致性提出严苛要求。摩尔线程MTT S4000显卡虽具备高带宽GDDR6X与专用矩阵引擎,但缺乏CUDA级成熟工具链,在TensorRT替代、算子融合边界、PCIe DMA调度等底层环节存在显著适配鸿沟。本文聚焦Day-0支持本质——即不改模型代码、原样加载权

weixin_33923762的博客 313

智能终端增强工具:一键安装的自然语言命令行工作流

现代开发者日常频繁面对重复性命令操作、多格式数据解析与条件筛选等基础任务,传统CLI工具因语法复杂、组合繁琐、上下文缺失而显著抬高认知负荷。本文介绍一类原生终端集成的智能增强型命令行工具集,其核心在于意图识别引擎与上下文感知执行器,将自然语言式指令(如'find slow-500-errors')自动映射为最优工具链(jq/rg/csvkit等),并实现结果智能渲染与按需插件加载。它不替代Linux命令,而是让命令真正‘听懂人话’,适用于前端、产品、运营等非专职工程师群体,尤其契合one-click ins

djfiew7234的博客 403

Python繁琐工作自动化实战:requests+Playwright+openpyxl分层方案

Python自动化并非语法炫技,而是面向重复性高、操作细碎、逻辑固定的‘烦琐重’任务的工程实践。其核心原理在于分层解耦:用requests高效获取静态HTML,以Playwright精准交互动态网页,再借openpyxl实现带样式、公式与图表的Excel落地。这种组合兼顾性能、鲁棒性与业务交付力,广泛应用于数据采集、报表生成、跨系统集成等企业场景。尤其适合需绕过JS渲染、保留格式输出、稳定应对页面变更的中大型自动化项目。

weixin_30745553的博客 324

DeepSeek-V4国产大模型100万上下文实战解析

长上下文大模型是当前AI工程落地的核心基础设施,其本质是通过稀疏注意力、语义建模与动态缓存等技术,在显存、延迟与理解精度间取得平衡。相比传统RAG依赖分块检索与向量召回,100万token上下文让模型能将整份PDF、合同或代码库作为统一知识空间直接推理,显著提升溯源准确率与任务连贯性。DeepSeek-V4正是这一范式的代表性突破,它不仅实现百万级上下文稳定服务,更通过Pro/Flash双本设计,将‘深度诊断’与‘确定性执行’解耦,适配从周报生成、SQL编写到故障排查等真实办公场景。本文基于一线技术实践,

android_mylove的专栏 411
上一篇: NMAP高级使用技巧
下一篇: Nessus漏洞扫描简介
qdzhanghao
博客等级 码龄15年 2粉丝 11原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值