Linux学习笔记

Linux
习惯问题:

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

  2. 重启reboot

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

  4. 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:命令的执行都是在正常模式,而不是插入模式下进行。

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

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

  7. 用户管理
    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

  8. 用户组
    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包含的组的信息
    每行的含义:组名:口令:组标识号:组内用户列表

  9. 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

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

  11. 文件目录指令
    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的指令

  12. 时间日期类型的指令
    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年全年的日历

  13. 搜索查找类指令
    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)

  14. 压缩解压类指令
    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)

  15. 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 服务数据,包含服务器特定服务相关的数据
    ________________

  16. 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(土匪)组

  17. 权限管理
    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时,用户才能进入该目录

  18. 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. 成功

  19. 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 目录 显示指定目录下的文件及目树形录结构

  20. 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

  21. 进程管理
    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)

  22. 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 会安装最新版本

  23. 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)

  24. 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 12"
    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 case1 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. 结束
  1. 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
    

推荐阅读更多精彩内容