第一章
1.1.1 Linux系统简介-UNIX发展历史和发行版本
1.2Linux系统简介-开源软件简介
1.3Linux系统简介-Linux应用领域
第二章
1.1Linux系统安装-VMware虚拟机安装与使用
1.2Linux系统安装-系统分区
1.3Linux系统安装-Linux系统安装
1.4Linux系统安装-远程登录管理软件
网络适配器
- 网络连接
- 桥接:说明虚拟机是用的真实网卡实现虚拟机与真实机通讯。
- 缺点:占用真实网段ip
- 优点:能与局域网内的其他真实机通讯。
- NAT:是通过VMnet8虚拟网卡假网卡与真实机通讯。
- Host-only:是通过VMnet1虚拟网卡假网卡与真实机通讯。
- NAT/Host-noly与之相反:不占用真实ip,只能与本机通讯。
- 桥接:说明虚拟机是用的真实网卡实现虚拟机与真实机通讯。
Host-only:只能和真实机通讯。
NAT:只能和真实机通讯基础上,如果真实机能访问互联网,虚拟机也能访问互联网。
lo:本机回环网卡
临时更改ip地址命令:ifconfig eth0 192.168.1.1
eth0:指第一个网卡
*注:只是临时更改,重启后失效。
df:查看分区
第三章
1.1 注意事项
- Linux严格区分大小写
- Linux中所有内容以文件形式保存,包括硬件。[硬盘文件是/dev/sd[a-p] 、光盘文件是/dev/sr0等]
- Linux不靠扩展名区分文件类型,靠的是文件权限。
- 压缩包:“*.gz”、“*.bz2”、“*.tar.bz2”、"*.tgz"等
- 二进制软件包:“.rpm”
- 网页文件:“*.html”、“*.php”
- 脚本文件:“*.sh”
- 配置文件:“*.conf”
- Linux所有的存储设备都必须挂载之后用户才能使用,包括硬盘、U盘和光盘
- Windows下的程序不能直接在Linux中安装和运行
1.2 服务器管理和维护建议
1.2.1 Linux各目录的作用
目录名 | 目录作用 |
---|---|
/bin/ | 存放系统命令的目录,普通用户和超级用户都可以执行。不过放在/bin下的命令在单用户模式下也可以执行。 |
/sbin/ | 保存和系统环境设置相关的命令,只有超级用户可以使用这些命令进行系统环境设置,但是有些命令可以允许普通用户查看。 |
/usr/bin/ | 存放系统命令的目录,普通用户和超级用户都可以执行。这些命令和系统启动无关,在单用户模式下不能执行。 |
/usr/sbin/ | 存放根文件系统不必要的系统管理命令,例如多数服务程序。只有超级用户可以使用。大家其实可以注意到Linux的系统,在所有“sbin”目录中保存的命令只有超级用户可以使用,“bin”目录中保存的命令所有用户都可以使用。 |
/boot/ | 系统启动目录,保存系统启动相关的文件,如内核文件和启动引导程序(grub)文件等。 |
/dev/ | 设备文件保存位置。我们已经说过Linux中所有内容以文件形式保存,包括硬件。那么这个目录就是用来保存所有硬件设备文件的。 |
/etc/ | 配置文件保存位置。系统内所有采用默认安装方式(rpm安装)的服务的配置文件全部都保存在这个目录中,如用户账户和密码,服务的启动脚本,常用服务的配置文件等。 |
/home/ | 普通用户的家目录。建立每个用户时,每个用户要有一个默认登录位置,这个位置就是这个用户的家目录,所有普通用户的家目录就是在/home下建立 一个和用户名相同的目录。如用户user1的家目录就是/home/user1 |
/lib/ | 系统调用的函数库保存位置 |
/lost+found/ | 当系统意外崩溃或机器意外关机,而产生一些文件碎片放在这里。当系统启动的过程中fsck工具会检查这里,并修复已经损坏的文件系统。这个目录只在每个分区中出现,例如/lost+found就是根分区的备份恢复目录,/boot/lost+found就是/boot分区的备份恢复目录。 |
/media/ | 挂载目录。系统建议是用来挂载媒体设备的,例如软盘和光盘。 |
/mnt/ | 挂载目录,早期Linux中只有这一个挂载目录,并没有细分。现在这个目录系统建议挂载额外设备,如U盘,移动硬盘和其他操作系统的分区。 |
/misc/ | 挂载目录。系统用来挂载NFS服务的共享目录。我们在刚刚已经解释了挂载,童鞋们应该知道只要是一个已经建立的空目录就可以作为挂载点。那么系统虽然准备了三个默认挂载目录/media、/mnt、/misc,但是到底在哪个目录中挂载什么设备都可以由管理员自已决定。例如超哥接触Linux的时候,默认挂载目录只有/mnt一个,所以养成了在/mnt下建立 不同目录挂载不同设备的习惯。如/mnt/cdrom挂载光盘,/mnt/usb挂载U盘,这都是可以的。 |
/opt/ | 第三方安装的软件保存位置。这个目录就是放置和安装其他软件的位置,我手工安装的源码软件都可以安装到这个目录当中。不过我还是更加习惯把软件放置到/usr/local目录当中,也就是说/usr/local目录也可以用来安装软件。 |
/proc/ | 虚拟文件系统,该目录中的数据并不保存到硬盘当中,而是保存到内存当中,主要保存系统的内核,进程,外部设备状态和网络状态等。如/proc/cpuinfo是保存CPU信息的,/proc/devices是保存设备驱动的列表的,/proc/filesystems是保存文件系统列表的,/proc/net/是保存网络协议信息的 |
/sys/ | 虚拟文件系统。和/proc目录相似,都是保存在内存当中的,主要是保存于内核相关信息的。 |
/root/ | 超级用户的家目录。普通用户家目录在”/home“下,超级用户家目录直接在"/"下。 |
/srv/ | 服务数据目录。一些系统服务启动之后,可以在这个目录中保存所需要的数据。 |
/tmp/ | 临时目录。系统存放临时文件的目录,该目录下所有用户都可以访问和写入。我们建议此目录不能保存重要数据,最好每次开机都把该目录清空。 |
/usr/ | 系统软件资源目录。注意usr不是user的缩写,而是”Unix Software Resource“的缩写,所以不是存放用户数据,而是存放系统软件资源的目录,系统中安装的软件大多数保存在这里,所以除了/usr/bin/和/usr/sbin这两个目录,我在介绍几个/usr/下的二级目录。 |
/var/ | 动态数据保存位置。主要保存缓存、日志以及软件运行所产生的文件。 |
1.2.2 服务器注意事项
- 远程服务器不允许关机,只能重启
- 重启时应该关闭服务
- 不要在服务器访问高峰运行高负载命令
- 远程配置防火墙时,不要把自已踢出服务器
- 指定合理的密码规范并定期更新
- 合理分配权限
- 定期备份重要数据和日志
第四章 Linux常用命令
1. 文件处理命令
1.1 命令格式与目录处理命令ls
命令格式: 命令 [-选项] [参数]
例: ls -la /etc
说明:1)个别命令使用不遵循此格式
2)当有多个选项时,可以写在一起
3)简化选项与完整选项
-a 等于 --all
目录处理命令:ls
语法:ls 选项[-ald] [文件或目录]
-a 显示所有文件,包括隐藏文件
-l 详细信息显示
-d 查看目录属性
-rw-r--r--
drw-r--r--
lrw-r--r--
-:文件类型( -:二进制文件 d:目录 l:软链接文件)
rw- r-- r--
u g o
u所有者 g所属组 o其他人
r读 w写 x执行
1.2 目录处理命令
mkdir:
语法:mkdir -p [目录名]
功能描述:创建新目录
-p 递归创建
范例:mkdir -p /tmp/Japan/boduo
mkdir /tmp/Japan/longze /tmp/Japan/cangjing
rmdir
语法:rmdir [目录名]
功能描述:删除空目录
cp
语法: cp -rp [原文件或目录] [目标目录]
-r 复制目录
-p 保留文件属性[除复制文件的内容外,还把修改时间和访问权限也复制到新文件中]
功能描述:复制文件或目录(复制的过程中可以更名)
mv
语法: mv[原文件或目录] [目标目录]
功能描述:剪切文件、改名
rm
语法:rm -rf [文件或目录]
-r 删除目录
-f 强制执行
功能描述:删除文件
1.3 文件处理命令
touch
语法:touch [文件名]
功能描述:创建空文件
cat
语法:cat [文件名]
功能描述:显示文件内容
-n 显示行号
tac
语法:tac [文件]
功能描述:显示文件内容(反向列示)与cat显示相反,但不支持-n
more
语法:more [文件名]
(空格)或f 翻页
(Enter) 换行
q或Q 退出
功能描述:分页显示文件内容
less
语法:less [文件名]
(空格)或f 翻页
(Enter) 换行
q或Q 退出
pageup 向上翻页
↑ 一行一行向上翻页
功能描述:分页显示文件内容(可向上翻页)
附加功能:查找- 按“/”,输入要搜索的关键词,按“n(next)” 找下一个。
head
语法:head [文件名]
功能描述:显示文件前面几行
-n 指定行数 (默认前十行)
例: head -n 7 /etc/services
tail
语法:tail [文件名]
功能描述:显示文件后面几行
-n 指定行数
-f 动态显示文件末尾内容
1.4 链接命令
ln
语法:ln -s [原文件] [目标文件]
-s 创建软链接
功能描述:生成链接文件
ln -s /etc/issue /tmp/issue.soft
# 创建文件/etc/issue的软链接/tmp/issue.soft
ln /etc/issue /tmp/issue.hard
# 创建/etc/issue的硬链接/tmp/issue.hard
软链接:
1.类似Windows快捷方式,权限为 lrwxrwxrwx,软链接的权限不影响源文件的权限
2.文件大小-只是符号链接
3./tmp/issue.soft->/etc/issue 箭头指向源文件
硬链接:
1.拷贝cp -p + 同步更新
2.通过i节点识别
3.不能跨分区
4.不能针对目录使用
2. 权限管理命令
2.1 权限管理命令chmod
chmod
语法:chmod [{ugoa}{+-=}{rwx}][文件或目录]
[mode=421][文件或目录]
-R 递归修改(改变目录下的所有权限)
功能描述:改变文件或目录权限
例:chmod u+x *** #给所有者增加执行权限
chmod g+w,o-r *** #给所属组增加写权限,其他人的r权限去掉
【u:所有者,g:所属组,o:其他人,a:all所有】
【+:增加,-:减,=:不管之前有什么权限,全部按照本次授权】
权限的数字表示:
r---4
w---2
x---1
rwxrw-r--
7 6 4
例:chmod 640 *** # rw-r-----
所有者、root才可以更改权限
对目录有w权限,才可以写/删除目录下的文件。
2.2 其他权限管理命令
chown
语法:chown [用户] [文件或目录]
功能描述:改变文件或目录的所有者(只有root用户可以修改)
chgrp
语法:chgrp [用户组] [文件或止录]
功能描述:改变文件或目录的所属组
umask
语法:umask [-S]
-S 以rwx形式显示新建文件缺省权限
功能描述:显示、设置文件的缺省权限
3. 文件搜索命令
3.1 文件搜索命令find
find
语法:find [搜索范围] [匹配条件]
-name 根据文件名搜索(精确查找,模糊查找--> *init、*init*、init*。init?问号匹配单个字符)
-iname 不区分大小写(与-name没有本质区别)
-size (+n 大于 -n小于 n等于)
-user 根据所有者查找 find /home -user ***
-group 根据所属组查找
根据时间属性查找:
-amin访问时间 access
-cmin文件属性change
-mmin文件内容modify
例:find /etc -cmin -5 [在/etc下查找5分钟内被修改过属性的文件和目录]
-a两个条件同时满足
-o两个条件满足任意一个即可
例:find /etc -size +163840 -a -size -204800[在/etc下查找大于80MB小于100MB的文件]
-exec/-ok 命令{} \; 对搜索结果执行操作
例:find /etc -name inittab -exec ls -s {} \;[在/etc下查找inittab文件并显示其详细信息]
-type 根据文件类型查找 [f文件 d目录 l软链接文件]
-imun 根据i节点查找
功能描述:文件搜索
3.2 其他搜索命令
locate
语法:locate 文件名
-i 不区分大小写
功能描述:在文件资料库中查找文件[tmp目录不在locate收录范围之内]
updatedb 更新资料库,更新后,locate便可查找到。
which
语法:which 命令
功能描述:搜索命令所在目录及别名信息
例:which ls
whereis
语法:whereis [命令名称]
功能描述:搜索命令所在目录及帮助文档路径
grep
语法:grep -iv [指定字串] [文件]
-i 不区分大小写
-v 排除指定字串
功能描述:在文件中搜寻字串匹配的行并输出
例:grep mysql /root/install.log
4. 帮助命令
man
语法:man [命令或配置文件]
功能描述:获得帮助信息
例:man ls [查看ls命令的帮助信息]
man services[查看配置文件services的帮助信息]
man查看配置文件的帮助,不能写成man /etc/services绝对路径。因为得到的并不是帮助信息,而是把这个文件都显示出来了。直接man services就可以了。【man+配置文件信息】
每个Linux配置文件都会有关于这个配置文件的格式的介绍。都是有规律的。如下图:
空格翻页、回车一行一行住下翻,q退出, 可以用 /** 文件内查找,同more/less
*注:不仅能查看命令的帮助,还能查看系统里面相关的配置文件的帮助信息
man passwd
Linux 优先查看的是命令的帮助信息。
[root@VM-20-2-centos /]# which passwd
/usr/bin/passwd
[root@VM-20-2-centos /]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man5/passwd.5.gz /usr/share/man/man1/passwd.1.gz
man/man1/passwd.1.gz man/man5/passwd.5.gz
1:命令的帮助 5配置文件的帮助
man 5 passwd
whatis ls #得到命令的简短的信息
apropos services 只想查看一个配置文件的信息
--help 列出常见的选项信息
touch --help
info 和man大同小异
help
语法:help 命令
功能描述:获得Shell内置命令的帮助信息
例:help umask 查看umask命令的帮助信息
Shell内置命令:找不到路径的命令就是Shell内置命令。
安装man帮助文档包。指令如下:
sudo yum install man-pages
5. 用户管理命令
useradd
语法:useradd 用户名
功能描述:添加新用户
passwd
语法:passwd用户名
功能描述:设置用户密码
who
语法:who
功能描述:查看登录用户信息
w
语法:w
功能描述:查看登录用户详细信息
[root@VM-20-2-centos /]# w
22:11:31 up 354 days, 7:52, 2 users, load average: 0.08, 0.09, 0.10
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 120.1.56.101 10:02 3.00s 0.14s 0.00s w
root pts/1 120.1.56.101 10:02 12:08m 44.52s 44.50s top
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
系统当前时间 系统连续运行的时间 当前总共有几个用户登录 负载均衡指数(过去1/5/15min系统负载的情况)
PCPU:这个用户当前登录过来执行的操作占用的CPU的时间。
JCPU:累计占用的CPU的时间。
WHAT:当前执行了什么操作。
6. 压缩解压命令
gzip
语法:gzip [文件]
功能描述:压缩文件(只能压缩文件,不能压缩目录,不保留原文件)
gunzip
语法:gunzip [压缩文件] 或 gzip -d
功能描述:解压缩.gz的压缩文件
【解压缩】:gunzip [压缩文件] 或 gzip -d
----------------------------------------------------------------------
tar
语法:tar 选项 [-zcf] [压缩后文件名] [目录]
-c 打包
-v 显示详细信息
-f 指定文件名
-z 打包同时压缩
功能描述:打包目录
压缩后文件格式:.tar.gz
例:
[root@VM-20-2-centos tmp]# tar -cvf nginxhtml.tar nginxhtml/
nginxhtml/
nginxhtml/Dockerfile
nginxhtml/dist/
nginxhtml/dist/color.less
nginxhtml/dist/color.less.gz
nginxhtml/dist/js/
......
解压缩:
tar命令解压缩语法:
-x 解包
-v 显示详细信息
-f 指定解压文件
-z 解压缩
例:tar -zxvf Japan.tar.gz
----------------------------------------------------------------------
zip
语法:zip 选项[-r] [压缩后文件名] [文件或目录]
-r 压缩目录
功能描述:压缩文件或目录
压缩后文件格式:.zip
保留原文件,可以压缩目录
解压缩:
语法:unzip
功能描述:解压.zip的压缩文件
----------------------------------------------------------------------
bzip2
语法:bzip2 选项[-k] [文件]
-k 产生压缩文件后保留原文件
功能描述:压缩文件
# tar -cjf Japan.tar.bz2 Japan 生成*.tar.bz2格式压缩包
解压缩:
语法:bunzip2 选项 [-k] [压缩文件]
-k 解压缩后保留原文件
功能描述:解压缩
7. 网络命令
write
语法:write <用户名>
功能描述:给用户发信息,以Ctrl+D保存结束
wall
语法:wall [message]
功能描述:发广播信息
ping
语法:ping 选项 IP地址
-c 指定发送次数
功能描述:测试网络连通性
例:ping -c 3 192.168.1.156
0% packet loss 丢包率 ↓
ifconfig
语法:ifconfig 网卡名称 IP地址
功能描述:查看和设置网卡信息
例:ifconfig eth0 192.168.8.250
【eth0、eth1 本地真实网卡, lo 回环网卡:本机通信和测试的】
mail
语法:mail [用户名]
功能描述:查看发送电子邮件
接收:mail
N 代表未读
邮箱地址位置:/var/spool/mail/root
help 查看支持的命令格式
1:输入序列号就能查看信的具体内容
h:查看邮箱列表
d+序列号:删除指定序列号的邮件
q:退出
last
语法:last
功能描述:列出目前与过去登入系统的用户信息
lastlog
语法:lastlog
-u (-u 502 查询指定用户的登录信息)
功能描述:检查某特定用户上次登录时间
traceroute
语法:traceroute
功能描述:显示数据包到主机间的路径
例:traceroute www.lampbrother.net
netstat
语法:netstat [选项]
功能描述:显示网络相关信息
选项:
-t: TCP协议
-u: UDP协议
-l: 监听
-r: 路由
-n: 显示IP地址和端口号
例:
# netstat -tlun 查看本机监听的端口
# netstat -an 查看本机所有的网络连接
# netstat -rn 查看本机路由表
setup
语法:setup
功能描述:配置网络【redhat专有命令】
挂载命令:mount
语法:mount [-t 文件系统] 设备文件名(系统默认指定/dev/sr0) 挂载点
例: #mount -t iso9660 /dev/sr0(同/dev/cdrom) /mnt/cdrom
-t 可省略
umount:卸载挂载点
8. 关机重启命令
shutdown(推荐)
语法:shutdown [选项] 时间
选项:
-c: 取消一个关机命令
-h: 关机
-r: 重启
例:shutdown -h now #now指现在关机,也可以指定时间,将now换成时间即可20:30
其他关机命令:
halt
poweroff
init 0
其他重启命令:
reboot
init 6
系统运行级别:
0: 关机
1: 单用户
2: 不完全多用户,不含NFS服务[network file system网络文件系统]-> 文件共享服务
3: 完全多用户
4: 未分配
5: 图形界面
6: 重启
runlevel:查询系统运行级别
[root@VM-20-2-centos ~]# runlevel
N 3
N:空。
logout:退出登陆
第五章 文本编辑器Vim
5.1 Vim常用操作
Vim是一个功能强大的全屏幕文本编辑器,是linux/UNIX上最常用的文本编辑器,它的作用是建立、编辑、显示文本文件。
Vim没有菜单,只有命令。
插入命令
命令 | 作用 |
---|---|
a | 在光标所在字符后插入 |
A | 在光标所在行尾插入 |
i | 在光标所在字符前插入 |
I | 在光标所在行行首插入 |
o | 在光标下插入新行 |
O | 在光标上插入新行 |
定位命令
命令 | 作用 |
---|---|
:set nu | 设置行号 |
:set nonu | 取消行号 |
gg | 到第一行 |
G | 到最后一行 |
nG | 到第n行 例:821G |
:n | 到第n行 |
0 | 移至行首 |
$ | 移至行尾 |
删除命令
命令 | 作用 |
---|---|
x | 删除光标所在处字符 |
nx | 删除光标所在处后n个字符 |
D | 删除光标所在处到行尾内容 |
dd | 删除光标所在行,ndd删除n行 |
dG | 删除光标所在行到文件末尾内容 |
:n1,n2d | 删除指定范围的行 :517,563d |
复制和剪切命令
命令 | 作用 |
---|---|
yy | 复制当前行 |
nyy | 复制当前行以下n行 |
dd | 剪切当前行 |
ndd | 剪切当前行以下n行 |
p、P | 粘贴在当前光标所在行下或行上 |
替换和取消命令
命令 | 作用 |
---|---|
r | 取代光标所在处字符 |
R | 从光标所在处开始替换字符,按Esc结束 |
u | 取消上一步操作 |
搜索和搜索替换命令
命令 | 作用 |
---|---|
/string | 搜索指定字符串 (同less搜索 → /+字符串) 搜索时忽略大小写:set ic |
n | 搜索指定字符串的下一个出现位置 |
:%s/old/new/g | 全文替换指定字符串 【%–>全文】old:旧字符串 new:新字符串 g:不询问 c:询问确认 |
:n1,n2s/old/new/g | 在一定范围内替换指定字符串【n1,n2s–>[n1,n2]范围内】 |
:%s/D:/ZF/Nginx/nginx-1.25.0/html/platform-H5/report///usr/local/nginx/html/platform-H5/report//g
/usr/local/nginx/html/platform-H5/report/
例:
:%s/ftp/yangmi/g 全文替换 不询问确认
:41,44s/yangmi/shenchao/c 部分替换并询问
保存和退出命令
命令 | 作用 |
---|---|
:w | 保存修改 |
:w new_filename | 另存为指定文件 |
:wq | 保存修改并退出 |
ZZ | 快捷键,保存修改并退出 |
:q! | 不保存修改退出 |
:wq! | 保存修改并退出(文件所有者及root可使用) |
5.2 Vim使用技巧
- 导入命令执行结果 :r !命令
:r 文件名 导入文件内容到光标位置
:! 系统命令 可以在不退出vim的情况下执行系统命令
:r !date 将date输出的日期导入到当前正在编辑的vim文件内
-
定义快捷键 :map 快捷键 触发命令
范例::map ^P I# 注释某一行
:map ^B 0x 删除行首的#(取消注释)
-
连续行注释 :n1,n2s/^/#/g n1,n2s: 定义范围。 ^:行首 /g 不询问
:n1,n2s/^#//g 将行首#去掉
:n1,n2s/^g 在行首添加//注释
-
替换 :ab mymail samlee@lampbrother.net 只要输入mymail [输入完后按空格或回车] 就替换为samlee@lampbrother.net
配置文件.vimrc ,可以将快捷键命令保存,并永久有效。[用户的家目录:/home/username/.vimrc /root/.vimrc]
第六章 软件包管理
1 软件包管理简介
1.1 软件包分类
- 源码包
- 脚本安装包
- 二进制包(RPM包、系统默认包)
1.2 源码包
源码包的优点:
- 开源,如果有足够的能力,可以修改源代码
- 可以自由选择所需的功能
- 软件是编译安装,所以更加适合自已的系统,更加稳定也效率更高
- 卸载方便
源码包的缺点:
- 安装过程步骤较多,尤其安装较大的软件集合时(如LAMP环境搭建),容易出现拼写错误
- 编译过程时间较长,安装比二进制安装时间长
- 因为是编译安装,安装过程中一旦报错新手很难解决
1.3 RPM包
二进制包的优点:
- 包管理系统简单,只通过几个命令就可以实现包的安装、升级、查询和卸载
- 安装速度比源码包安装快的多
二进制包的缺点:
- 经过编译,不再可以看到源代码
- 功能选择不如源码包灵活
- 依赖性
2 RPM包管理—rpm命令管理
2.1 包全名与依赖性
2.1.1 RPM包命名原则
例:httpd-2.2.15-15.el6.centos.1.i686.rpm
name | 解释 |
---|---|
httpd | 软件包名 |
2.2.15 | 软件版本 |
15 | 软件发布的次数 |
el6.centos | 适合的Linux平台 |
i686 | 适合的硬件平台 |
rpm | rpm包扩展名 |
2.1.2 RPM包依赖性
- 树形依赖: a→b→c
- 环形依赖: a→b→c→a
- 模块依赖: 模块依赖查询网站:www.rpmfind.net
2.2 安装升级与卸载
2.2.1 包全名与包名
- 包全名:操作的包是没有安装的软件包时,使用包命名。而且要注意路径。
- 包名:操作已经安装的软件包时,使用包名。是搜索/var/lib/rpm/中的数据库
2.2.2 RPM安装
rpm -ivh 包全名
选项:
-i(install) 安装
-v(verbose) 显示详细信息
-h(hash) 显示进度
--nodeps 不检测依赖性[一般不用这个命令,只能在做实验的时候使用]
2.2.3 RPM包升级
rpm -Uvh 包全名
选项:
-U(upgrade) 升级
2.2.4 卸载
rpm -e 包全名
选项:
-e(erase) 卸载
--nodeps 不检查依赖性
2.3 查询
2.3.1 查询是否安装
rpm -q 包名
#查询包是否安装
选项:
-q 查询(query)
rpm -qa
#查询所有已经安装的RPM包
选项:
-a 所有(all)
2.3.2 查询软件包详细信息
rpm -qi 包名
选项:
-i 查询软件信息(informaion)
-p 查询未安装包信息(package)
安装、卸载加包全名,其他只需要包名即可。
2.3.3 查询包中文件安装位置
rpm -ql包名
选项:
-l 列表(list)
-p 查询未安装包信息(package)
2.3.4 查询系统文件属于哪个RPM包
rpm -qf包名
选项:
-f 查询系统文件属于哪个软件包(file)
2.3.5 查询软件包的依赖性
rpm -qR 包名
选项:
-R 查询软件包的依赖性(requires)
-p 查询未安装包信息(package)
2.4 检验和文件提取
2.4.1 RPM包校验
rpm -V 已安装的包名
选项:
-V 校验指定RPM包中的文件(verify)
验证内容中的8个信息的具体内容如下:
- S 文件大小是否改变
- M 文件的类型或文件的权限(rwx)是否被改变
- 5 文件MD5校验和是否改变(可以看成文件内容是否改变)
- D 设备的中,从代码是否改变
- L 文件路径是否改变
- U 文件的属性(所有者)是否改变
- G 文件的属组是否改变
- T 文件的修改时间是否改变
文件类型
- c 配置文件(config file)
- d 普通文件(documentation)
- g "鬼"文件(ghost file),很少见,就是该文件不应该被这个RPM包包含
- l 授权文件(license file)
- r 描述文件(read me)
2.4.2 RPM包中文件提取
rpm2cpio 包全名 | \
cpio -idv .文件绝对路径
# \:表示一条命令太长,换行输入,正常应该为:【rpm2cpio 包全名 | cpio -ivd .文件绝对路径】 .代表把指定的文件提取到当前目录下
rpm2cpio
#uqfrpm包转换为cpio格式的命令
cpio
#是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件
cpio 选项 < [文件|设备]
选项:
-i copy-in模式,还原
-d 还原时自动新建目录
-v 显示还原过程
[root@localhost ~]# rpm -qf /bin/ls
#查询ls命令属于哪个软件包
[root@localhost ~]# mv /bin/ls /tmp/
#造成ls命令误删除假象
[root@localhost ~]# rpm2cpio /mnt/cdrom/Package/coreutils-8.4-19.el6.i686.rpm | cpio -idv ./bin/ls
#提取RPM包中ls命令到当前目录的/bin/ls下
[root@localhost ~]# cp /root/bin/ls /bin/
#把ls命令复制到/bin/目录,修复文件丢失
3 RPM包管理—yum包在线管理
3.1 IP地址配置和网络yum源
3.1.1 IP地址配置
[root@VM-20-2-centos ~]# setup
#使用setup工具配置网络,详情请看视频,此处未进行记录。
[root@VM-20-2-centos ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
把ONBOOT="no"改为ONBOOT="yes"
#启动网卡
[root@VM-20-2-centos ~]# service network restart
重启网络服务
3.1.2 网络yum源
[root@VM-20-2-centos ~]# vi /etc/yum.repos.d/CentOS-Base.repo
[base] 容器名称,一定要放在[]中
name 容器说明,可以自已随便写
mirrorlist 镜像站点,这个可以注释掉
baseurl 我们的yum源服务器的地址。默认是CentOS官方的yum源服务器,是可以使用的,如果你觉得慢可以改成你喜欢的yum源地址
【mirrorlist/baseurl 用哪个都行】
enabled 此容器是否生效,如果不写或写成enable=1都是生效,写成enable=0就是不生效
gpgcheck 如果是1是指RPM的数字证书生效,如果0则不生效
gpgkey 数字证书的公钥文件保存位置。不用修改
3.2 yum命令
yum不再有包全名的概念,包全名概念只有在手工rpm命令管理时存在
3.2.1 常用yum命令
1)查询
查询
[root@VM-20-2-centos ~]# yum list
# 查询所有可用软件包列表
[root@VM-20-2-centos ~]# yum search 关键字[包名]
# 搜索服务器上所有和关键字相关的包
2)安装
[root@VM-20-2-centos ~]# yum -y install 包名
选项:
install 安装
-y 自动回答yes
3)升级
[root@VM-20-2-centos ~]# yum -y update 包名
# 如果没有包名,则升级全部软件包
选项:
update 升级
-y 自动回答yes
4)卸载
[root@VM-20-2-centos ~]# yum -y remove 包名
选项:
remove 卸载
-y 自动回答yes
3.2.2 YUM软件组管理命令
[root@VM-20-2-centos ~]# yum grouplist
#列出所有可用的软件组列表
[root@VM-20-2-centos ~]# yum groupinstall 软件组名
#安装指定软件组,组名可以由grouplist查询出来
[root@VM-20-2-centos ~]# yum groupremove 软件组名
#卸载指定软件组
3.3 光盘yum源搭建
光盘yum源搭建步骤
1)挂载光盘
[root@VM-20-2-centos ~]# mount /dev/cdrom /mnt/cdrom
2)让网络yum源文件失效
[root@VM-20-2-centos ~]# cd /etc/yum.repos.d/
[root@VM-20-2-centos ~]# mv CentOS-Base.repo \
CentOS-Base.repo.bak
[root@VM-20-2-centos ~]# mv CentOS-Debuginfo.repo \
CentOS-Debuginfo.repo.bak
[root@VM-20-2-centos ~]# mv CentOS-Vault.repo \
CentOS-Vault.repo.bak
3)修改光盘yum源文件
[root@VM-20-2-centos ~]# vim CentOS-Media.repo
[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///mnt/cdrom
#地址为你自已的光盘挂载地址
# file:///media/cdrom/
# file:///media/cdrecorder/
#注释这两个不存在的地址
gpgcheck=1
enabled=1
#把enabled=0改为enabled=1,让这个yum源配置文件生效
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
4 源码包管理
4.1 源码包和RPM包的区别
4.1.1 区别
- 安装之前的区别:概念上的区别
- 安装之后的区别:安装位置不同
4.1.2 RPM包安装位置
是安装在默认位置中
RPM包默认安装路径 | |
---|---|
/etc/ | 配置文件安装目录 |
/usr/bin/ | 可执行的命令安装目录 |
/usr/lib/ | 程序所使用的函数库保存位置 |
/usr/share/doc/ | 基本的软件使用手册保存位置 |
/usr/share/man/ | 帮助文件保存位置 |
4.1.3 源码包安装位置
安装在指定位置当中,一般是 : /usr/local/软件名/
4.1.4 安装位置不同带来的影响
RPM包安装的服务可以使用系统服务管理命令(service)来管理,例如RPM包安装的apache的启动方法是:
- /etc/rc.d/init.d/httpd start
- service httpd start
而源码包安装的服务则不能被服务管理命令管理,因为没有安装到默认路径中。所以只能用绝对路径进行服务的管理,如:
/usr/local/apache2/bin/apachectl start
4.2 源码包安装过程
4.2.1 安装准备
-
安装C语言编译器
-
下载源码包
http://mirror.bit.edu.cn/apache/httpd/
4.2.2 安装注意事项
- 源代码保存位置:/usr/local/src/
- 软件安装位置:/usr/local/
- 如何确定安装过程报错:
- 安装过程停止
- 并出现error、warning或no的提示
4.2.3 源码包安装过程
-
下载源码包
-
解压缩下载的源码包
-
进入解压缩目录
-
./configure 软件配置与检查
- ./configure --prefix=/usr/local/apache2
- 定义需要的功能选项。
- 检测系统环境是否符合安装要求。
- 把定义好的功能选项和检测系统环境的信息都写入Makefile文件,用于后续的编辑。
-
make 编译
- make ckean 清空产生的临时文件
-
make install 编译安装
4.2.4 源码包的卸载
- 不需要卸载命令,直接删除安装目录即可。不会遗留任何垃圾文件。
5 脚本安装包与软件包选择
5.1 脚本安装包
- 脚本安装包并不是独立的软件包类型,常见安装的是源码包。
- 是人为把安装过程写成了自动安装的标配,只要执行脚本,定义简单的参数,就可以完成安装。
- 非常类似于Windows下软件的安装方式。
5.2 Webmin的作用
Webmin是一个基于Web的Linux系统管理界面。您就可以通过图形化的方式设置用户账号、Apache、DNS、文件共享等服务。
5.3 Webmin安装过程
- 下载软件
- http://sourceforge.net/projects/webadmin/files/webmin/
- 解压缩,并进入加压缩目录
- 执行安装脚本
第七章 用户和用户组管理
7.1 用户配置文件
7.1.1 用户信息文件/etc/passwd
1、用户管理简介
- 所以越是对服务器安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范。
- 在Linux中主要是通过用户配置文件来查看和修改用户信息。
2、/ect/passwd [每一字段列详解]
- 第1字段:用户名称
- 第2字段:密码标志
- 第3字段:UID(用户ID)
- 0:超级用户
- 1-499:系统用户(伪用户)
- 500-65535:普通用户
- 第4字段:GID(用户初始组ID)
- 第5字段:用户说明
- 第6字段:家目录
- 普通用户:/home/用户名/
- 超级用户:/root/
- 第7字段:登录之后的Shell
3、初始组和附加组
- 初始组:就是指用户一登录就立刻拥有这个用户组的相关权限,每个用户的初始组只能有一个,一般就是和这个用户的用户名相同的组名作为这个 用户的初始组。
- 附加组:批用户可以加入多个其他的用户组,并拥有这些组的权限,附加组可以有多个。
4、Shell是什么
- Shell就是Linux的命令解释器。
- 在/etc/passwd当中,除了标准Shell是/bin/bash之外,还可以写如/sbin/nologin。
7.1.2 影子文件/etc/shadow
1、影子文件/etc/shadow
- 第1字段:用户名
- 第2字段:加密密码
- 加密算法升级为SHA512散列加密算法
- 如果密码位是“!!” 或“*” 代表没有密码,不能登录(伪用户)
- 第3字段:密码最后一次修改日期
- 使用1970年1月1日作为标准时间,每过一天时间戳加1
- 第4字段:两次密码的修改间隔时间(和第3字段相比)
- 第5字段:密码有效期(和第3字段相比)
- 第6字段:密码修改到期前的警告天数(和第5字段相比)
- 第7字段:密码过期后的宽限天数(和第5字段相比)
- 0:代表密码过期后立即失效
- -1:代表密码永远不会失效
- 第8字段:账号失效时间
- 要用时间戳表示
- 第9字段:保留
2、时间戳换算
- 把时间戳换算为日期
- date -d “1970-10-01 16066 days”
- 把日期换算为时间戳
- echo ( ( (( (((date --date=“2014/01/06” + %s)/86400+1))
7.1.3 组信息文件/ect/group和组密码文件/etc/gshadow
1、组信息文件/etc/group
- 第一字段:组名
- 第二字段:组密码标志
- 第三字段:GID
- 第四字段:组中附加用户
2、组密码文件/etc/gshadow
- 第一字段:组名
- 第二字段:组密码
- 第三字段:组管理员用户名
- 第四字段:组中附加用户
7.2 用户管理相关文件
1、用户的家目录
- 普通用户:/home/用户名,所有者和所属组都是此用户,权限是700
- 超级用户:/root/,所有者和所属组都是root用户,权限是550
2、用户的邮箱
- /var/spool/mail/用户名/
3、用户模板目录
- /etc/skel/
7.3 用户管理命令
7.3.1 用户添加命令useradd
1、useradd命令格式
[root@VM-20-2-centos /]# useradd [选项] 用户名
选项:
-u UID: 手工指定用户的UID号
-d 家目录: 手工指定用户的家目录
-c 用户说明: 手工指定用户的说明
-g 组名: 手工指定用户的初始组
-G 组名: 指定用户的附加组
-s shell: 手工指定用户的登录shell,默认是/bin/bash
2、添加默认用户
[root@VM-20-2-centos /]# useradd sc
-[root@VM-20-2-centos /]# grep sc /etc/passwd
-[root@VM-20-2-centos /]# grep sc /etc/shadow
-[root@VM-20-2-centos /]# grep sc /etc/group
-[root@VM-20-2-centos /]# grep sc /etc/gshadow
-[root@VM-20-2-centos /]# ll -d /home/lamp/
-[root@VM-20-2-centos /]# ll /var/spool/mail/lamp
3、指定选项添加用户
-
useradd -u 550 -G root,bin -d /home/lamp1 \
-c “test user” -s /bin/bash sc
4、用户默认值文件
- /etc/default/useradd
- GROUP=100 #用户默认组
- HOME=/home #用户家目录
- INACTIVE=-1 #密码过期宽限天数(shadow文件7字段)
- EXPIRE= #密码失效时间(shadow文件8字段)
- SHELL=/bin/bash #默认shell
- SKEL=/etc/skel #模板目录
- CREATE_MAIL_SPOOL=yes #是否建立邮箱
- /etc/login.defs
- PASS_MAX_DAYS 99999 #密码有效期(5)
- PASS_MIN_DAYS 0 #密码修改间隔(4)
- PASS_MIN_LEN 5 #密码最小5位(PAM)
- PASS_WARN_AGE 7 #密码到期警告(6)
- UID_MIN 500 #最小和最大UID范围
- GID_MAX 60000
- ENCRYPT_METHOD SHA512 #加密模式
7.3.2 修改用户密码passwd
1、passwd命令格式
[root@VM-20-2-centos ~]# passwd [选项] 用户名
选项:
-S 查询 用户密码的密码状态。仅root用户可用。
-l 暂时锁定用户。仅root用户可用。
-u 解锁用户。仅root用户可用。
--stdin 可以通过管道符输出的数据作为用户的密码。
2、查看密码状态
[root@VM-20-2-centos ~]# passwd -S root
root PS 2023-03-02 0 99999 7 -1 (密码已设置,使用 MD5 算法。)
#用户名 密码设定时间(2023-03-02) 密码修改间隔时间(0) 密码有效期(99999) 警告时间(7) 密码不失效(-1)
3、锁定和解锁用户
[root@VM-20-2-centos ~]# passwd -l lamp
[root@VM-20-2-centos ~]# passwd -u lamp
4、使用字符串作为用户的密码
[root@VM-20-2-centos ~]# echo "123" | passwd --stdin lamp
7.3.3 修改用户信息usermod、修改用户密码状态chage
1、修改用户信息usermod
[root@VM-20-2-centos ~]# usermod [选项] 用户名
-u UID: 修改用户的UID号
-c 用户说明: 修改用户的说明信息
-G 组名: 修改用户的附加组
-L: 临时锁定用户(Lock)
-U: 解锁用户锁定(Unlock)
2、修改用户密码状态chage
[root@VM-20-2-centos ~]# chage [选项] 用户名
选项:
-l: 列出用户的详细密码状态
-d 日期: 修改密码最后一次更改日期(shadow3字段)
-m 天数: 两次密码修改间隔(4字段)
-M 天数: 密码有效期(5字段)
-W 天数: 密码过期前警告天数(6字段)
-I 天数: 密码过后宽限天数(7字段)
-E 日期: 账号失效时间(8字段)
[root@VM-20-2-centos ~]# chage -d 0 lamp
#这个命令其实就是把密码修改日期归0了(shadow第3字段)
#这样用户一登陆就要修改密码
7.3.4 删除用户userdel、用户切换命令su
1、删除用户userdel
[root@VM-20-2-centos ~]# userdel [-r] 用户名
选项:
-r 删除用户的同时删除用户家目录
2、查看用户ID
[root@VM-20-2-centos ~]# id 用户名
3、切换用户身份su
[root@VM-20-2-centos ~]# su [选项] 用户名
选项:
-: 选项只使用“-” 代表连带用户的环境变量一起切换
-c 命令: 仅执行一次命令,而不切换用户身份
[root@VM-20-2-centos ~]$ su - root #切换成root
[root@VM-20-2-centos ~]$ su - root -c "useradd user3"
#不切换成root,但是执行useradd命令添加user3用户
7.4 用户组管理命令
1、添加用户组
[root@VM-20-2-centos ~]# groupadd [选项] 组名
选项:
-g GID: 指定组ID
2、修改用户组
[root@VM-20-2-centos ~]# groupmod [选项] 组名
选项:
-g GID: 修改组ID
-n 新组名: 修改组名
[root@VM-20-2-centos ~]# groupmod -n testgrp group1
#把组名group1 修改为testgrp
3、删除用户组
[root@VM-20-2-centos ~]# groupdel 组名
4、把用户添加入组或从组中删除
[root@VM-20-2-centos ~]# gpasswd 选项 组名
选项:
-a 用户名: 把用户加入组
-d 用户名: 把用户从组中删除
第八章 权限管理
8.1 ACL权限
8.1.1 ACL权限简介与开启
1、ACL权限简介
2、查看分区ACL权限是否开启
[root@VM-20-2-centos ~]# dumpe2fs -h /dev/sda3
#dumpe2fs命令是查询指定分区详细文件系统信息的命令
选项:
-h 仅显示超级块中信息,而不显示磁盘块组的详细信息
3、临时开启分区ACL权限
[root@VM-20-2-centos ~]# mount -o remount,acl /
#重新挂载根分区,并挂载加入acl权限
4、永久开启分区ACL权限
[root@VM-20-2-centos ~]# vi /etc/fstab
UUID=4b499d76-769a-40a0-93dc-4a31a59add28 / ext4 defaults,acl 1 1
#加入acl
[root@VM-20-2-centos ~]# mount -o remount /
#重新挂载文件系统或重启动系统,使修改生效
8.1.2 查看与设定ACL权限
1、查看ACL命令
[root@VM-20-2-centos ~]# getfacl 文件名
#查看acl权限
2 、设定ACL权限的命令
[root@VM-20-2-centos ~]# setfacl 选项 文件名
选项:
-m 设定ACL权限
-x 删除指定的ACL权限
-b 删除所有的ACL权限
-d 设定默认ACL权限
-k 删除默认ACL权限
-R 递归设定ACL权限
3、给用户设定ACL权限
[root@VM-20-2-centos ~]# useradd zhangsan
[root@VM-20-2-centos ~]# useradd lisi
[root@VM-20-2-centos ~]# useradd st
[root@VM-20-2-centos ~]# groupadd tgroup
[root@VM-20-2-centos ~]# mkdir /project
[root@VM-20-2-centos ~]# chown root:tgroup /project/
[root@VM-20-2-centos ~]# chmod 770 /project/
[root@VM-20-2-centos ~]# setfacl -m u:st:rx /project/
#给用户st赋予r-x权限,使用“u:用户名:权限” 格式
多了个"+"。
4、给用户组设定ACL权限
[root@VM-20-2-centos ~]# groupadd tgroup2
[root@VM-20-2-centos ~]# setfacl -m g:tgroup2:rwx project/
#为组tgroup2分配ACL权限。使用"g:组名:权限" 格式
8.1.3 最大有效权限与删除ACL权限
1、最大有效权限mask
- mask是用来指定最大有效权限的。如果我给用户赋予了ACL权限,是需要和mask的权限"相与"才能得到用户的真正权限
修改最大有效权限
[root@VM-20-2-centos ~]# setfacl -m m:rx 文件名
#设定mask权限为r-x。使用"m:权限" 格式
2、删除ACL权限
[root@VM-20-2-centos ~]# setfacl -x u:用户名 文件名
#删除指定用户的ACL权限
[root@VM-20-2-centos ~]# setfacl -x g:组名 文件名
#删除指定用户组的ACL权限
[root@VM-20-2-centos ~]# setfacl -b 文件名
#会删除文件的所有的ACL权限
8.1.4 默认ACL权限和递归ACL权限
1、递归ACL权限
- 递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有的相同的ACL权限。
- setfacl -m u:用户名:权限 -R 目录名
2、默认ACL权限
- 默认ACL权限的作用是如果给父目录设定了默认ACL权限,那么父目录中所有新建的子文件都会继承父目的ACL权限。
- setfacl -m d:u:用户名:权限 目录名
8.2 文件特殊权限
8.2.1 SetUID
1、SetUID的功能
-
只有可以执行的二进制程序才能设定SUID权限
-
命令执行者要对该程序拥有x(执行)权限
-
命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
-
SetUID权限只在该程序执行过程中有效,也就是说身份改变中在程序执行过程中有效
-
passwd命令拥有SetUID权限,所以普通可以修改自已的密码
[root@VM-20-2-centos ~]# ll /usr/bin/passwd
-rwsr-xr-x 1 root root 27856 4月 1 2020 /usr/bin/passwd [rwsr]多了个s
- cat命令没有SetUID权限,所以普通用户不能查看/etc/shadow文件内容
[root@VM-20-2-centos ~]# ll /bin/cat
-rwxr-xr-x 1 root root 54080 11月 17 2020 /bin/cat
2、设定SetUID的方法
- 4代表SUID
- chmod 4755 文件名
- chmod u+s 文件名
3、取消SetUID的方法
- chmod 755 文件名
- chmod u-s 文件名
4、危险的SetUID
- 关键目录应严格控制写权限。比如”/“、”/usr“ 等
- 用户的密码设置要严格遵守密码三原则
- 对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限
8.2.2 SetGID
1、SetGID针对文件的作用
- 只有可执行的二进制程序才能设置SGID权限
- 命令执行者要对该程序拥有x(执行)权限
- 命令执行在执行程序的时候,组身份升级为该程序文件的属组
- SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
[root@VM-20-2-centos ~]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 40520 4月 11 2018 /usr/bin/locate
[root@VM-20-2-centos ~]# ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 3701347 3月 25 03:41 /var/lib/mlocate/mlocate.db
- /usr/bin/locate 是可执行二进制程序,可以赋予SGID
- 执行用户lamp对/usr/bin/locate命令拥有执行权限
- 执行/usr/bin/locate命令时,组身份会升级为slocate组,而slocate组对/var/lib/mlocate/mlocate.db数据库拥有r权限,所以普通用户可以使用locate命令查询mlocate.db数据库
- 命令结束,lamp用户的组身份返回为lamp组
2、SetGID针对目录的作用
- 普通用户必须对此目录拥有r和x权限,才能进入此目录
- 普通用户在此目录中的有效组会变成此目录的属组
- 若普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组
3、设定SetGID
- 2代表SGID
- chmod 2755 文件名
- chmod g+s 文件名
[root@VM-20-2-centos ~]# cd /tmp/
[root@VM-20-2-centos ~]# mkdir dtest
[root@VM-20-2-centos ~]# chmod g+s dtest
[root@VM-20-2-centos ~]# ll -d dtest/
[root@VM-20-2-centos ~]# chmod 777 dtest/
[root@VM-20-2-centos ~]# su - lamp
[root@VM-20-2-centos ~]# cd /tmp/dtest/
[root@VM-20-2-centos ~]# touch abc
[root@VM-20-2-centos ~]# ll
4、取消SetGID
- chmod 755 文件名
- chmod g-s 文件名
8.2.3 Sticky BIT
1、SBIT粘着位作用
- 粘着位目前只对目录有效
- 普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限
- 如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自已建立的文件,但是不能删除其他用户建立的文件
[root@VM-20-2-centos ~]# ll -d /tmp/
drwxrwxrwt. 9 root root 4096 3月 25 12:00 /tmp/ rwt x换成了t
2、设置与取消粘着位
- 设置粘着位
- chmod 1755 目录名
- chmod o+t 目录名
- 取消粘着位
- chmod 777 目录名
- chmod o-t 目录名
8.3 文件系统属性chattr权限
1、chattr命令格式
[root@VM-20-2-centos ~]# chattr [+-=] [选项] 文件或目录名
+: 增加权限
-: 删除权限
=: 等于某权限
选项:
- i:如果对文件设置i属性,那么不允许对文件 进行删除、改名,也不能添加和修改数据,如果对目录设置i属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。
- a:如果对文件 设置a属性,对么只能在文件中增加数据,保量不能删除也不能修改数据,如果对目录设置a属性,那么只允许在目录中建立和修改文件 ,但是不允许删除
2、查看文件系统属性
[root@VM-20-2-centos ~]# lsattr 选项 文件名
选项:
-a 显示所有文件和目录
-d 若目标是目录,仅列出目录本身的属性,而不是子文件的
8.4 系统 命令sudo权限
1、sudo权限
- root把本来只能超级用户执行的命令赋予普通用户执行。
- sudo的操作对象是系统命令
2、sudo使用
[root@VM-20-2-centos ~]# visudo
#实际修改的是/etc/sudoers 文件
root ALL=(ALL) ALL
#用户名 被管理主机的地址= (可使用的身份) 授权命令(绝对路径)
#%wheel ALL=(ALL) ALL
#%组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
3、授权sc用户可以重启服务器
[root@VM-20-2-centos ~]# visudo
sc ALL=/sbin/shutdown -r now
4、普通用户执行sudo赋予的命令
[root@VM-20-2-centos ~]# su -sc
[root@VM-20-2-centos ~]# sudo -l
#查看可用的sudo命令
[lamp@VM-20-2-centos ~]$ sudo /sbin/shutdown -r now
#普通用户执行sudo赋予的命令
第九章 文件系统管理
9.1 回顾分区和文件系统
1、分区类型
- 主分区:总共最多只能分四个
- 扩展分区:只能有一个,也算作主分区的一种,也就是说主分区加扩展分区最多有四个。但是扩展分区不能存储数据和格式化,必须再划分成逻辑分区才能使用。
- 逻辑分区:逻辑分区是在拓展分区中划分的,如果是IDE硬盘,Linux最多支持59个逻辑分区,如果是SCSI硬盘Linux最多支持11个逻辑分区。
2、分区表示法
分区 的设备文件名 |
---|
主分区1 | /dev/sda1 |
---|---|
主分区2 | /dev/sda2 |
主分区3 | /dev/sda3 |
扩展分区 | /dev/sda4 |
逻辑分区1 | /dev/sda5 |
逻辑分区2 | /dev/sda6 |
逻辑分区3 | /dev/sda7 |
分区的设备文件名 |
---|
主分区 | /dev/sda1 |
---|---|
拓展分区 | /dev/sda2 |
逻辑分区1 | /dev/sda5 |
逻辑分区2 | /dev/sda6 |
逻辑分区3 | /dev/sda7 |
3、文件系统
- ext2:是ext文件系统的升级版本,RedHat Linux7.2版本以前的系统默认都是ext2文件系统。1993年发布,最大支持16TB的分区和最大2TB的文件 (1TB=1024GB=1024*1024KB)
- ext3:ext3文件系统是ext2文件系统的升级版本,最大的区别就是带日志功能,以在系统突然停止时提高文件系统的可靠性。支持最大16TB的分区和最大2TB的文件
- ext4:它是ext3文件系统的升级版。ext4在性能、伸缩性和可靠性方面进行了大量改进。EXT4的变化可以说是翻天覆地的,比如向下兼容EXT3、最大1EB文件系统和16TB文件、无限数量子目录、Extents连续数据块概念、多块分配、延迟分配、持久预分配、快速FSCK、日志校验、无日志模式、在线碎片整理、inode增强、默认启用barrier等。是CentOS6.3的默认文件系统(1EB=1024PB=1024*1024TB)
9.2 文件系统常用命令
9.2.1 df命令、du命令、fsck命令和dump2fs命令
1、文件系统查看命令df
[root@VM-20-2-centos ~]# df [选项] [挂载点]
选项:
-a 显示所有的文件系统信息,包括特殊文件系统,如/proc、/sysfs
-h 使用习惯单位显示容量,如KB,MB或GB等
-T 显示文件系统类型
-m 以MB为单位显示容量
-k 以KB为单位显示容量。默认就是以KB为单位
2、统计目录或文件大小
[root@VM-20-2-centos ~]# du [选项] [目录或文件名]
选项:
-a 显示每个子文件的磁盘占用量。默认只统计子目录的磁盘占用量
-h 使用习惯单位显示磁盘占用量,如KB,MB,或GB等
-s 统计总占用量,而不列出子目录和子文件的占用量
*注:
[root@VM-20-2-centos ~]# ll -h 只显示目录下一级文件大小,不会显示全部文件大小
du命令和df命令的区别
- df命令是从文件系统考虑的,不光要考虑文件占用的空间,还要统计被命令或程序占用的空间(最常见的就是文件已经删除,但是程序并没有释放空间)
- du命令是面向文件的,只会计算文件或目录占用的空间
3、文件系统修复命令fsck
[root@VM-20-2-centos ~]# fsck [选项] 分区设备文件名
选项:
-a: 不用显示用户提示,自动修复文件系统
-y: 自动修复,和-a作用一致,不过有些文件系统只支持-y
4、显示磁盘状态命令dumpe2fs
[root@VM-20-2-centos ~]# dumpe2fs 分区设备文件名
9.2.2 挂载命令
1、查询与自动挂载
[root@VM-20-2-centos ~]# mount [-l]
#查询系统中已经挂载的设备,-l会显示卷标名称
[root@VM-20-2-centos ~]# mount -a
#依据配置文件/etc/fstab的内容,自动挂载
2、挂载命令的格式
[root@VM-20-2-centos ~]# mount [-t 文件系统] [-L 卷标名] [-o 特殊选项] 设备文件名 挂载点
选项:
-t 文件系统: 加入文件系统类型来指定挂载的类型,可以ext3、ext4、iso9660等文件系统
-L 卷标名: 挂载指定卷标的分区,而不是安装设备文件名挂载
-o 特殊选项: 可以指定挂载的额外选项
参数 | 说明 |
---|---|
atime/noatime | 更新访问时间/不更新访问时间。访问分区文件时,是否更新文件的访问时间,默认为更新 |
async/sync | 异步/同步,默认为异步 |
auto/noauto | 自动/手动,mount -a命令执行时,是否会自动安装/etc/fstab文件内容挂载,默认为自动 |
defaults | 定义默认值,相当于rw,suid,dev,exec,auto,nouser,async这七个选项 |
exec/noexec | 执行/不执行,设定是否允许在文件系统中执行可执行文件,默认是exec允许 |
remount | 重新挂载已经挂载的文件系统,一般用于指定修改特殊权限 |
rw/ro | 读写/只读,文件系统挂载时,是否具有读写权限,默认是rw |
suid/nosuid | 具有/不具有SUID权限,设定文件系统是否具有SUID和SGID的权限,默认是具有 |
user/nouser | 允许/不允许普通用户挂载,设定文件系统是否允许普通用户挂载,默认是不允许,只有root可以挂载分区 |
usrquota | 写入代表文件系统支持用户磁盘配额,默认不支持 |
grpquota | 写入代表文件系统支持组磁盘配额,默认不支持 |
[root@VM-20-2-centos ~]# mount -o remount,noexec /home
#重新挂载/home分区,并使用noexec权限
[root@VM-20-2-centos ~]# cd /home
[root@VM-20-2-centos ~]# vi hello.sh
[root@VM-20-2-centos ~]# chmod 755 hello.sh
[root@VM-20-2-centos ~]# ./hello.sh
[root@VM-20-2-centos ~]# mount -o remount,exec /home
#记得改回来,不然会影响系统启动的。
9.2.3 挂载光盘与U盘
1、挂载光盘
[root@VM-20-2-centos ~]# mkdir /mnt/cdrom/
#建立挂载点
[root@VM-20-2-centos ~]# mount -t iso9660 /dev/cdrom /mnt/cdrom
#挂载光盘
[root@VM-20-2-centos ~]# count /dev/sr0 /mnt/cdrom
2、卸载命令
[root@VM-20-2-centos ~]# umount 设备文件名或挂载点
[root@VM-20-2-centos ~]# umount /mnt/cdrom
3、挂载U盘
[root@VM-20-2-centos ~]# fdisk -l
#查看U盘设备文件名
[root@VM-20-2-centos ~]# mount -t vfat /dev/sdb1 /mnt/usb/
注意:Linux默认是不支持NTFS文件系统的
9.2.4 支持NTFS文件系统
1、下载NTFS-3G插件
http://www.tuxera.com/community/ntfs-3g-download/
2、安装NTFS-3G
[root@VM-20-2-centos ~]# tar -zxvf ntfs-3g_ntfsprogs-2013.1.13.tgz
#解压
[root@VM-20-2-centos ~]# cd ntfs-3g_ntfsprogs-2013.1.13
#进入解压目录
[root@VM-20-2-centos ~]# ./comfigure
#编译器准备。没有指定安装目录,安装到默认位置中
[root@VM-20-2-centos ~]# make
#编译
[root@VM-20-2-centos ~]# make install
#编译安装
3、使用
[root@VM-20-2-centos ~]# mount -t ntfs-3g 全区设备文件名 挂载点
9.3 fdisk分区
9.3.1 fdisk命令分区过程
1、添加新硬盘
2、查看新硬盘
[root@VM-20-2-centos ~]# fdisk -l
3、使用fdisk命令分区
[root@VM-20-2-centos ~]# fdisk /dev/sdb
fdisk交互指令说明 |
---|
命令 | 说明 |
---|---|
a | 设置可引导标记 |
b | 编辑bsd磁盘标签 |
c | 设置DOS操作系统兼容标记 |
d | 删除一个分区 |
l | 显示已知的文件系统类型。82为Linux swap分区,83为Linux分区 |
m | 显示帮助菜单 |
n | 新建分区 |
o | 建立空白DOS分区表 |
p | 显示分区列表 |
q | 不保存退出 |
s | 新建空白SUN磁盘标签 |
t | 改变一个分区的系统ID |
u | 改变显示记录单位 |
v | 验证分区表 |
w | 保存退出 |
x | 附加功能(仅专家) |
4、重新读取分区表信息
[root@VM-20-2-centos ~]# partprobe
5、格式化分区
[root@VM-20-2-centos ~]# mkfs -t ext4 /dev/sdb1
6、创建挂载点并挂载
[root@VM-20-2-centos ~]# mkdir /disk1
[root@VM-20-2-centos ~]# mount /dev/sdb1 /disk1/
9.3.2 分区自动挂载与fstab文件修复
1、/ect/fstab文件
- 第一字段:分区设备文件名或UUID(硬盘通用唯一识别码)
- 第二字段:挂载点
- 第三字段:文件系统名称
- 第四字段:挂载参数
- 第五字段:指定分区是否被dump备份,0代表不备份,1代表每天备份,2代表不定期备份
- 第六字段:指定分区是否被fsck检测,0代表不检测,其他数字代表检测的优先级,那么当然1的优先级比2高
2、分区自动挂载
[root@VM-20-2-centos ~]# vi /etc/fstab
...省略部分输出...
/dev/sdb1 /disk1 ext4 defaults 1 2
[root@VM-20-2-centos ~]# mount -a
#依据配置文件/etc/fstab的内容,自动挂载
3、/ect/fstab文件修复
[root@VM-20-2-centos ~]# mount -o remount,rw /
9.4 分配swap分区
1、free命令
[root@VM-20-2-centos ~]# free -m
#查看内存与swap分区使用状况
- cached(缓存):是指把读取出来的数据保存在内存当中,当两次读取时,不用读取硬盘而直接从内存当中读取,加速了数据的读取过程
- buffer(缓冲):是指在写入数据时,先把分散的写入操作保存到内存当中,当达到一定程度再集中写入硬盘,减少了磁盘碎片和硬盘的反复寻道,加速了数据的写入过程。
2、新建swap分区
[root@VM-20-2-centos ~]# fdisk /dev/sdb
别忘记把分区ID改为82
[root@VM-20-2-centos ~]# partprobe #更新分区
3、格式化
[root@VM-20-2-centos ~]# mkswap /dev/sdb6
4、加入swap分区
[root@VM-20-2-centos ~]# swapon /dev/sdb6
#加入swap分区
[root@VM-20-2-centos ~]# swapoff /dev/sdb6
#取消分区
5、swap分区开机自动挂载
[root@VM-20-2-centos ~]# vi /etc/fstab
/dev/sdb6 swap swap defaults 0 0
第十章 Shell基础
10.1 Shell概述
1、Shell是什么
- Shell是一个命令解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
- Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
2、Shell的分类
- Bourne Shell:从1979起Unix就开始使用Bourne Shell,Bourne Shell的主文件名为sh。
- C Shell: C Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名。
- Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。Bourne家庭主要包括sh、ksh、Bash、psh、zsh;C家族主要包括:csh、tcsh。
- Bash:Bash与sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell。
3、Linux支持的Shell
- /etc/shells文件 #查看系统支持哪些shell
10.2 Shell脚本的执行方式
1、echo输出命令
[root@VM-20-2-centos ~]# echo [选项] [输出内容]
选项:
-e: 支持反斜线控制的字符转换
控制字符 | 作用 |
---|---|
\\ | 输出\本身 |
\a | 输出警告音 |
\b | 退格键,也就是向左删除键 |
\c | 取消输出行末的换行符。和“-n”选项一致 |
\e | ESCAPE键 |
\f | 换页符 |
\n | 换行符 |
\r | 回车键 |
\t | 制表符,也就是Tab键 |
\v | 垂直制表符 |
\0nnn | 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数 |
\xhh | 按照十六进制ASCII码表输出字符。其中hh是两位十六进制数 |
例:
[root@VM-20-2-centos ~]# echo -e "ab\bc"
#删除左侧字符
[root@VM-20-2-centos ~]# echo -e "a\tb\tc\nd\te\tf"
#制表符与换行符
[root@VM-20-2-centos ~]# echo -e "\x61\x62\x63\x64\x65\x66"
#按照十六进制ASCII码也同样可以输出
[root@VM-20-2-centos ~]# echo -e "\e[1;31m abcd \e[0m"
#输出颜色
#30m=黑色,31m=红色,32m=绿色,33m=黄色
#34m=蓝色,35m=洋红,36m=青色,37m=白色
2、第一个脚本
[root@VM-20-2-centos ~]# vi hello.sh
#!/bin/Bash
#The first program
#Author:zhangfu (E-mail:15510165841@163.com)
echo -e "Mr.Zhang Fu is the most honest man in Lamp Brother"
3、脚本执行
- 赋予脚本权限,直接运行
- chmod 755 hello.sh
- ./hello.sh
- 通过Bash调用执行脚本
- bash hello.sh
10.3 Bash的基本功能
10.3.1 历史命令与命令补全
1、历史命令
[root@VM-20-2-centos ~]# history [选项] [历史命令保存文件]
选项:
-c: 清空历史命令
-w: 把缓存中的历史命令写入历史命令保存文件~/.bash_history
- 历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改。
历史命令的调用
- 使用上、下箭头调用以前的历史命令
- 使用“!n”重复执行第n条历史命令
- 使用“!!”重复执行上一条命令
- 使用“!字串”重复执行最后一条以该字串开头的命令
2、命令与文件补全
- 在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按“Tab”键就会自动进行补全。
10.3.2 命令别名与常用快捷键
1、命令别名
[root@VM-20-2-centos ~]# alias 别名='原命令'
#设定命令别名
[root@VM-20-2-centos ~]# alias
#查询命令别名
命令的执行顺序
- 第一顺位执行用绝对路径或相对路径执行的命令。
- 第二顺位执行别名。
- 第三顺位很乖Bash的内部命令。
- 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。
让别名永久生效
[root@VM-20-2-centos ~]# vi /root/.bashrc
删除别名
[root@VM-20-2-centos ~]# unalis 别名
2、Bash常用快捷键
快捷键 | 作用 |
---|---|
ctrl+A | 把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移动到命令行开头时使用。 |
ctrl+E | 把光标移动到命令行结尾。 |
ctrl+C | 强制终止当前的命令。 |
ctrl+L | 清屏,相当于clear命令。 |
ctrl+U | 删除或剪切光标之前的命令。我输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键会更加方便。 |
ctrl+K | 删除或剪切光标之后的内容。 |
ctrl+Y | 粘贴ctrl+U或ctrl+K剪切的内容。 |
ctrl+R | 在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索。 |
ctrl+D | 退出当前终端。 |
ctrl+Z | 暂停,并放入后台。这个快捷键牵扯工作管理的内容,我们在系统管理章节详细介绍。 |
ctrl+S | 暂停屏幕输出。 |
ctrl+Q | 恢复屏幕输出。 |
10.3.3 输入输出重定向
1、标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/sdtout | 1 | 标准输出 |
显示器 | /dev/sdterr | 2 | 标准错误输出 |
2、输出重定向
3、输入重定向
[root@VM-20-2-centos ~]# wc [选项] [文件名]
选项:
-c 统计字节数
-w 统计单词数
-l 统计行数
- 命令 < 文件 把文件 作为命令的输入
10.3.4 多命令顺序执行与管道符
1、多命令顺序执行
多命令执行符 | 格式 | 作用 |
---|---|---|
; | 命令1; 命令2 | 多个命令顺序执行,命令之间没有任何逻辑联系 |
&& | 命令1&&命令2 | 逻辑与 当命令1正确执行,则命令2才会执行 当命令1执行不正确,则命令2不会执行 |
|| | 命令1||命令2 | 逻辑或 当命令1执行不正确,则命令2才会执行 当命令1正确执行,则命令2不会执行 |
例:
[root@VM-20-2-centos ~]# ls;date;cd /usr;pwd
[root@VM-20-2-centos ~]# dd if=输入文件 of=输出文件 bs=字节数 count=个数
选项:
if=输入文件 指定源文件或源设备
of=输出文件 指定目标文件或目录设备
bs=字节数 指定一次输入/输出多少字节,即把这些字节看做一个数据块
count=个数 指定输入/输出多少个数据块
*dd主要是用于磁盘复制
例:
[root@VM-20-2-centos ~]# date;dd if=/dev/zero of=/root/testfile bs=1k count=100000;date
2、管道符
命令格式:
[root@VM-20-2-centos ~]# 命令1 | 命令2
#命令1的正确输出作为命令2的操作对象
例:
[root@VM-20-2-centos ~]# ll -a /etc/ | more
[root@VM-20-2-centos ~]# netstat -an | grep "ESTABLISHED"
[root@VM-20-2-centos ~]# grep [选项] "搜索内容" 文件名
选项:
-i: 忽略大小写
-n: 输出行号
-v: 反向查找
--color=auto 搜索出的关键字用颜色显示
10.3.5 通配符与其他特殊符号
1、通配符
通配符 | 作用 |
---|---|
? | 匹配一个任意字符 |
* | 匹配0个或任意多个任意字符,也就是可以匹配任何内容 |
[] | 匹配中括号中任意一个字符。例如:[abc]代表一定匹配一个字符,或者是a,或者是b,或者是c。 |
[-] | 匹配中括号中任意一个字符,-代表一个范围。例如:[a-z]代表匹配一个小写字母。 |
[^] | 逻辑非,表示匹配不是中括号内的一个字符。例如:[^0-9]代表匹配一个不是数字的字符。 |
2、Bash中其他特殊符号
符号 | 作用 |
---|---|
’ ‘ | 单引号。在单引号中所有的特殊符号,如”$“ 和 “`”(反引号)都没有特殊含义。 |
” “ | 双引号。在双引号中特殊符号都没有特殊含义,但是“$”、“`”和“\“是例外,拥有”调用变量的值“、”引用命令“和”转义符“的特殊含义。 |
`` | 反引号。反引号括下来的内容是系统命令,在Bash中会先执行它。和 ( ) 作用一样,不过推荐使用 ()作用一样,不过推荐使用 ()作用一样,不过推荐使用(),因为反引号非常容易看错。 |
$() | 和反引号作用一样,用来引用系统命令。 |
# | 在Shell脚本中,#开头的行代表注释。 |
$ | 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。 |
\ | 转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如$将输出”$“符号,而不当做是变量引用。 |
10.4 Bash的变量
10.4.1 用户自定义变量
1、什么是变量
- 变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。
2、变量设置规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是”2name“则是错误的。
- 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。
- 变量用等号连接值,等号左右两侧不能有空格。
- 变量的值如果有空格,需要使用单引号或双引号包括。
- 在变量的值中,可以使用”\"转义符。
- 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含” 变量名“或用 变量名“或用 变量名“或用{变量名}包含。
- 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。
- 环境变量名建议大写,便于区分。
3、变量分类
- 用户自定义变量
- 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。
- 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
- 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
4、本地变量
- 变量定义
[root@VM-20-2-centos ~]# name="shen chao"
- 变量叠加
[root@VM-20-2-centos ~]# aa=123
[root@VM-20-2-centos ~]# aa="$aa"456
[root@VM-20-2-centos ~]# aa=${aa}789
- 变量调用
[root@VM-20-2-centos ~]# echo $name
- 变量查看
[root@VM-20-2-centos ~]# set
- 变量删除
[root@VM-20-2-centos ~]# unset name
10.4.2 环境变量
1、环境变量是什么
- 用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效。
2、设置环境变量
export 变量名=变量值
#申明变量
env
#查询变量
unset 变量名
#删除变量
3、系统常见环境变量
- PATH:系统查找命令的路径
[root@VM-20-2-centos ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
- PATH=“$PATH”:/root/sh
#PATH变量叠加
4、PS1:定义系统提示符的变量
\d: 显示日期,格式为“星期 月 日”
\h: 显示简写主机名。如默认主机名“localhost”
\t: 显示24小时制时间,格式为“HH:MM:SS”
\T: 显示12小时制时间,格式为“HH:MM:SS”
\A: 显示24小时制时间,格式为“HH:MM”
\u: 显示当前用户名
\w: 显示当前所在目录的完整名称
\W: 显示当前所在目录的最后一个目录
\#: 执行的第几个命令
\$: 提示符。如果是root用户会显示提示符为“#”,如果是普通用户会显示提示符为“$”
举例:
[root@VM-20-2-centos ~]# PS1=‘[\u@\t \w]\$ ’
[root@VM-20-2-centos ~]# PS1='[\u@\@ \h \# \W]\$'
[root@VM-20-2-centos ~]# PS1='[\u@\h \W]\$'
10.4.3 位置参数变量
1、位置参数变量
位置参数变量 | 作用 |
---|---|
$n | n为数字,¥0代表命令本身,$1- 9 代表第一到第九个参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10}. |
$* | 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体 |
$@ | 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待 |
$# | 这个变量代表命令行中所有参数的个数 |
10.4.4 预定义变量
1、预定义变量
预定义变量 | 作用 |
---|---|
$? | 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自已来决定),则证明上一个命令执行不正确了。 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID) |
2、接收键盘输入
[root@VM-20-2-centos ~]# read [选项] [变量名]
选项:
-p “提示信息”: 在等待read输入时,输出提示信息
-t 秒数: read命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数: read命令只接受指定的字符数,就会执行
-s 隐藏输入的数据,适用于机密信息的输入
10.5 Bash的运算符
10.5.1 数值运算与运算符
1、declare声明变量类型
[root@VM-20-2-centos ~]# declare [+/-][选项] 变量名
选项:
-: 给变量设定类型属性
+: 取消变量的类型属性
-i: 将变量声明为整数型(integer)
-x: 将变量声明为环境变量
-p: 显示指定变量的被声明的类型
2、数值运算-方法1
[root@VM-20-2-centos ~]# aa=11
[root@VM-20-2-centos ~]# bb=22
#给变量aa和bb赋值
[root@VM-20-2-centos ~]# declare -i cc=$aa+$bb
方法2:expr或let数值运算工具
[root@VM-20-2-centos ~]# aa=11
[root@VM-20-2-centos ~]# bb=22
#给变量aa和变量bb赋值
[root@VM-20-2-centos ~]# dd=$(expr $aa + $bb)
#dd的值是aa和bb的和。注意“+”号左右两侧必须有空格
方法3:“ ( ( 运算式 ) ) ”或“ ((运算式))”或“ ((运算式))”或“[运算式]”
[root@VM-20-2-centos ~]# aa=11
[root@VM-20-2-centos ~]# bb=22
[root@VM-20-2-centos ~]# ff=$(($aa+$bb))
[root@VM-20-2-centos ~]# gg=$[$aa+$bb]
3、运算符
优先级 | 运算符 | 说明 |
---|---|---|
13 | —,+ | 单目负、单目正 |
12 | !,~ | 逻辑非、按位取反或补码 |
11 | *,/,% | 乘、除、取模 |
10 | +,— | 加、减 |
9 | <<, >> | 按位左移、按位右移 |
8 | <= , >= , < , > | 小于或等于、大于或等于、小于、大于 |
7 | == , != | 等于、不等于 |
6 | & | 按位与 |
5 | ^ | 按位异或 |
4 | | | 按位或 |
3 | && | 逻辑与 |
2 | || | 逻辑或 |
1 | =,+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>= | 赋值、运算且赋值 |
10.5.2 变量测试与容替换
变量转换方式 | 变量y没有设置 | 变量y为空值 | 变量y设置值 |
---|---|---|---|
x=${y-新值} | x=新值 | x为空 | x=$y |
x=${y:-新值} | x=新值 | x=新值 | x=$y |
x=${y+新值} | x为空 | x=新值 | x=新值 |
x=${y:+新值} | x为空 | x为空 | x=新值 |
x=${y=新值} | x=新值 y=新值 | x为空 y值不变 | x=$y y值不变 |
x=${y:=新值} | x=新值 y=新值 | x=新值 y=新值 | x=$y y值不变 |
x=${y?新值} | 新值输出到标准错误输出(就是屏幕) | x为空 | x=$y |
x=${y:?新值} | 新值输出到标准错误输出 | 新值输出到标准错误输出 | x=$y |
例1:
[root@VM-20-2-centos ~]# unset y
#删除变量y
[root@VM-20-2-centos ~]# x=${y-new}
#进行测试
[root@VM-20-2-centos ~]# echo $x
new
#因为变量y不存在,所以x=new
[root@VM-20-2-centos ~]# y=""
[root@VM-20-2-centos ~]# x=${y-new}
[root@VM-20-2-centos ~]# echo $x
[root@VM-20-2-centos ~]#
[root@VM-20-2-centos ~]# y=old
[root@VM-20-2-centos ~]# x=${y-new}
[root@VM-20-2-centos ~]# echo $x
old
[root@VM-20-2-centos ~]#
10.6 环境变量配置文件
10.6.1 环境变量配置文件简介
1、source命令
[root@VM-20-2-centos ~]# source 配置文件
或
[root@VM-20-2-centos ~]# . 配置文件
2、环境变量配置文件简介
- 环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME等默认环境变量。
- /etc/profile
- /etc/profile.d/*.sh
- ~/.bash_profile [只对当前登录用户生效,因为是在用户的家止录,且是隐藏文件]
- ~/.bashrc [只对当前登录用户生效,因为是在用户的家止录,且是隐藏文件]
- /etc/bashrc
10.6.2 环境变量配置文件作用
/etc/profile的作用:
- USER变量:
- LOGNAME变量:
- MAIL变量:
- PATH变量:
- HOSTNAME变量:
- HISTSIZE变量:
- umask:
- 调用/etc/profile.d/*.sh文件
~/.bash_profile的作用
- 调用了~/.bashrc文件。
- 在PATH变量后面加入了“:$HOME/bin”这个目录
~/bashrc的作用
- 定义默认别名
- 调用/etc/bashrc
/etc/bashrc的作用
- PS1变量
- umask
- PATH变量
- 调用/etc/profile.d/*.sh文件
10.6.3其他配置文件和登录信息
1、注销时生效的环境变量配置文件
- ~/.bash_logout
2、其他配置文件
- ~/bash_history
3、Shell登录信息
- 本地终端欢迎信息:/etc/issue
转义符 | 作用 |
---|---|
\d | 显示当前系统日期 |
\s | 显示操作系统名称 |
\l | 显示登录的终端号,这个比较常用。 |
\m | 显示硬件体系结构,如i386、i686等 |
\n | 显示主机名 |
\o | 显示域名 |
\r | 显示内核版本 |
\t | 显示当前系统时间 |
\u | 显示当前登录用户的序列号 |
- 远程终端欢迎信息:/etc/issue.net
- 转义符在/etc/issue.net文件中不能使用
- 是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_comfig决定,加入“Banner /etc/issue.net”行才能显示(记得重启SSH服务)
- 登陆后欢迎信息:/etc/motd
- 不管是本地登录,还是远程登录,都可以显示此欢迎信息
第十一章 Shell编程
11.1 基础正则表达式
1、正则表达式与通配符
- 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式。
- 通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能使用shell自已的通配符来进行匹配了。
2、基础正则表达式
元字符 | 作用 |
---|---|
* | 前一个字符匹配0次或任意多次。 |
. | 匹配除了换行符外任意一个字符。 |
^ | 匹配行首。例如:^hello会匹配以hello开头的行。 |
$ | 匹配行尾。例如:hello&会匹配以hello结尾的行。 |
[] | 匹配中括号中指定的任意一个字符,只匹配一个字符。例如:[aoeiu]匹配任意一个元音字母,[0-9]匹配任意一位数字,[a-z] [0-9]匹配小写字和一位数字构成的两位字符。 |
[^] | 匹配除中括号的字符以外的任意一个字符。例如:[^0-9] 匹配合意一位非数字字符,[^a-z]表示任意一位非小写字母。 |
\ | 转义符。用于取消讲特殊符号的含义。 |
\{n\} | 表示其前面的字符恰好出现n次。例如:[0-9]\{4\} 匹配4位数字,[1][3-8][0-9]\{9\}匹配手机号码。 |
\{n,\} | 表示其前面的字符出现不小于n次。例如:[0-9]\{2,\}表示两位及以上的数字。 |
\{n,m\} | 表示其前面的字符至少出现n次,最多出现m次,例如:[a-z]\{6.8\}匹配6到8位的小写字母。 |
11.2 字符截取命令
11.2.1 cut字段提取命令
[root@VM_0_13_centos ~]# cut [选项] 文件名
选项:
-f列号: 提取第几列
-d分隔符: 按照指定分隔符分割列
11.2.2 printf命令
[root@VM_0_13_centos ~]# printf ‘输出类型输出格式’ 输出内容
输出类型:
%ns: 输出字符串。n是数字指代输出几个字符
%ni: 输出整数。n是数字指代输出几个数字
%m.nf: 输出浮点数。m和n是数字,指代输出的整数位数和小数位数。如%8.2f代表共输出8位数,其中2位是小数,6位是整数。
输出格式:
\a: 输出警告声音
\b: 输出退格键,也就是Backspace键
\f: 清除屏幕
\n: 换行
\r: 回车,也就是Enter键
\t: 水平输出退格键,也就是Tab键
\v: 垂直输出退格键,也就是Tab键
在awk命令的输出中支持print和printf命令
- print:print会在每个输出之后自动加入一个换行符(Linux默认没有print命令)
- printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符。
11.2.3 awk命令
awk默认识别的分割符是空格和制表符
[root@VM_0_13_centos ~]# awk‘条件1 {动作1} 条件2{动作2}...’文件名
条件(Pattern):
一般使用关系表达式作为条件
x>10 判断变量x是否大于10
x>=10 大于等于
x<=10 小于等于
动作(Action):
格式化输出
流程控制语句
[root@VM_0_13_centos ~]# vi student.txt
[root@VM_0_13_centos ~]# awk '{printf $2 "\t" $6 "\n"}' student.txt
[root@VM_0_13_centos ~]# df -h | awk '{print $1 "\t" $3}'
*注:awk中,printf、print均可以使用,printf不会自动加换行符
BEGIN:(在所有的数据读取之前,执行{printf “This is a transcript \n”}这条命令)
[root@VM_0_13_centos ~]# awk 'BEGIN{printf "This is a transcript \n"} {printf $2 "\t" $6 "\n"}' student.txt
END:(在所有数据处理完之后,执行一个操作)
[root@VM_0_13_centos ~]# awk 'END {printf "The End \n"} {printf $2 "\t" $6 "\n"}' student.txt
FS内置变量:(指定分割符)
[root@VM_0_13_centos ~]# cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\n"}'
注:如果在使用指定分割符时,要强制使用BEGIN,因为awk在指定分割符时,会先读取一行,再执行动作,就会出现一个问题:要操作的文件的第一行内容没有被正常分割读取。所以此时要强制加上BEGIN防止出现这种情况。
关系运算符
[root@VM_0_13_centos ~]# cat student.txt | grep -v Name | awk '$6 >= 87 {printf $2 "\n"}'
11.2.4 sed命令
sed命令
- sed是一种几乎包括在所有UNIX平台(包括Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。
[root@VM_0_13_centos ~]# sed [选项] ‘[动作]’ 文件名
选项:
-n: 一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。
-e: 允许对输入数据应用多条sed命令编辑
-i: 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作:
a\: 追加,在当前行后添加一行或多行,除最后一行外,每行末尾需要用“\”代表数据未完结。
c\: 行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结。
i\: 插入,在当前行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。
d: 删除,删除指定的行。
p: 打印,输出指定的行。
s: 字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)。
行数据操作
[root@VM_0_13_centos ~]# sed '2p' student.txt
#查看文件的第二行
[root@VM_0_13_centos ~]# sed -n '2p' student.txt
[root@VM_0_13_centos ~]# sed '2,4d' student.txt
#删除第二行到第四行的数据,但不修改文件本身
[root@VM_0_13_centos ~]# sed '2a hello' student.txt
#在第二行后追加hello
[root@VM_0_13_centos ~]# sed '2i hello \
world' student.txt
#在第二行前插入两行数据
[root@VM_0_13_centos ~]# sed '2c No such person' student.txt
#数据替换
字符串替换
[root@VM_0_13_centos ~]# sed 's/旧字串/新字串/g' 文件名
[root@VM_0_13_centos ~]# sed '3s/74/99/g' student.txt
#在第三行中,把74换成99
[root@VM_0_13_centos ~]# sed -i '3s/74/99/g' student.txt
#sed操作的数据直接写入文件
[root@VM_0_13_centos ~]# sed -e 's/Liming//g';s/Gao//g' student.txt
#同时把“Liming”和“Gao”替换为空
11.3 字符处理命令
1、排序命令sort
[root@VM_0_13_centos ~]# sort [选项] 文件名
选项:
-f: 忽略大小写
-n: 以数值型进行排序,默认使用字符串型排序
-r: 反向排序
-t: 指定分隔符,默认分隔符是制表符
-k,n[,m]: 按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾)
[root@VM_0_13_centos ~]# sort /etc/passwd
#排序用户信息文件
[root@VM_0_13_centos ~]# sort -r /etc/passwd
#反向排序
[root@VM_0_13_centos ~]# sort -t ":" -k 3,3 /etc/passwd
#指定分隔符是“:”,用第三字段开头,第三字段结尾排序,就是只用第三字段排序
[root@VM_0_13_centos ~]# sort -n -t ":" -k 3,3 /etc/passwd
2、统计命令wc
[root@VM_0_13_centos ~]# wc [选项] 文件名
选项:
-l: 只统计行数
-w: 只统计单词数
-m: 只统计字符数
11.4 条件判断
1、按照文件类型进行判断
测试选项 | 作用 |
---|---|
-b 文件 | 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真) |
-c 文件 | 判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真) |
-d 文件 | 判断该文件是否存在,并且是否为目录文件(是目录为真) |
-e 文件 | 判断该文件是否存在,(存在为真) |
-f 文件 | 判断该文件是否存在,并且是否为普通文件(是普通文件为真) |
-L 文件 | 判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真) |
-p 文件 | 判断该文件是否存在,并且是否为管道文件(是管道文件为真) |
-s 文件 | 判断该文件是否存在,并且是否为非空(非空为真) |
-S 文件 | 判断该文件是否存在,并且是否为套接字文件(是套接字文件为真) |
两种判断格式
[root@VM_0_13_centos ~]# test -e /root/install.log
[root@VM_0_13_centos ~]# [ -e /root/install.log ]
*:-e /root/install.log与[]间必须要有空格
[root@VM_0_13_centos ~]# [-d/root] && echo "yes" || echo "no"
#第一个判断命令如果正确执行,则打印”yes“,否则打印”no:
2、按照文件权限进行判断
测试选项 | 作用 |
---|---|
-r 文件 | 判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真) |
-w 文件 | 判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真) |
-x 文件 | 判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真) |
-u 文件 | 判断该文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真) |
-g 文件 | 判断该文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真) |
-k 文件 | 判断该文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真) |
3、两个文件之间进行比较
测试选项 | 作用 |
---|---|
文件1 -nt 文件2 | 判断文件1的修改时间是否比文件 2的新(如果新则为真) |
文件1 -ot 文件2 | 判断文件1的修改时间是否比文件2的旧(如果旧则为真) |
文件1 -ef 文件2 | 判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法 |
[root@VM_0_13_centos ~]# ln /root/student.txt /tmp/stu.txt
#创建个硬链接
[root@VM_0_13_centos ~]# [/root/student.txt -ef /tmp/stu.txt] && echo "yes" || echo "no"
#yes
4、两个整数之间比较
测试选项 | 作用 |
---|---|
整数1 -eq 整数2 | 判断整数1是否和整数2相等(相等为真) |
整数1 -ne 整数2 | 判断整数1是否和整数2不相等(不相等为真) |
整数1 -gt 整数2 | 判断整数1是否大于整数2(大于为真) |
整数1 -lt 整数2 | 判断整数1是否小于整数2(小于为真) |
整数1 -ge 整数2 | 判断整数1是否大于等于整数2(大于等于为真) |
整数1 -le 整数2 | 判断整数1是否小于等于整数2(小于等于为真) |
5、字符串的判断
测试选项 | 作用 |
---|---|
-z 字符串 | 判断字符串是否为空(为空返回真) |
-n 字符串 | 判断字符串是否为非空(非空返回真) |
字串1 == 字串2 | 判断字符串1是否和字符串2相等(相等返回真) |
字串1 !=字串2 | 不相等判断字符串1是否和字符串2不相等(不相等返回真) |
6、多重条件判断
测试选项 | 作用 |
---|---|
判断1 -a 判断2 | 逻辑与,判断1和判断2都成立,最终的结果才为真 |
判断1 -o 判断2 | 逻辑或,判断1和判断2有一个成立,最终的结果就为真 |
!判断 | 逻辑非,使原始的判断式取反 |
11.5 流程控制
11.5.1 if语句
1、单分支if条件语句
[root@VM_0_13_centos ~]# if [ 条件判断式 ] ;then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
单分支条件语句需要注意几个点
- if语句使用fi结尾,和一般语言使用大括号结尾不同
- [ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
- then后面跟符合条件之后执行的程序,可以放在[]之后,用“;”分割。也可以换行写入,就不需要“;”了
#!/bin/bash
#统计根分区使用率
# Author: zhangfu(E-mail:15510165841@163.com)
rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d "%" - fi)
#把根分区使用率作为变量值赋予变量rate
if [ $rate -ge 80 ]
then
echo "Warinig! /dev/sda3 is full!!"
fi
2、双分支if条件语句
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
例1:
#!/bin/bash
#备份mysql数据库
#Author: zhangfu (E-mail:15510165841@163.com)
ntpdate asia.pool.ntp.org &> /dev/null
#同步系统时间
date=$(date +%y%m%d)
#把当前系统时间按照“年月日”格式赋予变量date
size=$(du -sh /var/lib/mysql)
#统计mysql数据库的大小,并把大小赋予size变量
if [ -d /tmp/dbbak ]
then
echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
echo "Data size : $size" >> /tmp/dbbak/dbinfo.txt
cd /tmp/dbbak
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
rm -rf /tmp/dbbak/dbinfo.txt
else
mkdir /tmp/dbbak
echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
echo "Data size : $size" >> /tmp/dbbak/dbinfo.txt
cd /tmp/dbbak
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
rm -rf /tmp/dbbak/dbinfo.txt
fi
例2:
#!/bin/bash
#Author: zhangfu (E-mail:15510165841@163.com)
port=$(nmap -sT 192.168.1.156 | grep tcp | grep http | awk '{print $2}')
#使用nmap命令扫描服务器,并截取apache服务的状态,赋予变量port
if [ "$port" == "open" ]
then
echo "$(date) httpd is ok!" >> /tmp/autostart-acc.log
else
/etc/rc.d/init.d/httpd start &>/dev/null
echo "$(date) restart httpd!!" >> /tmp/autostart-err.log
fi
3、 多分支if条件语句
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
…省略更多条件…
else
当所有条件都不成立时,最后执行此程序
fi
例:
#!/bin/bash
#判断用户输入的是什么文件
#Author: zhangfu (E-mail:1551016841@163.com)
read -p "Please input a filename: " file
#接收键盘的输入,并赋予变量file
if [ -z "$file" ]
then
echo "Error,please input a filename"
exit 1
elif [ ! -e "#file" ]
#判断file的值是否存在
then
echo "Your input is not a file!"
exit 2
elif [ -f "$file" ]
#判断file的值是否为普通文件
then
echo "$file is a regulare file!"
elif [ -d "$file" ]
#判断file的值是否为目录文件
then
echo "$file is a directory!"
else
echo "$file is an other file!"
fi
11.5.2 case语句
多分支case条件语句
- case语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
例:
#!/bin/bash
#判断用户输入
#Author: zhangfu (E-mail:1551016841@163.com
read -p "Please choose yes/no: " -t 30 cho
case $cho in
"yes")
echo "Your choose is yes!"
;;
"no")
echo "Your choose is no!"
;;
*)
ehco "Your choose is error!"
;;
esac
11.5.3 for循环
语法一
for 变量 in 值1 值2 值3...
do
程序
done
例1:
#!/bin/bash
#打印时间
#Author: zhangfu (E-mail:1551016841@163.com
for time in morning noon afternoon evening
do
echo "This time is $time!"
done
例2:
#!/bin/bash
#批量解压缩脚本
#Author: zhangfu (E-mail:1551016841@163.com
cd /lamp
ls *.tar.gz > ls.log
for i in $(cat ls.log)
do
tar -zxf $i &>/dev/null
done
rm -rf /lamp/ls.log
语法二
for ((初始值;循环控制条件;变量变化))
do
程序
done
例:
#!/bin/bash
#从1加到100
#Author: zhangfu (E-mail:1551016841@163.com
s=0
for ((i=1;i<=100;i=i+1))
do
s=$(($s+$i))
done
echo "The sum of 1+2+...+100 is :$s"
例2:
#!/bin/bash
#批量添加指定数量的用户
#Author: zhangfu (E-mail:1551016841@163.com
read -p "Please input user name:" -t 30 name
read -p "Please input the number of users" -t 30 num
read -p "Please input the password of users" -t 30 pass
if[ ! -z "$name" -a ! -z "$num" -a ! -z "$pass"]
then
y=$(echo $num | sed 's/^[0-9]*$//g')
if[ -z "$y" ]
then
for((i=1;i<=$num;i=i+i))
do
/usr/sbin/useradd $name$i&>/dev/null
echo $pass | /usr/bin/passwd --stdin "$name$i" &>/dev/null
done
fi
fi
11.5.4 while循环与until循环
1、while循环
- while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。这就和for的固定循环不太一样了。
while [ 条件判断式 ]
do
程序
done
例:
#!/bin/bash
#从1加到100
#Author: zhangfu (E-mail:1551016841@163.com
i=1
s=0
while [ $i -le 100 ]
#如果变量i的值小于等于100,则执行循环
do
s=$(($s+$i))
i=$(($i+1))
done
echo "The sum is: $s"
2、until循环
- until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循环。
until [ 条件判断式 ]
do
程序
done
例:
#!/bin/bash
#从1加到100
#Author: zhangfu (E-mail:1551016841@163.com
i=1
s=0
until [ $i -gt 100 ]
#循环直到变量i的值大于100,就停止循环
do
s=$(($s+$i))
i=$(($i+1))
done
echo "The sum is: $s"
第十二章 Linux服务管理
12.1 服务简介与分类
1、服务的分类
Linux服务
- RPM包默认安装的服务
- 独立的服务
- 基于xinetd服务
- 源码包安装的服务
启动与自启动
- 服务启动:就是在当前系统中让服务运行,并提供功能。
- 服务自启动:自启动是指让服务在系统开机或重启动之后,随着系统的启动而自动启动服务。
查询已安装的服务
-
RPM包安装的服务
- chkconfig –list
#查看服务自启动状态,可以看到所有RPM包安装的服务
-
源码包安装的服务
- 查看服务安装位置,一般是/usr/local/下
RPM包安装服务和源码包安装服务的区别
- RPM安装服务和源码包安装服务的区别就是安装位置的不同
- 源码包安装在指定位置,一般是/usr/local/(卸载的话直接删除对应文件夹即可)
- RPM包安装在默认位置中(配置文件:/etc/;启动脚本:/etc/rc.d/init.d/,卸载的话需要执行卸载命令,加上 -e参数)
12.2 RPM包安装服务的管理
12.2.1 独立服务的管理
RPM包安装的默认位置:
/etc/init.d/:启动脚本位置
/etc/sysconfig/:初始化环境配置文件位置
/etc/:配置文件位置
/etc/xinetd.conf:xinetd配置文件
/etc/xinetd.d/:基于服务的启动脚本
/var/lib/:服务产生的数据放在这里
/var/log/:日志
2、独立服务的启动
- /etc/init.d 独立服务名 start|stop|status|restart|
- service 独立服务名 start|stop|restart|status|
service --status-all 展示已经安装的RPM包服务状态
3、独立服务的自启动
-
chkconfig [–level 运行级别] [独立服务名] [on|off]
-
#chkconfig –list
chkconfig –level 2345 httpd on
chkconfig httpd off (–level可以省略 )
-
-
修改/etc/rc.d/rc.local文件(软链接指向:/etc/rc.local)
-
使用ntsysv命令管理自启动(类似setup)
12.2.2 基于xinetd服务的管理
1、安装xinetd与telnet
[root@VM_0_13_centos ~]# yum -y install xinetd
[root@VM_0_13_centos ~]# yum -y install telnet-server
2、xinetd服务的启动
[root@VM_0_13_centos ~]# vi /etc/xinetd.d/telnet
service telnet ←服务的名称为telnet
{
flags =REUSE ←标示为REUSE,设定TCP/IP socket可重用
socket_type =stream ←使用TCP协议数据包
wait =no ←允许多个连接同时连接
user =root ←启动服务的用户为root
server =/usr/sbin/in.telnetd ←服务的启动程序
log_on_failure +=USERID ←登陆失败后,记录用户的ID
disable =no ←服务不启动
}
*:disable = no代表服务启动
#重启xinetd服务
[root@VM_0_13_centos ~]# service xinetd restart
3、xinetd服务的自启动
1.
[root@VM_0_13_centos ~]# chkconfig telnet on
2.
[root@VM_0_13_centos ~]# ntsysv
12.3 源码包安装服务的管理
1、源码包安装服务的启动
- 使用绝对路径,调用启动脚本来启动。不同的源码包的启动脚本不同。可以查看源码包的安装说明,查看启动脚本的方法。
[root@VM_0_13_centos ~]# /usr/local/apache2/bin/apachectl start|stop
2、源码包服务的自启动
[root@VM_0_13_centos ~]# vi /etc/rc.d/rc.local
加入
/usr/local/apache2/bin/apachectl start
3、让源码包服务被服务管理命令识别
- 让源码包的apache服务被service命令管理启动
[root@VM_0_13_centos ~]# ln -s /usr/local/apache2/bin/apachectl /etc/init.d/apache
- 让源码包的apache服务能被chkconfig与ntsysv命令管理自启动
[root@VM_0_13_centos ~]# vi /etc/init.d/apache
#chkconfig: 35 86 76
#指定httpd脚本可以被chkconfig命令管理。格式是:chkconfig:运行级别 启动顺序 关闭顺序 启动、关闭顺序不能与现有重复 /etc/rc.d/**
#description:source package apache
#说明,内容随意
[root@VM_0_13_centos ~]# chkconfig --add apache
#把源码包apache加入命令
12.4 服务管理总结
第十三章 Linux系统管理
13.1 进程管理
13.1.1 进程查看
进程简介
- 进程是正在执行的一个程序或命令,每一个进程都是一个运行的实体,都有自已的地址空间,并占用一定的系统资源。
13.1.2 进程管理
13.2 工作管理
13.3 系统资源管理
13.4 系统定时任务
总结内容,不再记录
命令汇总
常用命令
临时更改ip地址命令:ifconfig eth0 192.168.1.1
查看分区:df
目录处理命令:ls
语法:ls 选项[-ald] [文件或目录]
-a 显示所有文件,包括隐藏文件
-l 详细信息显示
-d 查看目录属性
-h 文件大小以K,M,G为单位显示(human-readable)
-i 查询i节点
删除空目录:rmdir
语法:rmdir [目录名]
功能描述:删除空目录
cp
语法: cp -rp [原文件或目录] [目标目录]
-r 复制目录
-p 保留文件属性
功能描述:复制文件或目录(复制的过程中可以更名)
mv
语法: mv[原文件或目录] [目标目录]
功能描述:剪切文件、改名
rm
语法:rm -rf [文件或目录]
-r 删除目录
-f 强制执行
功能描述:删除文件
touch
语法:touch [文件名]
功能描述:创建空文件
cat
语法:cat [文件名]
功能描述:显示文件内容
-n 显示行号
tac
语法:tac [文件]
功能描述:显示文件内容(反向列示)与cat显示相反,但不支持-n
more
语法:more [文件名]
(空格)或f 翻页
(Enter) 换行
q或Q 退出
功能描述:分页显示文件内容
less
语法:less [文件名]
(空格)或f 翻页
(Enter) 换行
q或Q 退出
pageup 向上翻页
↑ 一行一行向上翻页
功能描述:分页显示文件内容(可向上翻页)
附加功能:查找- 按“/”,输入要搜索的关键词,按“n(next)” 找下一个。
head
语法:head [文件名]
功能描述:显示文件前面几行
-n 指定行数(默认前十行)
例: head -n 7 /etc/services
tail
语法:tail [文件名]
功能描述:显示文件后面几行
-n 指定行数
-f 动态显示文件末尾内容
ln
语法:ln -s [原文件] [目标文件]
-s 创建软链接
功能描述:生成链接文件
chmod
语法:chmod [{ugoa}{+-=}{rwx}][文件或目录]
[mode=421][文件或目录]
-R 递归修改(改变目录下的所有权限)
功能描述:改变文件或目录权限
例:chmod u+x *** #给所有者增加执行权限
chmod g+w,o-r *** #给所属组增加写权限,其他人的r权限去掉
【u:所有者,g:所属组,o:其他人,a:all所有】
【+:增加,-:减,=:不管之前有什么权限,全部按照本次授权】
权限的数字表示:
r---4
w---2
x---1
rwxrw-r--
7 6 4
例:chmod 640 *** # rw-r-----
chown
语法:chown [用户] [文件或目录]
功能描述:改变文件或目录的所有者
useradd 添加用户
groupadd 添加组
find
语法:find [搜索范围] [匹配条件]
-name 根据文件名搜索(精确查找,模糊查找--> *init、*init*、init*。init?问号匹配单个字符)
-iname 不区分大小写(与-name没有本质区别)
-size (+n 大于 -n小于 n等于)
-user 根据所有者查找 find /home -user ***
-group 根据所属组查找
根据时间属性查找:
-amin访问时间 access
-cmin文件属性change
-mmin文件内容modify
例:find /etc -cmin -5 [在/etc下查找5分钟内被修改过属性的文件和目录]
-a两个条件同时满足
-o两个条件满足任意一个即可
例:find /etc -size +163840 -a -size -204800[在/etc下查找大于80MB小于100MB的文件]
-exec/-ok 命令{} \; 对搜索结果执行操作
例:find /etc -name inittab -exec ls -s {} \;[在/etc下查找inittab文件并显示其详细信息]
-type 根据文件类型查找 [f文件 d目录 l软链接文件]
-imun 根据i节点查找
功能描述:文件搜索
locate
语法:locate 文件名
-i 不区分大小写
功能描述:在文件资料库中查找文件[tmp目录不在locate收录范围之内]
updatedb 更新资料库,更新后,locate便可查找到。
which
语法:which 命令
功能描述:搜索命令所在目录及别名信息
例:which ls
whereis
语法:whereis [命令名称]
功能描述:搜索命令所在目录及帮助文档路径
grep
语法:grep -iv [指定字串] [文件]
-i 不区分大小写
-v 排除指定字串
功能描述:在文件中搜寻字串匹配的行并输出
例:grep mysql /root/install.log
man
语法:man [命令或配置文件]
功能描述:获得帮助信息
例:man ls [查看ls命令的帮助信息]
man services[查看配置文件services的帮助信息]
man查看配置文件的帮助,不能写成man /etc/sercices,绝对路径。因为得到的并不是帮助信息,而是把这个文件都显示出来了。直接man services就可以了。【man+配置文件信息】
每个Linux配置文件都会有关于这个配置文件的格式的介绍。都是有规律的。如下图:
空格翻页、回车一行一行住下翻,q退出, 可以用 /** 文件内查找,同more/less
*注:不仅能查看命令的帮助,还能查看系统里面相关的配置文件的帮助信息
man passwd
Linux 优先查看的是命令的帮助信息。
[root@VM-20-2-centos /]# which passwd
/usr/bin/passwd
[root@VM-20-2-centos /]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man5/passwd.5.gz /usr/share/man/man1/passwd.1.gz
man/man1/passwd.1.gz man/man5/passwd.5.gz
1:命令的帮助 5配置文件的帮助
man 5 passwd
whatis ls #得到命令的简短的信息
apropos services 只想查看一个配置文件的信息
--help 列出常见的选项信息
touch --help
info 和man大同小异
help
语法:help 命令
功能描述:获得Shell内置命令的帮助信息
例:help umask 查看umask命令的帮助信息
Shell内置命令:找不到路径的命令就是Shell内置命令。
useradd
语法:useradd 用户名
功能描述:添加新用户
passwd
语法:passwd用户名
功能描述:设置用户密码
who
语法:who
功能描述:查看登录用户信息
w
语法:w
功能描述:查看登录用户详细信息
gzip
语法:gzip [文件]
功能描述:压缩文件(只能压缩文件,不能压缩目录,不保留原文件)
gunzip
语法:gunzip [压缩文件] 或 gzip -d
功能描述:解压缩.gz的压缩文件
【解压缩】:gunzip [压缩文件] 或 gzip -d
----------------------------------------------------------------------
tar
语法:tar 选项 [-zcf] [压缩后文件名] [目录]
-c 打包
-v 显示详细信息
-f 指定文件名
-z 打包同时压缩
功能描述:打包目录
压缩后文件格式:.tar.gz
例:
[root@VM-20-2-centos tmp]# tar -cvf nginxhtml.tar nginxhtml/
nginxhtml/
nginxhtml/Dockerfile
nginxhtml/dist/
nginxhtml/dist/color.less
nginxhtml/dist/color.less.gz
nginxhtml/dist/js/
......
解压缩:
tar命令解压缩语法:
-x 解包
-v 显示详细信息
-f 指定解压文件
-z 解压缩
例:tar -zxvf Japan.tar.gz
----------------------------------------------------------------------
zip
语法:zip 选项[-r] [压缩后文件名] [文件或目录]
-r 压缩目录
功能描述:压缩文件或目录
压缩后文件格式:.zip
保留原文件,可以压缩目录
解压缩:
语法:unzip
功能描述:解压.zip的压缩文件
----------------------------------------------------------------------
bzip2
语法:bzip2 选项[-k] [文件]
-k 产生压缩文件后保留原文件
功能描述:压缩文件
# tar -cjf Japan.tar.bz2 Japan 生成*.tar.bz2格式压缩包
解压缩:
语法:bunzip2 选项 [-k] [压缩文件]
-k 解压缩后保留原文件
功能描述:解压缩
write
语法:write <用户名>
功能描述:给用户发信息,以Ctrl+D保存结束
wall
语法:wall [message]
功能描述:发广播信息
ping
语法:ping 选项 IP地址
-c 指定发送次数
功能描述:测试网络连通性
ifconfig
语法:ifconfig 网卡名称 IP地址
功能描述:查看和设置网卡信息
例:ifconfig eth0 192.168.8.250
【eth0、eth1 本地真实网卡, lo 回环网卡:本机通信和测试的】
mail
语法:mail [用户名]
功能描述:查看发送电子邮件
接收:mail
N 代表未读
邮箱地址位置:/var/spool/mail/root
help 查看支持的命令格式
1:输入序列号就能查看信的具体内容
h:查看邮箱列表
d+序列号:删除指定序列号的邮件
q:退出
last
语法:last
功能描述:列出目前与过去登入系统的用户信息
lastlog
语法:lastlog
-u (-u 502 查询指定用户的登录信息)
功能描述:检查某特定用户上次登录时间
traceroute
语法:traceroute
功能描述:显示数据包到主机间的路径
例:traceroute www.lampbrother.net
netstat
语法:netstat [选项]
功能描述:显示网络相关信息
选项:
-t: TCP协议
-u: UDP协议
-l: 监听
-r: 路由
-n: 显示IP地址和端口号
例:
# netstat -tlun 查看本机监听的端口
# netstat -an 查看本机所有的网络连接
# netstat -rn 查看本机路由表
setup
语法:setup
功能描述:配置网络【redhat专有命令】
挂载命令:mount
语法:mount [-t 文件系统] 设备文件名(系统默认指定/dev/sr0) 挂载点
例: #mount -t iso9660 /dev/sr0(同/dev/cdrom) /mnt/cdrom
-t 可省略
umount:卸载挂载点
shutdown(推荐)
语法:shutdown [选项] 时间
选项:
-c: 取消一个关机命令
-h: 关机
-r: 重启
例:shutdown -h now #now指现在关机,也可以指定时间,将now换成时间即可20:30
其他关机命令:
halt
poweroff
init 0
其他重启命令:
reboot
init 6
系统运行级别:
0: 关机
1: 单用户
2: 不完全多用户,不含NFS服务[network file system网络文件系统]-> 文件共享服务
3: 完全多用户
4: 未分配
5: 图形界面
6: 重启
runlevel:查询系统运行级别
[root@VM-20-2-centos ~]# runlevel
N 3
N:空。
logout:退出登陆
Vim:
插入命令
命令 | 作用 |
---|---|
a | 在光标所在字符后插入 |
A | 在光标所在行尾插入 |
i | 在光标所在字符前插入 |
I | 在光标所在行行首插入 |
o | 在光标下插入新行 |
O | 在光标上插入新行 |
定位命令
命令 | 作用 |
---|---|
:set nu | 设置行号 |
:set nonu | 取消行号 |
gg | 到第一行 |
G | 到最后一行 |
nG | 到第n行 例:821G |
:n | 到第n行 |
$ | 移至行尾 |
0 | 移至行首 |
删除命令
命令 | 作用 |
---|---|
x | 删除光标所在处字符 |
nx | 删除光标所在处后n个字符 |
dd | 删除光标所在行,ndd删除n行 |
dG | 删除光标所在行到文件末尾内容 |
D | 删除光标所在处到行尾内容 |
:n1,n2d | 删除指定范围的行 |
复制和剪切命令
命令 | 作用 |
---|---|
yy | 复制当前行 |
nyy | 复制当前行以下n行 |
dd | 剪切当前行 |
dd | 剪切当前行以下n行 |
p、P | 粘贴在当前光标所在行下或行上 |
替换和取消命令
命令 | 作用 |
---|---|
r | 取代光标所在处字符 |
R | 从光标所在处开始替换字符,按Esc结束 |
u | 取消上一步操作 |
搜索和搜索替换命令
命令 | 作用 |
---|---|
/string | 搜索指定字符串 (同less搜索 → /+字符串) 搜索时忽略大小写:set ic |
n | 搜索指定字符串的下一个出现位置 |
:%s/old/new/g | 全文替换指定字符串 【%–>全文】old:旧字符串 new:新字符串 g:不询问 c:询问确认 |
:n1,n2s/old/new/g | 在一定范围内替换指定字符串【n1,n2s–>[n1,n2]范围内】 |
例:
:%s/ftp/yangmi/g 全文替换 不询问确认
:41,44s/yangmi/shenchao/c 部分替换并询问
保存和退出命令
命令 | 作用 |
---|---|
:w | 保存修改 |
:w new_filename | 另存为指定文件 |
:wq | 保存修改并退出 |
ZZ | 快捷键,保存修改并退出 |
:q! | 不保存修改退出 |
:wq! | 保存修改并退出(文件所有者及root可使用) |