Linux 笔记

Linux
习惯问题:
1. 在vim编辑时,按了ctrl + s后,再按ctrl + q就可以继续执行了。
    ctrl + s 表示停止向终端输出
    ctrl + q 表示恢复向终端输出
2.

1. 重启reboot

2. vi和vim使用方法
    打开一个文件:vi/vim xxx.xxx
    进入插入模式:i/a
    进入命令行模式:按Esc
    退出:q(没有修改的退出) w(保存) wq(保存并退出) q!(强制退出,不保存修改)

3. vi\vim快捷键
    1)拷贝当前行 yy,拷贝当前行下的5行 5yy,并粘贴(p)
    2)删除当前行 dd,删除当前行下的5行 5dd
    3)在文件中查找某个单词[命令行下/关键字,回车查找,输入n就是查找下一个]
    4)设置文件的行号,取消文件的行号 [命令行下 :set nu 和 :set nonu]
    5)编辑 /etc/profile文件,使用快捷键到底文档的最末行[G]和最首行[gg]
    6)在一个文件中输入 "hello",然后又撤销这个动作 u
    7)编辑 /etc/profile文件,并将光标移动到20行 输入20 再shift+g
    PS:命令的执行都是在正常模式,而不是插入模式下进行。

4. 关机&重启命令
    shutdown
    shutdown -h now    :立即关机
    shutdown -h 1    :1分钟后关机
    shutdown -r now    :立即重启
    halt            :直接使用,效果等价于关机
    reboot            :重启系统
    sync            :把内存的数据同步到磁盘上,防止丢失数据
    PS:当关机或重启时,都应先执行一次sync指令,把内存的数据写入磁盘,防止数据丢失

5. 用户的登录和注销
    1)登录时尽量不用root账号登录,因为他是系统管理员,拥有最大权限,避免操作失误,可以利用普通用户登录,登录后再用"su - 用户名"命令来切换成系统管理员身份
    2)在提示符下输入 logout即可注销用户,只对远程登录有用

6. 用户管理
    1)添加用户 useradd [选项] 用户名    如:useradd guest    就会创建一个guest用户
        当创建用户成功后,会自动的创建和用户同名的家目录
        也可以通过useradd -d 指定目录 新的用户名,给新创建的用户指定家目录
    2)指定/修改密码
        a. passwd 用户名
        b. 输入新的密码
        c. 再次确认输入的密码
    3)删除用户
        a. userdel 用户名
        b. 删除用户,但保留家目录        :userdel 用户名
        c. 删除用户,同时删除家目录        :userdel -r 用户名
        在删除用户时,我们一般不会把家目录删除掉
    4)查询用户信息 :id 用户名
    5)切换用户
        a. su - 用户名
        b. su 用户名
        c. exit 退出切换的用户,回到root用户上
        PS: su [user]切换到其他用户,但是不切换环境变量,su - [user]则是完整的切换到新的用户环境。
    6)查看当前登录用户/使用用户:whoami

7. 用户组
    1)增加组:groupadd 组名
    2)删除组:groupdel 组名
    3)创建用户的同时附属的指定的组中:useradd -g 组名 用户名
    4)修改用户组:usermod -g 用户组 用户名
    5)/etc/passwd 用户配置文件,记录用户的各种信息
        如:zwj:x:1002:1003::/home/zwj:/bin/bash
            root:x:0:0::/home/root:/bin/bash
            用户名:口令:用户id:组id::家目录:shell
            每行的含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录shell
    6)/etc/shadow 口令配置文件
        每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
    7)/etc/group 组配置文件,记录Linux包含的组的信息
        每行的含义:组名:口令:组标识号:组内用户列表

8. Linux的运行级别
    0:关机
    1:单用户(找回丢失密码)
    2:多用户无网络服务
    3:多用户有网络服务
    4:系统未使用保留给用户
    5:图形界面
    6:系统重启
    常用运行级别是3和5,要修改的运行级别可改文件/etc/inittab的id:5:initdefault:这一行中的数字
    命令:init[0123456]
    1)切换到指定运行级别的指令
        systemctl set-default multi-user.target
        systemctl set-default graphical.target
    2)查看当前的运行级别的指令
        systemctl get-default

9. 帮组指令
    1)man 指令
    2)help 指令

10. 文件目录指令
    1)pwd            显示当前工作目录的绝对路径
    2)ls            显示路径下的所有文件和目录
        ls -a        显示当前目录所有的文件和目录,包括隐藏的。
        ls -l        以列表的方式显示信息
        ls -a -l    以列表的形式显示所有文件和目录,包括隐藏的
        ls -al        和ls -a -l功能一致
    3)cd            切换目录
        cd ~        回到自己的家目录
        cd ..        回到上一级路径
        cd /        回到根路径
        cd ../home    回到上一级路径下home目录中
        cd /home    回到根目录下的home目录中
    4)mkdir        创建目录
        mkdir /home/dog    在/home路径下创建dog目录(只能创建单级目录)
        mkdir -p /home/animal/tiger    在/home路径下创建animal目录并在animal目录下创建tiger目录(创建多级目录)
    5)rmdir        删除目录
        rmdir /home/dog    删除/home目录下的dog目录(删除的是一个空目录)
        rm -r /home/dog(删除一个非空目录,dog目录下有一个test.txt文件)
    6)touch 文件名    创建一个空文件
        touch 1.txt    创建一个1.txt的空文件
        touch 1.txt 2.txt 创建了1.txt和2.txt两个文件
    7)cp            拷贝文件
        语法:cp [选项] source dest
        cp aaa.txt bbb/    把当前目录下aaa.txt文件拷贝到当前目录下的bbb目录下(拷贝单个文件到指定的目录中)
        cp -r test/ zwj/    把当前目录下的test目录拷贝到当前目录下的zwj目录下(循环拷贝内容到指定的目录下)
        \cp -r test/ zwj/    (强制覆盖)把当前目录下的test目录拷贝到当前目录下的zwj目录下(循环拷贝内容到指定的目录下)
        cp -r first/. second/ 把路径first下面的内容拷贝到second目录下,如first目录下有a.txt和b.txt两个文件,second目录下为空,结果是second目录下有a.txt和b.txt两个文件
    8)rm            移除文件或目录
        语法:rm [选项] 要删除的文件或目录
        rm aaa.txt    删除当前目录下的aaa.txt文件(需要确认)
        \rm aaa.txt    强制删除当前目录下的aaa.txt文件(不需要确认)
        rm -f aaa.txt    强制删除当前目录下的aaa.txt文件(不需要确认)
        rm -r bbb    删除当前目录下的bbb目录,依次进入目录进行删除
        \rm -r bbb    (强制删除)删除当前目录下的bbb目录,依次进入目录进行删除
        rm -rf bbb    (强制删除)删除当前目录下的bbb目录,依次进入目录进行删除
    9)mv            移动文件
        语法:mv 移动文件与目录或重命名
        mv oldNameFile newNameFile    重命名
        mv /temp/movefile /targetFolder    移动文件
    10)cat            查看文件内容,以只读的方式
        语法:cat [选项] 要查看的文件
        常用选项:
            -n :显示行号
        cat /etc/profile    查看/etc/profile文件
        cat -n /etc/profile    查看/etc/profile文件,并显示行号
        cat -n /etc/profile | more    查看/etc/profile文件,并显示行号,分页显示,回车显示下一行,空格键显示下一页
    11)more        基于vi编辑器的文本过滤器,它以全屏幕的方式按页显示文本的内容
        more 要查看的文件
        回车显示下一行,空格键显示下一页
        Ctrl+b 显示上一页
        q 退出
    12)less        分屏查看文件内容,与more指令类似,但是比more指令更加强大,并不是一次将整个文件加载之后显示,对于显示大型文件具有较高的效率。
        less 要查看的文件
        回车显示下一行,空格键显示下一页
        Ctrl+b 显示上一页
        q 退出
    13)> 指令和 >> 指令
        > 输出重定向,会将文件原来的内容覆盖
        >> 追加,不会覆盖文件原来的内容,而是追加到文件的尾部
        基本语法:
            a. ls -l > 文件            列表的内容写入文件a.txt中(覆盖写)
                ls -l > a.txt    将ls -l 的显示内容覆盖写入到a.txt文件,如果文件不存在,就创建该文件。
            b. ls -al >> 文件        列表的内容追加到文件aa.txt的末尾
                ls -l >> b.txt    将ls -l 的显示内容追加写入到b.txt文件,如果文件不存在,就创建该文件。
            c. cat 文件1 > 文件2    将文件1的内容覆盖到文件2中
            d. echo "内容" >> 文件    
            e. cal >> /home/mycal    将当前日历信息追加到/home/的mycal文件中
    14)cal            显示当前日历
    15)echo        输出内容到控制台
        echo 输出的内容    输出普通文本
        echo $PATH    输出环境变量路径
    16)head        显示文件的开头部分,默认情况下head指令显示文件的前10行内容
        语法:
        head 文件    查看文件头10行内容
        head -n 5 文件    查看文件前5行内容
        head -n 5 /etc/profile    查看/etc/profile的前面5行内容
    17)tail        用于输出文件中尾部的内容,默认情况下tail指令显示文件的后10行内容
        语法:(和head类似)
        tail 文件    查看文件后10行内容
        tail -n 5 文件    查看文件后5行内容
        tail -f 文件    实时追踪该文档的所欲更新,工作中经常使用
        tail -n 5 /etc/profile    查看/etc/profile的后面5行内容
    18)ln            创建源文件的软链接也叫符号链接,类似于windows里的快捷方式
        ln -s 源文件或目录 软链接名
        ln -s /root/ myroot    
        rm -rf myroot    删除软链接,删除时,软链接后面不能加/
    19)history        查看已经执行过历史命令,也可以执行历史命令
        history        显示所有执行过的历史指令
        history 10    显示最近执行的10个指令
        !178        执行历史指令中178的指令

11. 时间日期类型的指令
    1)date            显示当前日期
        date +%Y        显示当前年份
        date +%m        显示当前月份
        date +%d        显示当前是哪一天
        date "+%Y-%m-%d %H:%M:%s"    显示年月日时分秒
        date +%y        显示年份的最后两个数,如:2018,就会显示18
        date -s 字符串时间    设置日期指令
        date -s "2018-04-12 12:20:00"    把时间设置成2018年4月12日12点20分
    2)cal            查看日历指令
        cal            显示当前的日历
        cal 2020    显示2020年全年的日历

12. 搜索查找类指令
    1)find            将从指定目录向下递归的遍历各个子目录,将满足添加的文件或目录显示在终端
        find 搜索范围 选项
            选项:
                -name<查询方法>    按照指定的文件名查找模式查找
                -user<用户名>    查找属于指定用户名所有文件
                -size<文件大小>    按照指定的文件大小查找文件,+n大于 -n小于 n等于
        find /home -name hello.txt    
        find /opt -user nobody        查找/opt目录下,用户名为nobody的文件
        find / -size +20M            查找整个Linux系统下大于20M的文件
        find /opt *.txt                查找/opt目录下,所有.txt文件
    2)locate        快速定位文件路径
        使用locate之前需要调用updatedb命令更新数据库
        locate 文件名
    3)grep和管道符号|    grep过滤查找,管道符“|”表示将前一个命令的处理结果输出传递给后面的命令处理
        grep 选项 查找内容 源文件
            选项:
                -n    显示匹配行及行号
                -i    忽略字母大小写
        cat hello.txt | grep -n yes            在hello.txt文件中,区分大小写查找"yes"所在行,并显示行号
        cat hello.txt | grep -ni yes        在hello.txt文件中,不区分大小写查找"yes"所在行,并显示行号
    4)

13. 压缩解压类指令
    1)gzip/gunzip    gzip只能用于压缩文件,gunzip只能用于解压文件
        gzip 文件名        压缩文件,只能将文件压缩为*.gz文件
        gunzip 文件.gz    解压缩文件命令
        gzip /home/hello.txt    将/home/路径下的hello.txt压缩成hello.txt.gz文件,压缩后hello.txt文件就不存在了
        gunzip /home/hello.txt.gz    将/home/路径下的hello.txt.gz文件解压成hello.txt文件
    2)zip/unzip    zip用于压缩文件,unzip用于解压文件,这个在项目打包中很有用
        zip 选项 XXX.zip 将要压缩的内容        压缩文件和目录的命令
            选项:
                -r            递归压缩,即压缩目录
        unzip 选项 XXX.zip                    解压缩文件
            选项:
                -d 目录        指定解压后文件的存放目录
        zip -r mypackage.zip /home/        将/home/路径下的所有文件进行压缩成mypackage.zip文件
        unzip -d /opt/tmp/ mypackage.zip    将mypackage.zip解压到/opt/tmp/路径下
    3)tar            是打包指令,最后打包的文件是.tar.gz的文件
        tar 选项 xxx.tar.gz 打包的内容        打包目录,压缩后的文件格式.tar.gz
            选项:
                -c        产生tar打包文件
                -v        显示详细信息
                -f        指定压缩后的文件名
                -z        打包同时压缩
                -x        解包.tar文件
        tar -zcvf a.tar.gz a1.txt a2.txt    压缩多个文件,将/home/a1.txt 和 /home/a2.txt 压缩成 a.tar.gz
        tar -zcvf myhome.tar.gz /home/        将/home 的文件夹压缩成 myhome.tar.gz
        tar -zxvf a.tar.gz                    将a.tar.gz解压到当前目录
        tar -zxvf myhome.tar.gz -C /opt/    将myhome.tar.gz 解压到 /opt/ 目录下,解压到指定的目录下要事先存在,不然会报错
    4)

14. Linux的目录结构:https://blog.csdn.net/m0_38044196/article/details/72844025
        ______________
        |------/bin            User Binaries                用户的二进制文件,包含了二进制可执行文件
        |------/sbin        System Binaries                系统的二进制文件
        |------/etc            Configuration Files            配置文件,包含所有程序所需的配置文件,也包含了用于启动/停止单个程序的启动和关闭shell脚本
        |------/dev            Device Files                设备文件,包括终端设备、USB或连接到系统的任何设备
        |------/proc        Process Information            进程信息,包含系统进程的相关信息
        |------/var            Variable Files                变量文件,包括系统日志/var/log、包和数据库文件、电子邮件/var/mail、打印队列/var/spool、锁文件/var/lock、启动的临时文件/var/tmp
/-------|------/tmp            Temporary Files                临时文件,包含系统和用户创建的临时文件,当系统重启时,这个目录下的文件将被删除
        |------/usr            User Programs                用户程序,包含二进制文件、库文件、文档和二级程序的源代码,/usr/bin中包含用户程序的二进制文件,/usr/sbin系统管理员的二进制文件
        |------/home        Home Directories            所有用户用home目录来存储他们的个人档案
        |------/boot        Boot Loader Files            包含引导加载程序相关的文件,内核的initrd、vmlinux、grub文件位于/boot下
        |------/lib            System Libraries            系统库,包含支持位于/bin和/sbin下的二进制文件的库文件
        |------/opt            Optional add-on Apps        可选的附加应用程序,opt代表可选的
        |------/mnt            Mount Directory                挂载目录,临时安装目录,系统管理员可以挂载文件系统
        |------/media        Removable Devices            可移动媒体设备,用于挂载可移动设备的临时目录。
        |------/srv            Service Data                服务数据,包含服务器特定服务相关的数据
        ________________

15. Linux组相关内容        在Linux中的每个用户必须属于一个组,不能独立于组外。在Linux中每个文件有所有者、所有组、其他组的概念
    1)文件/目录所有者    一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者。
        1.1)查看文件的所有者    当某个用户创建了一个文件后,文件所在的所有人默认为该用户
            ls -ahl            查看文件所有者命令,a:all h:humen l:list
            创建一个组police,再创建一个用户tom,将tom放进police组,然后用tom创建一个ok.txt文件
            a. groupadd police
            b. useradd -g police tom
            c. su - tom
            d. touch ok.txt
            e. ls -ahl
        1.2)修改文件的所有者
            chown 用户名 文件名
            使用root创建一个apple.txt,然后将其所有者改为tom
            a. touch apple.txt
            b. chown tom apple.txt
            c. ls -ahl
    2)文件/目录所在组 当某个用户创建了一个文件后,文件所在的组默认为用户所在的组
        2.1)查看文件/目录所在组
            ls -ahl            查看文件所有者命令,a:all h:humen l:list(同查看文件的所有者命令)
        2.2)修改文件/目录所在组
            chgrp 组名 文件名
            使用root用户创建文件orange.txt,看看当前这个文件属于哪个组,然后将这个文件所在组,修改到police组
            a. touch orange.txt
            b. ls -ahl
            c. chgrp police orange.txt
            d. ls -ahl
    3)更改用户所在的组        在添加用户时,可以指定将该用户添加到哪个组中,同样的用root的管理权限可以改变某个用户所在组。
        3.1)usermod -g 组名 用户名
        3.2)usermod -d 目录名 用户名        改变该用户登录的初始目录
        创建一个土匪组(bandit),将tom从原来所在的police组,修改到bandit(土匪)组

16. 权限管理
    1)权限的基本介绍
        ls -l中显示的内容如下:
        -rwxrw-r-- 1 root root 1213 Feb 2 09:39 abc
           0-9     10 11   12   13       14      15
        0-9位说明:
            a. 第0位确定文件类型(d(目录), -(普通文件), c(字符设备,如键盘、鼠标), b(块文件,如硬盘), l(软链接))
            b. 第1-3位确定所有者(该文件的所有者)拥有该文件的权限。---->user
            c. 第4-6位确定所属组(同用户组)拥有该文件的权限。---->group
            e. 第7-9位确定其他用户拥有该文件的权限。------>other
            ps: r:4 w:2 x:1  rwx:7
                rwx作用到文件:
                    r:read读权限,可以读取,查看
                    w:write写权限,可以修改,但是不代表可以删除该文件,删除一个文件的前提是对该文件所在的目录有写权限,才能删除该文件
                    x:execute执行权限,可以被执行
                    -:没权限
                rwx作用到目录:
                    r:read读权限,可以读取,ls查看目录内容
                    w:write写权限,可以修改,目录内创建+删除+重命名目录
                    x:execute执行权限,可以进入该目录
                    -:没权限
        10:如果是文件,表示硬链接的数量,一般值为1;如果是目录,代表着目录下的子目录个数(其中有两个目录是隐藏的:. 和 ..)
        11:所有者
        12:所属组
        13:大小
        14:最后修改时间
        15:名称
    2)权限管理 chmod        通过chmod指令,可以修改文件或者目录权限
        2.1)+、-、=变更权限
            u:所有者,g:所有组,o:其他人,a:所有人(u, g, o的总和)
            a. chmod u=rwx,g=rx,o=x 文件目录名        给文件或目录设置权限rwxrx---x
            b. chmod o+w 文件目录名                    给文件或目录的其他人增加执行权限
            c. chmod a-x 文件目录名                    给所有的用户都去掉一个执行权限
            chmod u=rwx,g=rx,o=rx abc        给abc文件设置所有者读写执行、所属组读执行、其他人读执行的权限
            chmod u-x,g+w abc                给abc文件的所有者去除执行权限,增加组写的权限
            chmod a+r                        给abc文件的所有用户添加读的权限
        2.2)通过数字变更权限
            r:4,w:2,x:1    rwx=4+2+1=7
            chmod u=rwx,g=rx,o=x 文件名
            相当于 chmod 751 文件名
            chmod 755 /home/abc.txt            将/home/abc.txt文件的权限修改成rwxr-xr-x,使用数字的方式实现
    3)修改文件所有者
        3.1)chown newowner file            改变文件的所有者
        3.2)chown newowner:newgroup file    改变文件的所有者和所有组
        -R 如果是目录,则使其下的所有子文件或目录递归生效
        chown tom /home/abc.txt            将/home/abc.txt 文件的所有者改为tom
        chown -R tom /home/kkk            将/home/kkk 目录下所有的文档和目录的所有者都修改成tom
    4)修改文件所有组
        4.1)chgrp newgroup file            改变文件的所属组
        -R 如果是目录,则使其下的所有子文件或目录递归生效
        chgrp bandit abc.txt        把abc.txt文件的所在组修改成bandit(土匪)组
        chgrp -R bandit kkk            把kkk目录下所有的文档和目录的所在组都修改成bandit(土匪)组
    5)权限管理实践
        police, bandit
        jack,jerry:警察
        xh,xd:土匪
        (1) 创建组police和bandit
        (2) 创建用户jack、jerry、xh、xq
        (3) jack创建了一个文件,自己可以读写,本组人可以读,其他人没有任何权限
        (4) jack修改该文件,让其他人可以读,本组人可以读写
        (5) xh投靠警察,看看是否可以读写
        a. groupadd police
        b. groupadd bandit
        c. useradd -g police jack
        d. useradd -g police jerry
        e. useradd -g bandit xh
        f. useradd -g bandit xq
        g. jack: touch jack01.txt
        h. jack: chmod 640 jack01.txt
        i. jack: chmod g+w,o+r jack01.txt
        j. root: usermod -g police xh
        k.
    ps: 文件夹对应成员的权限为r-x时,用户才能进入该目录

17. crond 任务调度        进行定时任务的设置
    1)概述
        任务调度:是指系统在某个时间执行的特定的命令或程序。
        任务调度分类:1.系统工作:有些重要的工作必须周而复始的执行。如病毒扫描等
                      2.个别用户工作:个别用户可能希望执行某些程序,比如对mysql数据库的备份
    2)基本语法
        crontab [选项]
        常用选项:
            -e        编辑crontab定时任务
            -l        查询crontab任务
            -r        删除当前用户所有的crontab任务
        crontab -e        编辑一个定时任务,在保存退出后就开始执行
        crontab -l        列出当前有哪些任务调度
        crontab -r        删除所有的任务调度
        service crond restart        重启任务调度
    3)入门案列
        设置任务调度文件:/etc/crontab
        设置个人任务调度。执行crontab -e命令。
        接着输入任务到调度文件
        如:*/1 * * * * ls -l /etc/ > /tmp/to.txt
        意思说每小时的每分钟执行ls -l /etc/ > /tmp/to.txt命令
        参数细节说明
            项目                含义                    范围
            第一个"*"        一小时当中的第几分钟        0-59
            第二个"*"        一天当中的第几小时            0-23
            第三个"*"        一个月当中的第几天            1-31
            第四个"*"        一年当中的第几月            1-12
            第五个"*"        一周当中的星期几            0-7
        参数特殊符号说明
            *        代表任何时间,比如第一个"*"就代表着一小时中每分钟都执行一次的意思。
            ,        代表着不连续的时间。比如"0 8,12,16 * * * 命令",就代表着在每天的8点0分,12点0分,16点0分都执行一次命令
            -        代表连续的时间范围。比如"0 5 * * 1-6 命令",代表着周一到周六凌晨5点0分执行命令
            */n        代表着每隔多久执行一次。比如"*/10 * * * * 命令",代表每隔10分钟就执行一次命令
        步骤:
            a. crontab -e
            b. 输入:*/1 * * * * ls -l /etc/ >> /tmp/to.txt
            c. 保存退出后就生效
            d. 在每一分钟都会自动的调用 ls -l /etc/ >> /tmp/to.txt 命令
        特定时间执行案列
        45 22 * * * 命令                在每天22点45分执行命令
        0 17 * * 1 命令                    在每周一的17点0分执行命令
        0 5 1,15 * * 命令                在每月的1号15号的5点0分执行命令
        40 4 * * 1-5 命令                在每周一到周五的4点40分执行命令
        */10 4 * * * 命令                在每天的4点每隔10分钟执行一次命令
        0 0 1,15 * 1 命令                在每月1号和15号,每周1的0点0分都会执行一次命令
    4)应用实例
        案例1:每隔1分钟,就将当前的日期信息,追加到/tmp/mydate 文件中
            a. 先编写一个文件 /home/mytask1.sh
                date >> /tmp/mydate
            b. 给mytask1.sh 一个可执行权限
                chmod 744 mytask1.sh
            c. crontab -e
            d. */1 * * * * /home/mytask1.sh
            e. 成功
        案例2:每隔1分钟,将当前日期和日历都追加到/home/mycal 文件中
            a. 先编写一个文件 /home/mytask2.sh
                date >> /tmp/mycal
                cal >> /tmp/mycal
            b. 给mytask1.sh 一个可执行权限
                chmod 744 mytasks.sh
            c. crontab -e
            d. */1 * * * * /home/mytask2.sh
            e. 成功
        案例3:每天凌晨2:00将mysql数据库testdb,备份到文件中 mydb.bak。
            a. 先编写一个文件 /home/mytask3.sh
                /usr/local/mysql/bin/mysqldump -uroot -proot testdb > /tmp/mydb.bak
            b. 给mytask1.sh 一个可执行权限
                chmod 744 mytask3.sh
            c. crontab -e
            d. 0 2 * * * /home/mytask3.sh
            e. 成功

18. Linux磁盘分区、挂载
    1)分区基础知识
        分区的方式:
        1.1)mbr分区:
            1. 最多支持四个主分区
            2. 系统只能安装在主分区
            3. 扩展分区要占一个主分区
            4. MBR最大只支持2TB,但拥有最好的兼容性
        1.2)gtp分区:
            1. 支持无限多个主分区(但操作系统可能限制,比如window下最多128个分区)
            2. 最大支持18EB的大容量(1EB=1024PB,1PB=1024TB)
            3. window7 64位以后支持gtp
    2)Linux分区
        原理介绍:
        2.1)Linux来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成整个文件系统的一部分。
        2.2)Linux采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得。
        lsblk -f        查看系统的分区和挂载的情况
        lsblk            可以查看分区的大小
        ps:记忆命令的方法:老师不离开 lsblk
    3) 挂载的经典案例
        需求是给我们的Linux系统增加一个新的硬盘,并且挂载到/home/newdisk
        3.1)如何增加一块硬盘
            a. 虚拟机添加硬盘        通过虚拟机操作添加,然后重启centos系统
                在[虚拟机]菜单中,选择[设置],然后在设备列表中添加硬盘,然后一路[下一步],中间只有选择磁盘大小的地方需要修改,直到完成,然后重启系统(才能识别)!
            b. 分区                    fdisk /dev/sdb
                开始分区后输入n,然后选择p,分区类型为主分区。两次回车默认剩余全部空间。最后输入w写入分区并退出,若不保存退出输入q。
            c. 格式化                mkfs -t ext4 /dev/sdb1
            d. 挂载                    先创建一个目录/home/newdisk,挂载mount /dev/sdb1 /home/newdisk
            e. 设置可以自动挂载(永久挂载,当你重启系统,仍然可以挂载到/home/newdisk)
                1. vim /etc/fstab
                2. 添加一个挂载记录,如:/dev/sdb1        /home/newdisk        ext4    default        0 0
                3. mount -a
            ps: 卸载磁盘的命令 umount /home/newdisk
    4)磁盘情况查询
        4.1)查询系统整体磁盘使用情况
            df -h
        4.2)查询指定目录的磁盘占用情况
            du 选项 /目录
            选项:
                -s    指定目录占用大小汇总
                -h    带计量单位
                -a    含文件
                --max-depth=1 子目录深度
                -c    列出明细的同时,增加汇总值
            案例:查询/opt/目录的磁盘占用情况,深度为1
                du -ach --max-depth=1 /opt/
        4.3)磁盘情况-工作实用指令
            1)统计/home文件夹下文件的个数
                ls -l /home | grep "^-" | wc -l
            2)统计/home文件夹下目录的个数
                ls -l /home | grep "^d" | wc -l
            3)统计/home文件夹下文件的个数,包括子文件夹里的文件
                ls -lR /home | grep "^-" | wc -l
            4)统计文件夹下目录的个数,包括子文件夹里的
                ls -lR /home | grep "^d" | wc -l
            5)以树状显示目录结构
                tree        显示根目录下的文件及目录树形结构
                tree 目录    显示指定目录下的文件及目树形录结构

19. Linux网络配置
    1)Linux网络配置原理图(含虚拟机)
        目前我们的网络配置采用的是NAT模式。
    2)查看网络IP和网关
    3)ping 测试主机之间网络连通
    4)Linux网络环境配置
        4.1)自动获取
            缺点:Linux启动后悔自动获取IP,缺点是每次自动获取的ip可能不一样,这个不适用于做服务器,因为我们的服务器的ip需要是固定的。
        4.2)指定固定的ip
            直接修改配置文件来指定IP,并可以连接到外网(程序员推荐),编辑vi /etc/sysconfig/network-scripts/ifcfg-eth0
            要求:将ip地址配置成静态的,ip地址为192.168.184.130
            ps:修改后需要重启一下服务,有两种方式:
                1. 重启系统
                2. 重启网络服务 :service network restart

20. 进程管理
    1)基本介绍
        1.1)在Linux中,每个执行的程序(代码)都称为一个进程。每一个进程都分配一个ID号。
        1.2)每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程。例如www服务器
        1.3)每个进程都可能以两种方式存在的。前台与后台,所谓前台进程就是用户目前的屏幕上可以进行操作的。后台进程则是实际在操作,但由于屏幕上无法看到的进程,通常使用后台方式执行。
        1.4)一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中,知道关机才结束。
    2)显示系统执行的进程
        基本介绍:
            ps命令用来查看目前系统中,有哪些正在执行,以及它们执行的情况。可以不加任何参数。
            ps显示的信息选项:
                PID            进程识别号
                TTY            终端机号
                TIME        此进程所消耗cpu时间
                CMD            正在执行的命令或进程名
            ps -a        显示当前终端的所有进程信息
            ps -u        以用户的格式显示进程信息
            ps -x        显示后台进程运行的参数
        说明:查看进程使用的指令是 ps,一般来说使用的参数是 ps -aux
        
        ps详解:
        a. 指令:ps -aux | grep xxx
        USER    PID    %CPU    %MEM    VSZ    RSZ    TTY    STAT    START    TIME    COMMAND
        System V展示风格
        USER:用户名陈
        PID:进程号
        %CPU:进程占用CPU的百分比
        %MEM:进程占用物理内存的百分比
        VSZ:进程占用的虚拟内存大小(单位:KB)
        RSS:进程占用的物理内存大小(单位:KB)
        TTY:终端名称,缩写
        STAT:进程的状态 S:休眠 s:是会话的先导进程 N:拥有比普通优先级更低的优先级 R:正在运行 D:短期等待 Z:僵尸进程 T:被跟踪或被停止
        START:进程的启动时间
        TIME:进程使用cpu的总时间
        COMMAND:启动进程所用的命令和参数,如果过长会被截断显示
    3)应用实例
        要求:以全格式显示当前所有的进程,查看进程的父进程
            ps -ef        是以全格式显示当前所有的进程
            -e 显示所有进程        -f 全格式
            ps -ef | grep xxx
                是BSD风格
                UID:用户ID
                PID:进程ID
                PPID:父进程ID
                C:CPU用于计算机执行优先级的因子。数值越大,表明进程是CPU密集型运算,执行优先级会越低;数值越小,表明进程是I/O密集型运算,执行优先级会提高
                STIME:进程启动的时间
                TTY:完整的终端名称
                TIME:CPU时间
                CMD:启动进程所用的命令和参数
            思考:如果我们希望查看sshd进程的父进程号是多少,应该怎样查询?
                ps -ef | grep sshd
    4)终止进程kill和killall
        4.1)介绍
            若是某个进程执行一般需要停止时,或是已消耗了很大的系统资源时,此时可以考虑停止该进程,使用kill命令来完成此项任务。
        4.2)基本语法
            kill 选项 进程号    通过进程号杀死进程
            killall 进程名称    通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用
        4.3)常用选项
            -9    表示强迫进程立即停止
        4.4)最佳实践
            案例1:踢掉某个非法登录用户
                a. ps -aux | grep sshd        找到对应的进程id
                b. kill 4010                kill掉进程id对应的进程
            案例2:终止远程登录服务sshd,在适当时候再次重启sshd服务
                a. ps -aux | grep sshd        找到对应的进程id
                b. kill 3908                kill掉进程id对应的进程
            案例3:终止多个gedit编辑器[killall,通过进程名陈来终止进程]
                a. killall gedit
            案例4:强制杀掉一个终端
                a. ps -aux | grep bash        查到终端对应的进程ID
                b. kill -9 4090                强制kill掉进程id对应的进程
        4.5)查看进程树pstree
            基本语法:
                pstree 选项        可以更加直观的来看进程信息
                选项:
                    -p    :显示进程的PID
                    -u    :显示进程的所属用户
            应用场景:
                案例1:请你树状的形式显示进程的pid
                    pstree -p
                案例2:请你树状的形式显示用户的id
                    pstree -u
        PS:安装pstree的指令是:yum install psmisc
    5)服务(service)管理
        5.1)介绍
            服务(service)本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其他程序的请求,比如(mysql,sshd,防火墙等),因此我们又称为守护进程,是Linux中非常重要的知识点。
        5.2)service管理指令
            service 服务名 start | stop | restart | reload | status
            在centos7.0后不再使用service,而是用systemctl
        5.3)使用案例
            1)查看当前防火墙的状况,关闭防火墙和重启防火墙。
        5.4)细节讨论
            1)关闭或者启用防火墙后,立即生效。[telnet 测试某个端口即可]
            2)这种方式知识临时生效,当重启系统后,还是回归以前对服务器的设置。
            3)如果希望设置某个服务自启动或关闭永久生效,要使用chkconfig指令
        5.5)查看服务名:
            方式1:使用setup->系统服务 就可以看到
            方式2:/etc/init.d/服务名称
                ls -l /etc/init.d/        列出系统有哪些服务
        5.6)服务的运行级别(runlevel):
            1)查看或者修改默认级别:vi /etc/inittab
            2)Linux系统有7种运行级别(runlevel):常用的级别是3和5
                运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
                运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
                运行级别2:多用户状态(没有NFS),不支持网络
                运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
                运行级别4:系统未使用,保留
                运行级别5:X11控制台,登陆后进入图形GUI模式
                运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
            3)开机的流程说明:
                开机->BIOS->/boot->init进程->运行级别->运行级别对应的服务
            4)chkconfig指令
                介绍:
                    通过chkconfig命令可以给各个运行级别设置自启动/关闭
                基本语法
                    a. 查看服务 chkconfig --list | grep xxx
                    b. chkconfig 服务名 --list
                    c. chkconfig --level 5 服务名 on/off
                PS: 在Centos7.0 开始,换成了systemctl命令,具体操作请找度娘
                    如:chkconfig --list -> systemctl list-unit-files
                        chkconfig --level 5 sshd off -> systemctl disable sshd.service
                        chkconfig --level 5 sshd on -> systemctl enable sshd.service
                        chkconfig --list | grep sshd -> systemctl list-dependencies sshd
                应用实例:
                    案例1:请显示当前系统所有服务的各个运行级别的运行状态
                        chkconfig --list
                    案例2:请查看sshd服务的运行状态
                        service sshd status
                    案例3:将sshd服务在运行级别5下设置为不自动启动,看看有什么效果?
                        chkconfig --level 5 sshd off
                    案例4:当运行级别为5时,关闭防火墙
                        chkconfig --level 5 iptables off
                    案例5:在所有运行级别下,关闭防火墙
                        chkconfig iptables off
                    案例6:在所欲运行级别下,开启防火墙
                        chkconfig iptables on
                使用细节:
                    a. chkconfig重新设置服务后自启动或关闭,需要重启机器reboot才能生效
    6)动态监控进程
        6.1)介绍
            top与ps命令很相似,他们都用来显示正在执行的进程。top与ps最大的不同之处,在于top在执行一段时间可以更新正在运行的进程。
        6.2)基本语法
            top 选项
        6.3)选项说明
            -d 秒数        指定top命令每隔几秒更新。默认是3秒,在top命令的交互模式当中可以执行的命令。
            -i            使top不显示任何闲置或者僵尸进程
            -p            通过指定监控进程ID来仅仅监控某个进程的状态
        6.4)交互操作说明
            P            以cpu使用频率排序,默认就是此项
            M            以内存的使用频率排序
            N            以PID排序
            q            退出top
        6.5)应用案例
            案例1:监视特定用户
                top: 输入此命令,按回车键,查看执行的进程
                u: 然后输入"u"回车,再输入用户名,即可
            案例2:终止指定的进程
                top: 输入此命令,按回车键,查看执行的进程
                k: 然后输入"k"回车,再输入要结束
            案例3:指定系统状态更新的时间(每隔10秒自动更新)
                top -d 10
        6.6)top显示的内容解释
        top 20:51:22 up 3:22, 3USERS, load average: 0.35, 0.24, 0.30
        (当前时间,系统运行时间,当前登录系统用户数量,负载均衡(三个数加在一起除以3超过0.7时,说明系统有点不稳定了))
        Tasks: 204 total, 1 running, 203 sleeping, 0 stopped, 0 zombine
        (总任务数量,正在运行的任务数量,挂载的任务数量,停止,僵尸)
        Cpu(s): 0.8%us, 0.5%sy, 0.0%ni, 98.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
        (用户占用的cpu,系统占用的cpu,,空闲的,)
        Mem: 2038376K total, 783520k used, 1254856k free, 29636k buffers
        (内存的总大小,使用了多少,还有多少空闲,)
        Swap: 2097148k total, 0k used, 2097148k free, 389404k cached
        (内存不够用了才会用swap分区)
    7)监控网络状态
        查看系统网络情况netstat
        7.1)基本语法
            netstat 选项
            netstat -anp | more        常用指令,查看所有网络服务
        7.2)选项说明
            -an 按一定顺序排列输出
            -p 显示哪个进程在调用
        7.3)应用实例
            请查看服务名为sshd的服务的信息
        7.4)检测主机连接命令ping:
            是一种网络检测工具,它主要是用检测远程主机是否正常,或是两部主机间的介质是否为断、网线是否脱落或网卡故障
            如:ping对方ip地址
        7.5)

21. RPM和YUM
    1)rpm包的管理
        1.1)介绍
            一种用于互联网下载包的打包及安装工具,它包含在某些Linux发布版本中。它生成具有.RPM扩展名的文件。
            RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,类似windows的setup.exe,这一文件格式名称虽然打上了RedHat的标志,但理念是通用的。
        1.2)rpm包的简单查询指令:
            查询已安装的rpm列表 rpm -qa | grep xxx
        1.3)rpm包名基本格式
            一个rpm保命:firefox-45.0.1-1.el6.centos.x86_64.rpm
            名称:firefox
            版本号:45.0.1-1
            适用操作系统:el6.centos.x86_64    表示centos6.x的64位系统
            如果是i686、i386表示32位系统,noarch表示通用
        1.4)rpm包的其它查询指令:
            rpm -qa        查询所安装的所有rpm软件包
            rpm -qa | more        分页显示
            rpm -qa | grep XX        如:rpm -qa | grep firefox
            
            rpm -q 软件包名        查询软件包信息
            rpm -q firefox
            
            rpm -qi 软件包名    查询安装的rpm包软件的信息
            rpm -qi file
            
            rpm -ql 软件包名    查询rpm包的文件安装到哪里去了
            rpm -ql firefox
            
            rpm -qf 文件全路径名    查询某个文件属于哪个rpm包
            rpm -qf /etc/passwd
            rpm -qf /root/install.log
        1.5)卸载rpm包
            基本语法:
                rpm -e RPM包的名称
            应用案例
                1)删除firefox软件包
            细节讨论
                1)如果其他软件包依赖于你要卸载的软件包,卸载时则会产生错误信息。
                    如:rpm -e foo
                    removing these packages would break dependencies:foo is needed by bar-1.0-1
                2)如果我们就是要删除foo这个rpm包,可以增加参数--nodeps,就可以强制删除,但是一般不推荐这样做,因为依赖于该软件的程序可能无法运行
                    如:rpm -e --nodeps foo
        1.6)安装rpm包
            基本语法:
                rpm -ivh RPM包全路径名称
            参数说明:
                i=install 安装
                v=verbose 提示
                h=hash      进度条
            应用实例:
                1)演示卸载和安装firefox浏览器
                    a. 先找到firefox的安装rpm包,需要挂载上我们安装centos的iso文件,然后到/media/下去找rpm包。
                    b. cp firefox-45.0.1-1.el6.centos.x86_64.rpm /opt/
                    c. rpm -ivh firefox-45.0.1-1.el6.centos.x86_64.rpm
    2)yum
        介绍:
            YUM是一个Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。
        yum的基本指令:
            查询yum服务器是否有需要安装的软件
                yum list | grep XX            软件列表
            安装指定的yum包
                yum install XXX                下载安装
        yum应用实例:
            案例:请使用yum的方式来安装firefox
                a. 先查看一下firefox rpm 在yum 服务器上是否存在
                    yum list | grep firefox
                b. 安装
                    yum install firefox        会安装最新版本

22. Linux之JavaEE定制篇
    1)概述
        如果在Linux下进行JavaEE的开发,我们需要安装如下软件:
            mysql-5.6.14.tar.gz
            jdk-7u79-linux-x64.gz
            eclipse-jee-mars-2-linux-gtk-x86_64.tar.gz
            apache-tomcat-7.0.70.tar.gz
    2)安装JDK
        安装步骤
            a. 先将软件通过xftp5上传到/opt/路径下
            b. 解压缩到/opt/路径下
            c. 配置环境变量的配置文件vim /etc/profile
            d. JAVA_HOME=/opt/jdk1.7.0_79
            e. PATH=/opt/jdk1.7.0_79/bin:$PATH
            f. export JAVA_HOME PATH
            g. 需要注销用户,环境变量才能生效
        测试是否安装成功
            编写一个简单的hello.java 输出"hello, world!"
    3)安装tomcat
        安装步骤
            a. 解压缩到/opt/路径下
                tar -zxvf apach-tomcat-7.0.70.tar.gz
            b. 启动tomcat ./startup.sh
                先进入tomcat的bin目录:cd apach-tomcat-7.0.70/bin/
            c. 开放端口,这样外网才能访问tomcat
                vim /etc/sysconfig/iptables
                增加一行:A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
                重启防火墙:service iptables restart
        测试是否安装成功
            在windows或linux下访问http://linuxip:8080
    4)Eclipse安装
        安装步骤
            a. 解压缩到/opt/路径下
                tar -zxvf eclipse-jee-mars-2-linux-gtk-x86_64.tar.gz
            b. 启动eclipse,配置jre和server
            c. 编写hello world程序并测试
            d. 编写jsp页面,并测试
    5)mysql5.6的安装和配置,安装包地址:https://pan.baidu.com/s/1powjyUaS_Sh__ydReComRw
        CentOS 6.8 下编译安装MySQL5.6.14
        概述:
        通过源代码安装高版本的5.6.14
        正文:
        一:卸载旧版本
            使用下面的命令检查是否安装有MySQL Server
            rpm -qa | grep mysql
            有的话通过下面的命令来卸载掉
            目前我们查询到的是这样子的:
            [root@hsp ~]#rpm -qa | grep mysql
            mysql-libs-5.1.73-7.el6.x86_64
            如果查询到了,就删除吧
            rpm -e mysql_libs                // 普通删除模式
            rpm -e --nodeps mysql_libs        // 强力删除模式,如果使用上面命令删除时,提示有依赖的其他文件,则用该命令可以对其进行强力删除
        二:安装MySQL
            安装编译代码需要的包
            yum -y install make gcc-c++ cmake bison-devel ncurses-devel
            下载MySQL 5.6.14 [这里我们已经下载好了,看软件文件夹],MySQL 5.6.14的路径:
            进入mysql压缩包所在的路径:cd /opt/
            tar -zxvf mysql-5.6.14.tar.gz
            cd mysql-5.6.14
            编译安装[源码-》编译]
            cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
            编译并安装
            make && make install
            整个过程需要30分钟左右。
        三:配置MYSQL
            设置权限
            使用下面的命令查看是否有mysql用户及用户组
            cat /etc/passwd        查看用户列表
            cat /etc/group        查看用户组列表
            如果没有就创建
            groupadd mysql
            useradd -g mysql mysql
            修改/usr/local/mysql权限
            chown -R mysql:mysql /usr/local/mysql
            初始化配置,进入安装路径(再执行下面的指令),执行初始化配置脚本,创建系统自带的数据库和表
            cd /usr/local/mysql
            scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
        注:在启动MySQL服务时,会按照一定次序搜索my.cnf,先在/etc/目录下查找,找不到则会搜索"$basedir/my.cnf",在本例中就是/usr/local/mysql/my.cnf,这是新版MySQL的配置文件的默认位置!
        
        注意:在CentOS 6.8 版操作系统的最小安装完成后,在/etc/目录下会存在一个my.cnf,需要将此文件更名为其他的名字,如:/etc/my.cnf.bak,否则,该文件会干扰源码安装的MySQL的正确配置,造成无法启动。
        mv /etc/my.cnf /etc/my.cnf.bak
        
        启动 MySQL
        添加服务,拷贝服务脚本到init.d目录,并设置开机启动
        [注意在/usr/local/mysql下执行]
        cp support-files/mysql.server /etc/init.d/mysql
        chkconfig mysql on
        service mysql start            启动MySQL
        
        执行下面的命令修改root密码
        cd /usr/local/mysql/bin
        ./mysql -uroot
        mysql>SET PASSWORD = PASSWORD('root');
        通过vim /etc/profile,添加环境变量
        
        PS:CentOS 7 MySQL安装,亲测可用:https://www.cnblogs.com/chxuyuan/p/7707392.html
    6)

23. Linux之大数据定制篇
    大数据定制篇-Shell编程
    1)为什么要学习Shell编程
        1.1)Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理。
        1.2)对于JavaEE和Python程序员来说,工作的需要,你的老大会要求你编写一些Shell脚本进行程序或是服务器的维护,比如编写一个定时备份数据库的脚本。
        1.3)对于大数据程序员来说,需要编写Shell程序来管理集群。
    2)Shell是什么
        Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
    3)Shell编程快速入门---Shell脚本的执行方式
        a. 脚本格式要求
            1)脚本以#!/bin/bash开头
            2)脚本需要有可执行权限
        b. 编写第一个Shell脚本
            需求说明
            创建一个Shell脚本,输出hello world
            1. 编写一个shell文件:vim myShell.sh
            2. 输入内容
                #!/bin/bash
                echo "hello,world"
                保存并退出
            3. 更改权限,使之有可执行的权限
                chmod 744 myShell.sh
            4. 执行可执行文件,即myShell.sh文件
                ./myShell.sh
        c. 脚本的常用执行方式
            方式1(输出脚本的绝对路径或相对路径)
                1)首先要赋予helloworld.sh 脚本的+x权限(可执行)
                    chmod u+x helloworld.sh
                2)执行脚本
                    ./helloworld.sh
            方式2(sh+脚本)
                说明:不用赋予脚本+x权限,直接执行即可。
                    sh helloworld.sh
    4)Shell的变量
        4.1)Shell的变量的介绍
            1)Linux Shell中的变量分为:系统变量和用户自定义变量。
            2)系统变量:$HOME、$PWD、$SHELL、$USER等等
                比如:echo $HOME 等等
            3)显示当前Shell中所有变量: set
        4.2)Shell变量的定义
            基本语法:
            1)定义变量:变量=值
            2)撤销变量:unset 变量
            3)声明静态变量:readonly变量,注意:不能unset
            快速入门:
                案例1:定义变量A
                    A=100            定义变量A
                    echo "A=$A"        输出变量A的值
                    结果:A=100
                案例2:撤销变量A
                    unset A            注销变量A
                    echo "A=$A"        输出变量A的值
                    结果:A=
                案例3:声明静态的变量B=2,不能unset
                    readonly B=2    定义静态变量
                    echo "B=$B"        输出静态变量
                    unset B            注销静态变量,会出错,静态变量不能注销
                    echo "B=$B"
                案例4:可把变量提升为全局环境变量,可提供其他shell程序使用
            4)定义变量的规则
                a. 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
                b. 等号两侧不能有空格
                c. 变量名称一般习惯为大写
            5)将命令的返回值赋给变量(重点)
                a. A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A
                b. A=$(ls -la) 等价于反引号
                PS:反引号是键盘的左上角,Esc下面的那个键,引文状态下点击即可`
    5)Shell设置环境变量
        5.1)基本语法
            1)export 变量名=变量值        将shell变量输出为环境变量
            2)source 配置文件            让修改后的配置信息立即生效
            3)echo 变量名                查询环境变量的值
        5.2)快速入门
            1)在/etc/profile文件中定义TOMCAT_HOME环境变量
                a. vim /etc/profile
                b. 在末尾添加 TOMCAT_HOME=/opt/tomcat
                c. source /etc/profile
            2)查看环境变量TOMCAT_HOME的值
                echo $TOMCAT_HOME
            3)在另外一个shell程序中使用TOMCAT_HOME
                a. vim myShell.sh
                b. 在里面输入 echo "TOMECAT_HOME=$TOMECAT_HOME"
                c. ./myShell.sh
            注意:在输出TOMCAT_HOME环境变量前,需要让其生效
            source /etc/profile
        PS:# 被注释的内容    是单行注释
            :<<!            开始
            被注释的内容
            !                结束
    6)位置参数变量
        6.1)介绍
            当我们执行一个shell脚本时,如果希望获取命令行的参数信息,就可以使用到位置参数变量
            比如:./myshell.sh 100 200,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息
        6.2)基本语法
            $n    n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}
            $*    这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
            $@    这个变量也代表命令行中所有的参数
            $#    这个变量代表命令行中所有参数的个数
        6.3)位置参数变量
            应用案例
            案例:编写一个shell脚本positionPara.sh,在脚本中获取到命令行的各个参数信息。
                a. vim positionPara.sh
                b. 输入
                    #!/bin/bash
                    echo "$0 $1 $2"
                    echo "$*"
                    echo "$@"
                    echo "参数个数=$#"
                    保存并退出
                c. 使文件拥有可执行权限 chmod 744 positionPara.sh
                d. 执行 ./positionPara.sh 30 60
                e. 结果
                    ./positionPara.sh 30 60
                    30 60
                    30 60
                    参数个数=2
    7)预定义变量
        7.1)基本介绍
            就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
        7.2)基本语法
            $$        当前进程的进程号(PID)
            $!        后台运行的最后一个进程的进程号(PID)
            $?        最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;否则(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确。
        7.3)应用实例
            在一个shell脚本中简单使用一下预定义变量
            a. vim preVar.sh
            b. 输入
                #!/bin/bash
                echo "当前的进程号=$$"
                #后台的方式运行 myShell.sh
                ./myShell.sh &
                echo "最后的进程号=$!"
                echo "执行的值=$?"
            c. 使文件拥有可执行权限 chmod 744 preVar.sh
            d. 执行 ./preVar.sh
            e. 结果
                当前的进程号=22083
                最后的进程号=22084
                执行的值=0
    8)运算符
        8.1)基本介绍
            学习如何在shell中进行各种运算符操作
        8.2)基本语法
            1)"$((运算符))"或"$[运算符]"
            2)expr m + n
                注意expr运算符间要有空格
            3)expr m - n
            4)expr \*,/,% 乘,除,取余
            应用实例
                案例1:计算(2+3)*4的值
                1. $(运算符)
                    RESULT1=$(((2+3)*4))
                    echo "result1=$RESULT1"
                2. $[运算式]
                    RESULT2=$[(2+3)*4]
                    echo "result2=$RESULT2"
                3. expr
                    TEMP=`expr 2 + 3`
                    RESULT3=`expr $TEMP \* 4`
                    echo "result3=$RESULT3"
                案例2:请求出命令行的两个参数[整数]的和
                    SUM=$[$1+$2]
                    echo "sum=$SUM"
    9)条件判断
        9.1)判断语句
            [ condition ]        注意condition前后要有空格
            #非空返回true,可使用$?验证(0为true,>1为false)
        9.2)实用案例
            [ atguigu ]                                返回true
            []                                        返回false
            [ condition ] && echo OK || echo notok    条件满足,执行后面的语句
    10)条件判断
        10.1)判断语句
            常用判断条件
                1)两个整数的比较
                    =        字符串比较
                    -lt        小于 little
                    -le        小于等于 little equal
                    -eq        等于 equal
                    -gt        大于 greater
                    -ge        大于等于 greater equal
                    -ne        不等于 not equal
                2)按照文件权限进行判断
                    -r        有读权限
                    -w        有写权限
                    -x        有执行权限
                3)按照文件类型进行判断
                    -f        文件存在并且是一个常规的文件 file
                    -e        文件存在 exit
                    -d        文件存在并且是一个目录 directory
                4)应用实例
                    案例1:"ok"是否等于"ok"
                        a. vim judge.sh
                        b. 输入
                            #!/bin/bash
                            if [ "ok" = "ok" ]
                            then
                                echo "equal"
                            fi
                            保存并退出
                        c. 更改权限,使之有可执行的权限 chmod 744 judge.sh
                        d. ./judge.sh
                        e. 结果
                            equal
                    案例2:23是否大于等于22
                        a. vim judge.sh
                        b. 输入
                            if [ 23 -ge 22 ]
                            then
                                echo "23>=22"
                            fi
                            保存并退出
                        c. ./judge.sh
                        d. 结果
                            23>=22
                    案例3:/root/shell/aaa.txt目录中的文件是否存在
                        a. vim judge.sh
                        b. 输入
                            if [ -e /root/shell/aaa.txt ]
                            then
                                echo "exit"
                            fi
                            保存并退出
                        c. ./judge.sh
                        d. 结果
                            exit
                PS:if条件的格式是
                    if [ condition ]        // 条件判断
                    then                    // 满足条件则进行相应处理
                    fi                        // 条件结束,final
    11)if 判断
        11.1)基本语法
            if [ condition ];then
                程序
            fi
            或者
            if [ condition ]
            then
                程序
            elif [ condition ]
                then
                    程序
            fi
            注意事项:
                (1)    [ condition ],中括号和condition之间必须有空格
                (2) 推荐使用第二种
        11.2)应用实例
             案例:请编写一个shell程序,如果输入的参数大于等于60,则输出"及格了",如果小于60,则输出"不及格"
                a. vim testIf.sh
                b. 输入
                    #!/bin/bash
                    if [ $1 -ge 60 ]
                    then
                        echo "及格了"
                    elif [ $1 -lt 60 ]
                    then
                        echo "不及格"
                    fi
                    保存并退出
                c. 更改权限,使之有可执行的权限 chmod 744 testIf.sh
                d. 执行 ./testIf.sh 67
                e. 结果
                    "及格了"
    12)case 语句
        12.1)基本语法
            case $变量名 in
            "值1")
            如果变量的值等于值1,则执行程序1
            ;;
            "值2")
            如果变量的值等于值1,则执行程序2
            ;;
            *)
            如果变量的值都不是以上的值,则执行此程序
            ;;
            esac
        12.2)应用实例
            案例1:当命令行参数是1时,输出"周一",是2时,就输出"周二",其它情况输出"other"
                a. vi testCase.sh
                b. 输入
                    #!/bin/bash
                    case $1 in
                    "1")
                    echo "周一"
                    ;;
                    "2")
                    echo "周二"
                    ;;
                    *)
                    echo "其它"
                    ;;
                    esac
                c. 更改权限,使之有可执行的权限 chmod 744 testCase.sh
                d. 执行 ./testCase.sh 1
                e. 结果
                    周一
    13)for 循环
        13.1)基本语法1
            for 变量 in 值1 值2 值3 ...
             do
                程序
             done
        13.2)应用案例
            案例1:打印命令行输入的参数
                a. vim testFor.sh
                b. 输入
                    #!/bin/bash
                    for i in "$*"        // 或用 for i in "$@" 也可以,只不过$*是输出一行,而$@是每个参数输出一行
                    do
                        echo "the num is $i"
                    done
                    退出并保持
                c. 更改权限,使之有可执行的权限 chmod 744 testFor.sh
                d. 执行 ./testFor.sh 1 2 3
                e. 结果
                    // 用$*输出的结果
                    the num is 1 2 3
                    // 用$@输出的结果
                    the num is 1
                    the num is 2
                    the num is 3
        13.3)基本语法2
            for((初始值;循环控制条件;变量变化))
             do
                程序
             done
        13.4)应用案例
            案例1:从1加到100的值输出显示[这里可以看出$*和$@的区别]
                a. vim testFor2.sh
                b. 输入
                    #!/bin/bash
                    SUM=0
                    for((i=0;i<=100;++i))
                    do
                        SUM=$[$SUM+$i]
                    done
                    echo "SUM=$SUM"
                    保持并退出
                c. 更改权限,使之有可执行的权限 chmod 744 testFor2.sh
                d. 执行 ./testFor2.sh
                e. 结果
                    SUM=5050
    14)while 循环
        14.1)基本语法1
            while[条件判断式]
            do
                程序
            done
        14.2)应用实例
            案例1:从命令行输入一个数n,统计从1+..+n的值是多少?
                a. vim testWhile.sh
                b. 输入
                    #!/bin/bash
                    SUM=0
                    i=0
                    while [ $i -le $1 ]
                    do
                        SUM=$[$SUM+$i]
                        i=$[$i+1]
                    done
                    echo "SUM=$SUM"
                    保持并退出
                c. 更改权限,使之有可执行的权限 chmod 744 testWhile.sh
                d. 执行 ./testWhile.sh 10
                e. 结果
                    SUM=55
    15)read读取控制台输入
        15.1)基本语法
            read [选项] {参数}
            选项:
                -p        指定读取值时的提示符
                -t        指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了
            参数
                变量    指定读取值得变量名
        15.2)应用实例
            案例1:读取控制台输入一个num值
                a. vim testRead.sh
                b. 输入
                    read -p "请输入一个数num1=" NUM1
                    echo "你输入的值是num1=$NUM1"
                    保存并退出
                c. 更改权限,使之有可执行的权限 chmod 744 testRead.sh
                d. 执行
                    ./testRead.sh
                    123
                e. 结果
                    你输入的值是num1=123
            案例2:读取控制台输入一个num值,在10秒内输入
                a. vim testRead.sh
                b. 输入
                    read -t -p "请输入一个数num2=" NUM2
                    echo "你输入的值是num2=$NUM2"
                    保存并退出
                c. 执行 ./testRead.sh 不输入内容,等待10秒
                d. 结果
                    请输入一个数num2=你输入的值是num2=
    16)系统函数
        16.1)函数介绍
            shell编程和其他编程语言一样,有系统函数,也可以自定义函数。系统函数中,我们这里只学习两个。
        16.2)basename基本语法
            功能:返回完整路径最后/的部分,常用于获取文件名
            basename [pathname] [suffix]
            basename [string] [suffix]        basename命令会删掉所有的前缀包括最后一个('/')字符,然后将字符串显示出来。
            选项:
                suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
        16.3)应用实例
            案例1:请返回/home/aaa/test.txt的"test.txt"部分
                a. basename /home/aaa/test.txt
                b. 显示 test.txt
                c. basename /home/aaa/test.txt .txt
                d. 显示 test
        16.4)dirname 基本用法
            功能:返回完整路径最后/的前面的部分,常用于返回路径部分
            dirname 文件绝对路径    从给定的包含绝对路径的文件名中取出文件名(非目录的部分),然后返回剩下的路径(目录的部分)
        16.5)应用案例
            案例1:请返回 /home/aaa/test.txt 的/home/aaa
                a. dirname /home/aaa/test.txt
                b. 显示 /home/aaa
    17)自定义函数
        17.1)基本语法
            function funname()
            {
                Action;
                [return int;]
            }
        调用直接写函数名:funname [值]
        17.2)应用案例
            案例1:计算输入两个参数的和,getSum
                a. vim testFun.sh
                b. 输入
                    #!/bin/bash
                    function getSum()
                    {
                        SUM=$n1+$n2
                        echo "sum=$SUM"
                    }
                    
                    read -p "请输入第一个参数n1=" n1
                    read -p "请输入第一个参数n2=" n2
                    
                    getSum $n1 $n2
                    保存并退出
                c. 更改权限,使之有可执行的权限 chmod 744 testFun.sh
                d. 执行 ./testFun.sh
                    90
                    10
                e. 结果
                    sum=100
    18)Shell编程的综合案例
        18.1)需求分析
            1)每天凌晨2:10分备份数据库atguiguDB到/data/backup/db
            2)备份开始和备份结束能够给出相应的提示信息
            3)备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如2018-03-12_230210.tar.gz
            4)在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。
        18.2)实现流程
            a. vim mysql_db_backup.sh
            b. 输入内容如下:
                #!/bin/bash
                #完成数据库的备份
                #备份数据库
                BACKUP=/data/backup/db
                #当前的时间作为文件名
                DATETIME=${date +%Y-%m-%d_%H%M%S}
                #可以输出变量进行调试
                echo ${DATETIME}
                echo "-------------begin-------------"
                echo "-----------开始备份------------"
                #主机
                HOST=localhost
                #用户名
                DB_USER=root
                #密码
                DB_PWD=root
                #备份数据库名
                DATABASE=atguiguDB
                #创建备份的路径
                #如果备份的路径文件夹存在,就使用,否则就创建
                [ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
                #执行mysql的备份数据库的指令
                mysqldump -u${DB_USER} -p${DB_PWD} --host=${HOST} $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz
                #打包备份文件
                cd $BACKUP
                tar -zcvf $DATETIME.tar.gz $DATETIME
                #删除临时目录
                rm -rf $BACKUP/$DATETIME    也可以直接使用 rm -rf $DATETIME
                #删除十天前的备份文件
                find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
                echo "----------备份结束-----------"
            c. 更改权限,使之有可执行的权限 chmod 744 mysql_db_backup.sh
            d. crontab -e
            e. 输入
                10 2 * * * /usr/sbin/mysql_db_backup.sh
            f. 结束

24. Linux之Python定制篇
    1)Ubuntu介绍
        Ubuntu是一个以桌面应用为主的开源GNU/Linux操作系统,支持x86、amd64(即x64)和ppc架构,由全球化的专业开发团队(Canonical Ltd)打造的。
        专业的Python开发者一般会选择Ubuntu这款Linux系统作为生产平台。
        温馨提示:
        Ubuntu和Centos都是基于GNU/Linux内核的,因此基本使用和Centos是几乎一样的,他们的各种指令可以通用,只是界面和预安装的软件有所差异
        Ubuntu下载地址:http://cn.ubuntu.com/download/
    2)Ubuntu安装
    3)Ubuntu的root用户,给root用户设置密码并使用
        a. 输入 sudo passwd 命令,输入一般用户密码并设定root用户密码
        b. 设定 root 密码成功后,输入 su 命令,并输入刚才设定的root密码,就可以切换成root了。提示符$代表一般用户,提示符#代表root用户。
        c. 输入exit命令,退出root并返回一般用户
        d. 以后就可以使用root用户了
    4)Ubuntu下开发Python
        4.1)说明
            安装好Ubuntu后,默认就已经安装好Python的开发环境[Python2.7 和 Python3.5]。
        4.2)在Ubuntu下开发一个Python程序
            a. vim hello.py            编写hello.py
            提示:如果Ubuntu上没有vim,我们可以根据提示信息安装一个vim    apt install vim
            b. 输入
                print("hello,world!")
            c. python3 hello.py        运行hello.py
            d. 结果
                hello,world
    5)Python定制篇-APT软件管理和远程登录
        5.1)apt介绍
            apt是Advanced Packaging Tool的简称,是一款安装包管理工具。在Ubuntu下,我们可以使用apt命令可用于软件包的安装、删除、清理等,类似于Windows中的软件管理工具。
            Ubuntu的软件管理示意图(略)
        5.2)Ubuntu软件曹组的相关命令
            sudo apt-get update                更新源
            sudo apt-get install package    安装包
            sudo apt-get remove package        删除包
            
            sudo apt-cache search package    搜索软件包
            sudo apt-cache show package        获取包的相关信息,如说明、大小、版本等
            sudo apt-get install package --reinstall    重新安装
            
            sudo apt-get -f install            修复安装
            sudo apt-get remove package --purge        删除包,包括配置文件等
            sudo apt-get build-dep package    安装相关的编译环境
            
            sudo apt-get upgrade            更新已安装的包
            sudo apt-get dist-upgrade        升级系统
            sudo apt-cache depends package    了解使用该包依赖哪些包
            sudo apt-cache rdepends package    查看该包被哪些包依赖
            sudo apt-get source package        下载该包的源代码
        5.3)寻找国内的镜像源
            https://mirrors.tuna.tsinghua.edu.cn/
            所谓的镜像源:可以理解为提供下载软件的地方,比如Android手机上可以下载软件的安卓市场;ios手机上可以下载软件的AppStore
        5.4)Ubuntu软件安装、卸载的最佳实践
            案例说明:使用apt完成安装和卸载vim软件,并查询vim软件的信息
                sudo apt-get remove vim
                sudo apt-get install vim
                sudo apt-cache show vim
    6)ssh远程登录Ubuntu
        6.1)ssh介绍
            SSH为Secure Shell的缩写,由IETF的网络工作小组(Network Working Group) 所制定;SSH为建立在应用层和传输层基础上的安全协议。
            SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。常用于远程登录,以及用户之间进行资料拷贝。几乎所有Unix平台--包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。
            使用SSH服务,需要安装相应的服务器和客户端。客户端和服务器的关系:如果,A机器想被B机器远程控制,那么,A机器需要安装SSH服务器,B机器需要安装SSH客户端。
            和CentOS不一样,Ubuntu默认没有安装SSHD服务,因此,我们不能进行远程登录。
        6.2)使用ssh远程登录Ubuntu
            1)安装SSH和启用
                sudo apt-get install openssh-server
                执行上面的指令后,在当前这台Linux上就安装了SSH服务端和客户端
                
                service sshd restart
                执行上面的指令,就启动了sshd服务。会监听端口22
            2)在Windows上使用xshell5或xftp5登录Ubuntu
            3)从Linux系统客户机远程登录Linux系统服务机
                首先,我们需要在Linux的系统客户机也要安装openssh-server
                基本语法:
                    ssh 用户名@IP
                    例如: ssh atguigu@192.168.188.130
                    使用ssh访问,如访问出现错误。可查看是否有该文件 ~/.ssh/known_ssh 尝试删除该文件解决。
                    登出命令:
                    exit或者logout
        6.3)
    7)





posted @ 2018-04-21 13:41  李刚289237642  阅读(457)  评论(0编辑  收藏  举报