存档2019

Linux 常用命令




linux 常用命令 实用命令


1. yum 命令
    # yum repolist                   // 查看已启动的仓库
    # yum info httpd                 // 查看是否有httpd 安装包可以安装
    # rm -rf /var/run/yum.pid        // 强制关掉yum进程
    # yum list all                   // 显示可用安装包
    # yum clean all                  // 清除缓存
    # yum makecache                  // 建立缓存
    # yum install epel-release       // 安装epel源
    # yum install hping3             // 快速ping的工具 模拟DDOS # hping 192.168.10.14 --fast # hping3 -h 帮助命令 在epel源
    # yum install bash-completion    // 自动 补全命令 插件
    # yum install lrzsz              // 拖动文件 
        rz  上传
        sz a.txt 下载
    # yum install dos2unix           // 在windows上编辑的脚本换行符不一样 需要转换成unix格式
        dos2unix a.txt               // 转换成 unix格式

    # yum reinstall iptables         // 重新安装 iptables

    yum 更换 阿里源
        # cd /etc/yum.repos.d
        # rm ./*
        # wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
        # wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
        # yum install epel-release

1.1 vim 命令
    vim 修改文件格式  Linux 与 Windows 文件格式
        :set ff               // 查看文件格式
        :set ff=unix          // 修改文件格式 unix

        文件为dos格式 linux 会报错 bin/bash^M: bad interpreter: No such file or directory

    vim 中 粘贴的时候 格式错乱的问题
        :set paste            // 粘贴模式  就可以粘贴 原有的文件格式

    vim 其他用法
        :%s///g               // 替换

2 rpm 命令
    # rpm -qa | grep nginx             // 查看系统所有的rpm包
    # rpm -qf /etc/nginx/nginx.conf    // 查看系统中一个已知的文件属于哪个rpm包
        # which grep                   // 查询某一命令由哪个安装包提供 配合上面命令使用
    # rpm -ql nginx                    // 查询已安装的软件包的相关文件的安装路径          
    # rpm -qi nginx                    // 查询一个已安装软件包的信息
    # rpm -qc nginx                    // 查看已安装软件的配置文件
    # rpm -qd nginx                    // 查看已安装软件的文档的安装位置
    # rpm -qR nginx                    // 查看已安装软件所依赖的软件包及文件


3. 文件查询 切割等操作
    # grep 'Client' a.txt               // 查找有Client 所在的行
    # grep -A 1000 'Aug  8' a.txt       // 查找 Aug  8 所在的行 及下面1000行
    # grep -e'Aug 12' -e 'Aug 13'       // 删除 Aug 12 或 Aug 13
    # grep -v '61.31.168.61' a.txt      // -v反向
    # cut -d' ' -f 2-4,8,9 a.txt        // 以空格为分隔符 切割 保留第23489字段
    # sed 's/^ *//' a.txt               // 删除字段前面的所有空格
    # sort -t ' ' -k3,3 -u -n a.txt     // 以空格为分隔符 以第3字段到第3字段为重复标准 排序 -u去重复 -n以数字大小进行排序
    # grep Client messages | grep 'Aug  8' | cut -d' ' -f3,4,9 -u -n   // 筛选系统日志需要的字段


4. xshell中设置
    ❶. xshell linux 不能使用 删除键  属性 键盘 勾选 两个 ASCII
    ❷. xshell vim   不能使用 小键盘  属性 vty  设为普通
    ❸. xshell 连接 使用 vim 退出 后屏幕仍然显示 属性 终端 改为 xterm
        或  # vim ~/.bashrc             // 编辑 文件 
                export TERM=xterm       // 末尾 添加
            # source ~/.bashrc          // 使source生效 也可重新连接


5. vim 中常用命令
    ❶. vim 中 按到 ctrl+z 退出了  命令行输入   fg  返回
    ❷. vim 中 提示有文件打开 使用 ls -a 删除以.开头的+要打开的文件名的文件
    ❸. rx                     // 更改字符       rx    将当前光标下的字符更改为x(x为任意字符)
    ❹. ~                      // 更改当前光标下的字符的大小写
    ❺. D 或 d$                // 删除当前光标 后面的所有字符
    ❻. :%s/a/b/g              // 将整个文件的所有a替换为b
    ❼. %s/^[[:space:]]//g     // 删除行首的空格
    ❽. 删除空白                //  ctrl + v 块选择 jk移动  d  删除  可以删除 空白
    ❾. 整段缩进                //  ctrl + v 块选择或者shift +v按一下   jk移动 shift + >   向右移动
    ❿. 加#注释                 //  ctrl + v 块选择 --> jk移动 --> shift + i --> shift + # --> esc
    ❿. set nu                 // 显示行号
    ❿. set nonu               // 关闭行号


6. 关于查看系统配置等命令
    # systemctl list-unit-files    // 查看所有服务的状态
    # systemctl is-enabled httpd   // 查看某一服务是否开机启动
    # systemctl daemon-reload      // 重载 systemctl 配置
    # cat /etc/centos-release      // 查看centos 系统版本
    # uname -a                     // 查看系统内核版本
    # df -hl                // 查看磁盘 总用量
    # df -hT                // -T 列出文件系统的类型
    # free -m               // 查看剩余内存
    # who -a                // 查看最近用户登录
    # top
    # netstat -tnlp                 // 查询 所有端口号 对应的进程   命令由net-tools提供
    # hostname Teo                  // 临时设置主机名
    # hostnamectl set-hostname Teo  // 永久设置主机名 
    # hostnamectl                   // 查询系统相关信息及版本
    # uptime                        // 查看系统负载 5分钟 10分钟 15分钟
    # cat /etc/passwd               // 查看系统有哪些用户
    # userdel -r haha               // 删除用户 连同家目录
    # w                             // 看谁在线
    # last | head                   // 最后的登录的时间
    # pkill -KILL -t pts/0          // 杀掉终端


7. nginx相关命令
    # usr/local/nginx/sbin/nginx -v         // 显示Nginx的版本信息
    # usr/local/nginx/sbin/nginx -V         // 显示Nginx的版本信息 及 编译安装时的参数
    # usr/local/nginx/sbin/nginx -t         // 仅测试配置文件是否有错
    # usr/local/nginx/sbin/nginx -s quit    // 优雅停止nginx 先关闭端口 停止接受 处理完当前请求 才停止nginx


8. 常用 目录 配置文件
    ❶. /etc/sysconfig/network-scripts/ens33     // 网络属性配置文件
    ❷. /etc/yum.repos.d/                        // yum 仓库 配置文件
    ❸. /etc/sysconfig/selinux                   // selinux 配置文件 修改需要reboot才生效
    ❹. /etc/ssh/sshd_config                     // ssh 配置文件 # systemctl restart sshd 修改端口需要重启服务
    ❺. /etc/profile                             // 历史记录配置文件
           shopt -s histappend                  // 改为追加形式
           HISTSIZE="3000"                      // 默认保留1000条


9. 查看各软件版本
    # mysql -V                         // 查看 Mariadb 版本
    # httpd -v                         // 查看 Apache 版本
    # zabbix_server -V                 // 查看 Zabbix 服务器版本
    # zabbix_agentd -V                 // 查看 Zabbix 客户端版本
    # /usr/local/nginx/sbin/nginx -V   // 查看 Nginx 版本及编译的信息


10. 关闭selinux
   # vim /etc/sysconfig/selinux
       SELINUX=disabled            // 永久关闭 需要重启
   # getenforce                    // 查询状态
   # setenforce 0                  // 临时关闭


11 更改系统语言
    # echo $LANG                 // 查看当前操作系统的语言
        中文: zh_CN.UTF-8
        英文: en_US.UTF-8
    # export LANG=en_US.UTF-8    // 临时更改默认语言,当前立即生效 重启失效
    # vim /etc/locale.conf       // 此为centos7 如果是centos6 使用vim /etc/sysconfig/i18n
        LANG=“en_US.UTF-8”
    # source /etc/locale.conf    // 立即生效


12 设置开机启动 几种方法
    1 修改开机启动文件:/etc/rc.local(或者/etc/rc.d/rc.local)
        # vim /etc/rc.d/rc.local             // 把要执行的命令 写到最后即可 最好不用 启动的时候容易出错
        # chmod +x /etc/rc.d/rc.local        // 需要给执行权限  默认是没有的 /etc/rc.local 只是软连接而已
    2 将写好的脚本(.sh文件)放到目录 /etc/profile.d/ 下  系统启动后就会自动执行该目录下的所有shell脚本。
        # /etc/profile.d/aaa.sh                 // 把要执行的命令 写到 脚本即可
            /usr/local/tg/bin/telegram-cli -k /usr/local/tg/tg-server.pub -WDCRE -P 8890 -d &>/dev/null &
    3 通过chkconfig命令设置                      // 未测试
        # 1.将(脚本)启动文件移动到 /etc/init.d/或者/etc/rc.d/init.d/目录下。(前者是后者的软连接)
        mv  /www/wwwroot/test.sh /etc/rc.d/init.d

        # 2.启动文件前面务必添加如下三行代码,否侧会提示chkconfig不支持。
        #!/bin/sh                          告诉系统使用的shell,所以的shell脚本都是这样
        #chkconfig: 35 20 80               分别代表运行级别,启动优先权,关闭优先权,此行代码必须
        #description: http server          自己随便发挥!!!,此行代码必须
        /bin/echo $(/bin/date +%F_%T) >> /tmp/test.log

        # 3.增加脚本的可执行权限
        chmod +x  /etc/rc.d/init.d/test.sh

        # 4.添加脚本到开机自动启动项目中。添加到chkconfig,开机自启动。
        [root@localhost ~]# cd /etc/rc.d/init.d
        [root@localhost ~]# chkconfig --add test.sh
        [root@localhost ~]# chkconfig test.sh on

        # 5.关闭开机启动 
        [root@localhost ~]# chkconfig test.sh off

        # 6.从chkconfig管理中删除test.sh
        [root@localhost ~]# chkconfig --del test.sh

        # 7.查看chkconfig管理
        [root@localhost ~]# chkconfig --list test.sh


13. 使用光盘/U盘当做本地yum仓库
    # cd /etc/yum.repos.d
    # mkdir bak
    # mv ./*.repo bak
    # mount /dev/cdrom /mnt              // 挂载光盘至某目录 如/mnt
    # vim /etc/yum.repos.d/lo.repo       // 创建配置文件
        [baselo]
        name=CentOS 7 Release 7.1.1503
        baseurl=file:///mnt              // cdrom 下面有 repodata目录 所以指向
        gpgcheck=0
        enabled=1
    # yum clean all
    # yum repolist


14. 网卡配置
    # vim /etc/sysconfig/network-scripts/ifcfg-ens33
        TYPE="Ethernet"         // 接口类型 常见的有Ethernet以太网 Bridge桥接
        PROXY_METHOD="none"
        BROWSER_ONLY="no"
        BOOTPROTO="static"      // 激活此设备时使用的地址配置协议,常用dhcp,static,none,bootp;
        IPADDR=192.168.10.10    // ip地址
        NETMASK=255.255.255.0   // 子网掩码
        GATEWAY=192.168.10.254  // 网关
        DNS1=8.8.8.8            // DNS
        DEFROUTE="yes"
        IPV4_FAILURE_FATAL="no"
        IPV6INIT="yes"
        IPV6_AUTOCONF="yes"
        IPV6_DEFROUTE="yes"
        IPV6_FAILURE_FATAL="no"
        IPV6_ADDR_GEN_MODE="stable-privacy"
        NAME="ens33"
        UUID="e9f80c94-a517-42a1-a465-1611e83849ec"   // 设备的唯一标识
        DEVICE="ens33"                                // 此配置文件应用到的设备
        ONBOOT="yes"                                  // 在系统引导时是否激活此设备
    # systemctl restart network
    
    网卡配置多个ip地址
        方法01: 永久配置ip
            # cp /etc/sysconfig/network-scripts/ifcfg-ens33{,:0}
            # vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
                NAME="ens33:0"          // 这些为必改项目
                DEVICE="ens33:0"        // 需删除UUID"          // 这些为必改项目

        方法02: 永久配置ip
            # vim /etc/sysconfig/network-scripts/ifcfg-ens33   // 配置多ip
                IPADDR1=192.168.10.17
                PREFIX1=24

                IPADDR2=192.168.10.18
                PREFIX2=24
            # ip addr

        方法03: 临时配置ip
            # ifconfig ens33:1 192.168.10.16/24         // 添加 第二个ip
            # ip addr add 192.168.10.21/24 dev ens33:1  // 添加 第二个ip

            # ifconfig ens33:1  192.168.10.16/24 dwon   // 删除
            # ip addr del 192.168.10.16/24 dev ens33:1  // 删除

    虚拟机 添加 网卡后 没有配置文件 需要创建
        # cd /etc/sysconfig/network-scripts/
        # mv ifcfg-ens33 ifcfg-ens37
        # vim ifcfg-ens37
            NAME=ens37                // 改名
            DEVICE=ens37              // 改名
            #UUID=                    // 删除 UUID
        # systemctl restart network
        # ifconfig

    临时修改 网卡ip
        # ifconfig ens33 192.168.10.16/24 up    // 修改网卡的ip地址为 192.168.10.16


15. 解决VMware Workstation 两台 windowns 之间网络不通的问题
    控制面板 --> 系统与安全 --> windows defender 防火墙 --> 高级设置 --> 公用配置文件 
    --> windows defender 防火墙属性 --> 公用配置文件 --> 入站连接 --> 允许


16. umount命令 及 fuser命令
    umount卸载磁盘时报错,提示target is busy
    使用umount -f强制卸载依然报错
    解决方法:使用fuser  -mv -k  /mnt 先杀死使用该目录的所有进程,然后在执行卸载操作
    -m  后跟一个目录、文件或者设备名,列出使用该文件的进程PID
    -v 显示详细信息
    -k 杀死使用指定文件的所有进程
    关于fuser的介绍:
    fuser 可以显示出当前哪个程序在使用磁盘上的某个文件、挂载点、或者网络端口,并给出程序进程的详细信息.
    fuser只把PID输出到标准输出,其他的都输出到标准错误输出
    查看那些程序使用tcp的80端口: 
    fuser -v -n tcp 80 


17. Linux 硬盘 安装
    ❶. 使用UltraISO制作USB启动盘
        a 文件-->打开-->选择要安装的镜像
        b 启动-->写入硬盘映象
        c 选择U盘-->写入方式一般为USB-HDD+ 点击写入
    ❷. 在 Install CentOS 7 上按e 
        把hd:与quiet之间的字符都删除,变成下面这样,其实就添加了/dev/sdb4,sdb4就是U盘的分区号 之后 按 Ctrl+ x重启
            vmlinuz initrd=ini trd.img inst.stage2=hd:/dev/sdb4 queit
        如果启动不了 可以等到有命令行出现
            # ls
            # cd dev
            # ls             // 可以查看到U盘的盘符是哪一个 回去再添加上就可以了


18. 关于交换分区
    释放 交换分区中的内存
        # free -m            // 查看交换分区内存大小
        # swapon -s          // 查看 交换分区挂载目录
        # swapoff /dev/dm-1  // 停止交换分区 会释放交换分区 到内存中 主要内存要有足够的空间 需要几分钟停止
        # swapon -a          // 挂载交换分区
        # free -m

    添加交换分区
        # dd if=/dev/zero of=/swapfile bs=8M count=256  // 创建 swap分区为2G 内存不够用时可用此分区做为内存使用
        # mkswap /swapfile       // 格式化交换分区 bs=bytes:同时设置读入/输出的块大小为bytes个字节 
                                 // count=blocks:仅拷贝blocks个块,块大小等于ibs/bs指定的字节数
        # swapon /swapfile       // 启用/挂载 交换分区 # swapoff /swapfile 关闭 交换分区后可用rm删除
        # swapon -s              // 查看
        # vim /etc/fstab         // 开机自动 挂载 可使用 df -h 挂载的盘符
            /swapfile    swap     swap    defaults        0 0


19. 查看 nginx httpd mysql php 编译参数
    # nginx -V                                             // 查看 nginx 编译参数 及 版本
    # cat /usr/local/apache2/build/config.nice             // 查看 apache 编译参数
    # httpd -v                                             // 查看 apache 版本
    # /usr/local/php/bin/php -i | grep configure           // 查看 php 编译参数
    # php -v                                               // 查看 php 版本
    # mysql -v                                             // 查看mysql 版本
        status;                                            // 进入数据库查看mysql 版本       
        /s;                                                // 进入数据库查看mysql 版本  
    # cat /usr/local/mysql/bin/mysqlbug | grep configure   // 查看mysql 编译参数


20. 常用源地址
    ❶. http://rpmfind.net/        // 很不错的一个rpm 包下载的地方 几乎所有rpm包都可以下到
    ❷. https://sourceforge.net    // 开源软件下载
    ❸. 163的源:
           # wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
    ❹. 阿里云的源:
           # wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    ❺. epel的源
           # rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

    接口网址: 
            https://www.free-api.com                         // 各种接口网址
            https://api.btstu.cn/                            // 好用的免费接口网址
            https://v1.alapi.cn/api/icp?domain=baidu.com     // 查询 备案 接口
            result=$(whois $line | grep "No match"|wc -l)    // 查询 注册 接口
            https://johnvansickle.com/ffmpeg/                // ffmpeg 官网
            

21. 常见错误解决
    重启虚拟机后,再次重启nginx会报错: nginx: [error] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)
        # vim /usr/local/nginx/conf/nginx.conf         // 修改 nginx.conf 文件,指定 pid文件 所在目录
           pid    /usr/local/nginx/logs/nginx.pid;
        # mkdir /usr/local/nginx/logs


22. 忘记root密码  修改root密码
    ❶.centos7
        单用户模式
            重启开机esc按e进入
            在LANG=en_US.UFT-8后面添加init=/bin/sh     ro改为rw,在rhgb前
            Ctrl+x
            # touch /.autorelabel           // selinux开启 需执行命令
            # passwd root
            # exec /sbin/init               //  重启
        救援模式
            光盘启动 选择 Troubleshooting --> Rescue a installed system --> 1 --> 回车
            # chroot /mnt/sysimage          // 切换系统环境 为根用户环境
            # passwd
            # exec /sbin/init
    ❷.centos6
        单用户模式
            重启开机按e 选择 kernel选项
            /init 1                        //在后面键入 进入单用户模式
            回到 kernel 按 b 重启
            # vi /etc/passwd
                光标出删除root后面的x   用x键删除
        救援模式
            光盘启动 选择 Rescue installed system
                网卡选择否 其他一路是
            # vi /mnt/sysimage/etc/passwd
                光标出删除root后面的x   用x键删


23. Windows 一些常用信息
    ❶. 修改华为AC6005-8 无线密码 http://192.168.251.1
        配置 --> AP配置 --> 模板管理 --> 无线业务 --> 安全模板
    ❷. netstat -ano   windows查看 某一程序 的 网络连接
    ❸. win2012r 显示 桌面 计算机 图标
        ①. 在搜索框中输入 icon 
        ②. 运行 --> rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0
    ❹. Sublime Text 调中文
        Crrl + Shift + p --> install --> Package Control: Install Package --> 
        chinese --> ChineseLocalizations --> Help --> Language-> 简体中文


24. grep 命令
    引号 会先处理一遍 在交给grep

    单引号:  
    可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么。单引号''是全引用,被单引号括起的
    内容不管是常量还是变量者不会发生替换。
     
    双引号:
    把双引号内的内容输出出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来。双引号""是部分引用,被
    双引号括起的内容常量还是常量,变量则会发生替换,替换成变量内容。

    不加引号:
    不会将含有空格的字符串视为一个整体输出, 如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来,如果字符串
    中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以用。

    grep "//" file 与  grep '//' file     相同
        第一条命令shell把四个\,转义成2个\传递给grep,grep再把2个\转义成一个\查找
        第二条命令shell没转义,直接把2个\传递给grep,grep再把2个\转义成一个\查找

    egrep = grep -E   支持扩展元字符的正则形式
    fgrep  不支持正则表达式

    状态码
        0 找到 
        1 没找到
        2 文件不存在

        grep 也可以是扩展元字符 在这些元字符前面加 \ 

    gerp 里面的特殊 符号

        \w 所有字母与数字          称为 字符   等同[a-zA-Z0-9]
        \W 所有字母与数字之外的字符 称为 非字符 等同[^a-zA-Z0-9]
        \b 词边界                 等同于 \< \> 词首词首定位符   '\blove\b'  不重要

    grep 用法

        grep 选项 '内容' 路径

        -r -R   递归 针对目录    后面要跟目录
        -l      只列出匹配行坐在的文件名
        -v      取反 Invert
        -i      忽略大小写

        --exclude-dir=/data    排除 /data 目录
        -E      egrep 支持扩展元字符匹配
        -o      只打印出来 找到的内容

        -c      显示成功匹配的行数
        -n      显示 相对的行
        -q      不显示到标准输出 quit
        -s      禁止显示文件不存在或文件不可读的错误信息
        -B2     查看上面两行
        -A2     查看下面两行
        -C2     查看上下两行

    grep用法举例
        # grep -rl --exclude-dir={proc,boot,sys} 'root' /        // 在根目录中查找root  注意 除去文件夹的写法不要写路径       
        # sed 's/root/teooo/g' `grep --exclude-dir={proc,sys,boot} -lr 'root' /`     // grep 配合 sed 实现 搜索替换
        # find /data -name '*.sh' | xargs grep "root"                                // 找到文件后 xargs传递给 grep
                                                       // xargs 会把 前面的命令整理 成 路径 以空格 隔开的形式 传递给 grep
        # ls | xargs grep "send"
        # grep 'send' `ls`
        # grep 'send' `cat a.txt`
        # ll | grep '^d    列出目录
        # grep 'love' d*   以d开始的所有文件
        # grep --help | grep '\-v'      此 - 要加转移 因为 grep 会认为 -v是选项
        # grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}'    过滤ip
        # ifconfig | grep -E -o '([0-9]{1,3}\.){3}[0-9]{1,3}' | sed -n '1p'   提取本机ip
        # egrep -v '\bblur\b' d.txt > d.txt.tmp && mv d.txt.tmp d.txt     // 使用 egrep 找到 包含  blur 的行 并删除

25. sed 命令
    sed Stream EDitor 行编辑器 默认不编辑源文件 仅对模式空间中的数据做处理 从第一行处理一直到末尾 逐行处理 处理结束后 显示出来
    模式空间: sed命令读取数据 会存储到内存空间即sed模式空间

    sed 语法

        sed [OPTION]... {script-only-if-no-other-script} [input-file]...
        sed [OPTION] '[地址](命令)' [文本文件]
        

        第一种方式: 修改整行     按照地址 操作匹配的行  执行命令
            sed '[选项]' '[定址][命令]' a.txt          // [选项]  中括号 代表 
                # sed '2d' a.txt                      // 删除 第二行

        第一种方式: 修改一行中的一部分
            sed '[选项]' '[定址]s/[SET1]/[SET2]/g' a.txt    // 查找[SET1] 替换为 [SET2]  这里的 定址 通常省略 即 查找全文
                # sed 's/spool/teooo/g' a.txt              // 查找spool 替换为 teooo

    # sed 选项 "定址命令" 文件

        1. 选项
            -i : 直接修改源文件
            -r : 表示使用扩展正则表达式   默认 支持基本正则表达式  或者加 \
            -n : 只显示符合条件的行       静默模式 不在默认显示模式空间中的内容
            -e : 后面可接多个文件  直接在命令行模式上进行sed动作编辑,此为默认选项

        2. 定址    // 可以直接使用 也可以使用 正则表达式  一般都需要用正则表达式 要对 哪些位置的数据 进行 操作
            5     第5行
            $     最后一行          
            1,5   从1到5行
            1,+2  第一行 及 以后两行
            /RE/  正则匹配 需要放到双斜线中       做模式匹配  过滤特定的行
                \# #   亦可以写成这样 可以加任意字符或数字
                \x x

            /RE1/,/RE2/   第一次被正则1匹配到的开始,被第2次匹配到的结束,这中间的所有行

            正则表达式 [RE]  常用的
                ^   行首牟定 代表一行开始的位置   以...开头
                $   行尾牟定 代表一行的结尾      以...结尾
                ^$  代表空行 什么都没有的行

                \n  匹配一个换行符
                \r  匹配一个回车符
                \t  匹配一个制表符
                \s  匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]
                .   匹配除换行符 \n \r 之外的任何单字符    要匹配 . 字符请使用 \. 
                *   匹配前面的子表达式出现零次或多次       要匹配 * 字符请使用 \*
                \?  匹配一个或0个前面的字符.   这里 \ 是转义符 详情见注释
                \+  匹配一次或多次前面的字符.  这里 \ 是转义符 详情见注释


                空格  [[:space:]]
                      [ ]
                      \s

            注: 在sed正则里面 以下符号 只是普通字符 ...  要加上 转义符 \ 才能是特殊用途
                在 sed 的正则表达式中,有些特殊字是普通字符。这些字符在正则表达式中具有字面意义,没有特殊匹配功能。
                问号 ?:在 sed 中,问号 ? 是普通字符,表示它本身,不是用来表示零次或一次重复的量词。
                    要匹配零次或一次重复,应使用 \{0,1\} 或 \?。
                括号 ( 和 ):在 sed 中,括号 ( 和 ) 是普通字符,它们只匹配它们自身不是分组操作符。如果要使用分组 请使用 \( 和 \)
                花括号 { 和 }:在 sed 中,花括号 { 和 } 是普通字符,它们只匹配它们自身而不是用来表示重复次数的量词。
                    如果要匹配具体次数的重复,应使用 \{m,n\}。
                加号 + 和竖线 |:在 sed 中,加号 + 和竖线 | 也是普通字符,它们只匹配它们自身,不是用来表示一次或多次重复或逻辑

        3. 命令
            修改整行
                d:  删除符合条件的行
                a:  \string                // 在指定的行后面追加新行 内容为string
                i:  \string                // 在指定的行前面追加新行 内容为string
                c:  替换整行                // sed '/^SELINUX=enforcing/cSELINUX=disabled' /etc/selinux/config
                p:  显示符合条件的行         // 本身模式空间里面有 在显示 就是 2条

            修改一行中的一部分
                s:  替换符合条件的部分
                    s/aaa/bbb/g       // 可以使用  s###  s@@@ 替换 将前面正则匹配到的字符串 替换成其他字符串
                    s/aaa/bbb/gi      // 全局替换 + 忽略大小写
                    g :  全局替换  如果没有g 处理 第一行中的第一个 之后在处理 第二行中的第一个
                                  如果有g  处理第一行中的第一 之后在处理 第一行中第二个 ...  在处理第二行 
                    i :  忽略字符大小写
      
            !  在命令前面的叹号 表示取反
            &   符号 是 调用 前面 匹配到的所有东西  # sed 's/.*/#&/'   所有行首 加#
                & 符号代表的是你前面的匹配的模式

            ;   可以 分开 两部分  // sed '1d;s/aaa/bbb/g'    相当于 -e

            \{ \}  大括号用法 如果有多个命令可以使用 {;}隔开
            \{m,n\} 匹配其前面的字符至少m次,至多n次
                # echo '123abc45556' | sed 's#5\{1,\}# #g
                    \{1,\}    代表 匹配前面的字符 1次或多次
                    \{1,3\}    代表 匹配前面的字符 1次或2次或3次
                    \{0,0\}    代表 匹配前面的字符 0次

            \(   \) 为后项引用  使用 \1 调用第一次引用  \2 调用第二次引用
                    不看这个符号, 跟正常一样.  就是把要引用的东西, 加上这符号即可

                sed '3{h;d}'
                sed '3{d;}'          下面三个一样
                sed '3{d}'
                sed '3d'
                
            []  中括号 匹配指定范围内的任意单个字符
                [^A-Za-z] 取反
                [abc]     将匹配任何单个字符 a 或 b 或 c
                [A-Z]     大写字母
                [a-z]     小写字母
                [A-Za-z]  全部字母
                [0-9]     全部数字

            \l: 转换成 小写字母
            \l&: 把后面的 & 匹配的项目 首字母 转换成 小写字母
            \L: 转成成 大写字母 是转换全部 &匹配到的 为小写  
            \L&: 把后面的 & 匹配的项目 全部字母 转换成 小写字母  直到遇到 \E 为止

            \u: 转换成 大写字母
            \U: 转换成 大写字母   用法同\L 一样

 
            n:  处理下一行               //  sed -r '/^aaa/{n;s/sbin/uuu/}'
            r FILE: 将指定的文件及内容添加至 符合条件的行 的下面 可用于文件合并
            w FILE: 将指定范围内的内容另存至指定的文件中
            h:  把命令放到暂存空间   覆盖  默认的情况下暂存空间有一个 空行 只有一个 回车符
            H:  把命令放到暂存空间   追加
            g:  把暂存空间所有的内容从暂存空间取出 覆盖
            G:  把暂存空间所有的内容从暂存空间取出 追加


    修改整行:
        # sed '2d' a.txt                      // 删除 第二行
        # sed '/111/d' a.txt                  // 查找有  111 的行  删除
        # sed '/^#/d' a.txt                   // 删除 # 开头的行
        # sed "$d" a.txt                      // 删除 最后一行
        # sed "1,3d" a.txt                    // 删除 前三行
        # sed "1,+2d" a.txt                   // 删除 第一行 及 以后两行
        # sed '/root/d' a.txt                 // 有root的行 删除
        # sed '/^\\/d' a.txt                  // 删除以 \ 开头的行   /需要转义符

        # sed '/^$/d' a.txt                   // 删除 空行  删除什么都没有的行  不能删除有空格的行
        # sed '/^\s$/d'                       // 删除 全是 空格 的行
        # sed '/^[ ]*$/d' a.txt               // 删除 空白行  删除空行
        # sed '/^[[:space:]]/d' a.txt         // 删除以空格开始的行
        # sed '/^\s/d' a.txt                  // 删除以空格开始的行
        # sed '/^[ ]/d' a.txt                 // 删除以空格开始的行
        # sed '/^[ \t]*$/d' a.sh              // 删除空行  \t是制表符
        # sed 's/  */ /g' a.txt               // 多个或一个空格 改成 一个空格 即 删除多余的空格 只保留一个空格

        # sed -n '1,2p' a.txt                 // 仅仅显示 前两行
        # sed '/^root/a\#hello' a.txt         // 查找以root开头的行 添加一行 内容为#hello  \可以省略
        # sed '/^root/a\# hello\n# hi' a.txt  // \n为换行符 添加两行
        # sed '/11111/i\55555' a.txt          // 查找11111的行  在上方插入 55555
        # sed '/22222/a\55555' a.txt          // 查找22222的行 在下方插入 55555

    修改一行中的一部分
        # sed 's/spool/teooo/g' a.txt         // 把所有的 spool 替换成teooo
        # sed 's/^ *//' ./passwd              // 删除行首空格
        # sed 's/^[[:space:]]*//g' a.txt      // 删除行首的空白字符
        # sed 's/ *$//' ./passwd              // 删除行尾空格
        # sed 's/^\\/#/g' a.txt               // 把开头的 \ 都替换成 #    第一个 \ 是转义符
        # sed 's/\\/#/g' a.txt                // 把所有的 \ 都替换成 #    第一个 \ 是转义符
        # sed 's/id:3/id:5/g' a.txt           // 替换id:3为id:5
        # sed 's/^#//g' a.txt                 // 删除 开头的#号
        # sed 's/^#\s*//g' a.txt              // 删除 开头的#号 及 后面的空格有0个或多个空格 同时删除
        # sed 's/^\s\s*#//' a.txt             // 删除 空格开头的 后跟#  删除 空白字符及#号
        # sed 's/^/#/g' a.txt                 // 在 文件 所有行 上 添加注释
        # sed '2,20s/^#*/#/' aa.sh            // 20 - 20 行 没有注释的加注释
        # sed 's/[[:space:]]//g' a.txt        // 把history 所有的空格 删除  [[:space:]] 替换成 啥也没有
        # sed 's/^[[:space:]]*//g' a.txt      // 把行首的空白字符  * 所有空白字符
        # sed 's/^[ \t#]*/#/g' a.sh           // 把没有注释的加注释 或者 前面有空格的 删除空格 加注释
        # sed 's/[^A-Za-z]/ /g' a.sh          // 把不是 字母的 用空格 覆盖
        # sed 's/  */ /g' a.sh                // 把多个空格  用一个 空格 替代 删除多个连续的空格
        # sed 's/ /\n/g' a.sh                 // 把空格 换成 换行

    sed 中 & 符号的用法
        # echo hello|sed 's/hello/(&)/'
            (hello)
        # echo hello| sed 's/[a-z]*/(&)/' 
            (hello)
        # echo "hello world"| sed 's/[a-z]*/(&)/'       // 此时world 没有括号
            (hello) world
        # echo "hello world"| sed 's/[a-z]*/(&)/g'
            (hello) (world)
        # sed 's/sp..l/&er/g' a.txt           // 查找所有 sp..l 的字符串 替换成 sp..ler
        # sed 's/.*/#&/' a.txt                // 所有行首 加#
        # sed 's/^[^#]/#&/' a.txt             // 不是以#开头 加#
        # sed 's/[A-Z]/\l&/g'                 // 把 大写字母 改成小写字母
        # sed 's/[a-z]*/\u&/' a.txt           // 把每一行的首字母 变成大写
        # sed 's/[a-z]*/\u&/g' a.txt          // 把每个单词的首字母 变成大写
        # sed 's/[A-Z]/\L&/g' a.txt           // 把所有大写字母 换成 小写字母
        # sed 's/[a-z]/\U&/g' a.txt           // 把所有小写字母 换成 大写字母

    其他用法
        # sed '$G' ./passwdn                   // 最后一行下面 加上空白行
        # sed '2r /etc/issue' a.txt            // 将/etc/issue 此文件的内容 添加到 第二行的下面
        # sed '$r /etc/issue' a.txt            // 将/etc/issue 此文件的内容 添加到 最后一行
        # sed '1,2r /etc/issue' a.txt          // 在第一行和第二行后面都添加

        # sed 's/\(sp..l\)/\1er/g' a.txt       // \(   \) 为后项引用  \1 调用后项引用 查找所有sp..l 的字符串 替换成 sp..ler
        # sed 's/s\(...l\)/S\1/g' a.txt        // 只使用前面引用的 一部分时 只能使用 后项引用 ... 不能使用&.

        # echo "/etc/fstab" | sed -r 's#(^/.*/)([^/]+/?)#\1#'   // 取目录名
        # echo "/etc/fstab" | sed -r 's#(^/.*/)([^/]+/?)#\2#'   // 取基名
        # echo '12abc45556' | sed 's#5\{1,\}# #g                // 大括号用法, 代表 5 匹配了 1次或多次
        # cat a.txt | sed 's/[^A-Za-z]/ /g' | sed 's/  */ /g' | sed 's/ /\n/g' | grep -E '\b\w{2,}\b' | awk '{print tolower($0)}' 
          | awk '{ count[$1]++ } END { for(word in count) print word, count[word] }' | sort -k2,2nr // 统计单词出现的次数
        # cat "$file" | tr -sc 'A-Za-z' '\n' | tr A-Z a-z | sed '/^$/d' | grep -E '\b\w{2,}\b' | awk '{print tolower($0)}' 
          | awk '{ count[$1]++ } END { for(word in count) print word, count[word] }' | sort -k2,2nr // 统计单词出现的次数
 

26. awk 命令

    awk 语法
        awk [-F re][parameter...]['prog'][-f progfile][in_file...]

        awk 'BEGIN{print 1/2} {print "ok"} END{print "__________"}' ./passwd

    处理顺序 
        1. 处理BEGIN 在读文件之前处理
        2. 处理 行处理 处理每一行
        3. 处理 END 在行处理结束 处理

        -F"[ :\t]"

    awk [option] 'pattern [action]'  file ..

    awk   参数       '条件动作'        文件

    awk options pattern {action} file

    print       // 是 {action} 中的 命令
    printf

    语法
        awk '模式{动作}' 文件
            # awk 'NR==5{print $0}' a.txt                            // 输出 第5行
            # awk 'NR==3,NR==6{print $0}' a.txt                      // 输出 第3 - 6行
 
            # awk 'NR==3' a.txt                                      // 第3行
            # awk 'NR==3,NR==6' a.txt                                // 第3到第6行

            # awk '{print NR,$0}' a.txt                              // 加个行号
            # awk -F':' '{print $1,$(NF-1),$NF}' a.txt               // 显示 第一列 倒数第二列 倒数第一列
            # ifconfig ens33 | awk 'NR==2{print $2}'                 // 取 ip
            # awk -v FS=":" '{print $3}' a.txt                       // 指定分隔符
            # awk -v FS=":" -v OFS="---" '{print $1,$2}' a.txt
            # awk '/^ftp/,/^ntp/{print}' a.txt       // 正则表达式//,//   匹配第一个正则, 到 匹配第二个正则 之间的 数据 

    参数
        -F 指定分割字段符   实际就是 修改了 FS 的 变量值
            -F ":"          // 实际就是 修改了 FS 的 变量值为冒号:
        -v 定义或修改一个awk内部的变量   也可以自定义 变量
        -f 从脚本文件中读取awk命令

    内部变量
        $0:    $0保存当前记录的内容 
        $0     代表 整行的数据
        $1     代表 第一列的数据
        $2     代表 第二列的数据             

        NR:    代表 行号  
            NR==5   代表第5行

        NF: rumber of Field   当前行有多少个字段                
            # awk -F':' '{print FNR,$0,NF}' passwd
        $NF:   最后一个字段
            # awk -F':' '{print $NF}' passwd

        FS:    输入字段分隔符   默认空格或制表符
            # awd 'BEGIN{FS=":"} {print $1,$2}' passwd
            # awk -F"[ :\t]" '{print $1,$2,$3,$4,$5}' aa.txt     指定多个 分隔符  空格 冒号 制表符

        OFS:   输出字段分隔符               // , 默认调用OFS 默认为空格
            # awk 'BEGIN{FS=":";OFS="---"} {print $1,$2}' passwd

        RS   输入换行符  默认换行符为 回车  把冒号 当做 回车 使用  以前的回车删除    
            # awk -v RS=":" '{print}' a.txt     // 把 冒号 变成回车换行使用

        ORS  输出换行符 把回车 换成 其他符号 其他符号没有回车的功能
            # awk -v ORS="---" '{print}' a.txt   // 把 回车 换成 ---
            # awk -v ORS=" " '{print}' a.txt     // 把 回车 换成 空格 用于把多行合并为一行

            # awk 'BEGIN{RS=":"} {print $0}' passwd
            # awk 'BEGIN{RS=" "} {print $0}' aa.txt        // 一行 拆分成多行
            # awk 'BEGIN{ORS=" "}{print $0}' bb.txt        // 多行 合并为一行
            # awk 'BEGIN{FS=":";OFS="----"}{print NR,FNR,NF,$NF,$3,$0}' passwd

        FNR  显示行号  处理多个文件使用

    print
        print 后面引号"" 是要打印出来的 
        \n 换行
 
        printf 可以打印格式

    / /  正则
    ~    匹配
    !~  不匹配
        # awk -F":" '$4~/teo/' passwd
        # awk -F":" '$NF!~/bash$/' passwd

    关系运算符
        
        运算符
        <          小于          x<y
        <=         小于或等于     x<=y
        ==         等于          x==y
        !=         不等于        x!=y
        >=         大于等于      x>=y
        >          大于          x>y

        # awk -F":" '$3==0' passwd             // 此0位数字
        # awk -F":" '$3=="0"' passwd           // 此0为字符串
        # awk -F":" '$3<10' passwd
        # awk -F":" '$0~/teo/' passwd

    条件表达式
        if(){}
        awk '{if($3=0){print $0}}' aa.txt

        # awk -F":" '$3<5{print $0}' passwd                         // 如果第三列小于5  打印满足条件的
        # awk -F":" '{ if($3<5) {print $0} }' passwd                // 标准写法 空格在里面没有意义
        # awk -F":" '{if($3>300) {print $3} else{print $1}}' passwd
        # awk -F":" '{if($3==0){++i}else{++j}} END{print "管理员 "i;print "普通用户 "j}' passwd

    awk的循环
        while
            while(){}
            awk '{while(i<10){print i;i++}}'

            # awk 'BEGIN{i=0;while(i<=10){print i;i++}}'        // 打印1-10
            # awk 'BEGIN{RS=" "} {print $0}' aa.txt             // 把空格转换成回车 效果同下
            # awk '{i=1;while(i<=9){print $i;i++}}' aa.txt      // 可以打印 以空格 分割的 所有字段
            # awk '{i=1;while(i<=NF){print $i;i++}}' aa.txt     // 分别打印每行的 每列

            aa.txt
                www.baidu.com google.com ssyy.com
                hao123.com gogo.com
                www.aa.com

        for
            for(){}
            for(i=1;i<=5;i++){print i}

            # awk 'BEGIN{for(i=1;i<=10;i++){print i}}'      // 打印1-1
            # awk '{for(i=1;i<=NF;i++){print $i}}' aa       // 可以打印 以空格 分割的 所有字段

        引入外部变量 i=5
            方法1: 在awk 外面为 双引号的情况下使用
                \"$i\"          在外部变量 加 双引号 并且 转义         可以用在函数里面
            方法2: 在awk 外面为 单引号的情况下使用
                "'"$i"'"        在外部变量 依次加 双引号 单引号 双引号  可用在函数里面
                '''$i'''        在外部变量 依次加 单引号 单引号 单引号  可以用在函数外面
            方法3
                -v i="5" print i    使用-v i="5"    带入

    awk 实例
        # awk '/root/' passwd                                // 匹配到root行 输出到屏幕
        # awk -F":" '{print $1}' passwd                      // 每一行的 第一个字段 以:分割
        # awk -F":" '/root/{print $1}' passwd                // /root/ 为正则表达式. 查找满足条件行的.
        # awk -F":" '/root/{print $1,$3}' passwd             // 1和3
        # df | grep '/' | awk '$4>1000000{print $4}' 
        # date | awk '{print "Month:",$2"\n""Year:",$NF}'
        # awk '{print tolower($0)}'                          // 将 大写全部转换成小写
        # awk '{ count[$1]++ } END { for(word in count) print word, count[word] }'    // 统计单词出现的次数
        # awk '{ print length, $0 }' 8.3 | sort -n | cut -d " " -f2                   // 按照 字母数量 进行排序


27. cut 命令
    # cut -d ':' -f 1,2 /etc/passwd
        -d                       // 指定分隔符
        -f 1,2,3                 // 需要的列
        -f 1-4,6,7
        --complement -f 2        // 去掉 第2列
        --output-delimiter=' '   // 指定输出分隔符为空格    默认输出分隔符 与 输入分隔符同一个 


28. uniq 命令                              // 可检查文本文件中 连续 重复 出现的行
    # cat a.txt | uniq                     // 去掉 连续 重复的行
    # cat a.txt | uniq -c                  // -c 显示 每行出现的次数
    # cat a.txt | sort | uniq              // 一般先排序 在去重复
    # cat a.txt | uniq -cd                 // 
        -c 在每列旁边显示该行重复出现的次数
        -d 仅显示重复出现的行
        -u 仅显示出一次的行


29. ps 命令  查看系统进程
    # ps aux   可以查看系统中所有的进程
    # ps -le   可以查看系统中所有的进程 而且还能看到进程的父进程的 PID 和进程优先级
    # ps -l    只能看到当前 Shell 产生的进程
    # ps -ef   可以查看系统中所有的进程
        e: 显示所有进程
        f: 显示完整的输出
    # ps aux  显示所有包含其他使用者的行程  BSB格式显示进程
        a: 全部的进程
        u: username 显示该用户下的所有进程,且显示各个命令的详细路径。如:ps U zhang;(utility)
        x: 其他使用者
        -l:   长格式显示更加详细的信息
        -e:   显示所有进程
        -f:   显示程序间的关系
        VSZ: 进程所占用的 虚拟内存大小 kb
        RSS: 进程所占用的 物理内存大小 kb
        STAT:   进程的状态
        R 运行    Runnable (on run queue)            正在运行或在运行队列中等待。
        S 睡眠    Sleeping                休眠中, 受阻, 在等待某个条件的形成或接受到信号。
        I 空闲    Idle
        Z 僵死    Zombie(a defunct process)        进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放。
        D 不可中断    Uninterruptible sleep (ususally IO)    收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。
        T 终止    Terminate                进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行。
        P 等待交换页
        W 无驻留页    has no resident pages        没有足够的记忆体分页可分配。
        X 死掉的进程
        < 高优先级进程                    高优先序的进程
        N 低优先    级进程                    低优先序的进程
        L 内存锁页    Lock                有记忆体分页分配并缩在记忆体内
        s 进程的领导者(在它之下有子进程);
        l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads)
        + 位于后台的进程组 

    # ps -ef | grep "shadowsocksr" | grep -v grep | awk '{print $2}'                 // 查找程序的 pid
    # cd /proc/2107
    # ls -ail          // 已知pid 查看 程序的目录


30. 后台命令
    nohup 命令 和 & 的区别
        # sh a.sh &         将任务放到后台 即使关闭xshell退出当前session依然继续运行,但标准输出和标准错误信息会丢失
        # nohup sh a.sh     将任务放到后台 关闭标准输入,前台不再能够接收任何输入(标准输入) 重定向标准输出和标准
                            错误到当前目录下的nohup.out文件 即使关闭xshell退出当前session依然继续运行
        # nohup sh a.sh &   将任务放到后台 但是依然可以使用标准输入 前台能够接收任何输入 重定向标准输出和标准错误
                            到当前目录下的nohup.out文件 即使关闭xshell退出当前session依然继续运行
        # nohup a.sh &      后台执行此脚本 test.sh的打印信息会输出到当前目录下的nohup.out中
        # nohup a.sh > /data/nohup.out 2>&1 &       指定输出到output文件

    jobs 命令 可以用来查看当前终端放入后台的工作
        # jobs -l            // 列出当前终端后台进程的 PID 号
            [1]- 109422 Running                 tail -f /var/log/messages &
            [2]+ 109808 Running                 tail -f /var/log/messages-20201023 &
                Running 状态为运行
                Stopped 状态为停止
                "+"号代表最近一个放入后台的工作  当前任务
                "-"号代表倒数第二个放入后台的工作

        # ctrl + z     可以将一个正在前台执行的命令放到后台 并且暂停
        # bg 1         将一个在后台暂停的命令,变成继续执行 1 为jobs-l中的[1]命令的序号
        # fg 1         将后台中的命令调至前台继续运行 可以用在vim中 ^z 调入后台 fg返回
        # kill %1      杀死 1 的进程

        # ls ./* > /dev/null 2>&1      把错误和信息都扔进黑洞
            /dev/null  黑洞
            2>&1       1 表示标准输出 2表示标准错误 >重定向      把错误重定向到输出


31. wc 命令 统计指定文件中的字节数、字数、行数 并将统计结果显示输出 如果没有给出文件名 则从标准输入读取
    # wc -l
        -c 统计字节数
        -l 统计行数
        -m 统计字符数 这个标志不能与 -c 一起使用
        -w 统计字数 一个字被定义为由空白 跳格或换行字符分隔的字符串
        -L 打印最长行的长度
        -help 显示帮助信息
    # ls -l | grep "^-" | wc -l  查看当前文件下 文件的数量
        ^ 行首牟定
        - 为文件的标识
        d 为文件夹的标识
    # ls -lR | grep "^-" | wc -l  查看文件夹下包括子文件夹 所有的文件数量 
        R 递归
    # ls | wc -l  显示在标准输出的 所有文件及文件夹的数量


32. tar 命令
    # tar zcvf aa.tar.gz aa/         // 打 压缩包 
    # tar zxvf aa.tar.gz             // 解 aa.tar.gz
    # xz -d  aa.tar.xz               // 解 aa.tar.xz
    # uzip aa.zip                    // 解 aa.zip
    # tar jxvf aa.tar.bz2            // 解 aa.tar.bz2  需要 yum install lbzip2
    # tar -zcvf aaa.tar.gz aaa  --exclude=aaa/backups        // 除了某个目录  目录后面没有/ 不能是绝对路径 要在父目录
    # tar -zcvf home.tar.gz   /home --exclude=/home/logs   --exclude=/home/www/afish.php

    gzip 压缩
        # gzip -d a.gz      // 解压
        # gunzip -f a.gz    // 解压
        
    unzip 命令              
        # unzip aaa.zip              // 将aaa.zip解压到当前文件下
        # unzip -o aaa.zip           // -o 直接覆盖
        # unzip -n aaa.zip -d /tmp   // 将aaa.zip解压到/tmp目录下,并且不要覆盖已有文件
        # unzip -o aaa.zip -d /tmp   // 将aaat.zip解压到/tmp目录下,并且覆盖已有文件
        # unzip -v aaa.zip           // 查看aaazip内容,但不解压


33. nload 命令                       // 查看网络流量 
    # yum install nload
    # nload                          // 回车 切换 网卡
        Incoming 上半部分 也就是进入网卡的流量,
        Outgoing 下半部分 也就是从这块网卡出去的流量,
            Curr 当前流量
            Avg 平均流量
            Min 最小流量
            Max 最大流量
            Ttl 总和流量
    # nload eth1      // 切换网卡 


34. iftop 命令         实时流量监控工具
    # yum install iftop
    # iftop
        <= =>这两个左右箭头,表示的是流量的方向。
        TX:    发送流量
        RX:    接收流量
        TOTAL: 总流量
        Cumm:  运行iftop到目前时间的总流量
        peak:  流量峰值
        rates: 分别表示过去 2s 10s 40s 的平均流量
    # iftop -i eth1     切换网卡

        t: 按t切换显示格式为2行/1行/只显示发送流量/只显示接收流量;
        S: 按S切换是否显示本机的端口信息;
        D: 按D切换是否显示远端目标主机的端口信息;
        p: 按小p切换是否显示端口信息;
        P: 按大P切换暂停/继续显示;
        q: 按q退出监控。

        h: 按h切换是否显示帮助;
        n: 按n切换显示本机的IP或主机名;
        s: 按s切换是否显示本机的host信息;
        d: 按d切换是否显示远端目标主机的host信息;
        N: 按N切换显示端口号或端口服务名称;
        b: 按b切换是否显示平均流量图形条;
        B: 按B切换计算2秒或10秒或40秒内的平均流量;
        T: 按T切换是否显示每个连接的总流量;
        l: 按l打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,屏幕就只显示这个IP相关的流量信息;
        L: 按L切换显示画面上边的刻度;刻度不同,流量图形条会有变化;
        j: 按j或按k可以向上或向下滚动屏幕显示的连接记录;
        1: 按1或2或3可以根据右侧显示的三列流量数据进行排序;
        <: 按<根据左边的本机名或IP排序;
        >: 按>根据远端目标主机的主机名或IP排序;
        o: 按o切换是否固定只显示当前的连接;
        f: 按f可以编辑过滤代码,这是翻译过来的说法,我还没用过这个!
        !: 按!可以使用shell命令,这个没用过!没搞明白啥命令在这好用呢!


35. rpm 命令
    # yum localinstall aaa.rpm     安装rpm包
    # rpm -ivh aaa.rpm             安装rpm包
        i:     安装
        v:     显示安装信息
        h:     显示安装进度
        --force:   即使覆盖属于其它包的文件也强迫安装 
        --nodeps:  如果该RPM包的安装依赖其它包,即使其它包没装,也强迫安装。
    # rpm -Uvh aaa.rpm      升级rpm包
    # rpm -e aaa.rpm        卸载rpm包
    # rpm -q nginx          查询一个包是否被安装
    # rpm -qi nginx         得到被安装的包的信息 
    # rpm -ql nginx         列出该包中有哪些文件 
    # rpm -qf nginx.conf    列出服务器上的一个文件属于哪一个RPM包 
    # rpm -qa               列出所有被安装的rpm包
    # rpm2cpio aaa.rpm | cpio -div     解压rpm包


36. date 命令
    # date +"%Y-%m-%d-%H-%M-%S"
        %Y 年份(以四位数来表示)
        %m 月份(以01-12来表示)
        %d 日期(以01-31来表示)
        %H 小时(以00-23来表示)
        %M 分钟(以00-59来表示)
        %S 秒(以本地的惯用法来表示)

    修改时间与时区
        # ntpdate 0.asia.pool.ntp.org         // 网络同步时间 如不好使 可手动修改
        # date -R                             // 查看时间 与时区
        # date -s "2020-1-20 10:01:50"        // 修改时间 为
        # hwclock                             // 查看硬件时间
        # hwclock -w                          // 将软件时间写入到硬件时间 避免重启失效
        # tzselect                            // 修改时区 选择对应数字 Asia 亚洲 


37. find 命令
    find [路径] [选项] [操作]

      [路径]
        默认 当前路径及子目录  默认递归

      [选项]
        -name         根据文件名查找
        -iname        根据文件名查找 不区分大小写
        -size -n +n   根据文件大小查找
            # find -size 0c    等于 0字节 的文件  即空文件
            # find -size +10k  大于 10KB 的文件             -n  小于 大小为 n 的文件
            # find -size -10M  小于 10MB 的文件             +n  大于 大小为 n 的文件
        -mtime -n +n  在n天
            # find -mtime +5 -name '*.conf'   5天之前修改的文件
            # find -mtime -5 -name '*.conf'   5天以内修改的文件
        -mmin -n +n   在n分钟
            # find /etc -mmin +30             30分钟 之前修改过的文件
            # find /etc -mmin -30 -type d     30分钟 之内修改过的目录
        -type         根据文件类型查找
              f   文件       find . -type f
          d  目录        find . -type d
          c  字符设备文件   find . -type c
          b  块设备文件    find . -type b
          l  链接文件     find . -type l
          p  管道文件     find . -type p

        -prune        排除某些查找目录
        -maxdepth n   根据搜索到n级子目录

        -perm         根据文件权限查找
        -user         根据文件属主查找
        -group        根据文件属组查找
        -nogroup      查找无有效属组的文件
        -nouser       查找无有效属主的文件

    # find /etc -type f -name '*.conf' -size +10k -exec rm -f {} \;     // 非目录 .conf结尾 且大于 10k,然后将其删除
    # find /data/log -name '*.log' -mtime +7 -exec rm -f {} \;          // 更改时间在 7 天以上的删除
    # find /etc -type f -name '*.conf' -exec cp {} /root/conf/ \;       // 将其复制到 /root/conf 目录下
    # find ./ -type f -size +100M -exec cp {} /aaa \;                   // 查找超过100M的文件并移动到指定目录
    # find /data -type f -mtime +30 -exec rm -f  {} \;                  // 查找 /data 下 日期为30天以上的文件 删除
        -exec '命令' {} \;  对搜索到的文件执行特定的操作  {} 表示查询的结果
        -ok     和 -exec 的功能一样 只是每次操作都会给用户提示  
      -print   打印输出 默认的选项 即打印出找到的结果

        逻辑运算符 
            -a       与        默认情况查询条件之间都是 与 的关系
            -o       或
            -not | !   非

    # find /data/ -type f -name "*.txt" | xargs cp -t /tmp       // -t 参数指定目标目录
    # find /data/ -type f -name "*.txt" -exec cp {} /tmp \
    # cp $(find /data/ -type f -name"*.txt") /tmp                // $() 存放命令结果
    # find /data/ -type f -name "*.txt" | xargs -i cp {} /tmp    // -i 参数指定找到的结果放到{}中

    linux 删除 大量小文件 方法
        方案一:
            # mkdir null                                    // 建立空目录
            # rsync --delete-before -d null/ cache/         // cache目录为需要删除的小文件目录  null为空目录
        方案二:
            # find null -type f -delete


待整理命令 vim中的替换
    :%s///g

    注: 
        find: ‘/run/user/1000/gvfs’: 权限不够           // find 查找的时候 提示权限不够
            # umount /run/user/1000/gvfs
            # rm -rf /run/user/1000/gvfs


38. cp 命令
    # cp -a aaa /var/www/                                 // 最常用
        -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
        -d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
        -f:覆盖已经存在的目标文件而不给出提示。
        -i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目标文件将被覆盖。
        -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
        -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
        -R:同-r
        -l:不复制文件,只是生成链接文件。
    # cp -r -p aaa /var/www/                              // 复制目录 -p 保留属性

    关于取消 cp 的提示覆盖
        # alias                    // 可以看到cp 默认为 cp -i  即使加-f也会提示是否覆盖
        # unalias cp               // 方法一: 去掉cp的别名 临时
        # vim ~/.bashrc            // 定义永久别名

        # \cp /etc/passwd ./       // 方法二: \临时取消别名


39. sshpass 命令
    # yum install sshpass
        -p 123456    指定明文本密码输入(安全性较差)
        -f a.txt     从文件中获取密码
        -d number:使用数字作为获取密码的文件描述符
        -e:从环境变量SSHPASS获取密码

    # sshpass -f a.txt ssh root@192.168.10.13
    # sshpass -p "123456" ssh root@192.168.10.13 "sh a.sh"       // 后可以接要执行的命令 命令最好放在双引号里
    # sshpass -p 123456 ssh -o StrictHostKeyChecking=no root@192.168.10.10              // 忽略密码提示
    # sshpass -p 123456 scp a.sh root@192.168.10.10:/tmp
    # sshpass -p 123456 scp -o StrictHostKeyChecking=no a.sh root@192.168.10.10:/tmp    // 忽略密码提示
    # sshpass -p 123456 rsync -avzP ssyy99 -e 'ssh -p 65522' root@192.168.10.10:/data/  // rsync 推送文件夹到目标

    # export SSHPASS="123456"                  // 声明环境变量
    # sshpass -e ssh root@172.17.9.200         // -e 从环境变量中读取
    # sshpass -p 123456 scp -r -p root@47.91.219.64:/data/mysqldb/3306/Moniterdb/\{1.txt,2.txt\} ./
        // 把远程文件通过ssh 22端口复制到本地  {}命令展开 \转意符  ./复制到当前目录


40. ssh 命令
    -t 禁止伪终端
    -l 指定连接远程服务器登录用户名
    -o 指定配置选项
    -p 指定远程服务器上的端口

    # ssh 192.168.1.100
    # ssh -p 22 root@192.168.1.100
    # ssh root@192.168.1.100  -o stricthostkeychecking=no   // 首次登陆免输yes登录
    # ssh root@192.168.1.100 "ls /home/omd"
    # ssh root@192.168.1.100 "sh /data/a.sh"

    # vim /etc/ssh/ssh_config           // 可修改 ssh配置文件中 忽略密码提示
        StrictHostKeyChecking no
    # vim /etc/ssh/sshd_config          // ssh修改端口号
       Port 22
       Port 65522
    # lastb                             // ssh登陆失败的日志
    # last                              // ssh登陆的历史

    ssh 禁用密码验证 只能使用秘钥
        # vim /etc/ssh/sshd_config
            PasswordAuthentication no      // 禁用密码验证
            RSAAuthentication yes          // 添加 启用密钥验证
            PubkeyAuthentication yes       // 添加
        # service sshd restart

    注. 
      ssh 登陆慢 排查
        # hostname                       // 获取主机名
        # ssh -v localhost.localdomain   // 主机名 看看到哪个地方卡住
        # ll -h /var/log/btmp            // 此文件保存 破解密码的记录 看看是否很大 几百M
        # rm /var/log/btmp               // 删除即可 解决 debug1: Entering interactive session 卡住
        # touch /var/log/btmp

      ssh登录错误排查
        在机器上出现一个很诡异的现象,使用root ssh登录机器时,在打印了“last login”时间后就卡住了。
        需要按ctrl+c,终端才会显示bash-2.4,而只有source ~/.bashrc后,才会显示root的主目录。
        试了一下手动执行source /etc/profile,也卡住了。因此可以断定,是登录时加载/etc/profile卡住,导致的SSH登录卡住。
        试着手动执行了/etc/profile中的代码,发现运行到:
        for i in /etc/profile.d/*.sh ; do
            if [ -r "$i" ]; then
                if [ "${-#*i}" != "$-" ]; then 
                    echo $i
                    echo "1"
                    . "$i"
                else
                    echo $i
                    echo "2"
                    . "$i" >/dev/null
                fi
            fi
        done
        卡住的。这一段代码,是从/etc/profile.d/取出所有的ssh文件,并进行执行。可以看到,我在里面加入了一些打印指令。
        所以,可以清晰的看到是执行:/etc/profile.d/abrt-console-notification.sh卡住的。
        再研究/etc/profile.d/abrt-console-notification.sh文件,最终确定,是在执行:
        abrt-cli status --since="$SINCE" 2> /dev/null
        这一句时卡住的。
        使用systemctl status abrtd.service 查看abrtd服务状态,可以看到abrt的.lock文件被某个进程锁住了 kill掉该进程,问题解决
        # lsof | grep 409000000
        # kill 409000000

        1. 本机使用秘钥登录
            # ssh-keygen                         // 使用要设置秘钥的用户执行  生成 私钥id_rsa   公钥id_rsa.pub
            # cd ~/.ssh                          // 到此用户的家目录
            # cat id_rsa.pub > authorized_keys   // 创建验证文件
            # chmod 600 authorized_keys          // 必须是 600权限
            # chmod 700 ../.ssh                  // 必须是 700权限
            # sz id_rsa                          // 拷贝出来 私钥 即可登录

        2. 使用秘钥 登录其他 服务器
            # ssh-keygen                         // 生成私钥 公钥

            # ssh-copy-id 192.168.10.13          // 推送到目标
            # ssh 192.168.10.13                  // 登录即可 

        3. 手动 添加 公钥到服务器
            # mkdir -p /root/.ssh
            # cd /root/.ssh
            # rz authorized_keys                 // 复制公钥 到需要登录的服务器
            # chmod 600 /root/.ssh/authorized_keys
            # chmod 700 /root/.ssh

        4. 其他可能用到的命令
            # ssh-keygen -P "" -f ~/.ssh/id_rsa    // 非交互式生成
            # chown -R teo.root /home/teo/.ssh     // 非root用户需要修改 权限
            # ssh-keygen -y -f ./id_rsa            // 如没有公钥 可以由私钥 推算出公钥 保存为 authorized_keys 文件即可


41. scp 命令
    -p:保留原文件的修改时间,访问时间和访问权限
    -q: 不显示传输进度条。
    -r: 递归复制整个目录。
    -v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题
    -P:指定端口号 大写的P 
    -o: ssh中的 -o 设定ssh选项
    -i: 指定秘钥文件 此文件必须是 600权限

    # scp -r -P 65522 /data/aaaa root@192.168.10.10:/data/
    # scp -P 59157 -r -i /data/jump_guest.pem a.txt  jump_guest@192.168.10.1:/home/jump_guest/


42. head 命令
    -c 显示的字节数
    -n 显示的行数

    # head -n 5 a.txt       // 显示文件的前n行
    # head -n -6 a.txt      // 文件除了最后n行的全部内容
    # head -c 20 a.txt      // 显示文件前n个字节
    # head -c -32 a.txt     // 文件的除了最后32个字节以外的内容 


43. xargs 命令    是给命令传递参数的一个过滤器
    xargs 是给命令传递参数的一个过滤器 也是组合多个命令的一个工具 一般是和管道一起使用。
          可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
          也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
          默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白 不过通过 xargs 的处理 换行和空白将被空格取代
          是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。

    # find /sbin -perm +700 | xargs ls -l
    # cat test.txt | xargs
    # cat test.txt | xargs -n3


44. tr 命令    字符转换命令  可以把 字符 转成 空格 或 换行

    tr 语法

        tr [OPTION]... SET1 [SET2]             // 把 [SET1] 转换成 [SET2]
        tr [-cdst] '参数1' '[参数2]'  

    option 选项:
        -c 或 -complerment                 // 取代所有不属于第一字符集的字符;
        -s 或 -squeeze-repeats             // 把连续重复的字符以单独一个字符表示;
        -d 或 -delete                      // 删除所有属于第一字符集的字符;
        -t 或 -truncate-set1               // 先删除第一字符集较第二字符集多出的字符。

    表达式: 
        'A-Z'            // 大写字母
        'a-z'            // 小写字母
        'A-Za-z'         // 所有字母
        '0-9'            // 数字
        '\t'             // 制表符
        '\n'             // 换行
        ' '              // 空格
        [:alnum:]        // 字母和数字
        [:alpha:]        // 字母
        [:cntrl:]        // 控制(非打印)字符
        [:digit:]        // 数字
        [:graph:]        // 图形字符
        [:lower:]        // 小写字母
        [:print:]        // 可打印字符
        [:punct:]        // 标点符号
        [:space:]        // 空白字符
        [:upper:]        // 大写字母
        [:xdigit:]       // 十六进制字符

    用法举例: 
        # cat a.txt | tr -d 'A-Za-z'           // 删除 所有的字母
        # cat a.txt | tr -dc 'A-Za-z'          // 删除 所有字母 以外的字符
        # cat a.txt | tr -c 'A-Za-z' ' '       // 使用 空格 代替 所有不是字母的字符
        # cat a.txt | tr -sc 'A-Za-z' '\n'     // 使用 一个换行 代替 所有不是字母的字符
        # cat a.txt | tr 'A-Z' 'a-z'           // 把 a.txt 里面的文件中的 大写字母 转换成 小写字母
        # cat a.txt | tr '\t' ' '              // 将 制表符  转换成空格


45. sort 命令                              // 默认以字母序进行文本排序
    # cat a.txt | sort 
    # cat a.txt | sort -n -t ":" -k 2      // -t指定分隔符 冒号 -k 以第二列 排序
    # ps aux | sort -k 4 -gr | head -n 5   // 内存使用最多的 5个进程
    # cat passwd | sort -t ':' -k 3 -nr    // 按第三列 降序排序
    # du -h | sort -hr                     // 文件大小排序
    # sort -k2,2nr                         // 按照 第二列 数字进行排序
        -n 依照数值的大小排序
        -u 去重 相当于 uniq
        -r 以相反的顺序来排序
        -t <分隔字符> 指定排序时所用的栏位分隔字符

        -b 忽略每行前面开始出的空格字符
        -h 使用易读性数字 例如: 2K 1G
        -d 排序时 处理英文字母、数字及空格字符外 忽略其他的字符
        -f 排序时 将小写字母视为大写字母
        -i 排序时 除了040至176之间的ASCII字符外,忽略其他的字符
        -m 将几个排序好的文件进行合并
        -M 将前面3个字母依照月份的缩写进行排序
        -o<输出文件> 将排序后的结果存入指定的文件
        -k   –key=POS1[,POS2]   排序从POS1开始,若指定POS2,则POS2结束,否则以pos1排序

        +<起始栏位>-<结束栏位> 以指定的栏位来排序 范围由起始栏位到结束栏位的前一栏位


46. stat 命令
    stat 命令用于显示文件的状态信息 stat命令的输出信息比ls命令的输出信息要更详细。
    # stat a.txt   可以查看 文件的三个时间
        Access: atime  访问时间      显示的是文件中的数据最后被访问的时间
        Modify: mtime  修改时间      显示的是文件内容被修改的最后时间
        Change: ctime  状态修改时间  显示的是文件的权限、拥有者、所属的组、链接数发生改变时的时间。当然当内容改变时也会随之改变


47. sysctl 命令
    sysctl 命令用于运行时配置内核参数 这些参数位于/proc/sys目录下 sysctl配置与显示在/proc/sys目录中的内核参
           用户只需要编辑/etc/sysctl.conf文件
    # sysctl -a                                      // 显示所有系统内核参数
    # sysctl -w net.ipv4.ip_forward=1                // 临时改变某个指定参数的值
    # sysctl -p                                      // 从/etc/sysctl.conf 中加载 系统参数
    # echo "net.ipv4.ip_forward=1" /etc/sysctl.conf  // 永久修改


48. whereis 命令   
    可查找 程序的 二进制文件 源文件 帮助手册文件 的路径
    # whereis mysql      查找 可执行文件 源代码文件 帮助文件 在文件系统中的位置
    # whereis ls


49. which 命令
    查找命令可执行文件所在的路径 有时候可能在多个路径下存在相同的命令
    该命令可用于查找当前所执行的命令到底是哪一个位置处的命令
    # which mkdir
    # which ls


50. echo 命令  
    # echo "aaaa"   标准输出
        " "  双引号  弱引用 
        ' '  单引号  强引用
        -n   不换行 默认在最后出入换行符 -n不换行
        -e   打开 \ 转义符  若字符串中出现以下字符,则特别加以处理,而不会将它当成一般
             \a 发出警告声;
             \b 删除前一个字符;
             \c 最后不加上换行符号;
             \f 换行但光标仍旧停留在原来的位置;
             \n 换行且光标移至行首;
             \r 光标移至行首,但不换行;
             \t 插入tab;
             \v 与\f相同;
             // 插入\字符;
             \nnn 插入nnn(八进制)所代表的ASCII字符;
             \e[1;31m  颜色的 固定写法 31为红色  31-37 可换其他前景颜色  41-47可换背景颜色
             \e[0m     恢复颜色
    # echo -e "\e[1;31maaaaa\e[0m"   // 加红色
    # echo -e "\e[1;31maaaaa"         // 文字 及 shell会都变成此颜色   
    # echo                             // 默认 输出一个 回车符

    使用 shell + echo 修改数据库
        # echo 'use nextcloud;delete from oc_filecache;' | mysql -unextcloud -p123456      // 清空表
        # echo 'use nextcloud;show tables;' | mysql -unextcloud -p123456                    // 显示表


51. ls 命令
    -a 显示所有文件及目录 (. 开头的隐藏文件也会列出)
    -l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
    -r 将文件以相反次序显示(原定依英文字母次序)
    -t 将文件依建立时间之先后次序列出
    -A 同 -a ,但不列出 "." (目前目录) 及 ".." (父目录)
    -F 在列出的文件名称后加一符号;例如可执行档则加 "*", 目录则加 "/"
    -R 目录递归显示 若目录下有文件,则以下之文件亦皆依序列出

    # ls -A
    # ls -F
    # ls -R
    # ls -l
    # ls -l    mtime         // 修改时间
    # ls -lc   ctime         // 状态修改时间
    # ls -lu   atime         // 访问时间
    # ls -v image* > a.txt   // 可以按照 image后面的数字的大小进行排序
        image001.jpg
        image505.jpg
        image2507.jpg
        image2509.jpg


52. nslookup 命令     
    DNS查看
    # nslookup www. syk.my

53. ntpdate 命令
    时间同步
    # ntpdate asia.pool.ntp.org   // 初始化脚本中有同步时间的命令 可使用 crontab -e 拿出来 使用


54. Centos7 重装系统 修改网卡名字 
    重装系统 第一行 按tab键 输入 net.ifnames=0 biosdevname=0  以更改网卡名称为eth0 ethX


55. Linux 与 Windows 文件格式
    vim 修改文件格式
        :set ff               // 查看文件格式
        :set ff=unix          // 修改文件格式 unix
    文件为dos格式 linux 会报错 bin/bash^M: bad interpreter: No such file or directory

56. curl 命令
    # curl http://www.syk.my                                        // 请求网页
    # curl -I http://www.syk.my                                     // 只请求首部信息
    # curl ifconfig.me                                                  // 查看外网ip
    # curl ipinfo.io/ip                                                 // linux 查看外网ip
    # curl -I -o /dev/null -s -w %{http_code} www.baidu.com             // 返回网页状态码
    # curl -I -m 10 -o /dev/null -s -w %{http_code}"\n"  www.baidu.com  // 返回网页状态码
    # curl -s https://v1.alapi.cn/api/icp?domain=baidu.com | grep "true" | wc -l  // 静默 模式 没有信息打印
        -m                // 最大传输时间
        -o                // 写入到文件中
        -I                // 请求的头部
        -s                // 静默输出
        \n                // 换行
        -w %{http_code}   // -w 代表自定义参数   %{http_code}代表http状态码

57. linux 释放缓存区 内存的方法
    # echo 1 > /proc/sys/vm/drop_caches     // 清理 页面缓存
    # echo 2 > /proc/sys/vm/drop_caches     // 清理 目录缓存 和inodes
    # echo 3 > /proc/sys/vm/drop_caches     // 清理页面缓存 目录缓存  inodes

    # sysctl -w vm.drop_caches=1      // 清理 页面缓存
    # sysctl -w vm.drop_caches=2      // 清理 目录缓存 和inode
    # sysctl -w vm.drop_caches=3      // 清理页面缓存 目录缓存  inodes


58. EOF 用法
    # cat <<-EOF   把eof定义的内容 重定向给 cat 执行         - 支持下面EOF不顶格
    111
    222
    333
    EOF         // EOF只是定义一个 开始和结束的标志 可以使用任意字母或符号

    # cat <<-EOF > /data/a.txt      // 把EOF 内容给cat执行 在重定向到a.txt
    aaa
    bbb
    ccc
    EOF      


59. umask 命令
    umask 可用来设定 权限掩码 
    # umask         // 获取当前权限掩码   创建文件默认的权限666 减去 022  为644  文件夹为默认777           
        022
    # umask 077     // 修改 当前shell 的umask值  当前有效  在创建文件都666 减去077 为 600

    cowsay 命令
        # yum install cowsay
        # cowsay -l              // 查看其它动物的名字,然后-f跟上动物名,如
        # cowsay aaaaa
        # cowsay -f eyes aaaaa


60. mysqladmin 命令
    # mysqladmin -uroot -p123456 password 123456789   // 修改密码   mysql 密码
    # mysqladmin -uroot -p23456 version               // 查看 mysql 版本
    # mysqladmin -uroot -p23456 create aaaaa          // 创建数据库
    # mysqladmin -uroot -p23456 drop aaaaa            // 删除数据库
    # mysqladmin -uroot -p23456 reload                // 重新载入
    # mysqladmin -uroot -p shutdown                   // 关闭数据库
    # mysqlshow -uroot -p23456                        // 显示服务器上的所有数据库
    # mysqlshow -uroot -p23456 aaaaa                  // 显示数据库aaaaa中有什么表
    # mysql -uroot -p123456 -e "show databases;"   // 可以不连入mysql 直接执行mysql命令 可以用到脚本中 执行mysql命令


61. ulimit 命令           // 不完全 待续
    # ulimit -a           // 查看打开的多大连接数  系统默认1024
        open files                      (-n) 1024

    # lsof | wc -l            // 查看 当前系统打开的文件数

    # lsof -p 29495 | wc -l   // 查看某个进程的打开文件数量
    # cat /proc/29495/limits  // 查看某个进程的最大可以打开的文件数


62. mtr 网络测试工具
    mtr www.baiud.com
    其中-c的说明是:–report-cycles COUNT
    第三列 Loss: 是显示的每个对应IP的丢包率
    第四列 Last: 显示的最近一次的返回时延
    第五列 Avg : 是平均值 这个应该是发送ping包的平均时延
    第六列 Best: 是最好或者说时延最短的
    第七列 Wrst: 是最差或者说时延最常的
    第八列 StDev: 是标准偏差
    接下来接着说相关参数:
    mtr -s 用来指定ping数据包的大小
    mtr -n no-dns不对IP地址做域名解析
    mtr -a 来设置发送数据包的IP地址 这个对一个主机由多个IP地址是有用的
    mtr -i 使用这个参数来设置ICMP返回之间的要求默认是1秒
    mtr -4 IPv4
    mtr -6 IPv6


63. 关于 Centos7 /home 空间 合并到 / 根目录

    ❶. Centos7把 /home 所有空间合并到 / 根目录
        # df -h                                 // 查看 分区  需要保存 /home目录下 所需要的文件 否则会丢失
        # umount /home                          // 卸载 /home
        # fuser -m -v -i -k /home               // 强制 终止 home 下的进程  如果不能卸载 使用此命令强制停止
        # vi /etc/fstab                         // 注释掉
            #/dev/mapper/centos-home /home                   xfs     defaults        0 0
        # fdisk -l          // 有 centos-home 分区
            Disk /dev/mapper/centos-home: 5821 MB... 
        # lvremove /dev/mapper/centos-home               // 删除 centos-home 分区   y
        # vgdisplay 
            Free  PE / Size       1390 / <5.43 GiB       // 有5.43G 未分配
        # lvextend -l +100%FREE /dev/mapper/centos-root  // 扩展 给/root 所有的 Free 空间
            # lvextend -L +5G /dev/mapper/centos-root    // 扩展/root所在的lv 给 root 分 5G 空间 给部分空间
        # df -T                                          // 查看磁盘系统格式
            # xfs_growfs /dev/mapper/centos-root         // 如果是 xfs 使用命令  扩展/root空间
            # resize2fs /dev/mapper/vg-lv_root           // 如果是 ext4 使用命令  扩展/root空间

        # df -h 

    ❷. Centos7把 /home 部分空间  合并到 / 根目录
        # df -h                                 // 查看 分区  需要保存 /home目录下 所需要的文件 否则会丢失
        # umount /home                          // 卸载 /home
        # fuser -m -v -i -k /home               // 强制 终止 home 下的进程  如果不能卸载 使用此命令强制停止
        # vi /etc/fstab                         // 注释掉
            #/dev/mapper/centos-home /home                   xfs     defaults        0 0
        # fdisk -l          // 有 centos-home 分区
            Disk /dev/mapper/centos-home: 5821 MB... 
        # lvremove /dev/mapper/centos-home            // 删除 centos-home 分区   y
        # vgdisplay 
            Free  PE / Size       1390 / <5.43 GiB    // 有5.43G 未分配

        # lvextend -L +5G /dev/mapper/centos-root     // 扩展/root所在的lv 给 root 分 5G 空间

        # xfs_growfs /dev/mapper/centos-root          // 扩展/root空间
        # df -h 
        # vgdisplay                                   // 查询 剩余多少空间
        # lvcreate -L 167G -n home centos             // 重新 创建 home 目录
        # df -T                                       // 查看磁盘系统格式
            # xfs_growfs /dev/mapper/centos-root      // 如果是 xfs 使用命令  扩展/root空间
            # resize2fs /dev/mapper/vg-lv_root        // 如果是 ext4 使用命令  扩展/root空间
        # mkfs.xfs /dev/centos/home                   // 创建文件系统
        # mount /dev/centos/home /home                // 挂载
        # df -h

    ❸. Centos7把 新添加的硬盘 合并到 / 中
        # fdisk -l             // 会看到两块硬盘,其中有一个有分区,还可以看到 /dev/sda: 2000.4 GB 是新加的硬盘 并没有分区
        # df -h                // 确认一下 分区中 是否 含有 新硬盘 注意数据安全
        # vgdisplay            // 查看 确认 没有 剩余的分配空间.  Free  PE / Size       0 / 0 
        # fdisk -l             // 找到新硬盘的 名字
        # fdisk /dev/sda       // 分区  注意数据 分区后格式化 数据就没有了
            m                  // 获取帮助信息
            p                  // 查看 分区表 可以显示 没有 /dev/sda 分区 (如果有 说明有数据)
            n                  // 新建分区
            p                  // 建立主分区    分区号和扇区号默认即可 接下来应该是一个回车即可

            t                  // 出现 Command (m for help):   出入 t
            8e                 // 选择 8e  Linux LVM    添加分区
            w                  // 写入硬盘
        # fdisk -l             // 会出现 新的分区
            Device Boot      Start         End      Blocks   Id  System
                /dev/sda1            2048  3906963631  1953480792   8e  Linux LVM
        # pvcreate /dev/sda1   // 创建物理卷
        # pvdisplay            // 查看 物理卷 有新增的 /dev/sda1
        # vgdisplay            // 依然没有 Free 空间  获取到  VGName 的名字
            VG Name               vg
        # vgextend vg /dev/sda1    // 可以看到有 Free PE 的空间了
            Free  PE / Size       476923 / <1.82 TiB
        # df -h                    // 看一下 根目录下 是 哪个 卷
            /dev/mapper/centos-root   17G  8.0G  9.0G  48% /
        # lvextend -l +100%FREE /dev/mapper/centos-root  // 扩展 给/root 所有的 Free 空间
            # lvextend -L +5G /dev/mapper/centos-root    // 扩展/root所在的lv 给 root 分 5G 空间 给部分空间
        # df -T                                          // 查看磁盘系统格式
            # xfs_growfs /dev/mapper/centos-root         // 如果是 xfs 使用命令  扩展/root空间
            # resize2fs /dev/mapper/centos-root          // 如果是 ext4 使用命令  扩展/root空间
        # df -h                                          // 可以看到 空间已经扩展完成



64. netstat 命令              显示与IP、TCP、UDP和ICMP协议相关的统计数据
    -i  显示网卡列表
    -r  显示路由信息
    -a  列出所有当前的连接
    -t  tcp连接
    -u  udp连接
    -n  禁用域名解析功能
    -l  选项列出 正在监听的 端口
    -p  显示建立相关链接的程序名

    # netstat -ant            // 查看 所有tcp连接
    # netstat -anu            // 查看 所有udp连接
    # netstat -rn             // 查看 路由信息 相当于 route -n
    # netstat -tnlp           // 相当于 ss -tnlp

    # netstat -in             // 查看网卡
    # netstat -c              // 查看当前连接状态 实时更新
    # netstat -an | grep ESTABLISHED | wc -l                                // 查看nginx/apache当前并发访问数
    # netstat -tn | grep 80 | wc -l                                         // 查看所有80端口的tcp连接
    # netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'  // 查看Apache的并发请求数及其TCP连接状态
        ESTABLISHED  意思是建立连接。表示两台机器正在通信
        CLOSE_WAIT   对方主动关闭连接或者网络异常导致连接中断 此时我方要调用close()来使得连接正确关闭
        TIME_WAIT    我方主动调用close()断开连接...表示处理完毕  等待超时结束的请求数
        SYN_SENT     表示请求连接
        YN_RECV      表示正在等待处理的请求数

        FIN_WAIT1    释放 连接状态为 FIN_WAIT1 的状态
            # sysctl -a | grep tcp_max_orphans        // 记下 net.ipv4.tcp_max_orphans 的值
            # sysctl -w net.ipv4.tcp_max_orphans=0    // 然后等待FIN_WAIT1的消失 netstat -npt | grep 8080 反复查看
            # sysctl -w net.ipv4.tcp_max_orphans=$aa  // 还原 设置上面的值 3276800      -w临时改变值

    # netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'               // 查看 tcp 各种状态 多少个
    # netstat -nat|grep "tcp"|awk ' {print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn // 查看每个ip跟服务器建立的连接数
    # netstat -an|awk -F: '{print $2}'|sort|uniq -c|sort -nr|head                         // 系统上监听和连接最多的端口号

    # netstat -antu | grep tcp | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10 // 连接最多的10个ip

    关于 TIME_WAIT 过多
        # vim /etc/sysctl.conf
            net.ipv4.tcp_syncookies = 1     // 开启SYN Cookies 当出现SYN等待队列溢出时 启用cookies来处理 可防范少量SYN攻击
            net.ipv4.tcp_tw_reuse = 1       // 表示开启重用 允许将TIME-WAIT sockets重新用于新的TCP连接
            net.ipv4.tcp_tw_recycle = 1     // 表示开启TCP连接中TIME-WAIT sockets的快速回收
            net.ipv4.tcp_fin_timeout            // 修改系默认的 TIMEOUT 时间
            net.ipv4.tcp_keepalive_time = 1200  // keepalive起用的时候 TCP发送keepalive消息的频度 缺省是2小时 改为20分钟
            net.ipv4.ip_local_port_range = 1024 65000   // 表示用于向外连接的端口范围 缺省情况下很小 32768到61000
            net.ipv4.tcp_max_syn_backlog = 8192    // 表示SYN队列的长度 默认为1024 可以容纳更多等待连接的网络连接数
            net.ipv4.tcp_max_tw_buckets = 5000     // 表示系统同时保持TIME_WAIT套接字的最大数量 如果超过这个数字 将立刻被清除


65. mv 命令
    # mv -fv ./* /data/   // 强制覆盖    不能移动文件夹   不需要加反斜杠  # \mv  取消-i命令
        -f 强制覆盖
        -v 显示过程
    # mv -fvb ./* /data/    // 覆盖前先备份文件 可以移动文件夹 会先备份文件夹 会以 文件名~ 结尾 
        -b 覆盖之前先备份


66. crontab 定时命令
    # crontab -e                // 定时任务
        * * * * * sh a.sh       // 每1分钟 执行
        */5 * * * * sh a.sh     // 每5分钟 执行
        * */1 * * * sh a.sh     // 每小时 执行
        5 * * * * sh a.sh       // 每小时的 过五分钟 执行
        1 1 * * * sh a.sh       // 每天 1:01 点 执行

        3,15 * * * * sh a.sh         // 每小时的 第3和第15分钟 执行
        3,15 8-11 * * * sh a.sh      // 在上午8点到11点的第3和第15分钟 执行
        3,15 8-11 */2 * * sh a.sh    // 每隔两天的上午8点到11点的第3和第15分钟 执行
        3,15 8-11 * * 1 sh a.sh      // 每个星期一的上午8点到11点的第3和第15分钟 执行
        10 1 * * 6,0 sh a.sh         // 每周六 周日的1:10分 执行
        0,30 18-23 * * * sh a.sh     // 每天18:00至23:00之间每隔30分钟 执行
        0 23 * * 6 sh a.sh           // 每星期六的晚上11:00 执行
        0 4 1 jan * sh a.sh          // 一月一号的4点 执行

        第一个 * 表示分钟,第二个表示小时,第三个表示日期,第四个表示月份,第五个表示星期
        *表示所有
        /5表示每5个单位
        1-3从1到3
        ,逗号表示离散的数字

    # trontab -l                  // 查看 定时任务
    # tail /var/log/cron          // 定时任务 日志
    # vim /var/spool/cron/root    // 定时任务的文件   crontab -e 就是写到这个文件里面 按用户存储


67. speedtest 命令                // 下载测试 网速测试

    # wget https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
    # chmod a+rx speedtest.py
    # ./speedtest --share


68. openssl 命令
    # openssl x509 -enddate -noout -in fullchain.pem             // 检测证书到期时间
    # openssl rand -hex 7                                        // 随机生成16进制的字符串
    # openssl req -new -x509 -days 365 -nodes -out /data/nextcloud.crt -keyout /data/nextcloud.key  // 生成证书自签证书

    配置 https证书 自签
        服务端 自签
            # cd /etc/pki/CA
            # touch index.txt      // 创建所需要的文件
            # echo 01 > serial
            # (umask 077; openssl genrsa -out private/cakey.pem 2048)
            # openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
        客户端
            # cd /usr/local/nginx/ssl
            # (umask 077; openssl genrsa -out teo1.key 2048)
            # opensll req -new -key teo2.key -out teo2.csr -days 365
        服务端 签署
            # openssl ca -in teo1.csr -out teo1.crt -days 365


69. lsof 命令             // 由lsof包提供
    # lsof               // 列出当前系统打开文件的工具
    # lsof ./a.txt
    # lsof -u root       // 列出某个用户打开的文件  ^为取反
    # lsof /ect/passwd   // 列出某个文件被哪些进程打开使用
    # lsof -c nginx      // 列出某个进程 访问的文件信息

    # lsof -i            // 列出所有的网络链接信息
    # lsof -i TCP        // 列出所有TCP协议的网络连接信息
    # lsof -i :800       // 查看800端口的网络连接信息


70. wget 命令
    # wget -c -t 0 http://syk.my/a.tar.gz
        -c 断点续传  
        -t 0 反复尝试的次数,0为不限次数

    # wget -O b.tar.gz  http://syk.my/a.tar.gz     // -O 重命名
    # wget -b http://syk.my/a.tar.gz               // 后台下载   # tail -f wget-log // 观看下载进度
    # wget -i a.txt                                    // -i 下载a.txt文件中的 链接
    # wget -o download.log http://syk.my/a.tar.gz  // -o 把下载链接信息过程 写入日志

    # wget -r -np -R index.html*  https://www.syk.my/down/en/ --no-check-certificate
        -r                     // 递归的方法 下载整个网站 指向的所有地址同样会被下载      
        -nd                    // 不建立目录 都下载到当前目录
        -np                    // 不追溯至父目录
        -nc                    // 不要覆盖已经存在的文件
        -l 2                   // 下载两层
        -Q 1M                  // 限速 最大下载速度 1M
        -R                     // 逗号分隔的要拒绝的扩展名列表 下载网页 会把 index.html下载下来所有使用-R排除
        -X                     // 排除目录的列表
        --no-check-certificate // 不检测安全性

    # wget -m https://www.syk.my/download/en --no-check-certificate // -m 镜像站点 会读入robots.txt并此文件规定来执行

    # wget -O- -q www.baidu.com     // 类似于curl的功能
        -o 将日志 写入 文件
        -O 将文档写入 FILE
        -O-  将文档写入标准输出
        -q 安静模式 (无信息输出)。

    # wget -c -O out.zip https://github.com/visualvm/visualvm.src/releases/download/1.4.1/visualvm_141.zip
        // 下载的时候 报错 名字过长 可以定义一个新名字 在下载


71. 查看linux硬件配置 及运行状态
    # cat /proc/meminfo                    // 查看内存信息
    # dmidecode | grep "Product Name"      // 查看机器型号
    # dmesg                                // 设备故障的诊断 硬件的连接或断开连接操作时 可以看到硬件的检测或者断开连接的信息
    # dmesg | grep -i eth                  // 查看网卡信息
    # cat /proc/version                    // 查看系统内核版本
    # hostnamectl                          // 查看系统内核版本
    # uname -a                             // 查看系统内核版本
    # lscpu                                // 查看cpu 型号及信息
    # cat /proc/cpuinfo                    // 查看cpu 型号及信息
    # cat /proc/cpuinfo | grep mode1*      // 查看cpu 核数
    # cat /proc/cpuinfo | grep "physical id"| sort| uniq| wc -l      // 查看物理cpu个数
    # cat /proc/cpuinfo | grep "processor"| wc -l                    // 查看逻辑CPU的个数
    # cat /proc/cpuinfo | grep "cpu cores"| uniq                     // 查看 cpu 核数
    # dmidecode -s system-product-name                               // 查看是虚拟机 还是物理机
    # getconf LONG_BIT                     // 查看cpu 运行在 32位系统还是 64位系统
    # top                                  // 查看cpu及内存等 运行状态
    # sar 1 5                              // 查看cpu使用率 1秒采集5次
    # mpstat 1 5                           // 查看cup使用率 1秒采集5次
        %user      // 在internal时间段里,用户态的CPU时间(%),不包含nice值为负进程  (usr/total)*100
        %nice      // 在internal时间段里,nice值为负进程的CPU时间(%)   (nice/total)*100
        %sys       // 在internal时间段里,内核时间(%)       (system/total)*100
        %iowait    // 在internal时间段里,硬盘IO等待时间(%) (iowait/total)*100
        %irq       // 在internal时间段里,硬中断时间(%)     (irq/total)*100
        %soft      // 在internal时间段里,软中断时间(%)     (softirq/total)*100
        %idle      // 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) (idle/total)*100

    # yum install sysstat                // iostat包
    # iostat -k                          // 查看硬盘读取写入 状态
    # iostat -d -k 2 6                   // 查看硬盘 读取 写入
        tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。
             "一次传输"意思是"一次I/O请求"。多个逻辑请求可能会被合并为"一次I/O请求"。"一次传输"请求的大小是未知的。
        kB_read/s:每秒从设备(drive expressed)读取的数据量;
        kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
        kB_read:读取的总数据量;
        kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。
    # iostat -d -x -k 1 6
        -x,该选项将用于显示和io相关的扩展数据
        -A:所有报告的总和
        -b:显示I/O和传递速率的统计信息
        -B:显示换页状态
        -d:输出每一块磁盘的使用信息
        -e:设置显示报告的结束时间
        -f:从制定的文件读取报告
        -i:设置状态信息刷新的间隔时间
        -P:报告每个CPU的状态
        -R:显示内存状态
        –u:输出cpu使用情况和统计信息
        –v:显示索引节点、文件和其他内核表的状态
        -w:显示交换分区的状态
        -x:显示给定进程的装
        -r:报告内存利用率的统计信息
    # sar -p 1 4      报告每个cpu的状态,1秒一次一共4次
    # vmstat  2 6
        r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,
          就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,
          服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
        b 表示阻塞的进程
        swpd 虚拟内存已使用的大小,如果大于0,表示物理内存不足了 如果不是程序内存泄露的原因 该升级内存了
        free   空闲的物理内存的大小
        buff   Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存
        cache cache直接用来记忆我们打开的文件,给文件做缓冲
        si  每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
        so  每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上
        bi  块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte
        bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
        in 每秒CPU的中断次数,包括时间中断
        cs 每秒上下文切换次数
        us 用户CPU时间
        sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
        id  空闲 CPU时间
        wt 等待IO CPU时间。
    # uptime 
        18:16:12 up  5:45,  4 users,  load average: 0.01, 0.04, 0.05
        up 5:45: 主机已运行的时间
        4 users: 用户连接数
        load average:  5分钟 10分钟 15分钟 的cpu负载 根据cpu核数而定 1核满载为1  2核满载为2
    # uptime -s  显示 系统开始运行的日期
    # uptime -p  显示 系统运行的总时间

    # top 命令
        h 帮助
        回车、空格 刷新
        b

    # yum install virt-what
    # virt-what            // 可以查看 机器用的什么 虚拟化 kvm 或 vmware 或 xen

    # pidstat -d 1         // 查看进程 使用磁盘的情况  哪个进程使用硬盘

    # ls /dev/             // 可以看到有几块硬盘 可依次查看
        sda
        sdb
    # cat /sys/block/sda/queue/rotational      // 返回0不可旋转为固态硬盘   返回1为可旋转机械硬盘
    # lsscsi                                   // 第四列 为硬盘型号可看到是否为 SSD
        [0:0:0:0]    disk    ATA      Vi550 S3 SSD     61.3  /dev/sda       // 固态硬盘
        [0:2:0:0]    disk    LSI      LSI              3.19  /dev/sda       // 机械硬盘
    # lsblk -d -o name,rota    // 返回0不可旋转为固态硬盘   返回1为可旋转机械硬盘
    # lsblk                    // 列出所有可用块设备的信息 还有依赖关系
    # lsblk -f                 // 查看文件系统
    # lsblk -a                 // 默认选项不会列出所有空设备


    关于 硬盘检测 测试硬盘
        # echo 3 > /proc/sys/vm/drop_caches                          // 循环执行 取平均值
        # dd if=/dev/zero of=cc bs=1M count=1024 conv=fdatasync      // 可用于 硬盘读取测试
            conv=fdatasync             // 不使用 内存
            
        # smartctl --all /dev/sda      // 查看硬盘信息 品牌 大小 SMART信息     虚拟的没有
            Power_On_Hours            0x0012   067   067   000    Old_age   Always       -      14798     // 总工作时间
            Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       4           // 通电次数

        # smartctl -H /dev/sda         // 检测硬盘 健康状态信息 
            SMART overall-health self-assessment test result: PASSED           // 有passed 说明正常

        # badblocks -v /dev/sda        // 检测 硬盘 坏块    很慢 很慢

        hdparm 命令                    // 测试硬盘
            # yum install hdparm
            # hdparm -t /dev/sda       // 磁盘的io性能
            # hdparm -T /dev/sda       // 测试 内存性能

        检测硬盘速度
            # lsblk -o NAME,SIZE,ROTA           // 检测硬盘 是否 是机械硬盘 还是 SSD固态硬盘
            # dd if=/dev/zero of=/tmp/test1.img bs=10G count=1 oflag=direct   // 检测硬盘写入速度 机械为80  固态为300左右
            # dd if=/tmp/test1.img of=/dev/null bs=10G count=1 iflag=direc    // 检测硬盘 读取 速度


72. 关于用户的命令
    # vim /etc/group             // 查看群组
    # vim /etc/passwd            // 查看用户
    # vim /etc/sudoers           // sudo配置文件
    # echo "%wheel        ALL=(ALL)       NOPASSWD: ALL" >>/etc/sudoers    // 把wheel的群组10 给与sudo权限

    usermod命令 可用来修改用户帐号的各项设定
        # usermod -s /sbin/nologin teo            // 修改用户的登陆shell
        # usermod -g 10 teo                       // 修改群组
            -c<备注>  修改用户帐号的备注文字。
            -d登入目录>  修改用户登入时的目录。
            -e<有效期限>  修改帐号的有效期限。
            -f<缓冲天数>  修改在密码过期后多少天即关闭该帐号。
            -g<群组>  修改用户所属的群组。
            -G<群组>  修改用户所属的附加群组。
            -l<帐号名称>  修改用户帐号名称。
            -L  锁定用户密码,使密码无效。
            -s<shell>  修改用户登入后所使用的shell。
            -u<uid>  修改用户ID。
            -U  解除密码锁定。

    /etc/profile      系统级     登陆的时候执行的文件
    /etc/bashrc

    ~/.bash_profile   用户级     登陆的时候执行
    ~/.bashrc

    ~/.bash_logout     用户级    退出的时候执行
    ~/.bash_history

    用户登陆的shell会执行
        /etc/profile
        /etc/bashrc
        ~/.bash_profile
        ~/.bashrc

    不能登陆的shell会执行
        /etc/bashrc
        ~/.bashrc


    查看所有用户
        # cat /etc/passwd

    查看所有用户组
        # cat /etc/group

    删除用户
        # userdel -r user1                // 删除 加目录及邮件文件

        # rm -rf /home/user1              // 如果没有执行 -r 则需要手动删除一下两个目录
        # rm -rf /var/spoool/mail/user1
        # id user1

    删除用户
        # useradd user1                   // 没有密码不能登录 默认为lock状态
        # passwd user1 

    sudo 权限
        # visudo                          // 编辑的事此文件  /etc/sudoers
            root    ALL= (ALL)    ALL           // 在行此行后添加
            teo     ALL= (ALL)    ALL           // 给 teo 用户sudo权限
            startalk     ALL= (ALL)    ALL
            postgres     ALL= (ALL)    ALL

        # vim /etc/sudoers      // 设置允许wheel用户组中的用户在不输入该用户的密码的情况下使用所有命令  wheel 组 gid 为10
            echo "%wheel        ALL=(ALL)       NOPASSWD: ALL" >>/etc/sudoers      // 把 wheel 设置 sudo 组  

    ssh 设置指定的登录用户
        # vim /etc/ssh/sshd_config      // 只允许root teo1 登录
            Allowusers root teo1
        # systemctl restart sshd

    更改默认shell
        # echo $SHELL                   // 查看 当前使用的shell
        # zsh                           // shell 的一种
        # chsh -l                       // 查看所有可以使用的shell
        # chsh -s /usr/bin/bash         // 更改默认 shell


73. firewall 命令                                                  // 防火墙
    # firewall-cmd --reload                                        // 重载防火墙规则 每次修改要使用 此命令重新加载
    # firewall-cmd --list-all                                      // 查看防火墙规则
    # firewall-cmd --state                                         // 查看防火墙运行状态
    # firewall-cmd --permanent --zone=public --add-port=9999/tcp   // 添加 9999端口 放行
    # firewall-cmd --permanent --remove-port=9527/tcp   删除       // 删除 9527端口
    # firewall-cmd --permanent --add-port=9527/tcp                 // 添加 端口  宝塔里面可以看到

    # firewall-cmd --permanent --add-rich-rule="rule family="ipv4"  port protocol="tcp" port="59157" accept"   // 放行端口  宝塔可使用此命令
    # firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="18.162.228.120" port protocol="tcp" port="59157" accept"  // 限定源ip
    # firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="43.243.95.0/24" port protocol="tcp" port="59157" accept"   // 限定源ip段


74. nl 命令
    # nl a.txt                  // 加行号 显示   空白行默认不加行号
    # nl -b a a.txt             // 空白行也 加行号
    # nl -b a -n rz a.txt       // 在起那么 补上000000 默认为6位
    # nl -b a -n rz -w 3 a.txt  // -w 3 调整补位的0 为3位


75. fdisk 命令
    # fdisk -l           // 查看 所有 磁盘
    # fdisk /dev/sdb     // 
        m                // 帮助
        n                // 新建分区
            p            // 新建主分区
                +10G     // 分给 10G
            e            // 新建扩展分区
        p                // 显示 当前 分区 状态
        d                // 删除分区
        w                // 保存退出
        q                // 不保存退出
    # mkfs.ext3 /dev/sdb1      // 
    # mkfs.xfs /dev/sdb        // 使用xfs 格式化 sdb
    # mount /dev/sdb1 /data/   // 挂载


76. parted 命令          // 分区操作
    # parted -l          // 查看所有分区
    # parted             // 进入
        print devices    // 显示所有硬盘设备
        select /dev/sdb  // 选择某一硬盘
        p                // 查看分区状态
        mkpart           // 创建分区
            start 
            end -1       // 到最后
        rm 4             // 删除分区4


77. mkfs 命令                 // 格式化 建立文件系统
    # ls -l /sbin/mkfs.*      // 可以查看到所有支持的格式 实际就是调用这些文件
    # mkfs -V                 // 显示版本信息
    # mkfs.ext4 /dev/sdb4     // 把该设备格式化成ext4文件系统
        .vfat                 // vfat就是fat32
        .msdos                // msdos就是fat16


78. du 命令
    # du -sh ./aaa                                 // 查看某目录 总大小
    # du -sh                                       // 查看当前 目录总大小
    # du -h                                        // 所有当前目录及子目录 大小
    # du -h -d1                                    // -d1 一层子目录
    # du --block-size=MiB --max-depth=1 | sort -n  // 查看 所有 目录 大小


79. ln 命令                        // 软连接 硬链接
    # ln -s aa aa.soft             // 软链接: 源文件 目标文件  删除软链接不影响源文件 删除源文件软连接不可用  类似快捷方式
        aa.soft -> aa              // 此符号为软连接
    # ln aa aa.hard                // 硬链接: 没有链接符号 i节点会和源文件一样  删除硬链接不会影响 原文件 修改会同时修改
                                   // 任何 文件 都可以看成 i节点的 硬链接   不可以给文件夹创建硬链接
                                   // 硬链接 可以做备份使用 不占用实际空间
    # ln -s /data/soft  /home/soft // 软链接目录 要使用绝对路径 不能使用相对路径     软链接: 源目录 目标目录 
    # ls -i                        // 查看文件或目录的 i节点  i节点可以理解为元数据库存储的地方 


80. chattr 命令  lsattr 命令
    chattr
        +i                  // 对于文件 i权限 不能被删除修改等操作  对于文件夹 此文件夹下面所有的文件不能被 修改 删除 等操作
        +a                  // 对于文件 a权限 不能被删除 只能追加内容  对于文件夹 下面所有的文件 不能被删除 可以新建 

        # chattr +i bbb     // 给文件夹加 i权限
        # chattr -R +i bbb  // 递归
        # chattr +i a.txt   // 给文件 加 i 权限
        # chattr -i a.txt   // 去除 文件的特殊属性

    lsattr
        # lsattr -a         // 查看当前文件夹下 所有文件的特殊权限
        # lsattr b.txt      // 查看单个文件的特殊权限


81. passwd 命令
    # passwd git            // 修改 git用户 的密码
    # passwd -S git         // 查看git 用户的状态 是否被锁住   如果提示 locked 则被锁定住
    # passwd -l git         // 锁定 git 用户   不能登录
    # passwd -u -f git      // 解锁 git 用户  如果设置密码 -u即可  -f为强制此用户密码为空的时候使用
    # passwd -d git         // 删除密码 移除 git 用户的密码 使之为空
    # awk -F ':' '{if($2=="") print $0 }' /etc/shadow   // 查看系统上 所有的 空密码 的用户
        -d 删除密码
        -f 强迫用户下次登录时必须修改口令
        -w 口令要到期提前警告的天数
        -k 更新只能发送在过期之后
        -l 停止账号使用
        -S 显示密码信息
        -u 启用已被停止的账户
        -x 指定口令最长存活期
        -g 修改群组密码
        指定口令最短存活期
        -i 口令过期后多少天停用账户


82. centos ntfs 支持

    方案一: 已测试可以正常使用  
        # yum install -y ntfsprogs                                              // epel源
        # wget https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2017.3.23.tgz
        # tar -xzvf ntfs-3g_ntfsprogs-2017.3.23.tgz -C /usr/local/
        # cd /usr/local
        # mv ntfs-3g_ntfsprogs-2017.3.23 ntfs-3g_ntfsprogs
        # cd ntfs-3g_ntfsprogs/
        # vim configure                // 注释掉此行 否则会报错
            # $RM "$cfgfile" 
        # ./configure                          
        # make
        # make install
        # ln -s /usr/bin/ntfs-3g /usr/bin/ntfs
        # fdisk -l
        # ls /dev/sdb*
        # mount /dev/sdb1 /mnt         // 挂载
        # df -Th 

        # fdisk /dev/sdb               // 如果需要重新分区 详细 参见 fdisk
        # mkfs.ntfs -k /dev/sdb1       // 格式化   很慢    最好不要是用此格式化 使用windows格式化

    方案二: 未测试
        # wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
        # yum install ntfs-3g


83. less 命令
    # tree | less         // 可以把比较长的文档 给less 读取
    # cat a.txt | less
        /aaaa    向前搜索
        ?aaaa    向后搜索  都差不多
            n    查找下一个
            N    查找上一个
        f 或 ctrl + f   向前移动一屏
        b 或 ctrl + b   向后移动一屏
        d 或 crtl + d   向前移动半屏
        u 或 ctrl + u   向后移动半屏
        j   向下移动一行
        k   向上移动一行
        G   移动到最后一行
        g   移动到第一行

    # less aaa.log   // less 版 tail -f


84. diff 命令
    # diff a b            // 比较两个文件夹的不同
    # diff a.sh c.sh      // 比较两个文件的不同  没有返回说明相同
        a - add
        c - change
        d - delete

        3c3               // c为change 表示第一个文件的第3行  和第二个文件的第3行不同  
        <                 // 第一个文件
        >                 // 第二个文件
        6a7               // a 为 add 
        11,12d10          // d 为 delete

    # diff a.sh c.sh -y -W 140      // 并排输出比较
        -y     以并列的方式显示文件的异同之处。
        -W     在使用-y参数时,指定栏宽
        -w     忽略全部的空格字符
        |      表示前后2个文件内容有不同
        <      表示后面文件比前面文件少了1行内容
        >      表示后面文件比前面文件多了1行内容

    # diff a.sh c.sh -c                     //  上下文输出格式
        -c    上下文 输出比较
        +    比较的文件的后者比前着多一行
        -    比较的文件的后者比前着少一行
        !    比较的文件两者有差别的行

    # diff a.sh c.sh -u                     // 以合并的方式来显示文件内容的不同
        -u    以合并的方式来显示文件内容的不同


85. traceroute 路由追踪
    # yum install traceroute
    # traceroute www.baiud.com
    # traceroute -n www.baiud.com         // 直接使用IP地址  不解析主机名

    tracert -d www.baidu.com              // windows -d 不解析主机名


86. cal 日历命令
    # cal          // 显示 当期月份的 日历
    # cal -y       // 显示 当前年份的 所有日历
    # cal 1987     // 显示 指定年份的 所有日历
    # cal 12 1987  // 显示指定年份 指定月份 的日历
    # cal -3       // 显示当月 前一个月 后一个月的 日历
    # cal -j       // 显示在当年中的第几天 一年日期按天算 从1月1号算起
        -s         // 显示星期天为一个星期的第一天,默认的格式 
        -m         // 显示星期一为一个星期的第一个天


87. du 命令                      // 文件和目录磁盘使用的空间
    # du -sh                     // 总大小
    # du -h | sort -nr | less    // 按照空间大小排序
    # du -h --max-depth=1        // 输出当前目录下 一层子目录所使用的空间
    # du -sh .[!.]* *            // 查看隐藏


88. killall 命令
    # yum install psmisc    // killall 命令的包
    # killall nginx         // 杀死所有nginx进程
    # killall -9 rsync      // 强制杀程序 粗暴 最好不用-9

    关于 杀死都有登录的 用户
        # w                     // 显示当前所有用户登录信息及执行的命令
        # killall -9 bash       // 杀掉所有的bash 前所有连接丢失了   需要重新连接并登录


89. pkill 命令
    # yum install procps-ng       // pkill 由 procps-ng 包提供
    # pkill rsync                 // 杀死程序


90. nl 命令
    # nl a.txt                  // 加行号 显示   空白行默认不加行号
    # nl -b a a.txt             // 空白行也 加行号
    # nl -b a -n rz a.txt       // 在起那么 补上000000 默认为6位
    # nl -b a -n rz -w 3 a.txt  // -w 3 调整补位的0 为3位


91. sl 命令
    # yum install sl
    # sl               // 火车


92. route 命令

    常用 route 命令
        # route add -host 192.168.10.2 eth0        // 到 10.2 经过 eth0 一般指定网卡即可
        # route del -host 192.168.10.2             // 删除
        # route add -net 192.168.20.0/24 ens33     // 添加网段
        # route del -net 192.168.30.0/24           // 删除
        # route add default gw 192.168.120.240     // 添加 默认网关
        # route del default gw 192.168.120.240     // 删除 默认网关

    添加永久路由
        # vim /etc/sysconfig/network-scripts/route-ens33  // 跟route-网卡名字  跟网卡一个名字 走此网卡的路由
            192.168.142.200/32 via 192.168.10.254         // 添加单个路由   主机路由
            192.168.142.100/24 via 192.168.10.254         // 添加一个网段
        # systemctl restart network
        # route -n

    route 命令 详解

        Destination: 目标网段或者主机
        Gateway: 网关地址  * 表示目标是本主机所属的网络 不需要路由
        Genmask: 网络掩码
        Flags:  标记
            U — 路由是活动的
            H — 目标是一个主机
            G — 路由指向网关
            R — 恢复动态路由产生的表项
            D — 由路由的后台程序动态地安装
            M — 由路由的后台程序修改
            ! — 拒绝路由
        Metric: 路由距离 到达指定网络所需的中转数(linux 内核中没有使用)
        Ref:    路由项引用次数(linux 内核中没有使用)
        Use:    此路由项被路由软件查找的次数
        Iface:  该路由表项对应的输出接口

        主机路由: 就是到单个ip  是路由选择表中指向单个IP地址或主机名的路由记录   主机路由的 Flags 字段为 H
        网络路由: 就是到网段    是代表主机可以到达的网络 网络路由的 Flags 字段为 N
        默认路由: 当主机不能在路由表中查找到目标主机的IP地址或网络路由时 数据包就被发送到默认路由(默认网关)上 Flags字段为 G

        # route  [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]

            add : 添加一条路由规则
            del : 删除一条路由规则
            -net : 目的地址是一个网络
            -host : 目的地址是一个主机
            target : 目的网络或主机
            netmask : 目的地址的网络掩码
            gw : 路由数据包通过的网关
            dev : 为路由指定的网络接口

        添加到主机的路由  单个路由
            # route add -host 192.168.10.2 eth0             // 到 10.2 经过 eth0 一般指定网卡即可
            # route del -host 192.168.10.2                   // 删除

            # route add -host 192.168.10.2 dev eth0                  // dev 可以省略 都一样
            # route add -host 192.168.10.2 gw 192.168.10.254          // 到10.2 经过网关10.254  一般不用指定网关
            # route add -host 192.168.10.2 gw 192.168.10.254 dev eth0  // 到10.2 经过eth0 发到网关 10.254  一般不用指定网关

        添加到网络的路由  网段
            # route add -net 192.168.20.0/24 ens33
            # route del -net 192.168.30.0/24                                  // 删除

            # route add -net 192.168.20.0 netmask 255.255.255.0 dev ens33       // dev可以省略而已 两个一样
            # route add -net 192.168.20.0 netmask 255.255.255.0 ens33
            # route add -net 192.168.20.0 netmask 255.255.255.0 gw 192.168.20.1   // 指明 网关  网关要存在

        添加默认路由
            # route add default gw 192.168.120.240      // 添加 默认网关
            # route del default gw 192.168.120.240       // 删除 默认网关

        屏蔽路由
            # route add -net 192.168.20.0 netmask 255.255.255.0 reject       // 屏蔽一条路由
            # route del -net 192.168.20.0 netmask 255.255.255.0 reject        // 删除 屏蔽路由条目

        删除路由
            # route del -host 192.168.1.2 dev eth0:0
            # route del -host 10.20.30.148 gw 10.20.30.40
            # route del -net 10.20.30.40 netmask 255.255.255.248 eth0
            # route del -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41
            # route del -net 192.168.1.0/24 eth1
            # route del default gw 192.168.1.1


93. tee 命令

    # ls | tee                       // tee以标准输入作为输入,标准输出和文件作为输出。
    # cat aa.txt | tee b.txt         // 把 aa.txt的内容 追加 b.txt   如果没有 b.txt 则创建
    # cat aa.txt | tee -a b.txt      // 把 aa.txt的内容 追加 b.txt   如果没有 b.txt 则创建
    # cat aa.txt | tee a.txt b.txt c.txt     // 列出文本文件 aa.txt 的内容 同时复制3份副本 没有a.txt 会创建 如果有会覆盖
    # cat aa.txt | tee -                     // 输出到标准输出两次
    # cat aa.txt | tee - -                  // 输出到标准输出三次

    # tee a.sh                // 会生成一个 a.sh 的文件 里面包含敲入的内容  ctrl + d 结束 +c 也行
    # tee -i a.sh             // 不接受中断信号 即 是能使用ctrl + d 结束  crtl + c 不能结束
        -a          // 追加
        -i          // 不接受中断信号
        --version   // 显示版本信息

    (
    cat <<'EOF'
    aaaaaaaaaaaaaaaaaaaaaaaaaa
    EOF
    ) | tee /data/a.txt            // 配合 EOF 写入文件


94. ipset 命令

    ipset list short_cc            // 显示所有 short_cc 里面的 规则
    ipset list short_long
    ipset flush short_cc           // 清空规则 short_cc 里面的 规则


95. jwhois 命令

    jwhois 检测域名的到期日期 及 域名的信息
    可以检测 .app  .me  .city   .xyz   .link  .one   .bet   .io    .la    .ai   .run   .win   .love   .ink  .city
    不能检测 .tv    .vip   .live    .shop    .cn    .pro

    # jwhois baidu.com | grep 'Registry Expiry Date'
        Registry Expiry Date: 2025-07-24T07:46:09Z
    # jwhois yuce9.me | grep 'Registry Expiry Date' | awk -F'[T]' '{print $1}' | awk '{print $NF}'

    whois  可以 检测   .com   .cc   


96. vnstat 命令

    节点安装 vnstat 监测 流量
        # apt-get install vnstat
        # systemctl start vnstat
        # systemctl enable vnstat
        # systemctl status vnstat
        /etc/vnstat.conf         // 配置文件
        /var/lib/vnstat          // 数据库 文件位置

    命令的使用
        # vnstat -5              // 显示过去五分钟的流量统计
        # vnstat -5 --oneline    // --oneline  以简单的可解析格式显示数据 用于脚本
        # vnstat -5 --json       // 以 JSON 格式显示数据库中的数据
        # vnstat -5 --xml        // 以 XML 格式显示数据库中的数据
        # vnstat -d              // 查看每天的流量
        # vnstat -d --begin 2024-08-25 --end 2024-08-25 // 使用 --begin 和 --end 获取特定日期的数据
        # vnstat -m              // 查看每月流量
        # vnstat -h              // 查看每小时流量
        # vnstat -t              // 显示流量最多的几天
        # vnstat -l              // 实时流量
        rx: 接收的数据量(接收字节数)
        tx: 发送的数据量(发送字节数)
        total: 总的数据量(接收 + 发送)




100. 其他命令
    # w                                                         // 显示当前所有用户登录信息及执行的命令
    # mkdir -pv /data/{shell,soft,www}                          // 建立一串目录
    # dhclient -r eth0                                          // 释放dhcp 获取到的ip
    # dhclient -v eth0                                          // 主动获取ip
    # echo "8888" | md5sum                                      // 查看一个字符串 md5的值  可用作 生成密码  随机数
    # echo $RANDOM                                              // 生成随机数字
    # echo $RANDOM|cksum |cut -c 1-2                            // 取两位随机数
    # route add -host 192.168.10.30 dve ens33:0                 // 
    # ifconfig ens33:0 192.168.10.30/32 broadcast 192.168.10.30 // 网卡配置多个ip地址
    # route -n                                                  // 查看路由表
    # route add -net 192.168.20.0/24 gw 172.16.100.9            // 添加路由
    # cat -n a.txt                                              // 加行号显示 空白行也加行号
    # wget --no-check-certificate  https://www.syk.my/download/Moniterdb.sql.gz   // 下载 --no... 不检测安全性
    # time cat a.txt                                            // 可以计算出 cat 命令 执行的时间
    # curl -o /dev/null -s -w 'Total: %{time_total}s\n' https://www.baidu.com      // 测试 请求 响应 时间
    # lsof | grep REG | grep -v /proc                           // 查询 正在写入哪些文件


101. 其他 

    M3U8播放解析: https://www.shandianbf.com/m3u8/?url=
    https://www.shankubf.com/m3u8/?url=https://v11.fentvoss.com/sdv11/202407/22/bRWDBwvWJM3/video/index.m3u8  // 可以播放

    好用的浏览器插件
        Wappalyzer          查看 网页使用什么架构搭建
        WwitchyOmega        代理
        AdBlock             广告拦截
        Simple Allow Copy   复制网页内容
        油猴脚本
            Tampermonkey
            bilibili 在未登录的情况下自动并无限试用
            bilibili新版首页排版调整和去广告

    sublime text 列编辑
        Ctrl + shift + L

    excel 中 使用 vlookup 锁定选择区域 按F4

    域名劫持
        架构方面. 无非就那么几种 跳转 反代 CDN 缓存服务器 负载均衡
        我感觉可能是某些细节出现的问题
        DNS方面能做的比较少,主要还是服务器防御方面.
        一. 主服务器隐藏方面: 
            可以使用 反向代理  或 CDN
            保护真实服务器避免暴漏.
            可减少,自己的开发项目出现漏洞,被攻击的可能性.
            可减少攻击渗透的可能性.
            注意事项:
                1. 如果只做国内CDN,通过国外访问可以判断出主服务器的IP
                2. 一般做CDN只做主域名.如果有子域名的情况下,主域名
                   和子域名在同一服务器,可以爆破出子域名.以查找真实服务器.
                3. 域名历史解析记录.可以查看域名以前解析服务器ip.如果域名之前
                   直接解析到真实服务器,可以从历史解析记录中判断出真实服务器.
                4. 接口域名使用反向代理隐藏真实服务器.

        二. 服务器防御
            1. 合理利用防火墙,避免暴漏不必要的端口,以减少入侵可能.
            2. http 强制跳转到 https 可以预防一些 针对http的攻击手段
            3. 可以使用服务器入侵检查工具,定期检查服务器,如CScan,ClamAV
            4. WAF防火墙.可防止常见的 web 攻击. 如有必要的话可以尝试安装
            5. 入侵检测系统(IDS)入侵防御系统(IPS). 有必要的话可以尝试安装

        三. 关于 DNS劫持  可以 启用 DNSSEC 功能

    域名被封被墙

        1. 中转页, 中转页可以用来向用户提供备用访问链接。
           即使主网站被封,中转页仍能提供有效的访问路径。
        2. 301网页跳转进行加密.
        3. 我感觉有效的方式还是 代码方面 做 内容混淆/数据伪装
            对敏感内容进行加密或混淆,增加被识别和拦截的难度。
            动态内容生成,以避免静态内容被简单识别和拦截。
        被封解决: 国内免备案服务器做301跳转


    Centos shell命令行只显示-bash-4.1#不显示用户和路径解决方法
        是由于  /root 下面的 .bashrc 和 .bash_profile 两个文件 错误 导致的

        # vim ~/.bashrc
            # .bashrc

            # Source global definitions
            if [ -f /etc/bashrc ]; then
                    . /etc/bashrc
            fi
            # User specific aliases and functions
        # vim ~/.bash_profile
            # .bash_profile
            # Get the aliases and functions
            if [ -f ~/.bashrc ]; then
                    . ~/.bashrc
            fi
        # source ~/.bashrc
        # source ~/.bash_profile


    Debian 系统更改 默认编辑器 为 vim
        # apt-get install vim
        # export EDITOR=vim
        # echo 'export EDITOR=vim' >> ~/.bashrc
        # source ~/.bashrc
        # crontab -e


102.关于证书

    ❶. 最新 certbot 申请证书     2024.1.10更新
        # yum install epel-release
        # yum install snapd
        # systemctl enable --now snapd.socket
        # ln -s /var/lib/snapd/snap /snap               // 创建/var/lib/snapd/snap和/snap之间的链接
        # snap install core                             // 可能需要运行两次   需要在epel源上下载
        # snap refresh core
        # snap install --classic certbot
        # ln -s /snap/bin/certbot /usr/bin/certbot

        ①. 80端口 未占用时 申请证书
            # systemctl stop nginx                              
            # certbot certonly --standalone --email  k051197@kok.work  -d b.kshenbf.com

        ②. nginx 运行时 yum安装的nginx 申请证书                   // 针对 yum 安装的nginx  nginx要运行80被监听
            # certbot certonly --nginx --nginx-server-root /etc/nginx --email teo@teo.com -d syk.my -d www.syk.my
            
        ③. nginx 运行时 编译安装的nginx 申请证书
            # ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx    // 针对 编译安装的nginx 需要 创建软连接
            # ln -s /usr/local/nginx/ /etc/nginx
            # certbot certonly --nginx --nginx-server-root /usr/local/nginx/conf --email teo@teo.com -d syk.my

        注:
            ❶. 如有证书还未到期 先把原的证书文件夹改其他名字 在改相关配置文件执行新改的名字目录 在新生成证书 修改配置文件证书目录

            ❷. 如果 有老版本 certbot 先要卸载
                # yum remove certbot
                # rm /usr/local/bin/certbot-auto
                # rm -rf /opt/eff.org/certbot

            ❸. 提示错误 The error was: NoInstallationError("Could not find a usable 'nginx' binary. Ensure nginx exists, 
                        the binary is executable, and your PATH is set correctly.")
                        The nginx plugin is not working; there may be problems with your existing configuration.
                # which nginx                                                  // 查看nginx文件执行目录
                # ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx       // 添加软连接  在执行申请证书

            ❹. 提示错误 打开网页提示 使用了不受支持的协议  ERR_SSL_VERSION_OR_CIPHER_MISMATCH
                在nginx配置文件中添加 ssl_ciphers HIGH; 

        添加定时任务
          crontab  -e   每10天 晚上22点 自动续期证书
            0 22 */10 * * /usr/bin/certbot renew --quiet

        检测证书 本地 pem 证书 到期时间
            openssl x509 -enddate -noout -in download.midianshangmeng.com.pem | awk -F '=' '{print $2}' | xargs -I {} sh -c 'echo $((($(date -d "{}" +%s)-$(date -u "+%s"))/(3600*24)))'

        检测证书 还剩下多少天
            timeout 1 openssl s_client -servername syk.my -connect syk.my:443 2>/dev/null | openssl x509 -noout -dates 2>/dev/null | grep 'notAfter' | awk -F '=' '{print $2}' | xargs -I {} sh -c 'echo $((($(date -d "{}" +%s)-$(date -u "+%s"))/(3600*24)))' 2>/dev/null


    ❷.acme.sh  申请证书 

        # curl  https://get.acme.sh | sh  // 必须使用root 会在家目录下生成隐藏文件夹 .acme.sh 或者直接拷贝acme.sh 来此文件夹
        # alias acme.sh=~/.acme.sh/acme.sh         // 添加别名 方便使用
        # echo 'alias acme.sh=~/.acme.sh/acme.sh' >>/etc/profile  // 添加到 环境   方便使用

        基于文件验证
            # acme.sh --issue -d syk.my -d www.syk.my --webroot /www/wwwroot/ssyy99.cpm/ -m teo@teo.com // 申请证书
            # acme.sh --issue -d syk.my --nginx -m teo@teo.com        // 基于 nginx
            # acme.sh --issue -d syk.my --apache -m teo@teo.com       // 基于 apache
            # acme.sh  --issue -d syk.my --standalone -m teo@teo.com  // 没有80端口监听的情况下
         
        基于 DNS 验证                               // 亦可使用 域名解析商提供的 api 自动添加 txt 记录完成验证. 这里不介绍
            # acme.sh --issue --dns -d syk.my  // 基于 dns 验证 需要在 解析 txt 记录 
            # acme.sh --renew -d syk.my        // 解析 txt 记录 之后 在执行申请申请书

        其他命令
            # acme.sh --list                       // 显示已申请的证书信息
            # acme.sh --upgrade                    // 更新 手动更新  acme主程序
            # acme.sh --upgrade --auto-upgrade     // 自动更新 acme主程序   以后会自动更新
            # acme.sh --upgrade --auto-upgrade 0   // 关闭 自动更新

        关于 拷贝证书          // 最好使用此命令拷贝证书  不要是用默认的目录  证书60天会自动续签 使用命令拷贝会自动续签
            # acme.sh --installcert -d domain.com \
            --key-file /usr/local/nginx/conf/ssl/syk.my.key \
            --fullchain-file /usr/local/nginx/conf/ssl/syk.my.cer \
            --reloadcmd "service nginx reload"


    ❸. 使用 certbot-auto 脚本  (有可能此方法已经失效)
        # wget https://dl.eff.org/certbot-auto
        # chmod a+x certbot-auto
        # systemctl stop nginx                     // 需要停止nginx 使80端口不被占用    生成证书有效三个月
        # ./certbot-auto certonly --standalone --email k051535@qq.com -d baidu.com -d www.baidu.com -d syk.my  
            a
            y

        注:
            ❶. 证书目录 及 相关文件
                # tree /etc/letsencrypt/live/                 // 查看安装的证书的目录
                    cert.pem         // Apache服务器端证书  
                    chain.pem        // Apache根证书和中继证书  
                    fullchain.pem    // Nginx所需要ssl_certificate文件  
                    privkey.pem      // 安全证书KEY文件  Nginx环境,就只需要用到fullchain.pem和privkey.pem两个证书文件

            ❷. nginx 添加证书关键配置文件
                server {
                    listen 443 ssl;
                    server_name syk.my;
                    charset utf-8;
                    ssl_certificate /etc/letsencrypt/live/syk.my/fullchain.pem;
                    ssl_certificate_key /etc/letsencrypt/live/syk.my/privkey.pem;
                    ssl_stapling on;
                    ssl_session_timeout 5m;
                    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                    ssl_prefer_server_ciphers on;
                }

            ❸. certbot-auto其他命令
                ./certbot-auto certificates           // 查看SSL证书的过期时间
                ./certbot-auto renew --force-renew    // 强制更新证书命令

            ❹. 续期
                # ./certbot-auto renew                // 自动续期 需要停止nginx 80  443端口不能被占用
                # crontab -e                          // 亦可以加到 定时任务 自动续期
                    * * 1 * * systemctl stop nginx;/data/shell/certbot-auto renew --no-self-upgrade;systemctl start nginx

    ❹. 使用 certbot 申请 通配符域名证书 需要DNS验证  (有可能此方法已经失效)
        # yum install epel*
        # yum install certbot
        # certbot --version
        # certbot -d syk.my -d *.syk.my --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory certonly --agree-tos --register-unsafely-without-email
            Press Enter to Continue                                            // 第一个 回车 同意  直接按  根据提示解析DNS
                _acme-challenge  iLS0NjcdP3RR1KphB6xbbVnKS_NS2uMW-xdDRzz85OM   // 根据提示  需要DNS解析
                # host -t txt _acme-challenge.syk.my                       // 可开其他机器测试 可测试DNS是否成功

            Press Enter to Continue                                     // 第二个 回车 需要 DNS 解析测试完在按
                   /etc/letsencrypt/live/syk.my/fullchain.pem       // 证书地址 
                   /etc/letsencrypt/live/syk.my/privkey.pem

    ❺. 使用 freessl.org 免费证书申请流程
        https://freessl.org
            证书类型 RSA
            验证类型 文件验证
            CSR生成  浏览器生成

        添加到nginx文件验证                        // 对于DNS验证 添加 @ tet 记录即可
                location / {                      // 对于强制跳转的加如下代码  在80端口下添加注释掉原来的rewrite
                    rewrite ^/(.*) https://$server_name$1 permanent;
                }
                location /.well-known/pki-validation {       // 对于不是强制跳转 加以下代码即可
                    charset utf-8;
                    alias /data/;                            // godaddy.html 或要验证的文件 复制到此目录下
                    sendfile on;
                    autoindex on;
                    autoindex_exact_size off;
                    autoindex_localtime on;
                }
            # /usr/local/sbin/nginx -t
            # /usr/local/sbin/nginx -s reload                // 证书:*.crt   私钥: *.key

    ❻. 使用 godaddy 购买证书 申请证书
        # (umask 077; openssl genrsa -out www.syk.my.key 2048)
        # openssl req -new -key www.syk.my.key -out www.syk.my.csr -days 730  // 拿到csr复制到godaddy官网
            CN Beijing Beijing ssyy99 OMD www.syk.my ssyy99@google.com

        godaddy 验证步骤 https://sg.godaddy.com/zh/help/html-dns-7452

    ❼. Windows  IIS部署证书流程
          Linux
            # yum install openssl
            # rz cs.tskefu.com.key cs.tskefu.com.crt                      // 需生成 .pfx文件 密码123456即可
            # openssl pkcs12 -export -out cs.tskefu.com.pfx -inkey cs.tskefu.com.key -in cs.tskefu.com.crt

          Windows
            ① 把pfx文件复制到证书目录下 D:\zrpfx
            ② 打开IIS应用池 SERVER-02 --> 服务器证书 --> 导入
            ③ 打开www.online.com主页 --> 右键编辑绑定 --> 编辑/添加 --> 选择要使用的证书
            
        注:
            ❶ 此key文件为linux格式 否则会报错 可以使用把key复制到vim编辑另存即可


103. 宝塔

    宝塔安装
        # wget http://download.bt.cn/install/install_6.0.sh
        # chmod +x install_6.0.sh
        # ./install_6.0.sh
        # bt                   // 宝塔面板 命令行 文件在 /etc/init.d/bt
        # bt restart
        # bt stop
        # bt reload

    卸载
        # /etc/init.d/bt stop 
        # chkconfig --del bt
        # rm -f /etc/init.d/bt
        # rm -rf /www/server/panel 

    宝塔配置文件
        # vim www/server/panel/data/admin_path.pl     // 设置安全 端口
            /4084ae67
        # rm www/server/panel/data/admin_path.pl      // 关闭安全入口 删除此文件即可
        # vim /www/server/panel/data/port.pl          // 修改宝塔端口
            8888
        # cat /tmp/panelBoot.pl                       // 日志
        # vim /www/server/panel/tools.py              // 面板配置文件

    绕过 注册页面
        1.修改配置文件
            # vim /www/server/panel/BTPanel/static/js/index.js
                if (bind_user == 'REMOVED') {         // 修改此项 绕过 注册

        2. 临时 绕过注册页面
            链接后面加上/soft  /files这样即可轻松越过强制绑定

        3. 删除登录页面   前面两种在新版中已经不管用了
            # cd /www/server/panel/BTPanel/templates/default
            # mv bind.html bind.html.bak

    备份数据
        注意 PHP mysql nginx apache 版本
        sz /www/wwwroot                    // 网址目录
        sz /www/server/panel/vhost         // 网址配置文件
        sz /www/server/panel/data          // 主要备份default.db  宝塔面板数据文件
        # ./mysql_bak.sh                   // 备份mysql数据库 注意mysql版本 5.5   5.7不互通   

        推送 到服务器安装rsync
            # vim /etc/rsyncd.conf
                uid  = www
                gid  = www
                port = 63873
                use chroot  = no
                max connections = 10
                hosts allow = 192.168.10.10
                lock file = /var/run/rsync.lock
                log file  = /var/log/rsyncd.log
                ignore errors
                [cp_web]
                path = /data/www
                read only = no

            # groupadd www
            # useradd -g www www
            # chown -R www.www /data/wwwroot
            # rsync --daemon
            # ss -tnl 
            # pkill rsync 
            # iptables -A INPUT 4 -p tcp --dport 63873 -j ACCEPT 

            # rsync -avzP --port=63873 /www/wwwroot/ www@192.168.10.11::cp_web         // 推送到目标
        
    还原数据
        rz /www/wwwroot                         // 网址目录
        rz /www/server/panel/vhost              // 网址配置文件
        rz /www/server/panel/data/default.db    // 使用Navicat修改宝塔数据库 此文件存放宝塔面板的信息
        # ./mysql_re.sh                         // 还原mysql数据 注意测试

    修改面板数据
        使用navicat 导出sites domain databases表格
        sites  表格k列设置id 
        domain 表格G列设置id I列=VLOOKUP(B2,sites.xlsx!$A$2:$K$153,11,1) 替换id 和pid列 删除G I 列保存
        databases 表格J列设置id L列=VLOOKUP(B2,sites.xlsx!$A$2:$K$153,11,1 ) 替换id和pid列 删除J L列保存
        sites  替换id列 删除k列保存

    宝塔数据面板 sqlite数据库  /www/server/panel/data/default.db
        sites      网站 
            domain    网站-->域名管理的端口  pid要与sites表的 id 对应
        firewall   安全           
        databases  数据库
        users      登陆密码
        crontab    计划任务
     
    宝塔 问题
        1. 一些网站会提示 php短标签(short_open_tag)功能才能运行!
            # vim /www/server/php/56/etc/php.ini
                short_open_tag = Off


104. 苹果包做分发 做下载链接
    1. 包需要先做签名 具体在此不论述
    2. 配置苹果包下载地址 必须为ssl https://m.syk.my/syk.my.ipa
    3. 创建plist文件 路径为 https://m.syk.my/ssyy99.plist 格式如下
    4. 下载路径为 itms-services://?action=download-manifest&url=https://m.syk.my/ssyy99.plist


    # vim ssyy99.plist
        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
        <plist version="1.0">
        <dict>
            <key>items</key>
            <array>
                <dict>
                    <key>assets</key>
                    <array>
                        <dict>
                            <key>kind</key>
                            <string>software-package</string>
                            <key>url</key>
                            <string>https://m.syk.my/ssyy99.ipa</string>
                        </dict>
                    </array>
                    <key>metadata</key>
                    <dict>
                        <key>bundle-identifier</key>
                        <string>com.youmi.shangpin</string>
                        <key>bundle-version</key>
                        <string>1.0</string>
                        <key>kind</key>
                        <string>software</string>
                        <key>title</key>
                        <string>ssyy99</string>
                    </dict>
                </dict>
            </array>
        </dict>
        </plist>


注:
    plist文件详解
        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
        <plist version="1.0">
        <dict>
            <key>items</key>
            <array>
                <dict>
                    <key>assets</key>
                    <array>
                        <dict>
                            <key>kind</key>
                            <string>software-package</string>
                            <key>url</key>
                            <string>https://sss/ss/ss.ipa</string>      ipa包下载地址
                        </dict>
                        <dict>
                            <key>kind</key>
                            <string>display-image</string>
                            <key>url</key>
                            <string>https://sss/ss/icon.png</string>    这里是APP图标
                        </dict>
                        <dict>
                            <key>kind</key>
                            <string>full-size-image</string>
                            <key>url</key>
                            <string>https://sss/ss/ss.png</string>      这里是APP图标
                        </dict>
                    </array>
                    <key>metadata</key>
                    <dict>
                        <key>bundle-identifier</key>
                        <string>sss</string>              IPA打包包名
                        <key>bundle-version</key>
                        <string>1.0</string>              APP版本
                        <key>kind</key>
                        <string>software</string>
                        <key>title</key>
                        <string>ss</string>               APP名字
                    </dict>
                </dict>
            </array>
        </dict>
        </plist>

    完整访问路径:  itms-services://?action=download-manifest&url=https://xxx/manifest.plist

    js代码跳转: window.location.href = “itms-services://?action=download-manifest&url=https://域名/manifest.plist”;


105. linux 使用 其他邮箱 SMTPS 465 端口 发送邮件                      // 可做成脚本

    # mkdir -p /root/.certs/                                           // 创建证书   证书随便即可
    # echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
    # certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
    # certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
    # certutil -L -d /root/.certs
    # certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu"  -d ./ -i qq.crt    // 信任证书

    # vim /etc/mail.rc                           // 追加即可
        set smtp="smtps://smtp.qq.com:465"
        set smtp-auth=login
        set smtp-auth-user="aaaaaaaaa@qq.com"    // 换成你的邮箱
        set smtp-auth-password="123456"          // 换成你的邮箱第三方登录密码
        set ssl-verify=ignore 
        #set nss-config-dir=/etc/pki/nssdb
        set nss-config-dir=/root/.certs

    # echo 123456 | mail -v -r "228444347@qq.com" -s "hello world" 228444347@qq.com // 发送邮件 一定要带-r参数 -v调试


106. 关于 百度统计 及 网页代码 跳转

        百度统计代码 类似 下面的形式 加到网页即可
            <script>
            var _hmt = _hmt || [];
            (function() {
              var hm = document.createElement("script");
              hm.src = "https://hm.baidu.com/hm.js?def0d57de38ea6e5180ad67193da61e9";
              var s = document.getElementsByTagName("script")[0]; 
              s.parentNode.insertBefore(hm, s);
            })();
            </script>

        # vim index.html               // 使用nginx root 指向此index.html 即可 跳转
            <!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
                <title>美女都让狗咬了</title>
                <meta http-equiv="keywords" content="美女,都让,狗,咬了,linux,">
                <link rel="shortcut icon" href="./icon.png"/>
                <meta name=”Description” Content=”linux技术博客”>
            </head>
            <script>
                var _hmt = _hmt || [];
                (function() {
                    var hm = document.createElement("script");
                    hm.src = "https://hm.baidu.com/hm.js?ff6f1626d0efb1cdbe7c261b62beeafe";
                    var s = document.getElementsByTagName("script")[0];
                    s.parentNode.insertBefore(hm, s);
                })();
            </script>
            <script>
                var url="https://www.syk.my"; var str1=document.title;  document.write('<meta id="viewport" name="viewport" content="user-scalable=no,width=device-width, initial-scale=1.0" />'); document.write('<style>html,body{width:100%;height:100%;overflow:hidden; clear:both;}</style>'); document.write('<div style="width:100%;height:100%;position:absolute;top:0;left:0;z-index:2147483647;">'); document.write('<iframe src=" '+url+'" frameborder="0" style="border:0;width: 100%; text-align: center; border: medium none; height:100%;max-height: 4000px;"></iframe>'); document.write('</div>');
            </script>
            <script>
                !function () {
                    var devices = ["iPhone","Android","Windows Phone"]
                    var ua = window.navigator.userAgent
                    for (var i = 0; i < devices.length; i++) {
                    if (ua.indexOf(devices[i]) != -1) {
                    window.location.href = 'https://m.syk.my'
                    }
                }
            }()
            </script>
            <body>
            </body>
            </html>


106. 苹果 cms 

    安装
        nginx
        php 5.6
        mysql 5.7

        安装包 maccms10-master_n3mnZ3.zip

        需要把 admin.php  改名  admin_login.php

        php.ini中 修改配置
            always_populate_raw_post_data = -1     // 去掉之前的分号 ;

        其他按照要求给权限即可
        安装 php 模块

        http://192.168.10.11/admin_login.php/admin/index/index.html
            admin
            123456

    使用: 
        1. 采集 -- 自定义 接口
            采集 网址 https://shandianzy.cc/  可根据里面的 接口配置
            接口地址: https://xsd.sdzyapi.com/api.php/provide/vod/from/sdm3u8/at/xml
            接口类型: xml
            资料类型: 视频
            数据操作: 新增+更新
            地址过滤: 不过滤
            同步图片: 跟随全局

        2. 基础 -- 分类管理
            在名称处 添加 与 采集网站定义的 名称 相同即可 可以多个一起修改
            勾选 选择要 刚刚修改的名称 点击 编辑 即可 保存

        3. 系统 -- 网站参数配置
            网站模板: 
            手机模版:


107. 关于解析

    A记录是将域名解析成IP   A记录只能填写IPv4地址       TTL值 默认 600秒 生效
    CNAME是将域名解析成另外一个域名。
        如果我们要添加www.example.com的解析记录,则主机记录填写www;
        如果我们要添加example.com的解析记录,则主机记录则需要填写@;
        如果我们想针对example.com下的所有子域名都指向同一个IP地址,则主机记录填写*
        主机记录
            www
            @
            *

    AAAA记录 IPv6地址
    CNAME记录,也叫别名记录,相当于给A记录中的域名起个小名儿,比如www.xx.com的小名儿就叫www.yy.com好了,
    然后CNAME记录也和A记录一样,是一种指向关系,把小名儿www.yy.com指向了www.xx.com,然后通过A记录,www.xx.com又指向了对应的IP:
    www.yy.com → www.xx.com → 1.1.1.1
    A记录优先于CNAME记录。即如果一个主机地址同时存在A记录和CNAME记录,则CNAME记录不生效。
    MX记录 邮件
    NS记录     解析服务器记录。用来表明由哪台服务器对该域名进行解析。这里的NS记录只对子域名生效
    “IP地址/主机名”中既可以填写IP地址,也可以填写像ns.mydomain.com这样的主机地址,  ·NS记录优先于A记录。即,
        如果一个主机地址同时存在NS记录和A记录,则A记录不生效。这里的NS记录只对子域名生效。


108. iptables 防止 SYN Flood攻击(SYN洪水攻击) CC  攻击

    # iptables -A INPUT -p tcp --syn -m recent --name conn_limit --set
    # iptables -A INPUT -p tcp --syn -m recent --name conn_limit --update --seconds 60 --hitcount 20 -j DROP
        // 攻击防御规则:限制每个 IP 地址的连接数
        // 这里设置为每分钟同一个 IP 最多建立 20 个新连接
        iptables -A INPUT:      // 向 INPUT 链(输入链)添加规则,用于处理进入系统的数据包。
        -p tcp:                 // 指定协议为 TCP。
        --syn:                  // 匹配 TCP 的 SYN 数据包,即连接建立时的第一个数据包。
        -m recent:              // 使用 recent 扩展模块,允许跟踪最近的连接状态。
        --name conn_limit:      // 指定连接跟踪列表的名称为 conn_limit,这个名称可以自定义,用于标记此连接跟踪列表。
        --set:                  // 表示在 recent 跟踪列表中设置一个新的条目,记录当前数据包的源 IP 地址和时间戳等信息。

        iptables                 // 是 Linux 下用于配置防火墙规则的命令。
        -A INPUT                 // 表示向 INPUT 链(输入链)末尾添加规则,用于处理进入系统的数据包。
        -p tcp                   // 指定匹配的协议为 TCP。这意味着该规则仅适用于 TCP 数据包。
        --syn                    // 参数用于匹配 TCP 协议中的 SYN 数据包。在 TCP 三次握手中,SYN 是建立连接的第一个步骤,
                                 // 因此该规则会处理尝试建立新连接的请求。
        -m recent                // 是 iptables 中的扩展模块,允许跟踪最近的连接状态。
        --name conn_limit        // 指定连接跟踪列表的名称为 conn_limit,这个名称可以自定义,用于标记此连接跟踪列表。
        --set 表示在 conn_limit   // 连接跟踪列表中设置一个新的条目,记录当前数据包的源 IP 地址和时间戳等信息。

    # iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
       // 限制每秒钟从单个IP地址发起的最大连接数为 20

    删除规则
        # iptables -D INPUT -p tcp --syn -m recent --name conn_limit --set
        # iptables -D INPUT -p tcp --syn -m recent --name conn_limit --update --seconds 60 --hitcount 20 -j DROP
        # iptables -D INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 32 -j REJECT --reject-with tcp-reset

    # iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
    # iptables -A INPUT -p tcp --syn -j DROP
      // 这组规则限制每秒只能接收1个TCP SYN包,并且允许突发速率为3个SYN包,超过这个速率的将被丢弃。

    # iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 50 -j REJECT
      // 这条规则限制同一源IP地址的并发连接数超过50个将被拒绝。

    # iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
      //这条规则过滤掉除了SYN标志以外的TCP数据包,以防止一些异常或恶意的TCP连接。

    SYN Flood 攻击
        在正常的TCP连接过程中,客户端向服务器发送SYN(同步)包,服务器收到后回复一个SYN-ACK(同步-确认)包,客户端再回复一个ACK(确认)包,
        完成三次握手建立连接。在SYN Flood攻击中,攻击者发送大量的SYN包给服务器,但不完成后续的握手过程,即攻击者不发送ACK包。
        由于服务器在收到SYN包后会为每个SYN包分配一些资源来等待后续的ACK包,而攻击者发送大量的SYN包会使得服务器资源快速耗尽,
        导致服务器无法响应正常用户的请求,从而造成拒绝服务。

    CC攻击(Command and Control攻击)
        通常指的是一种通过操纵大量被感染的计算机或者IoT设备(僵尸网络)来发起的分布式拒绝服务攻击。攻击者通过控制这些被感染的设备,
        集中地向目标服务器或网络发送大量恶意流量,以超出目标系统处理能力的方式来使其服务不可用。

        SYN Flood攻击可以作为CC攻击的一部分,因为攻击者可以使用多个被感染的设备来同时发起SYN Flood攻击,增加攻击的规模和影响力。
        攻击者可以使用CC攻击工具来自动化和协调这些攻击活动,以更有效地达到其攻击目的。
        总结

        SYN Flood攻击是一种针对TCP协议的拒绝服务攻击,通过发送大量未完成的TCP连接请求来耗尽服务器资源。
        它与CC攻击的关系在于,SYN Flood攻击可以作为CC攻击中的一种手段,用来增加攻击的规模和效果。
        有效的防御措施包括使用防火墙、负载均衡器、反向代理以及限制连接数等方法来减轻其影响。

    DDoS攻击(分布式拒绝服务攻击):大量请求同时针对特定的域名,试图使其服务不可用。

    HTTP Flood攻击:大量的HTTP请求,超出服务器处理能力,导致服务负载过高或者服务器崩溃。

    Slowloris攻击:通过发送大量半开放的HTTP连接来占用服务器资源,使得服务器无法处理其他合法请求。

    CC攻击(Command and Control攻击):使用大量感染的计算机或设备,通过恶意的命令来攻击目标服务器或网络。