存档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格式

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


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     删除行首的空格
    ❽. 删除空白                ^v 块选择 jk移动  d  删除  可以删除 空白
    ❾. 整段缩进                ^v 块选择或者shift +v按一下   jk移动 shift + >   向右移动
    ❿. 加#注释                 ^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


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

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

        1. 选项
            -i : 直接修改源文件
            -r : 表示使用扩展正则表达式   默认 支持基本正则表达式  或者加 \

            -n : 只显示符合条件的行    静默模式 不在默认显示模式空间中的内容
            -e : 后面可接多个文件

        2. 地址定址
                5     第5行
                $     最后一行          
                1,5   从1到5行
                1,+2  第一行 及 以后两行
                /RE/  正则匹配 需要放到双斜线中       做模式匹配  过滤特定的行
                    \# #   亦可以写成这样 可以加任意字符或数字
                    \x x

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

        3. 命令

            s:  s///修饰符  s###  s@@@ 替换 将前面正则匹配到的字符串 替换成其他字符串
                修饰符
                    g :  全局替换
                    i :  忽略字符大小写
            c:  替换整行                 // sed '/^SELINUX=enforcing/cSELINUX=disabled' /etc/selinux/config
            d:  删除符合条件的行
            n:  处理下一行               //  sed -r '/^aaa/{n;s/sbin/uuu/}'
            !  在命令前面的叹号 表示取反
            &   符号 是 调用 前面 匹配到的所有东西sed 's/.*/#&/'   所有行首 加#
            ;   可以 分开 两部分  // sed '1d;s/aaa/bbb/g'    相当于 -e
            { } 如果有多个命令可以使用 {;}隔开
                sed '3{h;d}'
                sed '3{d;}'          下面三个一样
                sed '3{d}'
                sed '3d'
            \t  制表符
            h:  把命令放到暂存空间   覆盖  默认的情况下暂存空间有一个 空行 只有一个 回车符
            H:  把命令放到暂存空间   追加
            g:  把暂存空间所有的内容从暂存空间取出 覆盖
            G:  把暂存空间所有的内容从暂存空间取出 追加
            p:  显示符合条件的行         // 本身模式空间里面有 在显示 就是 2条
            a:  \string                // 在指定的行后面追加新行 内容为string
                \n 换行符 可以用于换行
            i:  \string                // 在指定的行前面追加新行 内容为string
            r FILE: 将指定的文件及内容添加至 符合条件的行 的下面 可用于文件合并
            w FILE: 将指定范围内的内容另存至指定的文件中
            \L: 是转换全部 &匹配到的 为小写  直到遇到 \E 为止
            \U: 是转换全部 &匹配到的 为大写  直到遇到 \E 为止
        
    sed 实例
        # sed '/11111/i\55555' test.txt                   i 插入上一行 查找11111的行  在上方插入 55555
        # sed '/22222/a\55555' test.txt                   a 插入下一行 查找22222的行 在下方插入 55555

        # sed -i 's/^[[:space:]]*//g'  ./grub2.cfg        删除/etc/grub2.cfg文件中行首的空白字符
        # sed 's/id:3/id:5/g' ./inittab                   替换/etc/inittab文件中"id:3:initdefault:"一行中的数字为5
        # sed '/^$/d' inittab                             删除/etc/inittab文件中 空白行     删除空行
            # sed '/^[ ]*$/d' ./inittab                   删除空行 及 全是空格的行    [ ]*有0个或多个空格
            # sed '/^[[:space:]]/d' ./inittab             删除以空格开始的行.
            # sed '/^\s/d' ./inittab                      删除以空格开始的行.
            # sed '/^[ ]/d' ./inittab                     删除以空格开始的行.

            # sed '/^[ \t]*$/d' aa.sh          删除空行  \t是制表符

                空格  [[:space:]]
                      [ ]
                      \s
        # sed 's/^#//g' ./inittab               删除 /etc/inittab文件中 开头的#号
        # sed 's/^#\s*//g' ./inittab            删除 /etc/inittab文件中 开头的#号 及 后面的空格有0个或多个空格 同时删除
        # sed 's/^\s\s*#//' ./inittab           删除 /etc/inittab文件中 空格开头的 后跟#  删除 空白字符及#号

        # sed 's/.*/#&/' ./inittab              所有行首 加#
        # sed 's/^\s*[^#\t].*$/#&/' ./inittab   不是以#号开头的 加#

        # echo "/etc/fstab" |sed -r 's#(^/.*/)([^/]+/?)#\1#'   取目录名
        # echo "/etc/fstab" |sed -r 's#(^/.*/)([^/]+/?)#\2#'   取基名

        # sed '2,20s/^#*/#/' aa.sh              没有注释的加注释
        # sed 's/^[ \t#]*/#/g' aa.sh            把没有注释的加注释 或者 前面有空格的 删除空格 加注释

        # sed "1d" ./passwd                     删除 第一行
        # sed "$d" ./passwd                     删除 最后一行
        # sed '$G' ./passwdn                    最后一行下面 加上空白行
        # sed '2r /etc/issue' ./passwd          将/etc/issue 此文件的内容 添加到 第二行的下面
        # sed '$r /etc/issue' ./passwd          将/etc/issue 此文件的内容 添加到 最后一行
        # sed '1,2r /etc/issue' ./passwd        在第一行和第二行后面都添加
        # sed "1,3d" ./passwd                   删除 前三行
        # sed -n '1,2p' ./passwd                仅仅显示 前两行
        # sed "1,+2d" ./passwd                  删除 第一行 及 以后两行
        # sed 's/^ *//' ./passwd                删除行首空格
        # sed 's/ *$//' ./passwd                删除行尾空格
        # sed "/root/d" ./passwd
        # sed '/^\//d' ./passwd                    删除以 \ 开头的行   /需要转义符
        # sed '/^root/a\#hello' ./passwd           查找以root开头的行 添加一行 内容为#hello  \可以省略
        # sed '/^root/a\# hello\n# hi' ./passwd     \n为换行符 添加两行
        # sed 's/spool/teooo/g' ./passwdn          把所有的 spool 替换成teooo
        # sed 's/^\//#/' ./passwdn                 查找以 \ 开头的行 替换成 #  默认替换每一行的第一次 被匹配到的
        # sed 's/\//#/' ./passwdn                  查找 \ 替换成 #  默认替换每一行的第一次 被匹配到的
        # sed 's/\//#/g' ./passwdn                 把所有的 \ 都替换成 #
        # sed 's/sp..l/&er/g' ./passwd             查找所有 sp..l 的字符串 替换成 sp..ler 
        # sed 's/\(sp..l\)/\1er/g' ./passwdn       \(   \) 为后项引用  \1 调用后项引用 查找所有sp..l 的字符串 替换成 sp..ler
        # sed 's/s\(...l\)/S\1/g' ./passwdn        只使用前面引用的 一部分时 只能使用 后项引用 ... 不能使用&.
        # history | sed 's/[[:space:]]//g'         把history 所有的空格 删除  [[:space:]] 替换成 啥也没有
        # history | sed 's/^[[:space:]]*//g'       把行首的空白字符    * 所有空白字符
        # sed '$a'"$teo" aa.txt                    在最后一行添加 teo的变量 可以使用 两种引号 各有需求
        # sed "\$a$teo" aa.txt                     或转义
        # sed -i 's/[A-Z]/\L&/g' a.txt             把所有大写字母 换成 小写字母
        # sed -i 's/[a-z]/\U&/g' a.txt             把所有小写字母 换成 大写字母


26. awk 命令

    awk 'BEGIN{print 1/2} {print "ok"} END{print "__________"}' ./passwd
    处理顺序 
        1. 处理BEGIN 在读文件之前处理
        2. 处理 行处理 处理每一行
        3. 处理 END 在行处理结束 处理

        -F"[ :\t]"

    内部变量
        $0:    $0保存当前记录的内容              
        NR:    显示行号 总的记录    多个文件         
        FNR:   显示行号 当前文件的  单个文件 
        NF:    当前行有多少个字段                
            # 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   输入 记录分隔符  把冒号 换成 回车         默认每一条为一个记录
        ORS  输出 记录分隔符  把回车 换成 冒号
            # 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

    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        满足条件行的 第一个字段 正则
        # awk -F":" '/root/{print $1,$3}' passwd     1和3
        # df | grep '/' | awk '$4>1000000{print $4}' 
        # date | awk '{print "Month:",$2"\n""Year:",$NF}'


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   可以查看系统中所有的进程
         a:   显示一个终端的所有进程 除会话引线外
         u:   显示进程的归属用户及内存的使用情况
         x:   显示没有控制终端的进程
        -l:   长格式显示更加详细的信息
        -e:   显示所有进程
        -f:   显示程序间的关系
    # ps -ef | grep "shadowsocksr" | grep -v grep | awk '{print $2}' | xargs kill -9 // 查找程序pid 并杀掉

    # 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 -dc "[:alnum:]"

    # cat /dev/urandom | tr -dc "[:alnum:]" | head -c 14 | xargs       // 取随机数
    # openssl rand -hex 7


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                     // 文件大小排序
        -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. ssyy99.com

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.ssyy99.com                                        // 请求网页
    # curl -I http://www.ssyy99.com                                     // 只请求首部信息
    # 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 +5G /dev/mapper/centos-root     // 扩展/root所在的lv 给 root 分 5G 空间
        # xfs_growfs /dev/mapper/centos-root          // 扩展/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 目录
        # mkfs.xfs /dev/centos/home             // 创建文件系统
        # mount /dev/centos/home /home          // 挂载
        # 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 -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://ssyy99.com/a.tar.gz
        -c 断点续传  
        -t 0 反复尝试的次数,0为不限次数

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

    # wget -r -np -R index.html*  https://www.ssyy99.com/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.ssyy99.com/download/en --no-check-certificate // -m 镜像站点 会读入robots.txt并此文件规定来执行

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


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       // 测试 内存性能


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 写入文件

    

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.ssyy99.com/download/Moniterdb.sql.gz   // 下载 --no... 不检测安全性


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 ssyy99.com -d www.ssyy99.com
            
        ③. 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 ssyy99.com

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

            ❷. 如果 有老版本 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 ssyy99.com -connect ssyy99.com: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 ssyy99.com -d www.ssyy99.com --webroot /www/wwwroot/ssyy99.cpm/ -m teo@teo.com   // 申请证书 指明网址目录
            # acme.sh --issue -d ssyy99.com --nginx -m teo@teo.com        // 基于 nginx
            # acme.sh --issue -d ssyy99.com --apache -m teo@teo.com       // 基于 apache
            # acme.sh  --issue -d ssyy99.com --standalone -m teo@teo.com  // 没有80端口监听的情况下
         
        基于 DNS 验证                                     // 亦可使用 域名解析商提供的 api 自动添加 txt 记录完成验证. 这里不介绍
            # acme.sh --issue --dns -d ssyy99.com        // 基于 dns 验证 需要在 解析 txt 记录 
            # acme.sh --renew -d ssyy99.com              // 解析 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/ssyy99.com.key \
            --fullchain-file /usr/local/nginx/conf/ssl/ssyy99.com.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 ssyy99.com  
            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 ssyy99.com;
                    charset utf-8;
                    ssl_certificate /etc/letsencrypt/live/ssyy99.com/fullchain.pem;
                    ssl_certificate_key /etc/letsencrypt/live/ssyy99.com/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 ssyy99.com -d *.ssyy99.com --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.ssyy99.com                       // 可开其他机器测试 可测试DNS是否成功

            Press Enter to Continue                                     // 第二个 回车 需要 DNS 解析测试完在按
                   /etc/letsencrypt/live/ssyy99.com/fullchain.pem       // 证书地址 
                   /etc/letsencrypt/live/ssyy99.com/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.ssyy99.com.key 2048)
        # openssl req -new -key www.ssyy99.com.key -out www.ssyy99.com.csr -days 730  // 拿到csr复制到godaddy官网
            CN Beijing Beijing ssyy99 OMD www.ssyy99.com 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.ssyy99.com/ssyy99.com.ipa
    3. 创建plist文件 路径为 https://m.ssyy99.com/ssyy99.plist 格式如下
    4. 下载路径为 itms-services://?action=download-manifest&url=https://m.ssyy99.com/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.ssyy99.com/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.ssyy99.com"; 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.ssyy99.com'
                    }
                }
            }()
            </script>
            <body>
            </body>
            </html>