Linux01
一、运维常见的概念
域名
域名(英语:Domain Name),又称网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置)。 [1]
由于IP地址具有不方便记忆并且不能显示地址组织的名称和性质等缺点,人们设计出了域名,并通过网域名称系统(DNS,Domain Name System)来将域名和IP地址相互映射,使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址数串。 [1]
IP地址:
ipv4 和ipv6
x.x.x.x 0-255
公网:国际互联网
内网:局域网
问题:
普通的电脑是否能够充当服务器?
能,但是一般不会
1.稳定性不行
2.性能不及专门的服务器 服务器一般没有界面 开销小
cpu :拿笔记本 intel
服务器 志强
3.标准不统一 (内存条)
二操作系统:
eclipse myeclipse sts idea
常见的操作系统:win7,xp,win8,win10,mac,linux
win 闭源 不开放源代码
mac 闭源 不收费
linux 开源 redHat Ubantu Centos
目前市面上比较常见的开源的操作系统,有许多分支 如: redHat,Ubantu(乌班图),CentOS,目前linux在世界上最大的分支是安卓
开源的系统
三为什么要使用linux?
- 性能比较好 (linux一般没有桌面,占用的内存比较小,性能比较高)
- 稳定性比较好
开机时间可以达到几年
开源 白帽会给系统打补丁
- 安全性
linux操作系统相比于window操作系统比较安全
- 可以远程管理
windows:mstsc 需要桌面信息
linux: 只需要命令行
四linux的特点
多用户多任务
单用户:在登录计算机的时候只能允许同时登录一个用户
单任务:允许用户同时操作的任务数量
多用户:在登录计算机的时候允许同时登陆多个用户
多任务:允许用户同时操作多个任务
window:单用户 多任务
linux:多用户 多任务
五linux安装
真机安装
使用真实的计算机进行安装
虚拟机安装
通过一些特定的手段来进行虚拟安装,并不会影响当前的计算机的操作系统
1.虚拟机介绍
虚拟机(Virtual Machine)是计算机系统的仿真器,通过软件模拟具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,能提供物理计算机的功能。虚拟机根据它们的运用和与直接机器的相关性可分为系统虚拟机和,系统虚拟机可以提供一个可以运行完整操作系统的完整系统平台,程序虚拟机则为运行单个计算机程序设计。其本质特点是运行在虚拟机上的软件被局限在虚拟机提供的资源里。
安装虚拟机,大家脑袋中第一个蹦出来比较熟悉的名字就是VMware。确实在虚拟机中VMware的地位可以说是没人可以撼动了。使用VMware,你可以同时运行Linux各种发行版、Dos、Windows各种版本,Unix等,你甚至可以在同一台计算机上安装多个Linux发行版、多个Windows版本。
VMware既然这么牛逼,那下面我们就来说说其使用吧!!!
首先我们的了解下虚拟机的运行架构:
寄居架构(VMware Workstation):一个适合于学习的架构
原生架构 (VMware vSphere):一般用在企业生产环境中使用
寄居架构就是在操作系统之上安装和运行虚拟化程序,依赖于主机操作系统对设备的支持和物理资源的管理
原生架构是直接在硬件上面安装虚拟化软件,再在其上安装操作系统和应用,依赖虚拟层内核和服务器控制台进行管理
2.安装vmware
下载vmware
开始安装
点击安装,一路next,跟安装普通软件是一样的
安装以后
在VMware Workstation里面检查虚拟机的网络设置
2.Linux介绍
linux系统概述
Linux是一种自由和开放源码的操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、台式计算机
Linux介绍
Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。
Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。
Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。
Linux特点:
多用户,多任务,丰富的网络功能,可靠的系统安全,良好的可移植性,具有标准兼容性,良好的用户界面,出色的速度性能
开源
主流:目前的Linux操作系统主要应用于生产环境,主流企业级Linux系统仍旧是RedHat或者CentOS
免费:RedHat 和CentOS差别不大,基于Red Hat Linux 提供的可自由使用源代码的企业CentOS是一个级Linux发行版本
更新方便:CentOS独有的yum命令支持在线升级,可以即时更新系统,不像RedHat 那样需要花钱购买支持服务!
镜像地址:
CentOS官网:The CentOS Project/
CentOS搜狐镜像:http://mirrors.sohu.com/centos/
CentOS网易镜像:Index of /centos//
CentOS北京理工大学镜像:http://mirror.bit.edu.cn/centos/
3.创建虚拟机
选择自定义和典型都行
点击浏览选择镜像文件
根账号是 root 账号 最高权限的用户
打开虚拟机
开启虚拟机,若出现如下错误(此处由于win10系统引起)
用记事本打开,找到“vmci0.present”,将true更改为false点击保存重启即可 ip
重启之后
六.开机关机
(a)在linux领域内大多用在服务器上,很少遇到关机的操作。毕竟服务器上跑一个服务是永无止境的,除非特殊情况下,不得已才会关机;
(b)#reboot # 重启
(c)# poweroff # 关机;
(d) shutdown –h now # 立马关机
七.防火墙
查看防火墙状态:firewall-cmd –state 或者systemctl status firewalld.service
启动防火墙:systemctl start firewalld.service
关闭防火墙:systemctl stop firewalld.service
重启:systemctl restart firewalld.service
开机启用:systemctl enable firewalld.service ping
禁止开机启动:systemctl disable firewalld.service
查看是否开机启动:systemctl is-enabled firewalld.service
八.配置静态ip
为什么要配置成静态IP?这是为了方便使用PUTTY、Xshell等软件远程登录服务器。
1.查看ipif
ip addr
192.168.159.128就是我们的ip地址
使用root用户输入如下命令:(显示#代表当前的是root用户显示$代表是普通用户,普通用户切换到root用户输入su命令即可)t
vi /etc/sysconfig/network-scripts/ifcfg-ens32
注意vi后面加空格
vi是Linux内置的文本编辑器命令 打开文件的意思
输入i进入编辑模式s
把dhcp改为static
ONBOOT改为yes
BROADCAST=192.168.139.255
IPADDR=192.168.139.34
NETMASK=255.255.255.0
GATEWAY=192.168.139.2
DNS=8.8.8.8
DNS1=114.114.114.114
BROADCAST设置的是局域网广播地址,
IPADDR就是静态IP,
NETMASK是子网掩码,
GATEWAY就是网关或者路由地址;
更改之后重启网络:service network restart
附加:
DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。
net模式,就是在你的Windows电脑(假设叫A电脑)的网络基础上,再生成一个子网络,ip的前两位默认就是192.168,然后第三位是随机,第四位是自己可以手动设置的。使用这种模式唯一的一个缺点就是你的虚拟机只有当前电脑(A电脑)可以访问,其他电脑不管通过什么方式都是访问不了的,然后在A电脑上创建多台虚拟机,这些虚拟机和A电脑都可以相互ping通。
net模式是使用vmnet8这个虚拟网卡进行通信的
正常情况下网关的最后一位应该是1,但是因为这里的网关是虚拟生成的子网络的网关,再说一句最后一位是2!也就是说你这台电脑上所有虚拟机(如果用net模式)的网关都是192.168.159.2
桥接模式是这样的,让你的虚拟机的ip和Windows的ip在同一个网段,这样有什么好处呢,好处就是:只要A电脑和B电脑在同一个网段当中(连了同一个网络,或者插着同一家公司的不同网线,理论上就叫在同一个网段当中),这样A电脑上的虚拟机,B电脑也能访问得到,这样就可以使用几台配置不太好的Windows电脑每台都配置一个虚拟机,让这些虚拟机组成一个大数据的集群
设置桥接模式:
改成桥接模式以后 也需要修改ip地址让虚拟机里面的IP地址跟我们自己的电脑的网址保持在一个网段里面
Linux02
一.常用命令
什么是命令?
指在Linux终端(命令行)中输入的内容就称之为命令。
命令的格式
一个完整的命令的标准格式:Linux通用的格式
#指令主体(空格) [选项](空格) [操作对象]
一个指令可以包含多个选项
操作对象也可以是多个
张三 去操场 跑圈
1. 文件处理命令 ls(list)
1、功能描述:显示文件目录
2、语法: ls 选项 【-ald】
3、-a 显示所有文件,包括隐藏文件 (all)
4、-l 详细信息显示
5、-d 查看目录属性
6、-h 以可读性较高的形式显示 一般和l连用 ls -lh
2. 文件处理命令 cd(change directory)
功能描述:切换目录
1、范例: cd / 切换到根目录
2、 cd .. 回到上一级目录
路径可以是相对路径也可以是绝对路径 ~代表的是当前用户的家目录
3. 文件处理命令 pwd(print working directory)
功能描述:显示当前所在的工作目录
1、范例: pwd
4. 文件处理命令 touch(touch)
功能描述:创建空文件
1、范例: touch newfile
2、newfile可以是一个文件名也可以是一个包含文件路径的文件名
3、使用touch来同时创建多个文件 touch 文件1 文件2
注意:不能创建多层文件
5.文件处理命令 mkdir(make directory)
功能描述:创建新目录
1、范例: mkdir newdir
创建多层文件夹的时候使用的是 mkdir -p 文件夹/文件夹1
当一次性创建多层不存在的目录的时候,添加-p参数,否则会报错
1、 mkdir -p aaa/bbb/ccc
2、 创建多层目录
一次性创建多个目录 mkdir 目录1 目录2 目录3 ….
1、 mkdir aaa bbb ccc
2、 一次性创建多个目录
注意:文件的颜色的含义
-----
6.文件处理命令 cp(copy)
功能描述:复制文件或目录
语法: cp -R [源文件或目录][目的目录]
-R 复制目录
cp [被复制的文档路径] [文档被复制到的路径]
当使用cp命令进行文件夹复制操作的时候需要添加选项“-r”【-r表示递归复制】,
否则目录将被忽略
复制的时候文件可以重新命名 但是如果非必须 不建议
7.文件处理命令 mv(move)
功能描述:移动文件 更名
语法: mv [源文件或目录][目的目录]
1、范例: mv file1 file
2、将当前目录下文件 file1 更名为 file 重命名
1、mv 文件的名字 目录
2、mv file2 dir2
3、将 file2 移动到目录 dir2 下
8.文件处理命令 rm(remove)
-f force 强制
功能描述:删除文件
语法: rm -r [文件或目录]
-r 删除目录
1、 rm file3
2、 删除文件 file3
1、rm -r dir1
2、删除目录 dir1
9.文件处理命令 cat(concatenate and display files)
功能描述:显示文件内容
语法: cat [文件名]
1、cat /etc/issue
2、cat /etc/services
cat还可以对文件进行合并
语法2:#cat 待合并的文件路径1 待合并的文件路径2 …. 文件路径n > 合并之后的文件路径
1、cat testyyl.txt test2.txt > ./test3.txt
10.文件处理命令 more
功能描述:分页显示文件内容
语法: more [文件名]
(空格)或f 显示下一页
(Enter)显示下一行
Q或q退出
1、范例: more /etc/issue
11.文件处理命令 head
功能描述: 查看文件的前几行
语法: head -num [文件名]
-num 显示文件的前num行
1、范例: head -20 /etc/issue
12.文件处理命令 tail
功能描述:查看文件的后几行
语法: tail -num [文件名]
-num 显示文件的后num行
-f 动态显示文件内容
1、范例: tail -30 /etc/issue
2、tail -f 文件的名字 动态显示文件的内容
13.文件处理命令 wc(word count)
功能描述:统计文本的行数、字数、字符数
语法: wc -mwl [文件名]
-m 统计文本字符数
-w 统计空格字数
-l 统计文本行数
wc -m ccc.txt
14.文件处理命令 ln(link)
功能描述:产生链接文件
语法: ln -s [源文件][目标文件]
-s 创建软链接 (soft)
1、范例:ln -s /etc/issue /issue.soft
2、windows里面你的快捷方式
创建文件/etc/issue的软连接/issue.soft
-h 硬连接 (hard)
ln -h /etc/issue /issue.hard
创建文件/etc/issue的硬连接/issue.hard
硬链接 就是创建一个副本
15.文件搜索命令 find
功能描述:查找文件或目录
语法:find [搜索路径] [选择项] [搜寻关键字]
1、范例:find /etc -name init
2、在目录/etc中查找文件init
1、find / -size +102400
2、在根目录下查找大于100MB的文件
1、find / -user sam
2、在根目录下查找所有者为sam的文件
1、find /etc -ctime -1
2、在/etc查找24小时内被需改过属性的文件和目录
$find /etc -size +163840 -a -size -204800
在/etc查找大于80MB小于100MB的文件
$find /etc -name init -exec ls -l {} ;
在/etc下查找init文件并显示其详细信息
-type:按照文档的类型进行搜索
文档类型:“-”表示文件(在使用find的时候需要用f来替换),“d”表示文件夹
find /etc/sane.d/ -type f
搜索/etc/sane.d/目录下所有的文件
16.文件搜索命令 grep
功能描述:在文件中搜寻字符串匹配的行并输出(grep命令用在文件中搜寻字串匹配的行并输出,使用时可以指定文件(包括绝对路径/相对路径)的存放位置。)
语法:grep [选项] [指定字串] [源文件]
-i 不区分大小写
-v 排除关键字
-w 完全匹配关键字
1、范例:grep ftp /etc/service
查询services文件里面包含ftp的行,并显示完整的行信息
2、grep -i aaa不区分大小写aaa
3、grep -v aaa排除关键字aaa
4、grep -w aaa完全匹配aaa关键字
17.压缩解压命令 (GUN zip)
功能描述:压缩文件
语法:gzip 选项 [文件]
压缩后文件格式: .gz
18.压缩解压命令 gunzip(GUN unzip)
功能描述:解压缩 .gz 的压缩文件
语法:gunzip 选项 [压缩文件]
范例: $ gunzip file1.gz
19.压缩解压命令 tar
功能描述:打包目录
语法:tar 选项[cvfz] [压缩文件的名字] [目录]
-c 产生.tar打包文件
-v 显示详细信息
-f 指定压缩后的文件名
-z 打包同时压缩
解压缩语法 tar -zxvf [指定的压缩文件] -c [目的目录]
-x 解压.tar文件
-v 显示详细信息
-f 指定解压文件
-z 解压缩
压缩后文件格式: .tar.gz
指定文件夹 -C
tar -zxvf 解压文件的名字 -C 指定的目录
20.压缩解压命令 zip
功能描述:压缩文件或目录
语法:zip 选项[-r][压缩后文件名称][文件或目录]
-r 压缩目录
压缩后文件格式: .zip
21.压缩解压命令 unzip
功能描述:解压.zip的压缩文件
语法:unzip [压缩文件]
范例:$ unzip test.zip
22.压缩解压命令 bzip2
功能描述:压缩文件
语法:bzip2 选项-k
-k 产生压缩文件后保留原文件
压缩后文件格式: .bz2
23.压缩解压命令 bunzip2
功能描述:解压缩文件
语法:bunzip2 选项-k
-k 解压缩文件后保留原文件
24.权限管理命令 chmod(change the permissions mode of a file)
功能描述:改变文件或目录权限
语法:chmod [{ugo}{+-=}{rwx}] [文件或目录]
[mode=421][文件或目录]
r 4 读 read
w 2 写 write
x 1 执行 execute
范例: chmod g+w file1
赋予文件file1所属组写权限
chmod 777 目录/文件
第一位表示文件类型。如果是—表示文件,d表示是文件夹。。。
第2-4表示当前用户对该文件具有的权限r是read读,w是write写,x表示可以执行
第5-7表示当前用户所在组对该文件/文件夹的权限
第8-10表示出了这个组以外的人对该文件的权限
750
25.帮助命令 man(manual)
功能描述:获得帮助信息
语法:man [命令或配置文件]
范例: man ls
26.帮助命令 info(information)
功能描述:获得帮助信息
语法:man [任何关键字]
范例: info ls
27.帮助命令 whatis(search the whatis database for strings)
功能描述:获得索引的简短说明信息
语法:whatis apropos[任何关键字]
范例:$ whatis ls
$ apropos fstab 相当于 man -k
### makewhatis
建立whatis和apropos搜索使用的数据库,当使用这两个命令发生错误时,就是数据库没有建立
28.rpm命令
rpm (Redhat Package Manager)
-a:查询所有套件;
-b<完成阶段><套件档>+或-t <完成阶段><套件档>+:设置包装套件的完成阶段,并指定套件档的文件名称;
-c:只列出组态配置文件,本参数需配合"-l"参数使用;
-d:只列出文本文件,本参数需配合"-l"参数使用;
-e<套件档>或--erase<套件档>:删除指定的套件;
-f<文件>+:查询拥有指定文件的套件;
-h或--hash:套件安装时列出标记;
-i:显示套件的相关信息;
-i<套件档>或--install<套件档>:安装指定的套件档;
-l:显示套件的文件列表;
-p<套件档>+:查询指定的RPM套件档;
-q:使用询问模式,当遇到任何问题时,rpm指令会先询问用户;
-R:显示套件的关联性信息;
-s:显示文件状态,本参数需配合"-l"参数使用;
-U<套件档>或--upgrade<套件档>:升级指定的套件档;
-v:显示指令执行过程;
-vv:详细显示指令执行过程,便于排错。
安装
rpm -ivh xxx.rpm # 直接安装
rpm --force -ivh xxx.rpm # 忽略报错,强制安装
卸载
[root@localhost ~]# rpm -ql tree # 查询
[root@localhost ~]# rpm -e tree # 卸载
[root@localhost ~]# rpm -ql tree # 查询
列出所有安装过的包
[root@localhost ~]# rpm -qa
如何获得某个软件包的文件全名
[root@localhost ~]# rpm -q tree
rpm包中的文件安装的位置
[root@localhost ~]# rpm -ql tree
哪个软件包包含这个程序
[root@localhost ~]#rpm -qf `程序名` #返回软件包的全名
[root@localhost ~]#rpm -qif `程序名` #返回软件包的有关信息
[root@localhost ~]#rpm -qlf `程序名` #返回软件包的文件列表
[root@localhost ~]# rpm -qf `shd`
29.输出重定向
一般命令的输出都会显示在终端中,有些时候需要将一些命令的执行结果想要保存到文件中进行后续的分析/统计,则这时候需要使用到的输出重定向技术。
>:覆盖输出,会覆盖掉原先的文件内容
>>:追加输出,不会覆盖原始文件内容,会在原始内容末尾继续添加
语法:#正常执行的指令 > / >> 文件的路径
注意:文件可以不存在,不存在则新建
案例:使用覆盖重定向,保存ls -la 的执行结果,保存到当前目录下的ls.txt
30.ps -ef 指令(重点)
指令:ps
作用:主要是查看服务器的进程信息
选项含义:
-e:等价于“-A”,表示列出全部的进程
-f:显示全部的列(显示全字段)
二.vim编辑器
进行最小安装的时候没有vim命令的需要我们进行手动安装
安装vim
yum -y install vim
vim是Unix / Linux上最常用的文本编辑器而且功能非常强大。
vim的这些优势主要体现在以下几个方面:
1.vim拥有所有vi命令功能;
2.vi只能在Unix / Linux,vim可以在Unix / Linux,windows系统上使用
3.vim编辑器,自动根据文件你内容显示不同的颜色
使用方法
进入方式 vim 文件的名字
进入编辑模式 i
文件的底部显示insert就表示当前是编辑模式
从编辑模式退出 按esc
再输入:wq 单击回车键 保存修改的内容
基本上vim可以分为三种状态,分别是命令模式 (command mode)、插入模式 (Insert mode) 和底行模 式 (last line mode).
命令行模式:在该模式下是不能对文件直接编辑,可以输入快捷键进行一些操作(控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last )
插入模式:也称为编辑文本模式 只有在Insert mode下,才可以做文字输入,按 「ESC」键可回到命令行模式。
底行模式: 将文件保存或退出vi,也可以设置编辑环境,如搜索、替换、保存、退出、撤销、高亮等等
不过一般我们在 使用时把vi简化成两个模式,就是将底行模式 (last line mode)也算入命令行模式command mode)。
插入命令
i 在光标前插入
I 在光标当前行开始插入
a 在光标后插入
A 在光标当前行末尾插入
o 在光标当前行的下一行插入新行
O 在光标当前行的上一行插入新行
定位命令
:set nu 显示行号
:set nonu 取消行号
gg 到文本的第一行
G 到文本的最后一行
:n 到文本的第n行
$ 当前行的最后一个字符
替换和取消命令
u 取消上一步操作 Ctrl+r 返回到undo之前
r 替换光标所在处字符
R 从光标所在处开始替换,按esc结束
删除命令
x 删除光标所在字符
nx 删除光标所在处后n个字符
dd 删除光标所在行,ndd删除n行
dG 删除光标所在行到末尾行的所有内容
D 删除光标所在处到行尾的内容
:5,7d 删除指定范围的行,从第5行到第7行
常用快捷键
Shift+ zz 保存退出,与“:wq”作用相同
v 进入字符可视模式
V 或 Shift + v 进入行可视模式
Ctrl + v 进入块可视模式
快捷键
Linux中vi编辑器的使用详解,下面的引号和括号不算啊
光标的移动除了键盘上的上下左右键.也可以是小写模式下,按键盘上的"h,j,k,l",
"ctrl+b":屏幕往后移动一页
"ctrl+f":屏幕往前移动一页
"ctrl+u":屏幕往后移动半页
"ctrl+d":屏幕往前移动半页
输入任何一个整数,然后输入"shift+G" 就可以到这一页的开头了.
按键盘上的大写"G"移动到文章的最后.
按"$"符号将光标移动到行尾
"^"将光标移到行头
"w":将光标移到下一行头
b":跟"w"相反.移到上一行行头
"e":将光标移到下一行尾.
如果想让文本显示行号.就在【命令行】 模式下,在文本最后输入":set nu"命令.就可以了
复制
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「yy」:复制光标所在行到缓冲区。
「#yy」:例如,「6yy」表示拷贝从光标所在的该行"往下数"6行文字。
将缓冲区内的字符贴到光标所在位置。
注意:所有与"y"有关的复制命令都必须与"p"配合才能完成复制与粘贴 功能。
查找
用"/"加上要查找的内容.例如"/hello"或者是"?hello"也是可以的.
替换
「r」:替换光标所在处的字符。 ,按一下"r"然后输入要即可.
「R」:替换光标所到之处的字符,直到按下「ESC」键为止。
恢复上一次操作
「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。
按多次"u"可以执行多次恢复.就相当于"CTRL +Z"的操作.
替换
在命令模式下使用“s/原字符/新字符/g” 代表当前行所有
如果想全局替换,s变为%s
文件内全部替换:
:%s#abc#123#g (如文件内有#,可用/替换,:%s/abc/123/g)
--注:把abc替换成123
(或者: %s/str1/str2/g 用str2替换文件中所有的str1)
文件内局部替换:
:20,30s#abc#123(如文件内有#,可用/替换,:%s/abc/123/g)
--注:把20行到30行内abc替换成123
三.用户权限管理和时间
Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。
每个用户账号都拥有一个惟一的用户名和各自的密码。
用户在登录时键入正确的用户名和密码后,就能够进入系统和自己的主目录。
要想实现用户账号的管理,要完成的工作主要有如下几个方面:
用户账号的添加、删除、修改以及用户密码的管理。
用户组的管理。
注意三个文件:
/etc/passwd 存储用户的关键信息
/etc/group 存储用户组的关键信息
/etc/shadow 存储用户的密码信息
显示当前登录的用户: whoami
用户管理
查看用户信息
使用cat命令来查看一下保存用户信息的文件 ,保存用户信息的文件保存在 /etc/passwd文件里面
cat /etc/passwd
: 号代表含意:
yyl:x:1000:1000:yyl:/home/yyl:/bin/bash
root:x:0:0:root:/root:/bin/bash
域分割符这个文件有7个域分别是:
用户名:密码:用户ID:用户组ID:注释:家目录:解释器shell
用户名:创建新用户名称,后期登录的时候需要输入;
密码位:此密码位置一般情况都是“x”,表示密码的占位;
用户标示号:用户的识别符
默认组标示号:该用户所属的主组ID;
注释:用于描述用户的信息
家目录:用户登陆系统的默认目录,默认是在/home/下、
解释器:等待用户进入系统之后,用户输入指令之后,该解释器会收集用户输入的指令,传递给内核处理;
根用户都是从0开始的(第三个域)
除了第一行root外,下面的都是操作系统的伪用户(除普通用户外)
超级用户:(root,UID=0)
普通用户:(UID在500到60000)
伪用户:(UID在1到499)
伪用户不能登录系统,而且没有宿主目录
为什么需要伪用户:没有用户登录时,linux系统依然要运行,有很多进程在跑着,所以必须需要一些伪用户来执行那些命令
保存密码的文件:/etc/shadow
yyl:$1$iTT$V24n6nzIb7HnOoLUNUz25/:18754:0:99999:7:::
用户名:密码:更改密码的日期:密码不可被更改的天数(0随时可以更改):密码需要更新的时间:
提前几天进行提醒
:号的含义
- 帐号名称:由于密码也需要与帐号对应啊~因此, 这个档案的第一栏就是帐号,必须要与 /etc/passwd 相同才行!
- 密码:这个才是真正的密码,而且是 经过编码过的密码啦!
- 最近更动密码的日期:这个栏位记录了‘更动密码的那一天’的日期, 不过,这里展示的是数字18492 那是因为计算 Linux 日期的时间是以 1970 年 1 月 1 日作为 1 ,而 1971 年 1 月 1 日则为 366 啦! 所以这个日期是累加的那么2020年8月19日就是18492
- 密码不可被更动的天数: 第四个栏位记录了这个帐号的密码需要经过几天才可以被变更!如果是 0 的话, 表示密码随时可以更动的意思。这的限制是为了怕密码被某些人一改再改而设计的!如果设定为 20 天的话,那么当你设定了密码之后, 20 天之内都无法改变这个密码!
- 密码需要重新变更的天数: 由于害怕密码被某些‘有心人士’窃取而危害到整个系统的安全,所以有了这个栏位的设计。 你必须要在这个时间之内重新设定你的密码,否则这个帐号将会暂时失效。 而如果像上面的 99999 的话,那就表示,呵呵,密码不需要重新输入啦! 不过,如果是为了安全性,最好可以设定一段时间之后,严格要求使用者变更密码呢!
- 密码需要变更期限前的警告期限:当帐号的密码失效期限快要到的时候, 就是上面那个‘必须变更密码’的那个时间时, 系统会依据这个栏位的设定,发出‘警告’言论给这个帐号,提醒他‘再过 n 天你的密码就要失效了,请尽快重新设定你的密码呦!’,如上面的例子,则是密码到期之前的 7 天之内,系统会警告该用户。
- 密码过期的恕限时间:如果用户过了警告期限没有重新输入密码, 使得密码失效了,也就是说,你在‘必须变更密码的期限前,并没有变更你的密码!’ 那么该组密码就称为‘失效的密码’啰~怎么办?没关系,还有这个栏位的天数设计啊 意思就是说,当密码失效后,你还可以用这个密码在 n 天内进行登入的意思。 而如果在这个天数后还是没有变更密码,那么您的帐号就失效了!无法登入!
- 帐号失效日期:这个日期跟第三个栏位一样,都是使用 1970 年以来的总日数设定。这个栏位表示: 这个帐号在此栏位规定的日期之后,将无法再使用。 这个栏位会被使用通常应该是在‘收费服务’的系统中, 你可以规定一个日期让该帐号不能再使用啦!
保留:最后一个栏位是保留的,看以后有没有新功能加入。
保存用户组的文件:/etc/group
保存用户组密码的文件:/etc/gshadow
用户配置文件:/etc/default/useradd
1.添加用户
useradd [选项] 用户名
常用选项:
-g:表示指定用户的用户主组,选项的值可以是用户组的id,也可以是组名
-G:表示指定用户的用户附加组,选项的值可以是用户组的id,也可以是组名
-u:uid,用户的id(用户的标识符),系统默认会从1000之后按顺序分配uid,如果不想使用系统分配的,可以通过该选项自定义
-c: comment:添加注释
案例:创建用户 yyl 不带任何选项
useradd yyl
验证是否成功:
a. 验证/etc/passwd的最后一行,查看是否有yyl的信息;
b. 验证是否存在家目录(在Centos下创建好用户之后随之产生一个同名家目录);
注意:在不添加选项的时候,执行useradd之后会执行一系列的操作
a. 创建同名的家目录; (home/yyl)
b. 创建同名的用户组;(yyl)
案例:添加选项,创建用户lisi,让lisi属于1000主组,附加组1001,自选号6666,注释是 lisi。
useradd -g 1000 -G 1001 -u 6666 -c lisi lisi
注意:查看用户的主组可以查看passwd文件,查看附加组可以查看group文件。
2.修改用户
usermod [选项] 用户名
usermod:user modify,用户修改
常用选项:
-g:表示指定用户的用户主组,选项的值可以是用户组的id,也可以是组名
-G:表示指定用户的用户附加组,选项的值可以是用户组的id,也可以是组名
-u:uid,用户的id(用户的标识符),系统默认会从500之后按顺序分配uid,如果不想使用系统分配的,可以通过该选项自定义号
-l:修改用户名
案例:修改yyl用户主组为1001,附加组改为1000
usermod -g 1001 -G 1000 yyl
案例:修改yyl用户用户名,改为yuyongli
usermod -l 新的用户名 旧的用户名
#usermod -l yuyongli yyl
注意:已经登录的用户不能修改
groups 用户名 --- 用户所在的组
3.修改用户密码
Linux不允许没有密码的用户登录到系统,因此前面创建的用户目前都处于锁定状态,需要设置密码之后才能登录计算机。
passwd 用户名
案例:设置yuyongli用户的密码
设置密码之后在shadow文件中能够看出用户是否有密码。
在设置用户密码之后可以登录帐号,例如此处需要登录yuyongli
4.切换用户
切换用户命令:su [用户名] (switch user)
从root往普通用户切换不需要密码,但是反之则需要root密码;
5.删除用户
常用语法:userdel [选项] 用户名
常用选项:
-r:表示删除用户的同时,删除其家目录;
案例:删除yuyongli用户
注意:已经登录的yuyongli用户删除的时候提示删除失败,但是没有登录的lisi用户可以正常删除
如果想要删除yuyongli这个用户可以强制删除
a. ps -ef|grep yuyongli
b. kill -9 xxx
提示:所有跟用户操作的命令(除passwd外)只有root超级管理员有权限执行。
6.查看用户有谁
ls /home
7.锁定用户:
usermod -L 用户名
usermod -L yyl
8.解锁用户:
usermod -U 用户名
用户组管理
每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。
用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。
文件结构:
用户组名:密码:用户组ID:组内用户名
密码:X表示占位符,虽然用户组可以设置密码,但是绝大部分的情况下不设置密码;
组内用户名:表示附加组是该组的用户名称
1.添加用户组
常用语法:#groupadd [选项] 用户组名
常用选项:
-g:类似用户添加里的“-u”,-g表示选择自己设置一个自定义的用户组ID数字,如果自己不指定,则默认从1000之后递增;
案例:使用groupadd指令创建一个新的用户组,命名为xxx
groupadd xxx
2.更改组名称
groupmod [选项] 新组名 老组名
常用选项:
-g:类似用户修改里的“-u”,-g表示选择自己设置一个自定义的用户组ID数字
-n:类似于用户修改“-l”,表示设置新的用户组的名称
案例:修改Administrators用户组,将组ID从502改成520,将名称改为admins
groupmod -g 520 -n admins Administrators
3.删除组
groupdel 组名
注意:当如果需要删除一个组,但是这个组是某个用户的主组时,则不允许删除;如果确实需要删除,则先从组内移出所有用户。
4.修改用户的组
usermod -g 用户组 用户名
注:-g|–gid,修改用户的gid,该组一定存在
多组:
usermod -G 组名,组名 用户名
usermod -G test,root yyl
给文件授权到组
-- change group premission
chgrp 组名 文件名
chgrp g1 /home/test
6.设置文件权限
chmod 770 /home/test
750
用数字来表示权限(r=4,w=2,x=1,-=0)
四.时间
查看当前时间
[root@localhost ~]# date
格式化当前的时间
[root@localhost ~]# date "+%Y-%m-%d %H:%M:%S"
2021-02-21 21:57:00
date "+%F %T"
获取之前或者之后的某个时间(备份)
#date -d "-1 day" "+%Y-%m-%d %H:%M:%S"
符号的可选值:+(之后) 或者 - (之前)
单位的可选值:day(天)、month(月份)、year(年)
%F:表示完整的年月日
%T:表示完整的时分秒
%Y:表示四位年份
%m:表示两位月份(带前导0)
%d:表示日期(带前导0)
%H:表示小时(带前导0)
%M:表示分钟(带前导0)
%S:表示秒数(带前导0)
查看硬件时间
[root@localhost ~]# hwclock
Sun 21 Feb 2021 09:59:01 PM PST -0.992879 seconds
设置当前的时间
[root@localhost ~]# date -s "2021-2-22 14:00"
Mon Feb 22 14:00:00 PST 2021
将系统时间同步到硬件时钟
[root@localhost ~]# hwclock --systohc
[root@localhost ~]# date && hwclock
时间不一致的问题:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
五 总结
命令:
ls
cd
rpm
ps-ef
grep
tar
head
tail
find
cat
touch
mkdir
rm
vim编辑器:
插入模式 i
命令模式 i=>esc 复制 粘贴 G $
底行模式:在最下面一行输入命令 保存 退出 删除
用户管理:
/etc/passwd
/etc/group
/etc/shadow
Linux03
磁盘和文件管理和使用检测和维护
一.磁盘目录:
/bin (binaries) :该目录中存储的都是一些二进制文件,文件都是可以被运行的。
/dev (devices):该目录中主要存放的是外接设备,例如盘、其他的光盘等。在其中的外接设备是不能直接被使用的,需要挂载(类似windows下的分配盘符)。
/etc (etcetera):该目录主要存储一些配置文件。
/home :表示“家”,表示除了root用户以外其他用户的家目录,类似于windows下的User/用户目录。
/proc:process,表示进程,该目录中存储的是Linux运行时候的进程。
/root:该目录是root用户自己的家目录。
/sbin:全称super binary,该目录也是存储一些可以被执行的二进制文件,但是必须得有super权限的用户才能执行。
/tmp:表示“临时”的,当系统运行时候产生的临时文件会在这个目录存着。
/usr:存放的是用户自己安装的软件。类似于windows下的program files。
/var:存放的程序/系统的日志文件的目录。
/mnt:当外接设备需要挂载的时候,就需要挂载到mnt目录下。
/ 根目录root 超级用户目录
/lost+found 存放一些系统出错的检查结果
注:特殊权限:粘着位t
粘着位定义:当权限为777的目录被授予粘着位,用户只能在此目录下删除自己是所有者的文件
磁盘管理相关命令
fdisk -l 查看磁盘分区信息
df 显示文件系统磁盘空间的使用情况
语法:#df -h -h表示以可读性较高的形式展示大小
显示指定的文件(目录)已使用的磁盘空间的总量
语法:#du -sh 目录路径
选项含义:
-s:summaries,只显示汇总的大小
-h:表示以高可读性的形式进行显示(human-readable)
案例:统计“/root”目录的实际大小
free 显示当前内存和交换空间的使用情况
作用:查看内存使用情况
语法:#free -m -m表示以mb为单位查看
二.安装软件
1.rpm命令
rpm的作用类似于windows上的电脑管家中“软件管理”、安全卫士里面“软件管家”等产品,主要作用是对linux服务器上的软件包进行对应管理操作,管理分为:查询、卸载、安装。
①查询某个软件的安装情况
#rpm -qa|grep 关键词
选项:
-q:查询,query
-a:全部,all
②卸载某个软件
#rpm -e 软件的名称
当存在依赖关系的时候又不想去解决这个问题的时候可以:
#rpm -e 软件包名 --nodeps
③安装软件:
#rpm -ivh 软件包完整名称
选项:
-i:install,安装
-v:显示进度条
-h:表示以“#”形式显示进度条
-U:update升级
2.安装jdk
1.检查jdk是否存在
2.查看并卸载原本的jdk
rpm -e --nodeps java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64
rpm -e --nodeps java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64
rpm -e --nodeps copy-jdk-configs-2.2-3.el7.noarch
rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.141-2.6.10.5.el7.x86_64
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.131-11.b12.el7.x86_64
3.下载jdk的安装包并上传到指定的文件夹(/usr/java)里面
(手动安装)
a.创建文件夹/usr/java : mkdir /usr/java/jdk
b.将tar文件上传到指定的目录下:操作
c.解压文件:tar -zxvf jdk-8u191-linux-x64.tar.gz (-c 指定的目录)
d.修改/etc/profile配置环境变量:
#set java enviroment
export JAVA_HOME=/usr/java/jdk/jdk1.8.0_191
export JRE_HOME=/usr/java/jdk/jdk1.8.0_191/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin/$JAVA_HOME:$PATH
e.使配置文件生效
source /etc/profile
f:测试是否安装成功
java -version
出现如上图的内容即为安装成功
2.1 yum安装jdk11
1.查询yum中存在的jdk版本
yum list | grep java-11
2.开始安装
yum install -y java-11-openjdk-headless-11.0.13.0.8-1.el7_9.x86_64 java-11-openjdk-11.0.13.0.8-1.el7_9.x86_64 java-11-openjdk-devel-11.0.13.0.8-1.el7_9.x86_64
出现上图即为安装成功
文件的默认安装位置是:/usr/lib/jvm
3.设置环境变量 /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.13.0.8-1.el7_9.x86_64
export JRE_HOME=$JAVA_HOME
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin/$JAVA_HOME:$PATH
4.使配置文件生效
source /etc/profile
5.验证是都安装成功、
java -version
3.安装tomcat
1.上传压缩包
2.解压
3.设置配置文件 /etc/profile
#set tomcat 环境
4。启动tomcat
cd apache-tomcat-8.5.37/bin
./startup.sh
运行tomcat
出现logo即为成功
4.安装mysql
查看是否安装mariadb
执行命令:
[root@localhost ~]# rpm -qa | grep mariadb
卸载mariadb
执行命令
[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64
使用yum安装mysql8
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
配置安装源
配置安装源:rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
安装mysql8
yum --enablerepo=mysql80-community install mysql-community-server
如果有提示下载插件请选:y
出现complete即为安装成功
启动mysql
centos6:
service mysqld start
centos7:
systemctl start mysqld
如上图即为启动成功
查看MySQL的运行状态
centos6:
service mysqld status
cenos7:
systemctl start mysqld
查看安装mysql之后生成的临时密码
grep password /var/log/mysqld.log
zD1=2N>hr;iU就是密码
登录mysql
输入:mysql -uroot -p
在Enter password:后面输入临时密码
登录成功
修改密码
alter user 'root'@'localhost' identified with mysql_native_password by 'Abc123...';
密码一定要有大写小写数字和其他符号
修改完密码以后查看并设置密码规则
show variables like 'validate_password%';
策略说明
validate_password.length 是密码的最小长度,默认是8,我们把它改成4
输入:set global validate_password.length=4;
validate_password.policy 验证密码的复杂程度,我们把它改成0
输入:set global validate_password.policy=0;
validate_password.check_user_name 用户名检查,用户名和密码不能相同,我们也把它关掉
输入:set global validate_password.check_user_name=off;
修改完策略之后就可以修改密码了
//ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
alter user 'root'@'localhost' identified with mysql_native_password by 'root';
配置远程访问:
mysql> use mysql;
mysql> select host, user, authentication_string, plugin from user;
修改一下user为root的host为% 可以进行远程连接
mysql> update user set host = '%' where user ='root';
刷新权限
mysql> flush privileges;
重新查看一下对应的用户的信息是否修改成功
mysql> select host, user, authentication_string, plugin from user;
使用navicat连接mysql
安装mysql57
rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum --enablerepo=mysql57-community install mysql-community-server
如果有提示下载插件请选:y
出现如上即为安装成功
启动mysql
service mysqld start
systemctl start mysqld
如上图即为启动成功
查看MySQL的运行状态
service mysqld status
查看安装mysql之后生成的临时密码
grep "A temporary password" /var/log/mysqld.log
zD1=2N>hr;iU就是密码
登录mysql
输入:mysql -uroot -p
在Enter password:后面输入临时密码
登录成功
修改密码
alter user 'root'@'localhost' identified with mysql_native_password by 'Abc123...';
show variables like 'validate_password%';
策略说明
validate_password.length 是密码的最小长度,默认是8,我们把它改成6
输入:set global validate_password_length=4;
validate_password.policy 验证密码的复杂程度,我们把它改成0
输入:set global validate_password_policy=0;
validate_password.check_user_name 用户名检查,用户名和密码不能相同,我们也把它关掉
输入:set global validate_password_check_user_name=off;
alter user 'root'@'localhost' identified with mysql_native_password by 'root';
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
配置远程访问:
mysql> use mysql;
mysql> select host, user, authentication_string, plugin from user;
mysql> update user set host = '%' where user ='root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> select host, user, authentication_string, plugin from user;
6.运行项目
1.普通web项目
使用war包将对应的项目直接存到tomcat的webapp下面即可tomcat运行时会自动解压项目
2.springboot项目
上传springboot项目(过程略)
创建日志文件 nohup.out
运行jar文件并指定端口号为多少
nohup java -jar demo.jar --server.port=8081 &
查看日志文件
访问项目
切忌:一定要关闭防火墙
1.创建一个ssm的web项目,里面包含jsp页面,打成一个war包部署到linux上面并能正常运行(连接数据库)
2.创建一个springboot项目打成一个jar 能够正常的访问
安装软件
安装jdk(yum)
1、 使用yum查询jdk是否存在
yum list | grep java
2、安装 yum -y install java-1.8.0-openjdk-devel.x86_64
出现上图即为安装成功。
3、配置环境变量
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64
export JRE_HOME=$JAVA_HOME
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin/$JAVA_HOME:$PATH
4、 使配置文件生效
source /etc/profile
使用压缩包进行的安装jdk
1、上传压缩包
步骤略
2、解压压缩包
tar -zxvf xxx.tar
3、配置环境变量
export JAVA_HOME=/usr/yyl/jdk1.8.0_144
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin/$JAVA_HOME:$PATH
4、使配置文件生效
source /etc/profile
安装mysql80
linux使用最小安装的时候缺少一些东西,所以需要我们手动的导入
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
配置安装源
配置安装源:rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
安装mysql8
yum --enablerepo=mysql80-community install mysql-community-server
如果有提示下载插件请选:y
出现complete即为安装成功
启动mysql
centos6:
service mysqld start
centos7:
systemctl start mysqld
如上图即为启动成功
查看MySQL的运行状态
centos6:
service mysqld status
cenos7:
systemctl start mysqld
查看安装mysql之后生成的临时密码
grep password /var/log/mysqld.log
zD1=2N>hr;iU就是密码
登录mysql
输入:mysql -uroot -p
在Enter password:后面输入临时密码
登录成功
修改密码
alter user 'root'@'localhost' identified with mysql_native_password by 'Abc123...';
密码一定要有大写小写数字和其他符号
修改完密码以后查看并设置密码规则
show variables like 'validate_password%';
策略说明
validate_password.length 是密码的最小长度,默认是8,我们把它改成4
输入:set global validate_password.length=4;
validate_password.policy 验证密码的复杂程度,我们把它改成0
输入:set global validate_password.policy=0;
validate_password.check_user_name 用户名检查,用户名和密码不能相同,我们也把它关掉
输入:set global validate_password.check_user_name=off;
修改完策略之后就可以修改密码了
//ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
alter user 'root'@'localhost' identified with mysql_native_password by 'root';
配置远程访问:
mysql> use mysql;
mysql> select host, user, authentication_string, plugin from user;
修改一下user为root的host为% 可以进行远程连接
mysql> update user set host = '%' where user ='root';
刷新权限
mysql> flush privileges;
重新查看一下对应的用户的信息是否修改成功
mysql> select host, user, authentication_string, plugin from user;
使用navicat连接mysql
运行springboot项目
1、打包项目
maven package
2、将对应的jar拉到linux上面
步骤略
3、运行jar
注意事项:不能直接运行java -jar xxx.jar
会出现的问题:当运行的窗口关闭的时候 对应的命令会终止
推荐使用的命令: nohup java -jar xxx.jar &
对应的控制台里面的内容会直接放到nohup.out文件里面
通过本机访问项目 要求本机和linux能够相互通信的 关闭防火墙
4、进行测试
Linux04
shell
1.什么是shell
Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的内容。Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算符/if语句/循环控制/… 但在开始之前, 我想先理清Shell语言与Shell之间的关系.
当命令不在命令行中执行,而是从一个文件中执行时,该文件就是shell脚本。
Shell是一种解释型编程语言,不需要编译,执行时也是按行执行。
Shell脚本是由解释器解释执行的,常见的解释器有:bash dash ash ksh sh等
特点:
shell脚本是普通的文本文件,由流程控制逻辑和命令构成。
shell脚本通常以.sh作为后缀名,但不是必须的。
我们现阶段学习的主要是bash dash.
2.什么是Shell脚本
命令、变量和流程控制语句等有机的结合起来
shell脚本擅长处理纯文本类型的数据,而linux中,几乎所有的配置文件,日志,都是纯文本类型文件
3.脚本语言的种类
1、编译型语言
定义:指用专用的编译器,针对特定的操作平台(操作系统)将某种高级语言源代码一次性翻译成可被硬件平台直接运行的二进制机器码(具有操作数,指令、及相应的格式),这个过程叫做编译(./configure make makeinstall );编译好的可执行性文件(.exe),可在相对应的平台上运行(移植性差,但运行效率高)。。
典型的编译型语言有, C语言、C++等。
另外,Java语言是一门很特殊的语言,Java程序需要进行编译步骤,但并不会生成特定平台的二进制机器码,它编译后生成的是一种与平台无关的字节码文件(*.class)(移植性好的原因),这种字节码自然不能被平台直接执行,运行时需要由解释器解释成相应平台的二进制机器码文件;大多数人认为Java是一种编译型语言,但我们说Java即是编译型语言,也是解释型语言也并没有错。
2、解释型语言
定义:指用专门解释器对源程序逐行解释成特定平台的机器码并立即执行的语言;相当于把编译型语言的编译链接过程混到一起同时完成的。
解释型语言执行效率较低,且不能脱离解释器运行,但它的跨平台型比较容易,只需提供特定解释器即可。
常见的解释型语言有, Python(同时是脚本语言)与Ruby等。
3、脚本语言
定义:为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语言。
特点:程序代码即是最终的执行文件,只是这个过程需要解释器的参与,所以说脚本语言与解释型语言有很大的联系。脚本语言通常是被解释执行的,而且程序是文本文件。
典型的脚本语言有,JavaScript,Python,shell等。
其他常用的脚本语句种类
shell脚本的优势在于处理操作系统底层的业务 (linux系统内部的应用都是shell脚本完成)因为有大量的linux系统命令为它做支撑。2000多个命令都是shell脚本编程的有力支撑,特别是grep、awk、sed等。例如:一键软件安装、优化、监控报警脚本,常规的业务应用,shell开发更简单快速,符合运维的简单、易用、高效原则.
shell解释器,用户和操作系统内核之间的桥梁
shell介于操作系统内核与用户之间,负责接收用户输入的操作指令(命令),并运行和解释,将需要执行的操作传递给操作系统内核并执行
shell程序在系统中充当了一个”命令解释“的角色
4.1 Shell常见种类
Bsh:由贝尔实验室编写。Bsh是产生较早的UNIX Shell程序,实现了最基本的命令解释器的功能,同时也可以作为脚本编程语言。
Csh:是因使用C语言的语法风格而得名,在用户的命令行交互界面上进行了很多改进,并增加了历史,别名,文件名替换,作业掏等功能,相比Bsh,Csh在更加适用为 用户提供命令交互操作。
Ksh:在Bsh和Csh之后出现的,结合了两都的功能优势,兼具Bsh的语法和Csh的交互特性。
Bash:从名称可以看出是Bsh的升级版本,是著名的开源软件项目,目前大多数的Linux版本(包括Red Hat公司的Linux系统)都使用Bash 作为默认的Shell程序当运行Shell程序时,实际运行的是Bash程序。
Zsh:更多地基于交互式操作进行设计的Shell程序,集成了Bash,Ksh等多种Shell程序的优点。
Linux默认shell是Bourne Again shell(bash)
[root@localhost /]# cat /etc/shells
4.3 bash版本
查看bash的version
/bin/bash --version
4.4 sh与bash 的关系:
sh是一种POSIX标准,它有很多种实现,包括ksh88, dash,bash等。
因为sh是一种规范,并不是实现,
所以/bin/sh实际上是一个硬链接,链接到某种实现上。大多数情况下,
/bin/sh会链接到/bin/bash。所以执行sh xx.sh
等价于执行
bash xx.sh
5 脚本书写规范
5.1 选择解释器
开头的"#!"字符又称为幻数,在执行bash脚本的时候,内核会根据"#!"后的解释器来确定该用那个程序解释这个脚本中的内容。
init.d目录。这个目录是干嘛的呢?
它归根结底只做了一件事情,但这件事情非同小可,是为整个系统做的,
因此它非常重要。init.d目录包含许多系统各种服务的启动和停止脚本。
[root@localhost ~]# head -1 /etc/init.d/*
==> /etc/init.d/functions <==
# -*-Shell-script-*-
==> /etc/init.d/netconsole <==
#!/bin/bash
==> /etc/init.d/network <==
#! /bin/bash
==> /etc/init.d/README <==
You are looking for the traditional init scripts in /etc/rc.d/init.d,
init.d目录都是用来放服务脚本的,当Linux启动时,会寻找这些目录中的服务脚本,并根据脚本的run level确定不同的启动级别。
5.2 开发的规范
1) 放在统一的目录
2) 脚本以.sh为扩展名 (不是必需的)
3) 开头指定脚本解释器。(#! /bin/sh)
4) 开头加版本版权等信息,可配置~/.vimrc文件自动添加。
5) 脚本不要用中文注释,尽量用英文注释。
6) 代码书写优秀习惯
a、成对的内容一次性写出来,防止遗漏,如[ ]、' '、" "等
b、[ ]两端要有空格,先输入[ ],退格,输入2个空格,再退格写。
c、流程控制语句一次书写完,再添加内容。(if 条件 ; then 内容;fi)
语法结构为
if condtion
then
do something
elif condtion
then
do something
else
do something
fi
d、通过缩进让代码易读。
f、脚本中的引号都是英文状态下的引号,其他字符也是英文状态。
6 shell脚本的编写/执行/调试
6 shell脚本的编写/执行/调试
6.1 创建第一个shell脚本文件
创建脚本文件test.sh
[root@localhost tmp]# mkdir demo1
[root@localhost tmp]# cd demo1
[root@localhost demo1]# ls
[root@localhost demo1]# touch test.sh
[root@localhost demo1]#
在shell编程中,通常情况下,#代表注释,但是第一行的#是一个特例。
#! /bin/sh是shell脚本的一个标志,声明这个script使用的shell。
第一行的#!是一个约定标记, 它告诉脚本这段脚本需要什么解释器来执行.
第二行的echo命令则负责向屏幕上输出一句话。
运行这个脚本文件 sh test.sh 或者是 ./test.sh
刚开始执行不成功,是因为权限不够 如果赋权限 使用chmod命令
报错原因:
根据截图也可以看出,text01.sh的文字颜色是白色,并不是绿色,所以也可以看出它并没有执行权限,因此我们要赋权限, 可以使用chmod 777 test.sh命令来赋权限。
其实运行shell程序共有三种方法,除了给文件赋予可执行权限外,还有另外两种方法。
- chmod +x使文件具有可执行权限, 直接运行;
- 直接调用解释器, 将脚本文件作为参数传入 (比如bash test.sh)
- 使用source(也可用.代替)执行文件 (在当前bash环境下读取并执行FileName中的命令。该filename文件可以无"执行权限")
通常情况下, 最方便的方式就是方式1, 通过方式1执行你需要在脚本第一行写好这段脚本由哪个解释器来解释, 而通过方式2来执行则没有这个限制, 写了也没用。除此之外方式1与方式2执行命令就没有区别了,
source script.sh:在脚本运行结束后,脚本中的变量在当前环境仍会被保留。
sh script.sh:在当前环境启动一个子进程运行脚本, 脚本中的变量会在脚本运行结束时释放掉。
6.2 Shell的变量
变量可以分为三类:环境变量(全局变量)、普通变量(局部变量)、 特殊变量
环境变量:也可称为全局变量,可以在创建他们的Shell及其派生出来的任意子进程shell中使用,环境变量又可分为自定义环境变量和Bash**内置的环境变量**
普通变量:也可称为局部变量,只能在创建他们的Shell函数或Shell脚本中使用。普通变量一般是由开发者用户开发脚本程序时创建的。
特殊变量:脚本内置的具有特殊用途的变量
使用 env ,export 命令查看系统中的环境变量
env 显示用户的环境变量
export 显示当前导出成用户变量的shell变量,并显示变量的属性(是否只读),
按变量名称排序
输出一个系统中的 环境变量 echo $HOME
6.2.2 普通变量
本地变量在用户当前的Shell生存期的脚本中使用。例如,本地变量a取值为1,这个值在用户当前Shell生存期中有意义。如果在Shell中启动另一个进程或退出,本地变量值将无效。
注意:$用来获取变量的值 ,=前后两端不能有空格
#! /bin/sh
#输出数字,字符串
echo "不带引号的数字:"
echo 1
echo "带单引号的数字:"
echo '1'
echo '双引号数字:'
echo "1"
echo "带单引号字符串:"
echo 'hello'
echo "双引号字符串:"
echo "hello"
#定义变量
str="123"
#输出变量
echo $str
echo "单引号变量:"
echo '$str'
echo '双引号变量:'
echo "$str"
#定义转义字符
echo '转义字符\'\'
echo "转义字符\"\""
注意:
单引号字符串的限制:单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号里可以有变量,可以出现转义字符。
6.2.3 变量中引号的使用
只有在变量的值中有空格的时候,会使用引号。
单引号与双引号的区别在于,是否能够解析特殊符号。
变量使用反引号赋值,及使用${}获取参数值
取值的时候不加{}代表取的是某一个变量的值 :$ab 取的是ab变量的值
加{}之后取的是拼接之后的值:${a}b 取的是 ${a}的值拼接上字符串b
6.2.4 定义变量名技巧
- 变量名只能为字母、数字或下划线,只能以字母或下划线开头。
- 变量名的定义要有一定的规范,并且要见名知意。
示例:
ClsnAge=22 #<==每个单词的首字母大写的写法
clsn_age=22 #<==单词之间用"_"的写法
clsnAgeSex=man #<==驼峰语法:首个单词的首字母小写,其余单词首字母大写
CLSNAGE=22 #<==单词全大写的写法
- 一般的变量定义、赋值常用双引号;简单连续的字符串可以不加引号;希望原样输出时使用单引号。
- 希望变量的内容是命令的解析结果时,要用反引号``,或者用$()把命令括起来再赋值。
6.2.5 特殊变量
- 位置变量
常用的特殊位置参数说明
位置变量 | 作用说明 |
$0 | 获取当前执行的shell脚本的文件名,如果执行脚本带路径那么就包括脚本路径。 |
$n | 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9用大括号括起来{10},参数以空格隔开。 |
$# | 获取当前执行的shell脚本后面接的参数的总个数 |
$* | 获取当前shell的所有传参的参数,不加引号同如果给加上双引号,例如: “$”,则表示将所有的参数视为单个字符串,相当于“112$3”。 |
$@ | 获取当前shell的所有传参的参数,不加引号同如果给@加上双引号,例如: “则表示将所有参数视为不同的独立字符串,相当于1” “3” “……”,这是将参数传递给其他程序的最佳方式,因为他会保留所有内嵌在每个参数里的任何空白。 |
当“$*”和“$@”都加双引号时,两者有区别,都不加双引号时,两者无区别。。 |
2. 进程状态变量
Shell进程的特殊状态变量说明
位置变量 | 作用说明 |
$? | 获取执行上一个指令的执行状态返回值(0为成功,非零为失败),这个变量最常用 |
$$ | 获取当前执行的Shell脚本的进程号(PID),这个变量不常用,了解即可 |
$! | 获取上一个在后台工作的进程的进程号(PID),这个变量不常用,了解即可 |
$_ | 获取在此之前执行的命令或脚本的最后一个参数,这个变量不常用,了解即可 |
1. echo**参数说明**
参数 | 参数说明 |
-n | 不要追加换行 |
-e | 启用下列反斜杠转义的解释 |
-E | 显式地抑制对于反斜杠转义的解释 |
`echo' 对下列反斜杠字符进行转义: | |
\n | 换行 |
\r | 回车 |
\t | 横向制表符 |
\b | 退格 |
\v | 纵向制表符 |
\c | 抑制更多的输出 参数 |
6.3定义变量的方式
6.3.1三种定义变量的方式
- 直接赋值
- 传参 (传递参数)
- 交互式设置变量,使用read命令 类似于Scanner
6.3.2 read命令说明
获取输入内容,在命令行中使用
[root@localhost demo1]# read
123
[root@localhost demo1]# echo $REPLY
123
[root@localhost demo1]# read str
1234
[root@localhost demo1]# echo $str
1234
[root@localhost demo1]# echo $?
0
[root@localhost demo1]#
6.4 变量的子串
6.4.1变量子串说明
表达式 | 说明 |
${parameter} | 返回变量$parameter的内容 |
${#parameter} | 返回变内容的长度(按字符),也适用于特殊变量 |
${parameter:offset} | 在变量${parameter}中,从位置offset之后开始提取子串到结尾 |
${parameter:offset:length} | 在变量${parameter}中,从位置offset之后开始提取长度为length的子串 |
${parameter#word} | 从变量${parameter}开头开始删除最短匹配的word子串 |
${parameter##word} | 从变量${parameter}开头开始删除最长匹配的word子串 |
${parameter%word} | 从变量${parameter}结尾开始删除最短匹配的word子串 |
${parameter%%word} | 从变量${parameter}结尾开始删除最长匹配的word子串 |
${parameter/pattem/string} | 使用string代替第一个匹配的pattern |
${parameter//pattem/string} | 使用string代替所有匹配的pattern |
#!/bin/sh
str="1bcabdbdbdffgjrjhrhgotababab"
echo "输出字符串:${str}"
echo "字符的长度为:${#str}"
echo "从第三位开始截取字符串:${str:3}"
echo "从第三位开始截取6位:${str:3:6}"
echo "从头开始删除最短匹配的ab:${str#ab}"
echo "从头开始删除最长匹配的ab:${str##ab}"
echo "从尾部开始删除最短匹配的ab:${str%ab}"
echo "从尾部开始删除最长匹配的ab:${str%%ab}"
echo "替换第一个ab:${str/ab/xxx}"
echo "替换所有的ab:${str//ab/xxx}"
6.4.2 特殊扩展变量说明
表达式 | 说明 |
${parameter:-word} | 如果parameter的变量值为空或未赋值,则会返回word字符串并替代变量的值用途.如果变量未定义,则返回备用的值,防止变量为空值或因未定义而导致异常 |
${parameter:=word} | 如果parameter的变量值为空或未赋值,则设置这个变量值为word,并返回其值。位置变量和特殊变量不适用用途:基本同上一个${parameter>word},但该变量又额外给parameter变量赋值了 |
${parameter:?word} | 如果parameter变量值为空或未赋值,那么word字符串将被作为标准错误输出,否则输出变量的值。用途:用于捕捉由于变量未定义而导致的错误,并退出程序 |
${parameter:+word} | 如果parameter变量值为空或未赋值,则什么都不做,否则word字符串将替代变量的值 |
7 条件表达式
Dos2unix
7.1 &&,||
&&
如果第一个命令执行成功(返回1),与操作符&&才会执行第二个命令
如果第一个命令执行不成功就直接返回0
||
如果第一个命令执行失败,或操作符||才会执行第二个命令
如果第一个命令执行成功就直接返回1
7.2文件判断
常用文件测试操作符
常用文件测试操作符 | 说明 |
-d文件,d的全拼为directory | 文件存在且为目录则为真,即测试表达式成立 |
-f文件,f的全拼为file | 文件存在且为普通文件则为真,即测试表达式成立 |
-e文件,e的全拼为exist | 文件存在则为真,即测试表达式成立。注意区别于“-f”,-e不辨别是目录还是文件 |
-r文件,r的全拼为read | 文件存在且可读则为真,即测试表达式成立 |
-s文件,s的全拼为size | 文件存在且文件大小不为0则为真,即测试表达式成立 |
-w文件,w的全拼为write | 文件存在且可写则为真,即测试表达式成立 |
-x文件,x的全拼为executable | 文件存在且可执行则为真,即测试表达式成立 |
-L文件,L的全拼为link | 文件存在且为链接文件则为真,即测试表达式成立 |
fl -nt f2,nt 的全拼为 newer than | 文件fl比文件f2新则为真,即测试表达式成立。根据文件的修改时间来计算 |
fl -ot f2,ot 的全拼为 older than | 文件fl比文件f2旧则为真,即测试表达式成立。根据文件的修改时间来计算 |
判断目录是否存在
判断文件是否存在
7.3字符串判断
字符串测试操作符
常用字符串测试操作符 | 说明 |
-n "字符串" | 若字符串的长度不为0,则为真,即测试表达式成立,n可以理解为no zero |
-Z "字符串" | 若字符串的长度为0,则为真,即测试表达式成立,z可以理解为zero的缩写 |
"串 1"== "串 2" | 若字符串1等于字符串2,则为真,即测试表达式成立,可使用"=="代替"=" |
"串 1" != "串 2" | 若字符串1不等于字符串2,则为真,即测试表达式成立,但不能用"!=="代替"!=" |
1.对于字符串的测试,一定要将字符串加双引号之后再进行比较。 2.空格非空 |
练习:
7.4 整数判断
整数二元比较操作符参考
在[]以及test中 使用的比较符号 | 在(())和[[]]中 使用的比较符号 | 说明 |
-eq | ==或= | 相等,全拼为equal |
-ne | != | 不相等,全拼为not equal |
-gt | > | 大于,全拼为greater than |
-ge | >= | 大于等于,全拼为greater equal |
-lt | < | 小于,全拼为less than |
-le | <= | 小于等于,全拼为less equal |
7.5 逻辑符号
&&:连接命令,如果第一个命令执行成功(返回1),与操作符&&才会执行第二个命令
[root@localhost demo03]# expr 1 == 1 && echo "相等"
1
相等
[root@localhost demo03]# expr 1 == 2 && echo "相等"
0
[root@localhost demo03]# expr 1 == 1 && echo "相等"
1
&&:[[]]使用,作为逻辑运算符,判断两个表达式是否都成立
[root@localhost demo03]# [[ 1 == 1 && 1 == 1 ]]
[root@localhost demo03]# echo $?
0
[root@localhost demo03]# [[ 1 == 1 && 1 == 2 ]]
[root@localhost demo03]# echo $?
1
常用逻辑操作符
在[]和test中使用的操作符 | 说明 | 在[[]]和中使用的操作符 | 说明 |
-a | [ 条件A -a 条件B ] A与B都要成立,整个表达式才成立 | && | and,与,两端都为真,则结果为真 |
-o | [ 条件A -o 条件B] A与B都不成立,整个表达式才不成立 | || | or,或,两端有一个为真,则结果为真 |
! | ! | not,非,两端相反,则结果为真 |
8 if条件语句
8.1单分支语句
if [ 条件表达式 ]
then
Do something
fi
8.2双分支语句
if [ 条件表达式 ]
then
。。。。。。
else
..........
fi
8.3多分支语句
if [ 条件 ]
then
......
elif [ 条件 ]
then
........
else
.......
fi
成绩:
>=90优秀
>=80 良好
>=70 中等
>=60 及格
#! /bin/sh
if [ $# == 0 ]
then
echo "没有参数"
else
if [ $1 -ge 90 ]
then
echo "非常优秀!!!"
elif [ $1 -ge 80 ]
then
echo "优秀"
elif [ $1 -ge 70 ]
then
echo "良好"
elif [ $1 -ge 60 ]
then
echo "及格"
else
echo "不及格"
fi
fi
9 case条件结构语句
9.1 case语法结构
9.2 case与if的对比
case书写方式
case $name in
值1)
指令1
;;
值2)
指令2
;;
*)
指令
esac
if书写方式
if [ $name == "值1" ]
then
指令1
elif [ $name == "值2" ]
then
指令2
else
指令
fi
9.3 case值的书写方式
apple)
echo -e "$RED_COLOR apple $RES"
;;
也可以这样写,输入2种格式找同一个选项
apple|APPLE)
echo -e "$RED_COLOR apple $RES"
;;
10 for循环
10.1 列表for循环(常用)
#!/bin/bash
for i in 取值列表
do
循环主体
命令done
思考:卸载openjdk
- 查询系统中是否有jdk
l=`rpm -qa|grep jdk`
- 循环获jdk的安装包
for name in $l
do
echo $name
done
1.找到启动文件 startup.sh
l=`find 路径 -name startup.sh`
for i in $l
10.2类似C语言的风格
for((exp1;exp2;exp3))
do
指令...done
编写类似C语言风格脚本
Shell中的两种样式
11 while语法
基本结构:
while 条件
do
命令
done
6 until循环
基本结构
until condition
do
do something...
done
当满足条件的时候语句就不再往下执行了
12 跳出循环
shell中也支持break跳出循环, continue跳出本次循环.用法与C, Java中相同
13 退出/返回状态
1) $?:返回上一条语句或脚本执行的状态
a. 0:成功
b. 1-255:不成功
2) exit 命令,用于退出脚本或当前Shell
exit 命令n 是一个从 0 到 255 的整数 ,0 表示成功退出,非零表示遇到某种失败 ,返回值 被保存在状态变量 $? 中 。
exit n
常见的返回状态码
a. 0: 执行正确
b. 1: 通用错误
c. 126: 命令或脚本没有执行权限
d. 127: 命令没找到
14 数据流重定向
标准输入:代码0,使用 < 或者 <<
标准输出:代码1,使用 > 或者 >>
错误输出:代码2,使用 > 或者 >>
> 表示 写入; >>表示追加
<表示 读入;<<表示结束读入
EOF是END Of File的缩写,表示自定义终止符.
举例:
往hosts文件里追加两行域名的解析
创建updateHost.sh文件 编写脚本语言,将特定内容自动写入指定文件中。
执行脚本文件
查看(写入成功)
动态查看的时候使用的命令为 tail -f 文件名字
tail命令主要用于监视文件的内容
tail命令语法
tail [ -f ] [ -c Number | -n Number | -m Number | -b Number | -k Number ] [ File ]
参数解释:
-f 该参数用于监视File文件增长。
-c Number 从 Number 字节位置读取指定文件
-n Number 从 Number 行位置读取指定文件。
-m Number 从 Number 多字节字符位置读取指定文件,比方你的文件假设包括中文字,假设指定-c参数,可能导致截断,但使用-m则会避免该问题。
-b Number 从 Number 表示的512字节块位置读取指定文件。
-k Number 从 Number 表示的1KB块位置读取指定文件。
File 指定操作的目标文件名称
上述命令中,都涉及到number,假设不指定,默认显示10行。Number前面可使用正负号,表示该偏移从顶部还是从尾部開始计算。
tail可运行文件一般在/usr/bin/以下。