Linux学习笔记完整整理版
📝 适用于 Obsidian 的结构化学习笔记 🎯 包含完整目录、内部双链接、统一美化排版 📚 共13章 55节 完整Linux运维知识体系
目录
第1章 Linux基础
第2章 常用命令
第3章 vim编辑器
第4章 软件包管理
第5章 用户与用户组管理
第6章 权限管理
第7章 文件系统管理
第8章 Shell基础
第9章 Shell编程
第10章 服务管理
第11章 系统管理
第12章 日志管理
第13章 启动管理
Linux各目录作用
| 目录名 | 目录作用 |
|---|---|
| /bin/ | 存放系统命令的目录,普通用户和超级用户都可以执行。放在/bin下的命令在单用户模式下也可以执行 |
| /sbin/ | 保存和系统环境设置相关的命令,只有超级用户可以使用这些命令进行系统环境设置,但是有些命令可以允许普通用户查看 |
| /usr/bin/ | 存放系统命令的目录,普通用户和超级用户都可以执行。这些命令和系统启动无关,在单用户模式下不能执行 |
| /usr/sbin/ | 存放根文件系统不必要的系统管理命令,例如多数服务程序。只有超级用户可以使用 |
| /boot/ | 系统启动目录,保存系统启动相关的文件,如内核文件和启动引导程序(grub)文件等 |
| /dev/ | 设备文件保存位置。Linux中所有内容以文件形式保存,包括硬件。这个目录用来保存所有硬件设备文件 |
| /etc/ | 配置文件保存位置。系统内所有采用默认安装方式(rpm安装)的服务的配置文件全部都保存在这个目录当中 |
| /home/ | 普通用户的家目录。建立每个用户时,每个用户要有一个默认登录位置,这个位置就是这个用户的家目录 |
| /lib/ | 系统调用的函数库保存位置 |
| /lost+found/ | 系统意外崩溃或机器意外关机,而产生一些文件碎片放在这里。当系统启动的过程中fsck工具会检查这里,并修复已经损坏的文件系统 |
| /media/ | 挂载目录。系统建议是用来挂载媒体设备的,例如软盘和光盘 |
| /mnt/ | 挂载目录,早期Linux中只有这一个挂载目录,并没有细分。现在这个目录系统建议挂载额外设备 |
| /misc/ | 挂载目录。系统建议用来挂载NFS服务的共享目录 |
| /opt/ | 第三方安装的软件保存位置。手工安装的源码包软件都可以安装到这个目录当中 |
| /proc/ | 虚拟文件系统,该目录中的数据并不保存到硬盘当中,而是保存到内存当中。主要保存系统的内核,进程,外部设备状态和网络状态等 |
| /sys/ | 虚拟文件系统。和/proc目录相似,都是保存在内存当中的,主要是保存内核相关信息的 |
| /root/ | 超级用户的家目录。普通用户家目录在”/home”下,超级用户家目录直接在”/“下 |
| /srv/ | 服务数据目录。一些系统服务启动之后,可以在这个目录中保存所需要的数据 |
| /tmp/ | 临时目录。系统存放临时文件的目录,该目录下所有用户都可以访问和写入 |
| /usr/ | 系统软件资源目录。是”Unix Software Resource”的缩写,存放系统软件资源的目录 |
| /var/ | 动态数据保存位置。主要保存缓存、日志以及软件运行所产生的文件 |
服务器注意事项
- 远程服务器不允许关机,只能重启
- 重启时应该关闭服务
- 不要在服务器访问高峰运行高负载命令
- 远程配置防火墙时不要把自己踢出服务器
- 指定合理的密码规范并定期更新
- 合理分配权限
- 定期备份重要数据和日志
文件处理命令
命令格式
命令 [-选项] [参数]
例:ls -la /etc
- 个别命令不遵循此格式
- 当有多个选项时,可以写在一起
- 简化选项与完整选项
-a等于--all - 中括号[]中的是可选参数
文件类型
-rw-r--r--
| 符号 | 类型 |
|---|---|
| - | 二进制文件 |
| d | 目录 |
| l | 软链接文件 |
权限位说明
rw- r-- r--
| rw- | r— | r— |
|---|---|---|
| u所有者 | g所属组 | o其他人 |
| r读取 | w写入 | x执行 |
mkdir
- 命令名称:mkdir
- 命令英文原意:make directories
- 命令所在路径:/bin/mkdir
- 执行权限:所有用户
- 语法:
mkdir -p [目录名] - 功能描述:创建新目录
| 选项 | 说明 |
|---|---|
| -p | 递归创建 |
示例:
mkdir -p /tmp/Japan/boduo
# 递归创建
mkdir /tmp/Japan/longze /tmp/Janpan/cangjing
# 同时创建多个目录cd
- 命令名称:cd
- 命令英文原意:change directory
- 命令所在路径:shell内置命令
- 执行权限:所有用户
- 语法:
cd [目录] - 功能描述:切换目录
示例:
cd /tmp/Janpan/boduo
# 切换到指定目录
cd ..
# 返回上一级目录pwd
- 命令名称:pwd
- 命令英文原意:print working directory
- 命令所在路径:/bin/pwd
- 执行权限:所有用户
- 语法:
pwd - 功能描述:显示当前目录
示例:
pwd
# 显示当前工作目录rmdir
- 命令名称:rmdir
- 命令英文原意:remove empty directories
- 命令所在路径:/bin/rmdir
- 执行权限:所有用户
- 语法:
rmdir [目录名] - 功能描述:删除空目录
示例:
rmdir /tmp/Japan/boduocp
- 命令名称:cp
- 命令英文原意:copy
- 命令所在路径:/bin/cp
- 执行权限:所有用户
- 语法:
cp -rp [原文件或目录] [目标目录] - 功能描述:复制文件或目录
| 选项 | 说明 |
|---|---|
| -r | 复制目录 |
| -p | 保留文件属性 |
示例:
cp -r /tmp/Japan/cangjing /root
# 将目录/tmp/Japan/cangjing复制到目录/root下
cp -rp /tmp/Japan/boduo /tmp/Japan/longze /root
# 将/tmp/Japan目录下的boduo和longze目录复制到/root下,保持目录属性mv
- 命令名称:mv
- 命令英文原意:move
- 命令所在路径:/bin/mv
- 执行权限:所有用户
- 语法:
mv [原文件或目录] [目标目录] - 功能描述:剪切文件、改名
rm
- 命令名称:rm
- 命令英文原意:remove
- 命令所在路径:/bin/rm
- 执行权限:所有用户
- 语法:
rm -rf [文件或目录] - 功能描述:删除文件
| 选项 | 说明 |
|---|---|
| -r | 删除目录 |
| -f | 强制执行 |
示例:
rm /tmp/yum.log
# 删除文件/tmp/yum.log
rm -rf /tmp/Japan/longze
# 删除目录/tmp/Japan/longzels
- 命令名称:ls
- 命令英文原意:list
- 命令所在路径:/bin/ls
- 执行权限:所有用户
- 功能描述:显示目录文件
- 语法:
ls 选项 [文件或目录]
| 选项 | 说明 |
|---|---|
| -a | 显示所有文件,包括隐藏文件 |
| -l | 详细信息显示 |
| -d | 查看目录属性 |
| -h | 人性化显示,给文件大小自动增加单位显示 |
| -i | i接点 |
分页查看:
ls | less
ls | moretouch
- 命令名称:touch
- 命令所在路径:/bin/touch
- 执行权限:所有用户
- 语法:
touch [文件名] - 功能描述:创建空文件
示例:
touch Japanlovestory.list
touch program file
# 创建program和file两个文件,不建议用空格的名称
touch "program file"
# 创建带有空格的文件名program file时需要加""双引号
touch /tmp/japanlovestory.list
# 创建绝对路径的文件cat
- 命令名称:cat
- 命令所在路径:/bin/cat
- 执行权限:所有用户
- 语法:
cat [文件名] - 功能描述:显示文件内容
| 选项 | 说明 |
|---|---|
| -n | 显示行号 |
示例:
cat /etc/issue
cat -n /etc/servicestac
- 命令名称:tac
- 命令所在路径:/usr/bin/tac
- 执行权限:所有用户
- 语法:
tac [文件名] - 功能描述:显示文件内容(反向列示)
示例:
tac /etc/issuemore
- 命令名称:more
- 命令所在路径:/bin/more
- 执行权限:所有用户
- 语法:
more [文件名] - 功能描述:分页显示文件内容
| 操作 | 说明 |
|---|---|
| (空格)或f | 翻页 |
| (Enter) | 换行 |
| q或Q | 退出 |
示例:
more /etc/servicesless
- 命令名称:less
- 命令所在路径:/usr/bin/less
- 执行权限:所有用户
- 语法:
less [文件名] - 功能描述:分页显示文件内容(可向上翻页)
| 操作 | 说明 |
|---|---|
| pageup | 往上翻一页 |
| pagedown | 往下翻一页 |
| ↑ | 往上翻一行 |
| ↓ | 往下翻一行 |
| 回车键 | 往下换行 |
| 空格键 | 往下换一页 |
| / + 关键字 | 高亮显示搜索文件,N键(next)查找下一个 |
示例:
less /etc/serviceshead
- 命令名称:head
- 命令所在路径:/usr/bin/head
- 执行权限:所有用户
- 语法:
head [文件名] - 功能描述:显示文件前面几行
| 选项 | 说明 |
|---|---|
| -n | 指定行数 |
示例:
head -n 20 /etc/servicestail
- 命令名称:tail
- 命令所在路径:/usr/bin/tail
- 执行权限:所有用户
- 语法:
tail [文件名] - 功能描述:显示文件后面几行
| 选项 | 说明 |
|---|---|
| -n | 指定行数 |
| -f | 动态显示文件末尾内容 |
示例:
tail -n 18 /etc/servicesln
- 命令名称:ln
- 命令英文原意:link
- 命令所在路径:/bin/ln
- 执行权限:所有用户
- 语法:
ln -s [原文件] [目标文件] - 功能描述:生成链接文件
| 选项 | 说明 |
|---|---|
| -s | 创建软链接 |
软链接
ln -s /etc/issue /tmp/issue.soft
# 创建文件/etc/issue的软链接/tmp/issue.soft
# 软连接相当于Windows里的快捷方式软链接特点:
lrwxrwxrwx文件权限都是可读可写可执行- 文件大小只是符号链接
/tmp/issue.soft -> /etc/issue箭头指向源文件
硬链接
ln /etc/issue /tmp/issue.hard
# 创建文件/etc/issue的硬链接/tmp/issue.hard
# 源文件的备份文件,并且实时更新硬链接特点:
- 拷贝
cp -p+ 同步更新 - 通过i节点识别
- 不能跨分区
- 不能针对目录使用
du
du -sh test
# 显示test文件的大小权限管理命令
chmod
- 命令名称:chmod
- 命令英文原意:change the permissions mode of a file
- 命令所在路径:/bin/chmod
- 执行权限:所有用户
- 语法:
chmod [{ugoa}{+-=}{rwx}] [文件或目录] - 功能描述:改变文件或目录权限
| 符号 | 含义 | 说明 |
|---|---|---|
| u | user | 所有者 |
| g | group | 所属组 |
| o | other | 其他人 |
| a | all | 所有人 |
权限的数字表示:
- r ---- 4
- w ---- 2
- x ---- 1
例如:rwx rw- r-- 对应 7 6 4
递归修改: -R 递归修改
示例:
chmod g+w testfile
# 赋予文件testfile所属组写权限
chmod -R 777 testdir
# 修改目录testfile及其目录下文件为所有用户具有全部权限文件目录权限总结
| 代表字符 | 权限 | 对文件的含义 | 对目录的含义 |
|---|---|---|---|
| r | 读权限 | 可以查看文件内容 | 可以列出目录中的内容 |
| w | 写权限 | 可以修改文件内容 | 可以在目录中创建、删除文件 |
| x | 执行权限 | 可以执行文件 | 可以进入目录 |
chown
- 命令名称:chown
- 命令英文原意:change file ownership
- 命令所在路径:/bin/chown
- 执行权限:所有用户
- 语法:
chown [用户] [文件或目录] - 功能描述:改变文件或目录的所有者
示例:
chown shenchao fengjie
# 改变文件fengjie的所有者为shenchaochgrp
- 命令名称:chgrp
- 命令英文原意:change file group ownership
- 命令所在路径:/bin/chgrp
- 执行权限:所有用户
- 语法:
chgrp [用户组] [文件或目录] - 功能描述:改变文件或目录的所属组
示例:
chgrp lampbrother fengjie
# 改变文件fengjie的所属组为lampbrotherumask
- 命令名称:umask
- 命令英文原意:the user file-creation mask
- 命令所在路径:Shell内置命令
- 执行权限:所有用户
- 语法:
umask [-S] - 功能描述:显示、设置文件的缺省权限
| 选项 | 说明 |
|---|---|
| -S | 以rwx形式显示新建文件缺省权限 |
示例:
umask -S
# u=rwx,g=rx,o=rx默认情况:
mkdir创建的目录权限drwxr-xr-xtouch创建的文件权限-rw-r--r--没有可执行权限
修改默认权限:
umask 023
# 需要用 777-754=023,类似于反掩码
# 如果需要修改默认权限为 rwxr-x-r-- (754)
# 需要用 777-754=023文件搜索命令
find
- 命令名称:find
- 命令所在路径:/bin/find
- 执行权限:所有用户
- 语法:
find [搜索范围] [匹配条件] - 功能描述:文件搜索
按文件名搜索
find /etc -name init
# 在目录/etc中查找文件init
find /etc -iname init
# 不区分大小写
find / -name "*log*"
# 通配符匹配,*匹配任意字符按文件大小搜索
find / -size +204800
# 在根目录下查找大于100MB的文件
# 1块=512字节 100MB=102400KB=204800块
# +n 大于 -n 小于 n 等于按所有者搜索
find /home -user root
# 在/home目录下查找所有者为root的文件按时间属性搜索
find /etc -mmin -5
# 在/etc下查找5分钟内被修改过属性的文件和目录
# -amin 访问时间 access
# -cmin 文件属性 change
# -mmin 文件内容 modify多条件连接
find /etc -size +163840 -a -size -204800
# 在/etc下查找大于80MB小于100MB的文件
# -a 两个条件同时满足 and
# -o 两个条件满足任意一个即可 or对搜索结果执行操作
find /etc -name inittab -exec ls -l {} \;
# 在/etc下查找inittab文件并显示其详细信息
# -exec/-ok 命令 {} \; 对搜索结果执行操作
find /etc -name *.log -ok rm {} \;
# 询问删除按文件类型搜索
find /tmp -type d
# -f 文件 -d 目录 -l 软链接文件根据i节点查找
find . -inum 1234 -exec rm {} \;
# 根据i节点查找并删除文件locate
- 命令名称:locate
- 命令英文原意:
- 命令所在路径:/usr/bin/locate
- 执行权限:所有用户
- 语法:
locate 文件名 - 功能描述:在文件资料库中查找文件
示例:
locate passwd
# 快速查找文件
updatedb
# 更新文件数据库
# 新建的文件如果搜不到,执行updatedb更新数据库which
- 命令名称:which
- 命令所在路径:/usr/bin/which
- 执行权限:所有用户
- 语法:
which 命令 - 功能描述:搜索命令所在目录及别名信息
示例:
which ls
# 显示命令路径和别名whereis
- 命令名称:whereis
- 命令所在路径:/usr/bin/whereis
- 执行权限:所有用户
- 语法:
whereis [命令名称] - 功能描述:搜索命令所在路径及帮助文档所在位置
示例:
whereis lsgrep
- 命令名称:grep
- 命令所在路径:/bin/grep
- 执行权限:所有用户
- 语法:
grep -iv [指定字串] [文件] - 功能描述:在文件中搜寻字串匹配的行并输出
| 选项 | 说明 |
|---|---|
| -i | 不区分大小写 |
| -v | 排除指定字串 |
示例:
grep mysql /root/install.log
# 在文件中搜索包含mysql的行
grep -v "^#" /etc/inittab
# 排除以#开头的注释行帮助命令
man
- 命令名称:man
- 命令英文原意:manual
- 命令所在路径:/usr/bin/man
- 执行权限:所有用户
- 语法:
man [命令或配置文件] - 功能描述:获得帮助信息
示例:
man ls
# 查看ls命令的帮助信息
man services
# 查看配置文件services的帮助信息
# 注意:配置文件不要写绝对路径,直接写文件名man手册分章节:
- 1:命令的帮助
- 5:配置文件的帮助
man 5 passwd
# 查看passwd配置文件的帮助(第5章节)手册内操作:
/关键词搜索n下一个匹配
whatis
whatis ls
# 得到命令的简短描述信息apropos
apropos passwd
# 搜索和passwd相关的所有手册info
info ls
# 类似man的在线文档帮助help
- 命令名称:help
- 命令所在路径:Shell内置命令
- 执行权限:所有用户
- 语法:
help 命令 - 功能描述:获得Shell内置命令的帮助信息
示例:
help umask
# 查看umask命令的帮助外部命令获取帮助:
ls --help
# 外部命令通用的简短帮助用户管理命令(基础)
useradd
- 命令名称:useradd
- 命令英文原意:add a new user
- 命令所在路径:/usr/sbin/useradd
- 执行权限:root
- 语法:
useradd 用户名 - 功能描述:添加新用户
示例:
useradd lisipasswd
- 命令名称:passwd
- 命令英文原意:update user’s authentication tokens
- 命令所在路径:/usr/bin/passwd
- 执行权限:所有用户
- 语法:
passwd 用户名 - 功能描述:设置用户密码
示例:
passwd lisi
# root用户可以修改任意用户密码
passwd
# 普通用户修改自己的密码who
- 命令名称:who
- 命令所在路径:/usr/bin/who
- 执行权限:所有用户
- 语法:
who - 功能描述:查看登录用户信息
输出字段:
- 登录用户名
- 登录终端(tty本地终端,pts远程终端)
- 登录时间
- 登录IP地址
w
- 命令名称:w
- 命令所在路径:/usr/bin/w
- 执行权限:所有用户
- 语法:
w - 功能描述:查看登录用户详细信息
显示信息:
- 系统当前时间
- 系统运行时长
- 登录用户数
- 系统平均负载
- 用户、终端、登录IP、登录时间、空闲时间、CPU占用、当前操作
压缩解压命令
gzip
- 命令名称:gzip
- 命令英文原意:GNU zip
- 命令所在路径:/bin/gzip
- 执行权限:所有用户
- 语法:
gzip [文件] - 功能描述:压缩文件
- 压缩后文件格式:.gz
特点:
- 只能压缩文件,不能压缩目录
- 不保留原文件
示例:
gzip test.txt
# 压缩后生成 test.txt.gzgunzip
- 命令名称:gunzip
- 命令英文原意:GNU unzip
- 命令所在路径:/bin/gunzip
- 执行权限:所有用户
- 语法:
gunzip [压缩文件] - 功能描述:解压.gz的压缩文件
示例:
gunzip test.gz
# 或者
gzip -d test.gztar
- 命令名称:tar
- 命令所在路径:/bin/tar
- 执行权限:所有用户
- 语法:
tar 选项[-zcf] [压缩后文件名] [目录] - 功能描述:打包目录
- 压缩后文件格式:.tar.gz / .tar.bz2
| 选项 | 说明 |
|---|---|
| -c | 打包 |
| -v | 显示详细信息 |
| -f | 指定文件名 |
| -z | 打包同时压缩 |
| -x | 解包 |
打包压缩:
tar -zcvf test.tar.gz test
# 将test目录打包并压缩为test.tar.gz解压缩:
tar -zxvf test.tar.gz
# 解压.tar.gz文件bz2格式:
tar -cjf test.tar.bz2 test
# 压缩为bz2格式(压缩率更高)
tar -xjf test.tar.bz2
# 解压bz2格式zip
- 命令名称:zip
- 命令所在路径:/usr/bin/zip
- 执行权限:所有用户
- 语法:
zip 选项[-r] [压缩后文件名] [文件或目录] - 功能描述:压缩文件或目录
- 压缩后文件格式:.zip
| 选项 | 说明 |
|---|---|
| -r | 压缩目录 |
特点:
- Windows和Linux通用
- 保留原文件
示例:
zip test.zip test.txt
# 压缩文件
zip -r test.zip test
# 压缩目录unzip
- 命令名称:unzip
- 命令所在路径:/usr/bin/unzip
- 执行权限:所有用户
- 语法:
unzip [压缩文件] - 功能描述:解压.zip的压缩文件
示例:
unzip test.zipbzip2
- 命令名称:bzip2
- 命令所在路径:/usr/bin/bzip2
- 执行权限:所有用户
- 语法:
bzip2 选项 [-k] [文件] - 功能描述:压缩文件
- 压缩后文件格式:.bz2
| 选项 | 说明 |
|---|---|
| -k | 产生压缩文件后保留原文件 |
示例:
bzip2 -k test
# 压缩并保留原文件bunzip2
- 命令名称:bunzip2
- 命令所在路径:/usr/bin/bunzip2
- 执行权限:所有用户
- 语法:
bunzip2 选项 [-k] [压缩文件] - 功能描述:解压缩
| 选项 | 说明 |
|---|---|
| -k | 解压缩后保留原文件 |
示例:
bunzip2 -k test.bz2网络命令
write
- 命令名称:write
- 命令所在路径:/usr/bin/write
- 执行权限:所有用户
- 语法:
write <用户名> - 功能描述:给用户发信息,以Ctrl+D保存结束
示例:
write lisi
# 给在线用户lisi发消息wall
- 命令名称:wall
- 命令英文原意:write all
- 命令所在路径:/usr/bin/wall
- 执行权限:所有用户
- 语法:
wall [message] - 功能描述:发广播信息
示例:
wall Hello everyone!
# 给所有在线用户发广播ping
- 命令名称:ping
- 命令所在路径:/bin/ping
- 执行权限:所有用户
- 语法:
ping 选项 IP地址 - 功能描述:测试网络连通性
| 选项 | 说明 |
|---|---|
| -c | 指定发送次数 |
示例:
ping -c 4 192.168.1.1
# 发送4次数据包后停止ifconfig
- 命令名称:ifconfig
- 命令英文原意:interface configure
- 命令所在路径:/sbin/ifconfig
- 执行权限:root
- 语法:
ifconfig 网卡名称 IP地址 - 功能描述:查看和设置网卡信息
示例:
ifconfig
# 查看网卡信息
ifconfig eth0 192.168.1.100
# 临时设置eth0网卡IP
ifconfig eth0:1 192.168.1.101
# 给eth0网卡多绑定一个ip地址(虚拟网卡)- 命令名称:mail
- 命令所在路径:/bin/mail
- 执行权限:所有用户
- 语法:
mail [用户名] - 功能描述:查看发送电子邮件
示例:
mail root
# 给root发邮件
# 输入主题、内容,Ctrl+D发送
mail
# 查看收件箱last
- 命令名称:last
- 命令所在路径:/usr/bin/last
- 执行权限:所有用户
- 语法:
last - 功能描述:列出目前与过去登入系统的用户信息
示例:
last
# 查看所有登录记录和重启记录lastlog
- 命令名称:lastlog
- 命令所在路径:/usr/bin/lastlog
- 执行权限:所有用户
- 语法:
lastlog - 功能描述:检查某特定用户上次登录的时间
示例:
lastlog
# 查看所有用户最后一次登录时间
lastlog -u 1000
# 查看指定UID用户的登录记录traceroute
- 命令名称:traceroute
- 命令所在路径:/bin/traceroute
- 执行权限:所有用户
- 语法:
traceroute - 功能描述:显示数据包到主机间的路径
示例:
traceroute www.baidu.comnetstat
- 命令名称:netstat
- 命令所在路径:/bin/netstat
- 执行权限:所有用户
- 语法:
netstat [选项] - 功能描述:显示网络相关信息
| 选项 | 说明 |
|---|---|
| -t | TCP协议 |
| -u | UDP协议 |
| -l | 监听 |
| -r | 路由 |
| -n | 显示IP地址和端口号 |
示例:
netstat -tlun
# 查看本机监听的端口
netstat -an
# 查看本机所有的网络连接
netstat -rn
# 查看本机路由表setup
- 命令名称:setup
- 命令所在路径:/usr/bin/setup
- 执行权限:root
- 语法:
setup - 功能描述:配置网络
- 备注:RedHat系列专有
mount
- 命令名称:mount
- 命令所在路径:/bin/mount
- 执行权限:所有用户
- 语法:
mount [-t 文件系统] 设备文件名 挂载点 - 功能描述:挂载文件系统
示例:
mount -t iso9660 /dev/sr0 /mnt/cdrom
# 挂载光盘
umount /mnt/cdrom
# 卸载光盘
# 注意:不能在挂载目录内执行卸载命令关机重启命令
shutdown
- 命令名称:shutdown
- 语法:
shutdown [选项] 时间 - 功能描述:关机/重启命令(相对更安全,会正确保存服务)
| 选项 | 说明 |
|---|---|
| -c | 取消前一个关机命令 |
| -h | 关机 |
| -r | 重启 |
示例:
shutdown -h now
# 现在关机
shutdown -h 22:00
# 晚上10点关机
shutdown -r now
# 现在重启
shutdown -c
# 取消上一个关机命令其他关机命令
halt
poweroff
init 0重启命令
reboot
init 6系统运行级别
| 级别 | 说明 |
|---|---|
| 0 | 关机 |
| 1 | 单用户 |
| 2 | 不完全多用户,不含NFS服务 |
| 3 | 完全多用户 |
| 4 | 未分配 |
| 5 | 图形界面 |
| 6 | 重启 |
runlevel
# 查询系统运行级别
cat /etc/inittab
# 修改系统默认运行级别
# id:3:initdefault: 代表默认运行级别为3
# 注意:不要把默认运行级别设为0或6,否则系统无法正常启动退出登录命令
logout
# 退出登录服务器相关命令
查看apache
ps aux | grep apachenmap扫描
首先需要安装nmap:
yum -y install nmap查询所有服务
service --status-all服务管理详见 服务管理 章节
vim常用操作
插入命令
| 命令 | 作用 |
|---|---|
| a(小写a) | 在光标所在字符后插入 |
| A(大写A) | 在光标所在行尾插入 |
| i(小写i) | 在光标所在字符前插入 |
| I(大写I) | 在光标所在行行首插入 |
| o(小写o) | 在光标下插入新行 |
| O(大写O) | 在光标上插入新行 |
定位命令
| 命令 | 作用 | 命令 | 作用 |
|---|---|---|---|
| :set nu | 设置行号 | nG | 到第n行 |
| :set nonu | 取消行号 | :n | 到第n行 |
| gg | 到第一行 | $ | 移至行尾 |
| G | 到最后一行 | 0(数字0) | 移至行首 |
删除命令
| 命令 | 作用 |
|---|---|
| x | 删除光标所在处字符 |
| nx | 删除光标所在处后n个字符 |
| dd | 删除光标所在行,ndd删除n行 |
| dG | 删除光标所在行到文件末尾内容 |
| D | 删除光标所在处到行尾内容 |
| :n1,n2d | 删除指定范围的行 |
复制和剪切命令
| 命令 | 作用 |
|---|---|
| yy | 复制当前行 |
| nyy | 复制当前行以下n行 |
| dd | 剪切当前行 |
| ndd | 剪切当前行以下n行 |
| p、P | 粘贴在当前光标所在行下或行上 |
替换和取消命令
| 命令 | 作用 |
|---|---|
| r | 取代光标所在处字符 |
| R | 从光标所在处开始替换字符,按Esc结束 |
| u | 取消上一步操作 |
搜索和搜索替换命令
| 命令 | 作用 |
|---|---|
| /string | 搜索指定字符串 |
| n | 搜索指定字符串的下一个出现位置 |
| :%s/old/new/g | 全文替换指定字符串 |
| :n1,n2s/old/new/g | 在一定范围内替换指定字符串 |
搜索时忽略大小写: :set ic
搜索时区分大小写: :set noic
替换说明:
:替换范围%s全文替换g不询问c询问确认/old需要替换的字符/new新键入的字符
保存和退出命令
| 命令 | 作用 |
|---|---|
| :w | 保存修改 |
| :w new_filename | 另存为指定文件 |
| :wq | 保存修改并退出 |
| ZZ | 快捷键,保存修改并退出 |
| :q! | 不保存修改退出 |
| :wq! | 保存修改并退出(文件所有者及root可使用) |
vim使用技巧
导入命令执行结果
:r /etc/passwd
# 读取文件内容到光标处
:r !date
# 导入命令执行结果定义快捷键
:map ^P I#<ESC>
# 定义Ctrl+P快捷键,在行首插入#并退出编辑模式
# ^P 是按Ctrl+V+P输入的连续行注释
:n1,n2s/^/#/g
# 在n1到n2行的行首添加#注释
:n1,n2s/^#//g
# 取消n1到n2行的行首#注释替换
:ab mymail test@163.com
# 输入mymail自动替换为test@163.comvim配置文件
把配置写入 ~/.vimrc 文件,永久生效:
set nu " 显示行号
set nonu " 取消行号
map ^P I#<ESC> " 快捷键配置
ab mymail test@163.com " 字符替换RPM包-rpm命令
RPM包安装
rpm -ivh 包全名| 选项 | 说明 |
|---|---|
| -i | 安装 |
| -v | 显示详细信息 |
| -h | 显示进度 |
| —nodeps | 不检测依赖性 |
RPM包升级
rpm -Uvh 包全名| 选项 | 说明 |
|---|---|
| -U | 升级 |
| -v | 显示详细信息 |
| -h | 显示进度 |
| —nodeps | 不检测依赖性 |
RPM包卸载
rpm -e 包名| 选项 | 说明 |
|---|---|
| -e | 卸载 |
| —nodeps | 不检查依赖性 |
RPM包查询
rpm -q 包名
# 查询包是否安装
rpm -qa
# 查询所有已经安装的RPM包查询软件包详细信息
rpm -qi 包名| 选项 | 说明 |
|---|---|
| -i | 查询软件信息 |
| -p | 查询未安装包信息 |
查询包中文件安装位置
rpm -ql 包名| 选项 | 说明 |
|---|---|
| -l | 列表 |
| -p | 查询未安装包信息 |
查询系统文件属于哪个RPM包
rpm -qf 系统文件名| 选项 | 说明 |
|---|---|
| -f | 查询系统文件属于哪个软件包 |
查询软件包的依赖性
rpm -qR 包名| 选项 | 说明 |
|---|---|
| -R | 查询软件包的依赖性 |
| -p | 查询未安装包信息 |
RPM包校验
rpm -V 已安装的包名| 选项 | 说明 |
|---|---|
| -V | 校验指定RPM包中的文件 |
校验内容信息:
| 标记 | 说明 |
|---|---|
| S | 文件大小是否改变 |
| M | 文件的类型或文件的权限(rwx)是否被改变 |
| 5 | 文件MD5校验和是否改变(可以看成文件内容是否改变) |
| D | 设备的主从代码是否改变 |
| L | 文件路径是否改变 |
| U | 文件的属主(所有者)是否改变 |
| G | 文件的属组是否改变 |
| T | 文件的修改时间是否改变 |
文件类型:
| 标记 | 说明 |
|---|---|
| c | 配置文件(config file) |
| d | 普通文档(documentation) |
| g | ”鬼”文件(ghost file),很少出现 |
| l | 授权文件(license file) |
| r | 描述文件(read me) |
RPM包中文件提取
rpm2cpio 包全名 | cpio -idv .文件绝对路径- rpm2cpio:将rpm包转换为cpio格式的命令
- cpio:标准工具,用于创建软件档案文件和从档案文件中提取文件
cpio 选项 < [文件|设备]| 选项 | 说明 |
|---|---|
| -i | copy-in模式,还原 |
| -d | 还原时自动新建目录 |
| -v | 显示还原过程 |
RPM包-yum命令
yum在线管理
查询
yum list
# 查询所有可用软件包列表
yum search 关键字
# 搜索服务器上所有和关键字相关的包安装
yum -y install 包名| 选项 | 说明 |
|---|---|
| install | 安装 |
| -y | 自动回答yes |
升级
yum -y update 包名| 选项 | 说明 |
|---|---|
| update | 升级 |
| -y | 自动回答yes |
卸载
yum -y remove 包名| 选项 | 说明 |
|---|---|
| remove | 卸载 |
| -y | 自动回答yes |
⚠️ 注意:yum卸载会卸载依赖包,可能影响系统稳定性,慎用
yum软件组管理
yum grouplist
# 列出所有可用的软件组列表
yum groupinstall 软件组名
# 安装指定软件组
yum groupremove 软件组名
# 卸载指定软件组光盘yum源搭建
- 挂载光盘
mount /dev/cdrom /mnt/cdrom- 让网络yum源失效
cd /etc/yum.repos.d/
# 重命名.repo文件使其失效- 修改光盘yum源文件
vi CentOS-Media.repo修改内容:
baseurl=file:///mnt/cdrom光盘挂载地址enabled=1使此yum源生效
源码包与RPM包的区别
安装之前的区别:概念上的区别
安装之后的区别:安装位置不同
RPM包默认安装路径
| 路径 | 说明 |
|---|---|
| /etc/ | 配置文件安装目录 |
| /usr/bin/ | 可执行的命令安装目录 |
| /usr/lib/ | 程序所使用的函数库保存位置 |
| /usr/share/doc/ | 基本的软件使用手册保存位置 |
| /usr/share/man/ | 帮助文件保存位置 |
源码包安装位置
安装在指定位置当中,一般是 /usr/local/软件名/
安装位置不同带来的影响
RPM包安装的服务可以使用系统服务管理命令(service)来管理,源码包则不能。
RPM包安装的apache启动方法:
/etc/rc.d/init.d/httpd start
# 启动apache服务
service httpd start
# 等同如上的命令源码包安装的服务则不能被服务管理命令管理,因为没有安装到默认路径中。所以只能用绝对路径进行服务的管理:
/usr/local/apache2/bin/apachectl start
# apache2是自定义目录名称源码包安装
安装准备
- 安装C语言编译器
yum -y install gcc- 下载源码包
- 官方网站下载
- 例如:http://mirror.bit.edu.cn/apache/httpd/
安装注意事项
- 源代码保存位置:
/usr/local/src - 软件安装位置:
/usr/local/ - 如何确定安装过程报错:
- 安装过程停止
- 并出现error、warning或no的提示
源码包安装过程
- 下载源码包
- 解压缩下载的源码包
- 进入解压缩目录
./configure 软件配置与检查
- 定义需要的功能选项
- 检测系统环境是否符合安装要求
- 把定义好的功能选项和检测系统环境的信息都写入Makefile文件,用于后续的编辑
查看帮助:
./configure --help指定安装路径:
./configure --prefix=/usr/local/apache2编译安装步骤
./configure --prefix=/usr/local/apache2
# 指定安装路径
make
# 编译
make install
# 编译安装
make clean
# 若编译出错需要清空编译缓存源码包卸载
rm -rf /usr/local/apache2
# 源码包安装的软件卸载直接使用删除目录命令即可💡 虽然rpm包安装的apache和源码包安装的apache可以同时存在,但是在启用的时候都会占用80端口,所以只能启动其中的一个。
脚本安装包
脚本安装包
- 脚本安装包并不是独立的软件包类型,常见安装的是源码包
- 是人为把安装过程写成了自动安装的脚本,只要执行脚本,定义简单的参数,就可以完成安装
- 非常类似于Windows下软件的安装方式
Webmin的作用
Webmin 是一个基于Web的Linux系统管理界面,可以通过图形化的方式设置用户帐号、Apache、DNS、文件共享等服务。
Webmin安装过程
-
下载软件
-
解压缩,并进入加压缩目录
-
执行安装脚本
./setup.sh
# 执行安装脚本(一般是setup.sh文件)用户配置文件
用户信息文件 /etc/passwd
文件格式:
用户名:密码标识:UID:GID:用户说明:家目录:登录之后的Shell
| 字段 | 说明 |
|---|---|
| 用户名 | 用户登录系统时使用的用户名 |
| 密码标识 | x代表真正的密码存放在/etc/shadow中 |
| UID | 用户ID |
| GID | 用户初始组ID |
| 用户说明 | 用户的描述信息 |
| 家目录 | 用户登录后的默认目录 |
| 登录Shell | 用户登录后使用的Shell |
UID范围:
- 0:超级用户(root)
- 1-499:系统用户(伪用户)
- 500-65535:普通用户
影子文件 /etc/shadow
文件格式:
用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码到期前警告天数:密码过期后宽限天数:账号失效时间:保留
| 字段 | 说明 |
|---|---|
| 用户名 | 与/etc/passwd对应 |
| 加密密码 | SHA512加密,!!或*代表无密码不能登录 |
| 最后一次修改时间 | 从1970年1月1日算起的天数 |
| 最小修改时间间隔 | 两次修改密码的最小间隔天数 |
| 密码有效期 | 密码多少天后必须修改 |
| 密码到期前警告天数 | 到期前几天开始警告 |
| 密码过期后宽限天数 | 过期后还能用几天 |
| 账号失效时间 | 账号过期日期 |
| 保留 | 保留字段 |
时间戳换算:
date -d "1970-01-01 16066 days"
# 把时间戳换算为日期
echo $(( $(date +%s)/86400 + 1 ))
# 把日期换算为时间戳组信息文件 /etc/group
文件格式:
组名:组密码标识:GID:组中附加用户
| 字段 | 说明 |
|---|---|
| 组名 | 组的名称 |
| 组密码标识 | x代表密码存放在/etc/gshadow |
| GID | 组ID |
| 组中附加用户 | 以此组为附加组的用户列表 |
组密码文件 /etc/gshadow
文件格式:
组名:组密码:组管理员用户名:组中附加用户
用户管理相关文件
用户的家目录
- 普通用户:
/home/用户名/,所有者和所属组都是此用户,权限是700 - 超级用户:
/root/,所有者和所属组都是root用户,权限是550
普通用户更改为root权限:
vi /etc/passwd
# 编辑用户密码文件,修改第3字段用户ID(UID)为0
# 注意:是修改UID,不是GID用户模板目录
/etc/skel/
可以创建一个文本如警告信息等,之后每创建一个用户自动复制警告信息文件到该用户的家目录。
用户的邮箱
/var/spool/mail/用户名/
用户管理命令
查看用户ID
id 用户名useradd 用户添加命令
useradd [选项] 用户名| 选项 | 说明 |
|---|---|
| -u UID | 手工指定用户的UID号 |
| -d 家目录 | 手工指定用户的家目录,不推荐手工创建 |
| -c 用户说明 | 手工指定用户的说明 |
| -g 组名 | 手工指定用户的初始组 |
| -G 组名 | 指定用户的附加组,多组用,分隔 |
| -s shell | 手工指定用户的登录shell,默认是/bin/bash |
示例:
useradd user1
# 添加用户
useradd -u 666 -G root,bin -d /home/shijie -c "test user" -s /bin/bash shijie
# 创建UID为666,添加到root,bin用户组,创建/home/shijie家目录,添加说明,默认shell的shijie用户useradd执行后系统操作
当键入useradd命令后系统所做的操作:
- 在
/etc/passwd中添加用户信息 - 在
/etc/shadow中添加密码信息 - 在
/etc/group中添加用户组 - 在
/etc/gshadow中添加组密码信息 - 创建用户家目录
- 创建用户邮箱
用户默认值文件
/etc/default/useradd
vi /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
vi /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 | 加密模式 |
passwd 修改用户密码
root用户修改密码
passwd [选项] 用户名| 选项 | 说明 |
|---|---|
| -S | 查询用户密码的密码状态,仅root用户可用 |
| -l | 暂时锁定用户。仅root用户可用 |
| -u | 解锁用户。仅root用户可用 |
| —stdin | 可以通过管道符输出的数据作为用户的密码 |
示例:
passwd -S lamp
# 查看密码状态
# 输出示例:lamp PS 2013-01-06 0 99999 7 -1
# 用户名 密码设定时间 密码修改间隔时间 密码有效期 警告时间 密码不失效
passwd -l user1
# 锁定用户user1
# 系统实际上在shadow文件中的user1账户后加 !!(双感叹)
passwd -u user1
# 解锁用户
echo "123" | passwd --stdin lamp
# 使用字符串作为用户的密码💡 可以直接编辑/etc/shadow文件,在需要锁定的用户后加!!(双感叹),解除锁定直接删除!!即可
普通用户修改自己的密码
passwd
# 在当前用户直接输入passwd即可usermod 修改用户信息
usermod [选项] 用户名| 选项 | 说明 |
|---|---|
| -u UID | 修改用户的UID号 |
| -c 用户说明 | 修改用户的说明信息 |
| -G 组名 | 修改用户的附加组 |
| -L | 临时锁定用户(Lock) |
| -U | 解锁用户锁定(Unlock) |
示例:
usermod -c "test user" lamp
# 修改用户的说明
usermod -G root lamp
# 把lamp用户加入root组
usermod -L lamp
# 锁定用户
usermod -U lamp
# 解锁用户chage 修改用户密码状态
chage [选项] 用户名| 选项 | 说明 |
|---|---|
| -l | 列出用户的详细密码状态 |
| -d 日期 | 修改密码最后一次更改日期(shadow3字段) |
| -m 天数 | 两次密码修改间隔(4字段) |
| -M 天数 | 密码有效期(5字段) |
| -W 天数 | 密码过期前警告天数(6字段) |
| -I 天数 | 密码过后宽限天数(7字段) |
| -E 日期 | 账号失效时间(8字段) |
示例:
chage -d 0 lamp
# 把密码修改日期归0了(shadow第3字段)
# 这样用户一登陆就要修改密码userdel 删除用户
userdel [-r] 用户名| 选项 | 说明 |
|---|---|
| -r | 删除用户的同时删除用户家目录 |
手工删除用户:
vi /etc/passwd
vi /etc/shadow
vi /etc/group
vi /etc/gshadow
rm -rf /var/spool/mail/lamp
rm -rf /home/lamp/su 用户切换命令
su [选项] 用户名| 选项 | 说明 |
|---|---|
| - | 选项只使用”-“代表连带用户的环境变量一起切换 |
| -c | 仅执行一次命令,而不切换用户身份 |
示例:
su - root
# 普通用户若要完全切换到root,选项的 - 一定不能省
# 否则环境变量等不会改变
# root切换到普通用户则不需要
env
# 查看账户环境变量
su - root -c "useradd user3"
# 不切换成root,但是执行useradd命令添加user3用户用户组管理命令
groupadd 添加用户组
groupadd [选项] 组名| 选项 | 说明 |
|---|---|
| -g GID | 指定组ID |
示例:
groupadd tg
# 创建tg组groupmod 修改用户组
groupmod [选项] 组名| 选项 | 说明 |
|---|---|
| -g GID | 修改组ID |
| -n 新组名 | 修改组名 |
示例:
groupmod -n newtg tg
# 把tg组名改为newtggroupdel 删除用户组
groupdel 组名⚠️ 注意:要删除的组不能是初始组,只能是附加组
gpasswd 把用户添加入组或从组中删除
gpasswd [选项] 组名| 选项 | 说明 |
|---|---|
| -a 用户名 | 把用户加入组 |
| -d 用户名 | 把用户从组中删除 |
示例:
gpasswd -a user tg
# 把user用户加入tg组
gpasswd -d user tg
# 把user用户从tg组中删除ACL权限
ACL权限简介
ACL是Access Control List的缩写,用于解决用户身份不足的问题。传统的ugo权限模型只有所有者、所属组、其他人三种身份,ACL可以给单个用户分配权限。
查看分区ACL权限是否开启
dumpe2fs -h /dev/sda3
# 查询指定分区详细文件系统信息的命令| 选项 | 说明 |
|---|---|
| -h | 仅显示超级块中信息,而不显示磁盘块组的详细信息 |
临时开启分区ACL权限
mount -o remount,acl /
# 重新挂载根分区,并挂载加入acl权限永久开启分区ACL权限
vi /etc/fstab修改fstab文件,在defaults后面加上acl:
UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 / ext4 defaults,acl 1 1
然后重新挂载:
mount -o remount /查看ACL权限
getfacl 文件名
# 查看acl权限设置ACL权限
setfacl [选项] 文件名| 选项 | 说明 |
|---|---|
| -m | 设定ACL权限 |
| -x | 删除指定的ACL权限 |
| -b | 删除所有的ACL权限 |
| -d | 设定默认ACL权限 |
| -k | 删除默认ACL权限 |
| -R | 递归设定ACL权限 |
给用户设定ACL权限:
setfacl -m u:用户名:权限 文件名
# 例如:setfacl -m u:lisi:rx /project给用户组设定ACL权限:
setfacl -m g:组名:权限 文件名
# 例如:setfacl -m g:test:rwx /project最大有效权限mask
mask是用来指定最大有效权限的。如果我给用户赋予了ACL权限,是需要和mask的权限”相与”才能得到用户的真正权限。
修改最大有效权限:
setfacl -m m:rx 文件名
# 设定mask权限为r-x删除ACL权限
setfacl -x u:用户名 文件名
# 删除指定用户的ACL权限
setfacl -x g:组名 文件名
# 删除指定用户组的ACL权限
setfacl -b 文件名
# 会删除文件的所有的ACL权限递归ACL权限
递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限。
setfacl -m u:用户名:权限 -R 文件名默认ACL权限
默认ACL权限的作用是如果给父目录设定了默认ACL权限,那么父目录中所有新建的子文件都会继承父目录的ACL权限。
setfacl -m d:u:用户名:权限 文件名文件特殊权限
SetUID
SetUID的功能
- 只有可以执行的二进制程序才能设定SUID权限
- 命令执行者要对该程序拥有x(执行)权限
- 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
- SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
示例:
- passwd命令拥有SetUID权限,所以普通用户可以修改自己的密码
ll /usr/bin/passwd
# -rwsr-xr-x. 1 root root 25980 2月 22 2012 /usr/bin/passwd- cat命令没有SetUID权限,所以普通用户不能查看/etc/shadow文件内容
ll /bin/cat
# -rwxr-xr-x 1 root root 47976 6月 22 2012 /bin/cat设定SetUID的方法
chmod 4755 文件名
# 4代表SUID
# 2代表SGID
# 1代表SBIT
chmod u+s 文件名
# u所有者权限+s(SUID)取消SetUID的方法
chmod 755 文件名
chmod u-s 文件名危险的SetUID
- 关键目录应严格控制写权限。比如”/”、“/usr”等
- 用户的密码设置要严格遵守密码三原则
- 对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限
SetGID
SetGID针对文件的作用
- 只有可执行的二进制程序才能设置SGID权限
- 命令执行者要对该程序拥有x(执行)权限
- 命令执行在执行程序的时候,组身份升级为该程序文件的属组
- SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
示例:locate命令
ll /usr/bin/locate
# -rwx--s--x 1 root slocate 35612 8月 24 2010 /usr/bin/locate
ll /var/lib/mlocate/mlocate.db
# -rw-r----- 1 root slocate 1838850 1月 20 04:29 /var/lib/mlocate/mlocate.db- /usr/bin/locate是可执行二进制程序,可以赋予SGID权限
- 执行用户lamp对/usr/bin/locate命令拥有执行权限
- 执行/usr/bin/locate命令时,组身份会升级为slocate组
- 命令结束,lamp用户的组身份返回为lamp组
SetGID针对目录的作用
- 普通用户必须对此目录拥有r和x权限,才能进入此目录
- 普通用户在此目录中的有效组会变成此目录的属组
- 若普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组
设定SetGID
chmod 2755 文件名
# 2代表SGID
chmod g+s 文件名
# g所属组权限+s(SGID)示例:
cd /tmp/
mkdir dtest
chmod g+s dtest
ll -d dtest/
chmod 777 dtest/
su - lamp
cd /tmp/dtest/
touch abc
ll取消SetGID
chmod 755 文件名
chmod g-s 文件名Sticky BIT
SBIT粘着位作用
- 粘着位目前只对目录有效
- 普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限
- 如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件
- 一旦赋予了粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件
最常见的粘着位目录为/tmp
ll -d /tmp/
# drwxrwxrwt. 3 root root 4096 12月 13 11:22 /tmp/other权限中的 t 就代表粘着位,只有root用户能够赋予粘着位权限
设置与取消粘着位
设置粘着位:
chmod 1755 目录名
chmod o+t 目录名取消粘着位:
chmod 777 目录名
chmod o-t 目录名文件系统属性chattr权限
chattr命令格式
chattr [+-=] [选项] 文件或目录名| 选项 | 说明 |
|---|---|
| + | 增加权限 |
| - | 删除权限 |
| = | 等于某权限 |
| 选项 | 功能 |
|---|---|
| i | 如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i属性,那么只能修改目录下文件的数据,但不允许建立和删除文件 |
| a | 如果对文件设置a属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置a属性,那么只允许在目录中建立和修改文件,但是不允许删除 |
| e | Linux中绝大多数的文件都默认拥有e属性。表示该文件是使用ext文件系统进行存储的,而且不能使用chattr -e命令取消e属性 |
查看文件系统属性
lsattr [选项] 文件名| 选项 | 说明 |
|---|---|
| -a | 显示所有文件和目录 |
| -d | 若目标是目录,仅列出目录本身的属性,而不是子文件的 |
系统命令sudo权限
sudo权限
- root把本来只能超级用户执行的命令赋予普通用户执行
- sudo的操作对象是系统命令
sudo使用
visudo
# 实际修改的是/etc/sudoers文件配置格式:
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
| 字段 | 说明 |
|---|---|
| 用户名/%组名 | 被授权的用户或组 |
| 被管理主机的地址 | 可使用的身份 |
| 授权命令(绝对路径) | 授权的命令 |
示例:授权sc用户可以重启服务器
visudo
# 添加:
jie ALL= /sbin/shutdown -r now💡 权限可以接具体的参数,这样给到用户的权限更具体,参数越详细权限越小
普通用户执行sudo赋予的命令
su - sc
sudo -l
# 查看可用的sudo命令
sudo /sbin/shutdown -r now
# 普通用户执行sudo赋予的命令⚠️ 注意!!!不要给普通用户赋予vim等类命令的sudo权限,不然就拥有了root的权限
文件系统常用命令
df 文件系统查看命令
df [选项] [挂载点]| 选项 | 说明 |
|---|---|
| -a | 显示所有的文件系统信息,包括特殊文件系统,如/proc、/sysfs |
| -h | 使用习惯单位显示容量,如KB,MB或GB等 |
| -T | 显示文件系统类型 |
| -m | 以MB为单位显示容量 |
| -k | 以KB为单位显示容量。默认就是以KB为单位 |
du 统计目录或文件大小命令
du [选项] [目录或文件名]| 选项 | 说明 |
|---|---|
| -a | 显示每个子文件的磁盘占用量。默认只统计子目录的磁盘占用量 |
| -h | 使用习惯单位显示磁盘占用量,如KB,MB或GB等 |
| -s | 统计总占用量,而不列出子目录和子文件的占用量 |
du命令和df命令的区别
- df命令是从文件系统考虑的,不光要考虑文件占用的空间,还要统计被命令或程序占用的空间(最常见的就是文件已经删除,但是程序并没有释放空间)
- du命令是面向文件的,只会计算文件或目录占用的空间
文件系统修复命令fsck
fsck [选项] 分区设备文件名| 选项 | 说明 |
|---|---|
| -a | 不用显示用户提示,自动修复文件系统 |
| -y | 自动修复。和-a作用一致,不过有些文件系统只支持-y |
⚠️ 一般没问题不需要执行,有可能适得其反
显示磁盘状态命令dumpe2fs
dumpe2fs 分区设备文件名挂载命令
查询与自动挂载
mount [-l]
# 查询系统中已经挂载的设备,-l会显示卷标名称
mount -a
# 依据配置文件/etc/fstab的内容,自动挂载挂载命令格式
mount [-t 文件系统] [-L 卷标名] [-o 特殊选项] 设备文件名 挂载点| 选项 | 说明 |
|---|---|
| -t 文件系统 | 加入文件系统类型来指定挂载的类型,可以ext3、ext4、iso9660等文件系统 |
| -L 卷标名 | 挂载指定卷标的分区,而不是安装设备文件名挂载 |
| -o 特殊选项 | 可以指定挂载的额外选项 |
特殊选项说明:
| 参数 | 说明 |
|---|---|
| atime/noatime | 更新访问时间/不更新访问时间 |
| async/sync | 异步/同步,默认为异步 |
| auto/noauto | 自动/手动,mount -a命令执行时是否自动挂载 |
| defaults | 定义默认值,相当于rw,suid,dev,exec,auto,nouser,async这七个选项 |
| exec/noexec | 执行/不执行,设定是否允许在文件系统中执行可执行文件 |
| remount | 重新挂载已经挂载的文件系统,一般用于指定修改特殊权限 |
| rw/ro | 读写/只读,文件系统挂载时是否具有读写权限 |
| suid/nosuid | 具有/不具有SUID权限 |
| user/nouser | 允许/不允许普通用户挂载 |
| usrquota | 写入代表文件系统支持用户磁盘配额,默认不支持 |
| grpquota | 写入代表文件系统支持组磁盘配额,默认不支持 |
示例:
mount -o remount,noexec /home
# 重新挂载/home分区,并使用noexec权限
cd /home
vi hello.sh
chmod 755 hello.sh
./hello.sh
mount -o remount,exec /home
# 记得改回来,要不会影响系统启动的挂载光盘与U盘
挂载光盘
mkdir /mnt/cdrom
# 建立挂载点
mount -t iso9660 /dev/cdrom /mnt/cdrom
# 挂载光盘
# 或者
mount /dev/sr0 /mnt/cdrom挂载U盘
fdisk -l
# 查看U盘设备文件名
mount -t vfat /dev/sdb1 /mnt/usb/
# 挂载U盘
# 注意:Linux默认是不支持NTFS文件系统的以挂载NTFS文件格式的移动硬盘为例
下载NTFS-3G插件:
安装NTFS-3G:
tar -zxvf ntfs-3g_ntfsprogs-2013.1.13.tgz
# 解压
cd ntfs-3g_ntfsprogs-2013.1.13
# 进入解压目录
./configure
# 编译器准备,没有指定安装目录,安装到默认位置中
make
# 编译
make install
# 编译安装使用:
mount -t ntfs-3g 分区设备文件名 挂载点fdisk分区
查看新硬盘
fdisk -l
# 查看系统中可被识别的硬盘,U盘,光盘等使用fdisk命令分区
fdisk /dev/sdbfdisk交互指令说明
| 命令 | 说明 |
|---|---|
| a | 设置可引导标记 |
| b | 编辑bsd磁盘标签设置DOS操作系统兼容标记 |
| d | 删除一个分区 |
| l | 显示已知的文件系统类型。82为Linux swap分区,83为Linux分区 |
| m | 显示帮助菜单 |
| n | 新建分区 |
| o | 建立空白DOS分区表 |
| p | 显示分区列表 |
| q | 不保存退出 |
| s | 新建空白SUN磁盘标签 |
| t | 改变一个分区的系统ID |
| u | 改变显示记录单位 |
| v | 验证分区表 |
| w | 保存退出 |
| x | 附加功能(仅专家) |
重新读取分区表信息
partprobe
# 当遇到分区表正在使用,比如分了一次后需要再分区时,提示重启的时候建议使用此命令
# 若重复提示错误,则需要重启了格式化分区
mkfs -t ext4 /dev/sdb1建立挂载点并挂载
mkdir /disk1
mount /dev/sdb1 /disk1//etc/fstab文件修复
/etc/fstab文件内容
| 字段 | 说明 |
|---|---|
| 第一列 | 分区设备文件名或UUID(硬盘通用唯一识别码) |
| 第二列 | 挂载点 |
| 第三列 | 文件系统名称 |
| 第四列 | 挂载参数 |
| 第五列 | 指定分区是否被dump备份,0代表不备份,1代表每天备份,2代表不定期备份 |
| 第六列 | 指定分区是否被fsck检测,0代表不检测,其他数字代表检测的优先级,1的优先级比2高 |
/etc/fstab文件修复
如果/etc/fstab文件写错了,系统启动会报错。这时候:
- 系统会提示输入root密码
- 输入root密码进入系统
- 但是根分区是只读的,需要重新挂载为可写:
mount -o remount,rw /- 然后修改/etc/fstab文件
- 修改完成后重启系统
分配swap分区
free命令
free
# 查看内存与swap分区使用状况| 选项 | 说明 |
|---|---|
| cached(缓存) | 指把读取过来的数据保存到内存中,再次读取时不读取硬盘,提高效率 |
| buffer(缓冲) | 指把要写入的数据先集中保存到内存中,达到一定程度再写入硬盘,减少重复写入 |
新建swap分区
- 先使用fdisk命令新建分区,把分区的ID改为82(Linux swap分区ID)
- 格式化swap分区
mkswap /dev/sdb6
# 格式化swap分区- 加入swap分区
swapon /dev/sdb6
# 加入swap分区- 查看swap分区
free -m
# 查看内存和swap使用情况swap分区开机自动挂载
修改/etc/fstab文件:
/dev/sdb6 swap swap defaults 0 0
关闭swap分区
swapoff /dev/sdb6
# 关闭swap分区Shell概述
什么是Shell
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
Shell的分类
- Bourne Shell:主文件名为sh
- C Shell:BSD版本的Shell,语法类似C语言
Bourne家族:
- Bourne Shell(sh)
- Korn Shell(ksh)
- Bourne Again Shell(bash)
- POSIX Shell(sh)
C家族:
- C Shell(csh)
- tcsh
Linux的标准Shell是bash
Linux支持的Shell
cat /etc/shells
# 查看系统支持的Shell可以直接输入Shell名称切换:
sh
csh
zsh
# 等等Shell脚本的执行方式
echo输出命令
echo [选项] [输出内容]| 选项 | 说明 |
|---|---|
| -e | 支持反斜线控制的字符转换 |
控制字符:
| 控制字符 | 作用 |
|---|---|
| \ | 输出\本身 |
| \a | 输出警告音 |
| \b | 退格键,也就是向左删除键 |
| \c | 取消输出行末的换行符。和”-n”选项一致 |
| \e | ESCAPE键 |
| \f | 换页符 |
| \n | 换行符 |
| \r | 回车键 |
| \t | 制表符,也就是Tab键 |
| \v | 垂直制表符 |
| \0nnn | 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数 |
| \xhh | 按照十六进制ASCII码表输出字符。其中hh是两位十六进制数 |
示例:
echo -e "a\tb\tc\nd\te\tf"
# 输出带制表符和换行的内容
echo -e "\e[1;31m 红色文字 \e[0m"
# 输出带颜色的文字
# 30m=黑色 31m=红色 32m=绿色 33m=黄色
# 34m=蓝色 35m=洋红 36m=青色 37m=白色第一个脚本
#!/bin/bash
# 第一个脚本
echo -e "\e[1;34m 天上掉下个林妹妹 \e[0m"脚本执行
方式一:赋予执行权限,直接运行
chmod 755 hello.sh
./hello.sh方式二:通过Bash调用执行脚本
bash hello.shBash的基本功能
历史命令
history [选项] [历史命令保存文件]| 选项 | 说明 |
|---|---|
| -c | 清空历史命令 |
| -w | 把缓存中的历史命令写入历史命令保存文件~/.bash_history |
历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改
实际历史命令保存的位置为: /root/.bash_history
历史命令的调用
- 使用上、下箭头调用以前的历史命令
- 使用
!n重复执行第n条历史命令 - 使用
!!重复执行上一条命令 - 使用
!字串重复执行最后一条以该字串开头的命令
命令与文件补全
在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按”Tab”键就会自动进行补全。
命令别名
alias 别名='原命令'
# 设定命令别名
alias
# 查询命令别名命令执行时顺序
- 第一顺位执行用绝对路径或相对路径执行的命令
- 第二顺位执行别名
- 第三顺位执行Bash的内部命令
- 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
让别名永久生效
vi /root/.bashrc删除别名
unalias 别名Bash常用快捷键
| 快捷键 | 作用 |
|---|---|
| ctrl+A | 把光标移动到命令行开头 |
| ctrl+E | 把光标移动到命令行结尾 |
| ctrl+C | 强制终止当前的命令 |
| ctrl+L | 清屏,相当于clear命令 |
| ctrl+U | 删除或剪切光标之前的命令 |
| ctrl+K | 删除或剪切光标之后的内容 |
| ctrl+Y | 粘贴ctrl+U或ctrl+K剪切的内容 |
| ctrl+R | 在历史命令中搜索 |
| ctrl+D | 退出当前终端 |
| ctrl+Z | 暂停,并放入后台 |
| ctrl+S | 暂停屏幕输出 |
| ctrl+Q | 恢复屏幕输出 |
标准输入输出
| 设备 | 设备文件名 | 文件描述符 | 类型 |
|---|---|---|---|
| 键盘 | /dev/stdin | 0 | 标准输入 |
| 显示器 | /dev/stdout | 1 | 标准输出 |
| 显示器 | /dev/stderr | 2 | 标准错误输出 |
输出重定向
| 类型 | 符号(格式) | 作用 |
|---|---|---|
| 标准输出重定向 | 命令 > 文件 | 以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中 |
| 命令 >> 文件 | 以追加的方式,把命令的正确输出输出到指定的文件或设备当中 | |
| 标准错误输出重定向 | 错误命令 2> 文件 | 以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中 |
| 错误命令 2>> 文件 | 以追加的方式,把命令的错误输出输出到指定的文件或设备当中 | |
| 正确输出和错误输出同时保存 | 命令 > 文件 2>&1 | 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中 |
| 命令 >> 文件 2>&1 | 以追加的方式,把正确输出和错误输出都保存到同一个文件当中 | |
| 命令 &> 文件 | 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中 | |
| 命令 &>> 文件 | 以追加的方式,把正确输出和错误输出都保存到同一个文件当中 | |
| 命令 >> 文件1 2>> 文件2 | 把正确的输出追加到文件1中,把错误的输出追加到文件2中 |
ls &>/etc/null
# 把输出结果指向null,相当于垃圾箱,不存在的黑洞输入重定向
wc [选项] [文件名]| 选项 | 说明 |
|---|---|
| -c | 统计字节数 |
| -w | 统计单词数 |
| -l | 统计行数 |
wc << hello
# 在输入的内容中遇到hello时才会结束并统计结果多命令顺序执行
| 多命令执行符 | 格式 | 作用 |
|---|---|---|
| ; | 命令1;命令2 | 多个命令顺序执行,命令之间没有任何逻辑联系 |
| && | 命令1&&命令2 | 逻辑与:当命令1正确执行,则命令2才会执行;当命令1执行不正确,则命令2不会执行 |
| || | 命令1||命令2 | 逻辑或:当命令1执行不正确,则命令2才会执行;当命令1正确执行,则命令2不会执行 |
示例:
ls ; date ; cd /user ; pwd
dd if=输入文件 of=输出文件 bs=字节数 count=个数| 选项 | 说明 |
|---|---|
| if=输入文件 | 指定源文件或源设备 |
| of=输出文件 | 指定目标文件或目标设备 |
| bs=字节数 | 指定一次输入/输出多少字节,即把这些字节看做一个数据块 |
| count=个数 | 指定输入/输出多少个数据块 |
date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date
# 拷贝指定大小的文件,用两个日期时间来判断所用的时间
ls anaconda-ks.cfg && echo yes
# 当ls命令正确执行后输出yes,错误则不输出
ls /root/test || echo "no"
# 当ls命令错误执行后输出no,正确执行则不输出
命令 && echo yes || echo no
# 当命令正确执行后输出yes,当echo yes没有正确执行则输出no管道符
命令格式:
命令1 | 命令2- 命令1的正确输出作为命令2的操作对象
示例:
ll -a /etc/ | more
# 用 ll (ls -l) 以分页模式显示/etc/下所有的文件
netstat -an | grep "ESTABLISHED"
# 显示网络状态中包含"ESTABLISHED"的字段grep命令:
grep [选项] "搜索内容" 文件名| 选项 | 说明 |
|---|---|
| -i | 忽略大小写 |
| -n | 输出行号 |
| -v | 反向查找 |
| —color=auto | 搜索出的关键字用颜色显示 |
通配符
| 通配符 | 作用 |
|---|---|
| ? | 匹配一个任意字符 |
| * | 匹配0个或任意多个任意字符,也就是可以匹配任何内容 |
| [] | 匹配中括号中任意一个字符。例如:[abc]代表一定匹配一个字符,或者是a,或者是b或者是c |
| [-] | 匹配中括号中任意一个字符,-代表一个范围。例如:[a-z]代表匹配一个小写字母 |
| [^] | 逻辑非,表示匹配不是中括号内的一个字符。例如:[^0-9]代表匹配一个不是数字的字符 |
示例:
cd /tmp/
rm -rf *
# 删除/tmp/下所有文件
touch abc
touch abcd
touch 012
touch 0abc
ls ?abc
# 匹配?abc,?必须匹配一个字符
# 输出:0abc
ls [0-9]*
# 匹配包含一个0-9数字开头的任何文件
# 输出:012 0abc
ls [^0-9]*
# 匹配不含数字开头的任何文件
# 输出:abc abcdBash中其他特殊符号
| 符号 | 作用 |
|---|---|
| ” | 单引号。在单引号中所有的特殊符号,如”$“和”`“(反引号)都没有特殊含义 |
| "" | 双引号。在双引号中特殊符号都没有特殊含义,但是”$”、”`“和""是例外 |
| “ | 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它 |
| $() | 和反引号作用一样,用来引用系统命令 |
| # | 在Shell脚本中,#开头的行代表注释 |
| $ | 用于调用变量的值 |
| \ | 转义符,跟在\之后的特殊符号将失去特殊含义 |
单引号与双引号
name=sc
echo '$name'
# 输出:$name
echo "$name"
# 输出:sc
echo '$(date)'
# 输出:$(date)
echo "$(date)"
# 输出:当前日期时间反引号与$()
echo `ls`
# 输出ls命令结果,相当于执行ls
echo $(date)
# 输出date命令,相当于执行date
# 推荐使用$(),因为反引号非常容易看错Bash的变量
用户自定义变量
什么是变量
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。
变量设置规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头
- 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型
- 变量用等号连接值,等号左右两侧不能有空格
- 变量的值如果有空格,需要使用单引号或双引号包括
- 在变量的值中,可以使用""转义符
- 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含”{变量名}包含
- 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令
- 环境变量名建议大写,便于区分
变量分类
- 用户自定义变量
- 环境变量:这种变量中主要保存的是和系统操作环境相关的数据
- 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
- 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的
本地变量
name="shen chao"
# 定义变量
echo $name
# 调用变量变量叠加:
aa=123
aa="$aa"456
# 或者
aa=${aa}789变量查看:
set
# 查询系统中所有变量变量删除:
unset 变量名
# 删除变量环境变量
什么是环境变量
用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效。
设置环境变量
export 变量名=变量值
# 声明环境变量
env
# 查询环境变量
unset 变量名
# 删除变量系统常见环境变量
- PATH:系统查找命令的路径
echo $PATH
# 查看PATH环境变量
PATH="$PATH":/root/sh
# 变量叠加- PS1:定义系统提示符的变量
| 代码 | 说明 |
|---|---|
| \d | 显示日期,格式为”星期 月 日” |
| \h | 显示简写主机名。如默认主机名”localhost” |
| \t | 显示24小时制时间,格式为”HH:MM:SS” |
| \T | 显示12小时制时间,格式为”HH:MM:SS” |
| \A | 显示24小时制时间,格式为”HH:MM” |
| \u | 显示当前用户名 |
| \w | 显示当前所在目录的完整名称 |
| \W | 显示当前所在目录的最后一个目录 |
| # | 执行的第几个命令 |
| $ | 提示符。如果是root用户会显示提示符为”#“,如果是普通用户会显示提示符为”$“ |
位置参数变量
| 位置参数变量 | 作用 |
|---|---|
| $n | n为数字,1-{10} |
| $* | 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体 |
| $@ | 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待 |
| $# | 这个变量代表命令行中所有参数的个数 |
示例:
#!/bin/bash
echo $0
echo $1
echo $2
echo $3预定义变量
| 预定义变量 | 作用 |
|---|---|
| $? | 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0,则证明上一个命令执行不正确了 |
| $$ | 当前进程的进程号(PID) |
| $! | 后台运行的最后一个进程的进程号(PID) |
接收键盘输入
read [选项] [变量名]| 选项 | 说明 |
|---|---|
| -p “提示信息” | 在等待read输入时,输出提示信息 |
| -t 秒数 | read命令会一直等待用户输入,使用此选项可以指定等待时间 |
| -n 字符数 | read命令只接受指定的字符数,就会执行 |
| -s | 隐藏输入的数据,适用于机密信息的输入 |
示例:
#!/bin/bash
read -t 30 -p "请输入你的姓名:" name
echo $name
read -s -t 30 -p "请输入你的年龄:" age
echo -e "\n"
echo $age
read -n 1 -t 30 -p "请输入你的性别[M/F]:" gender
echo -e "\n"
echo $genderBash的运算符
数值运算的方法
declare声明变量类型
declare [+/-][选项] 变量名| 选项 | 说明 |
|---|---|
| - | 给变量设定类型属性 |
| + | 取消变量的类型属性 |
| -a | 将变量声明为数组型 |
| -i | 将变量声明为整数型(integer) |
| -r | 将变量声明为只读变量。注意,一旦设置为只读变量,既不能修改变量的值,也不能删除变量,甚至不能通过+r取消只读属性 |
| -x | 将变量声明为环境变量 |
| -p | 显示指定变量的被声明的类型 |
示例:数值运算
aa=11
bb=22
declare -i cc=$aa+$bb
echo $ccexpr或let数值运算工具
aa=11
bb=22
cc=$(expr $aa + $bb)
# cc的值是aa和bb的和
# 注意:"+"号左右两侧必须有空格”[运算式]“
aa=11
bb=22
cc=$(( $aa + $bb ))
# 或者
dd=$[ $aa + $bb ]运算符
| 优先级 | 运算符 | 说明 |
|---|---|---|
| 13 | -, + | 单目负、单目正 |
| 12 | !, ~ | 逻辑非、按位取反或补码 |
| 11 | *, /, % | 乘、除、取模 |
| 10 | +, - | 加、减 |
| 9 | <<, >> | 按位左移、按位右移 |
| 8 | ⇐, >=, <, > | 小于或等于、大于或等于、小于、大于 |
| 7 | ==, != | 等于、不等于 |
| 6 | & | 按位与 |
| 5 | ^ | 按位异或 |
| 4 | | | 按位或 |
| 3 | && | 逻辑与 |
| 2 | || | 逻辑或 |
| 1 | =, +=, -=, *=, /=, %=, &=, ^=, |=, <⇐, >>= | 赋值、运算且赋值 |
示例:
#!/bin/bash
echo $(( (11+22)*3/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 |
环境变量配置文件
环境变量配置文件简介
环境变量配置文件的功能
系统中有些环境变量如PATH、HISTSIZE、PS1、HOSTNAME等,这些变量是系统启动时就自动加载的,因为它们写入了环境变量配置文件中。
配置文件的生效顺序
环境变量配置文件有好几个,它们有一个生效顺序,我们先看一下这些配置文件的作用。
环境变量配置文件
/etc/profile
系统级别的环境变量配置文件,对所有用户都生效。
主要修改的变量:
- USER
- LOGNAME
- PATH
- HOSTNAME
- HISTSIZE
- umask
/etc/bashrc
系统级别的bash配置文件,对所有用户都生效。
主要修改的变量:
- PS1
- umask
- PATH
~/.bash_profile
用户级别的环境变量配置文件,只对当前用户生效。
~/.bashrc
用户级别的bash配置文件,只对当前用户生效。
~/.bash_logout
用户注销时执行的配置文件。
~/.bash_history
历史命令保存文件。
配置文件加载顺序
登录Shell时的加载顺序:
/etc/profile~/.bash_profile~/.bashrc/etc/bashrc
注意:
/.bash_profile会调用/.bashrc,而~/.bashrc会调用/etc/bashrc
其他配置文件和登录信息
注销时生效的环境变量配置文件
~/.bash_logout
历史命令
~/.bash_history
Shell登录信息
本地终端欢迎信息:/etc/issue
| 转义符 | 作用 |
|---|---|
| \d | 显示当前系统日期 |
| \s | 显示操作系统名称 |
| \l | 显示登录的终端号,这个比较常用 |
| \m | 显示硬件体系结构,如i386、i686等 |
| \n | 显示主机名 |
| \o | 显示域名 |
| \r | 显示内核版本 |
| \t | 显示当前系统时间 |
| \u | 显示当前登录用户的序列号 |
远程终端欢迎信息:/etc/issue.net
- 转义符在/etc/issue.net文件中不能使用
- 是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入”Banner /etc/issue.net”行才能显示(记得重启SSH服务)
登录后欢迎信息:/etc/motd
不管是本地登录,还是远程登录,都可以显示此欢迎信息。
基础正则表达式
正则表达式与通配符
- 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配
- 通配符用来匹配符合条件的文件名,通配符是完全匹配
注意:
ls、find、cp这些命令不能用正则,只能用通配符
基础正则表达式
| 元字符 | 作用 |
|---|---|
| * | 前一个字符匹配0次或任意多次 |
| . | 匹配除了换行符外任意一个字符 |
| ^ | 匹配行首。例如:^hello会匹配以hello开头的行 |
| $ | 匹配行尾。例如:hello$会匹配以hello结尾的行 |
| [] | 匹配中括号中指定的任意一个字符,只匹配一个字符。例如:[aoeiu] 匹配任意一个元音字母,[0-9] 匹配任意一位数字,[a-z][0-9]匹配小写字和一位数字构成的两位字符 |
| [^] | 匹配除中括号的字符以外的任意一个字符。例如:[^0-9] 匹配任意一位非数字字符,[^a-z] 匹配任意一位非小写字母 |
| \ | 转义符。用于取消特殊符号的含义 |
| \{n\} | 表示其前面的字符恰好出现n次。例如:[0-9]\{4\} 匹配4位数字 |
| \{n,\} | 表示其前面的字符出现不小于n次。例如:[a-z]\{5,\} 匹配5位及以上的小写字母 |
| \{n,m\} | 表示其前面的字符至少出现n次,最多出现m次。例如:[a-z]\{5,8\} 匹配5到8位的小写字母 |
示例:
grep "a*" test.txt
# 匹配所有内容,包括空白行
grep "aa*" test.txt
# 匹配至少包含有一个a的行
grep "aaa*" test.txt
# 匹配至少包含有两个a连续的行
grep "s..d" test.txt
# 匹配s和d之间有两个任意字符的行
grep "^M" test.txt
# 匹配以M开头的行
grep "n$" test.txt
# 匹配以n结尾的行
grep "^$" test.txt
# 匹配空白行
grep "s[ao]id" test.txt
# 匹配s和id中间是a或o的行
grep "[0-9]" test.txt
# 匹配包含数字的行
grep "^[^a-z]" test.txt
# 匹配不以小写字母开头的行
grep "\.$" test.txt
# 匹配以.结尾的行
grep "a\{3\}" test.txt
# 匹配包含连续3个a的行
grep "[0-9]\{3,\}" test.txt
# 匹配包含3个及以上连续数字的行字符截取命令
cut字段提取命令
cut [选项] 文件名| 选项 | 说明 |
|---|---|
| -f 列号 | 提取第几列 |
| -d 分隔符 | 按照指定分隔符分割列 |
示例:
cut -f 2 test.txt
# 提取第二列
cut -d ":" -f 1,3 /etc/passwd
# 以冒号为分隔符,提取第1和第3列cut命令的局限:如果分隔符是空格,而且空格数量不固定,cut就不好用了
printf命令
printf '输出类型输出格式' 输出内容输出类型:
| 类型 | 说明 |
|---|---|
| %ns | 输出字符串。n是数字指代输出几个字符 |
| %ni | 输出整数。n是数字指代输出几个数字 |
| %m.nf | 输出浮点数。m和n是数字,指代输出的整数位数和小数位数 |
输出格式:
| 格式 | 说明 |
|---|---|
| \a | 输出警告声音 |
| \b | 输出退格键,也就是Backspace键 |
| \f | 清除屏幕 |
| \n | 换行 |
| \r | 回车,也就是Enter键 |
| \t | 水平输出退格键,也就是Tab键 |
| \v | 垂直输出退格键,也就是Tab键 |
示例:
printf '%s\t%s\t%s\n' 1 2 3 4 5 6awk命令
awk的使用
awk '条件1{动作1} 条件2{动作2}...' 文件名条件(Pattern):
- 一般使用关系表达式作为条件
- x > 10 判断变量x是否大于10
- x >= 10 大于等于
- x ⇐ 10 小于等于
动作(Action):
- 格式化输出
- 流程控制语句
示例:
awk '{printf $2 "\t" $4 "\n"}' test.txt
# 输出第2列和第4列
df -h | awk '{print $1 "\t" $5}'
# 查看磁盘使用情况,输出第1列和第5列BEGIN
awk 'BEGIN{printf "This is a transcript\n"} {printf $2 "\t" $4 "\n"}' test.txt
# 在所有内容输出之前,先输出一句话END
awk 'END{printf "The End\n"} {printf $2 "\t" $4 "\n"}' test.txt
# 在所有内容输出之后,输出一句话FS内置变量
cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"} {printf $1 "\t" $3 "\n"}'
# FS指定分隔符,BEGIN是因为awk会先读第一行再执行关系运算符
cat test.txt | grep -v Name | awk '$4 >= 87 {printf $2 "\n"}'
# 第四列大于等于87的行,输出第二列sed命令
sed是一种几乎包括在所有UNIX平台(包括Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。
sed [选项] '[动作]' 文件名| 选项 | 说明 |
|---|---|
| -n | 一般sed命令会把所有数据都输出到屏幕,如果加入此选择则只会把经过sed命令处理的行输出到屏幕 |
| -e | 允许对输入数据应用多条sed命令编辑 |
| -i | 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出 |
| 动作 | 说明 |
|---|---|
| a \ | 追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用""代表数据未完结 |
| c \ | 行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用""代表数据未完结 |
| i \ | 插入,在当期行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用""代表数据未完结 |
| d | 删除,删除指定的行 |
| p | 打印,输出指定的行 |
| s | 字串替换,用一个字符串替换另外一个字符串。格式为”行范围s/旧字串/新字串/g” |
示例:
sed -n '2p' test.txt
# 查看文件的第二行
sed '2,4d' test.txt
# 删除第二行到第四行,但不修改文件本身
sed '2a hello' test.txt
# 在第二行后追加hello
sed '2i hello \
world' test.txt
# 在第二行前插入两行数据
sed '4c No such person' test.txt
# 替换第四行整行数据
sed '4s/75/99/g' test.txt
# 替换第四行中的75为99
sed -i '4s/75/99/g' test.txt
# -i会直接修改文件字符处理命令
排序命令sort
sort [选项] 文件名| 选项 | 说明 |
|---|---|
| -f | 忽略大小写 |
| -n | 以数值型进行排序,默认使用字符串型排序 |
| -r | 反向排序 |
| -t | 指定分隔符,默认是分隔符是制表符 |
| -k n[,m] | 按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾) |
示例:
sort /etc/passwd
# 排序用户信息文件
sort -r /etc/passwd
# 反向排序
sort -t ":" -k 3,3 /etc/passwd
# 指定分隔符是冒号,用第三字段排序(按字符串排序)
sort -n -t ":" -k 3,3 /etc/passwd
# 按数值排序统计命令wc
wc [选项] 文件名| 选项 | 说明 |
|---|---|
| -l | 只统计行数 |
| -w | 只统计单词数 |
| -m | 只统计字符数 |
示例:
wc /etc/passwd
# 统计行数、单词数、字符数
wc -l /etc/passwd
# 只统计行数条件判断
按照文件类型进行判断
| 测试选项 | 作用 |
|---|---|
| -b 文件 | 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真) |
| -c 文件 | 判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真) |
| -d 文件 | 判断该文件是否存在,并且是否为目录文件(是目录为真) |
| -e 文件 | 判断该文件是否存在(存在为真) |
| -f 文件 | 判断该文件是否存在,并且是否为普通文件(是普通文件为真) |
| -L 文件 | 判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真) |
| -p 文件 | 判断该文件是否存在,并且是否为管道文件(是管道文件为真) |
| -s 文件 | 判断该文件是否存在,并且是否为非空(非空为真) |
| -S 文件 | 判断该文件是否存在,并且是否为套接字文件(是套接字文件为真) |
两种判断格式:
test -e /root/install.log
# 或者
[ -e /root/install.log ]
# 注意:中括号内部两边必须有空格判断是否为真:
[ -d /root ] && echo "yes" || echo "no"
# 判断/root是否为目录按照文件权限进行判断
| 测试选项 | 作用 |
|---|---|
| -r 文件 | 判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真) |
| -w 文件 | 判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真) |
| -x 文件 | 判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真) |
| -u 文件 | 判断该文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真) |
| -g 文件 | 判断该文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真) |
| -k 文件 | 判断该文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真) |
两个文件之间进行比较
| 测试选项 | 作用 |
|---|---|
| 文件1 -nt 文件2 | 判断文件1的修改时间是否比文件2的新(如果新则为真) |
| 文件1 -ot 文件2 | 判断文件1的修改时间是否比文件2的旧(如果旧则为真) |
| 文件1 -ef 文件2 | 判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法 |
两个整数之间比较
| 测试选项 | 作用 |
|---|---|
| 整数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(小于等于为真) |
字符串的判断
| 测试选项 | 作用 |
|---|---|
| -z 字符串 | 判断字符串是否为空(为空返回真) |
| -n 字符串 | 判断字符串是否为非空(非空返回真) |
| 字串1 == 字串2 | 判断字符串1是否和字符串2相等(相等返回真) |
| 字串1 != 字串2 | 判断字符串1是否和字符串2不相等(不相等返回真) |
多重条件判断
| 测试选项 | 作用 |
|---|---|
| 判断1 -a 判断2 | 逻辑与,判断1和判断2都成立,最终的结果才为真 |
| 判断1 -o 判断2 | 逻辑或,判断1和判断2有一个成立,最终的结果就为真 |
| !判断 | 逻辑非,使原始的判断式取反 |
流程控制
if语句
单分支if条件语句
if [ 条件判断式 ]; then
程序
fi或者
if [ 条件判断式 ]
then
程序
fi示例:
#!/bin/bash
rate=$(df -h | grep /dev/sda3 | awk '{print $5}' | cut -d "%" -f 1)
if [ $rate -ge 80 ]
then
echo "Warning! /dev/sda3 is full!"
fi双分支if条件语句
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi示例:
#!/bin/bash
# 判断apache是否启动
port=$(nmap -sT 192.168.1.156 | grep tcp | grep http | awk '{print $2}')
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多分支if条件语句
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
...省略更多分支...
else
当所有条件都不成立时,最后执行此程序
fi示例:
#!/bin/bash
# 判断用户输入的是什么文件
read -p "Please input a filename: " file
if [ -z "$file" ]
then
echo "Error, please input a filename"
exit 1
elif [ ! -e "$file" ]
then
echo "Your input is not a file!"
exit 2
elif [ -f "$file" ]
then
echo "$file is a regular file!"
elif [ -d "$file" ]
then
echo "$file is a directory!"
else
echo "$file is an other file!"
ficase语句
case语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
...省略其他分支...
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac示例:
#!/bin/bash
read -p "Please choose yes/no: " -t 30 cho
case $cho in
"yes")
echo "Your choose is yes!"
;;
"no")
echo "Your choose is no!"
;;
*)
echo "Your choose is error!"
;;
esacfor循环
语法一
for 变量 in 值1 值2 值3...
do
程序
done示例:
#!/bin/bash
# 打印时间
for time in morning noon afternoon evening
do
echo "This time is $time!"
done语法二
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done示例:
#!/bin/bash
# 从1加到100
s=0
for (( i=1;i<=100;i=i+1 ))
do
s=$(( $s+$i ))
done
echo "The sum of 1+2+...+100 is : $s"while循环
while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。
while [ 条件判断式 ]
do
程序
done示例:
#!/bin/bash
# 从1加到100
i=1
s=0
while [ $i -le 100 ]
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "The sum is: $s"until循环
until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循环。
until [ 条件判断式 ]
do
程序
done示例:
#!/bin/bash
# 从1加到100
i=1
s=0
until [ $i -gt 100 ]
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "The sum is: $s"服务的分类
查询已安装的服务
RPM包安装的服务
chkconfig --list
# 查看服务自启动状态,可以看到所有RPM包安装的服务源码包安装的服务
查看服务安装位置,一般是/usr/local/下
RPM安装服务和源码包安装服务的区别
RPM安装服务和源码包安装服务的区别就是安装位置的不同
- 源码包安装在指定位置,一般是
/usr/local/ - RPM包安装在默认位置中
RPM包安装的服务管理
服务的启动与停止
独立服务的启动
/etc/rc.d/init.d/独立服务名 start|stop|status|restart|...
# 或者
service 独立服务名 start|stop|status|restart|...service命令实际上就是调用/etc/init.d/下的脚本
独立服务的自启动
方法一:
chkconfig [--level 运行级别] [独立服务名] [on|off]
# 设置独立服务自启动
# --level 指定运行级别示例:
chkconfig --level 2345 httpd on
# 设置httpd服务在2345级别自启动方法二:
ntsysv
# 使用ntsysv命令管理自启动
# 红帽系列专有方法三:
vi /etc/rc.d/rc.local
# 修改/etc/rc.local文件
# 在文件中加入启动命令基于xinetd服务的管理
xinetd服务的启动
vi /etc/xinetd.d/服务名
# 修改配置文件
# 把 disable = yes 改为 disable = no然后重启xinetd服务:
service xinetd restartxinetd服务的自启动
chkconfig 服务名 on
# xinetd服务的自启动和启动是一回事源码包安装服务的启动
使用绝对路径,调用启动脚本来启动
不同的源码包的启动脚本不同。可以查看源码包的安装说明,看看启动脚本的开启方法。
示例:
/usr/local/apache2/bin/apachectl start
# 启动源码包安装的apache源码包服务的自启动
vi /etc/rc.d/rc.local
# 加入启动命令
# 例如:/usr/local/apache2/bin/apachectl start让源码包服务被服务管理命令识别
让源码包的apache服务能被service命令管理启动:
ln -s /usr/local/apache2/bin/apachectl /etc/init.d/apache
# 做一个软链接到/etc/init.d/下让源码包的apache服务能被chkconfig与ntsysv管理自启动:
vi /etc/init.d/apache
# 加入
# chkconfig: 35 86 76
# description: source package apache然后加入chkconfig管理:
chkconfig --add apache服务管理总结
常见服务作用
| 服务名 | 功能说明 | 建议 |
|---|---|---|
| atd | 定时任务服务,只执行一次的定时任务 | 需要则开启 |
| anacron | 关机状态下错过的定时任务,开机后自动执行 | 建议开启 |
| apmd | 高级电源管理 | 笔记本需要,服务器不需要 |
| arptables_jf | arp防火墙 | 不需要 |
| atalk | AppleTalk网络协议支持 | 不需要 |
| autofs | 自动挂载设备(如U盘、光盘) | 需要则开启 |
| bluetooth | 蓝牙设备支持 | 不需要 |
| chargen-dgram | UDP版本的字符生成器服务,测试用 | 不需要 |
| chargen-stream | TCP版本的字符生成器服务 | 不需要 |
| cpuspeed | 调节CPU频率,节能 | 笔记本需要 |
| crond | 系统定时任务 | 必须开启 |
| cups | 打印服务 | 需要打印则开启 |
| daytime-dgram | UDP日期时间服务 | 不需要 |
| daytime-stream | TCP日期时间服务 | 不需要 |
| dc_client | SSL证书客户端 | 不需要 |
| dc_server | SSL证书服务端 | 不需要 |
| dhcdbd | DHCP客户端守护进程 | 不需要 |
| echo-dgram | UDP回显服务,测试用 | 不需要 |
| echo-stream | TCP回显服务 | 不需要 |
| firstboot | 系统安装后第一次启动的设置向导 | 不需要 |
| gpm | 字符界面下的鼠标支持 | 需要则开启 |
| haldaemon | 检测硬件变化 | 建议开启 |
| hidd | 蓝牙输入设备支持 | 不需要 |
| httpd | Apache服务 | Web服务器需要 |
| ip6tables | IPv6防火墙 | 不需要 |
| iptables | IPv4防火墙 | 必须开启 |
| irda | 红外设备支持 | 不需要 |
| irqbalance | 多核CPU中断分配 | 多核CPU建议开启 |
| isdn | ISDN设备支持 | 不需要 |
| kdump | 内核崩溃转储 | 不需要 |
| kudzu | 开机检测硬件变化 | 不需要 |
| lm_sensors | 检测CPU温度、风扇转速 | 需要则开启 |
| mcstrans | SELinux的图形化工具 | 不需要 |
| mdmonitor | RAID设备监控 | 有RAID则开启 |
| mdmpd | 多路径设备监控 | 不需要 |
| messagebus | 系统消息总线 | 建议开启 |
| microcode_ctl | Intel CPU微码支持 | Intel CPU建议开启 |
| multipathd | 多路径设备支持 | 不需要 |
| mysqld | MySQL数据库服务 | 需要则开启 |
| named | DNS服务 | DNS服务器需要 |
| netconsole | 网络控制台 | 不需要 |
| netfs | 网络文件系统挂载 | 不需要 |
| network | 网络服务 | 必须开启 |
| nfs | NFS文件共享服务 | 需要则开启 |
| nfslock | NFS文件锁 | 用NFS则开启 |
| nscd | 名称服务缓存 | 不需要 |
| ntpd | 网络时间同步 | 需要则开启 |
| pcscd | 智能卡设备支持 | 不需要 |
| portmap | RPC服务,NFS和NIS需要 | 用NFS则开启 |
| psacct | 进程审计 | 不需要 |
| rdisc | 客户端路由守护进程 | 不需要 |
| readahead_early | 开机预加载,加快启动 | 建议开启 |
| readahead_later | 开机预加载 | 建议开启 |
| restorecond | SELinux文件安全上下文恢复 | 不需要 |
| rpcgssd | NFSv4客户端需要 | 不需要 |
| rpcidmapd | NFSv4用户名映射 | 不需要 |
| rsync | 文件同步服务 | 需要则开启 |
| saslauthd | SASL认证服务 | 需要则开启 |
| sendmail | 邮件服务 | 需要邮件服务则开启 |
| setroubleshoot | SELinux故障排查工具 | 不需要 |
| smartd | 硬盘自检 | 建议开启 |
| smb | Samba文件共享 | 需要则开启 |
| snmpd | 简单网络管理协议 | 需要监控则开启 |
| squid | 代理服务 | 需要则开启 |
| sshd | 远程连接服务 | 必须开启 |
| syslog | 日志服务 | 必须开启 |
| tux | 内核级Web服务器 | 不需要 |
| vncserver | VNC远程桌面 | 需要则开启 |
| vsftpd | FTP服务 | 需要FTP则开启 |
| xfs | X Window字体服务 | 用图形界面则开启 |
| xinetd | 超级守护进程 | 有xinetd服务则开启 |
| ypbind | NIS客户端 | 不需要 |
| yum-updatesd | yum自动更新 | 建议关闭 |
进程管理
进程查看
ps命令
ps aux
# 查看系统中所有进程,使用BSD操作系统格式| 选项 | 说明 |
|---|---|
| a | 显示一个终端的所有进程,除了会话引线 |
| u | 显示进程的归属用户及内存的使用情况 |
| x | 显示没有控制终端的进程 |
ps -le
# 查看系统中所有进程,使用Linux标准命令格式| 选项 | 说明 |
|---|---|
| -l | 长格式显示。显示更加详细的信息 |
| -e | 显示所有进程,和-A作用一致 |
ps输出信息说明:
| 字段 | 说明 |
|---|---|
| USER | 该进程是由哪个用户产生的 |
| PID | 进程的ID号 |
| %CPU | 该进程占用CPU资源的百分比,占用越高,进程越耗费资源 |
| %MEM | 该进程占用物理内存的百分比,占用越高,进程越耗费资源 |
| VSZ | 该进程占用虚拟内存的大小,单位KB |
| RSS | 该进程占用实际物理内存的大小,单位KB |
| TTY | 该进程是在哪个终端中运行的。其中tty1-tty7代表本地控制台终端,tty1-tty6是本地的字符界面终端,tty7是图形终端。pts/0-255代表虚拟终端 |
| STAT | 进程状态。常见的状态有:R运行、S睡眠、T停止、s包含子进程、+位于后台 |
| START | 该进程的启动时间 |
| TIME | 该进程占用CPU的运算时间,注意不是系统时间 |
| COMMAND | 产生此进程的命令名 |
top命令
top [选项]| 选项 | 说明 |
|---|---|
| -d 秒数 | 指定top命令每隔几秒更新。默认是3秒 |
top命令的交互模式当中可以执行的命令:
| 命令 | 说明 |
|---|---|
| ?或h | 显示交互模式的帮助 |
| P | 以CPU使用率排序,默认就是此项 |
| M | 以内存的使用率排序 |
| N | 以PID排序 |
| q | 退出top |
top输出信息说明:
第一行信息为任务队列信息:
| 内容 | 说明 |
|---|---|
| 12:26:46 | 系统当前时间 |
| up 1 day, 13:32 | 系统的运行时间,本机已经运行1天13小时32分钟 |
| 2 users | 当前登录了两个用户 |
| load average: 0.00, 0.00, 0.00 | 系统在之前1分钟,5分钟,15分钟的平均负载。一般认为小于1时,负载较小。如果大于1,系统已经超出负荷 |
第二行为进程信息:
| 内容 | 说明 |
|---|---|
| Tasks: 95 total | 系统中的进程总数 |
| 1 running | 正在运行的进程数 |
| 94 sleeping | 睡眠的进程 |
| 0 stopped | 正在停止的进程 |
| 0 zombie | 僵尸进程。如果不是0,需要手工检查僵尸进程 |
第三行为CPU信息:
| 内容 | 说明 |
|---|---|
| Cpu(s): 0.1%us | 用户模式占用的CPU百分比 |
| 0.1%sy | 系统模式占用的CPU百分比 |
| 0.0%ni | 改变过优先级的用户进程占用的CPU百分比 |
| 99.7%id | 空闲CPU的CPU百分比 |
| 0.1%wa | 等待输入/输出的进程的占用CPU百分比 |
| 0.0%hi | 硬中断请求服务占用的CPU百分比 |
| 0.1%si | 软中断请求服务占用的CPU百分比 |
| 0.0%st | st(Steal time)虚拟时间百分比 |
第四行为物理内存信息:
| 内容 | 说明 |
|---|---|
| Mem: 625344k total | 物理内存的总量,单位KB |
| 571504k used | 已经使用的物理内存数量 |
| 53840k free | 空闲的物理内存数量 |
| 65800k buffers | 作为缓冲的内存数量 |
第五行为交换分区(swap)信息:
| 内容 | 说明 |
|---|---|
| Swap: 524280k total | 交换分区(虚拟内存)的总大小 |
| 0k used | 已经使用的交换分区的大小 |
| 524280k free | 空闲交换分区的大小 |
| 409280k cached | 作为缓存的交换分区的大小 |
pstree命令
pstree [选项]| 选项 | 说明 |
|---|---|
| -p | 显示进程的PID |
| -u | 显示进程的所属用户 |
进程管理
kill命令
kill -l
# 查看可用的进程信号常见信号:
| 信号代号 | 信号名称 | 说明 |
|---|---|---|
| 1 | SIGHUP | 该信号让进程立即关闭,然后重新读取配置文件之后重启 |
| 2 | SIGINT | 程序终止信号,用于终止前台进程。相当于输出ctrl+c快捷键 |
| 8 | SIGFPE | 在发生致命的算术运算错误时发出 |
| 9 | SIGKILL | 用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。一般用于强制终止进程 |
| 14 | SIGALRM | 时钟定时信号,计算的是实际的时间或时钟时间。alarm函数使用该信号 |
| 15 | SIGTERM | 正常结束进程的信号,kill命令的默认信号 |
| 18 | SIGCONT | 该信号可以让暂停的进程恢复执行。本信号不能被阻断 |
| 19 | SIGSTOP | 该信号可以暂停前台进程,相当于输入ctrl+z快捷键。本信号不能被阻断 |
kill -1 22354
# 重启进程
kill -9 22368
# 强制杀死进程killall命令
killall [选项] [信号] 进程名| 选项 | 说明 |
|---|---|
| -i | 交互式,询问是否要杀死某个进程 |
| -I | 忽略进程名的大小写 |
示例:
killall -9 httpd
# 杀死所有httpd进程pkill命令
pkill [选项] [信号] 进程名| 选项 | 说明 |
|---|---|
| -t 终端号 | 按照终端号踢出用户 |
示例:
pkill -9 -t pts/1
# 强制踢出从pts/1登录的用户进程优先级
优先级范围
- PRI(Priority):优先级,值越小优先级越高
- NI(Nice): nice值,范围-20到19
nice命令
nice [选项] 命令| 选项 | 说明 |
|---|---|
| -n 优先级 | 给命令赋予NI值 |
示例:
nice -n -5 service httpd start
# 给httpd进程设置NI值为-5renice命令
renice [优先级] PID示例:
renice -10 2125
# 修改PID为2125的进程优先级为-10工作管理
什么是工作管理
- 前台:是指当前可以操控的这个终端窗口
- 后台:是指当前不操控的终端窗口,但程序还在运行
把进程放入后台
方式一:
tar -zcf etc.tar.gz /etc &
# 在命令后面加&,放入后台执行方式二:
top
# 命令执行过程中,按ctrl+z快捷键,暂停并放入后台查看后台的工作
jobs [-l]| 选项 | 说明 |
|---|---|
| -l | 显示工作的PID |
注意:”+“号代表最近一个放入后台的工作,也是工作恢复时,默认恢复的工作。”-“号代表倒数第二个放入后台的工作
将后台暂停的工作恢复到前台执行
fg %工作号| 选项 | 说明 |
|---|---|
| %工作号 | %号可以省略,但是注意工作号和PID的区别 |
将后台暂停的工作恢复到后台执行
bg %工作号注意:后台恢复执行的命令,是不能和前台有交互的,否则不能恢复到后台执行
后台命令脱离登录终端运行
我们知道,把命令放入后台,只能在当前登录终端执行。一旦退出或关闭终端,后台程序就会停止。
方法一:
nohup 命令 &方法二:
# 把需要后台执行的命令写入/etc/rc.local文件方法三:
# 使用系统定时任务系统资源查看
vmstat命令监控系统资源
vmstat [刷新延时 刷新次数]示例:
vmstat 1 3
# 每秒刷新一次,共刷新3次输出信息说明:
procs:进程信息字段
| 字段 | 说明 |
|---|---|
| r | 等待运行的进程数,数量越大,系统越繁忙 |
| b | 不可被唤醒的进程数量,数量越大,系统越繁忙 |
memory:内存信息字段
| 字段 | 说明 |
|---|---|
| swpd | 虚拟内存的使用情况,单位KB |
| free | 空闲的内存容量,单位KB |
| buff | 缓冲的内存容量,单位KB |
| cache | 缓存的内存容量,单位KB |
swap:交换分区信息字段
| 字段 | 说明 |
|---|---|
| si | 从磁盘中交换到内存中数据的数量,单位KB |
| so | 从内存中交换到磁盘中数据的数量,单位KB |
io:磁盘读写信息字段
| 字段 | 说明 |
|---|---|
| bi | 从块设备读入数据的总量,单位是块 |
| bo | 写到块设备的数据的总量,单位是块 |
system:系统信息字段
| 字段 | 说明 |
|---|---|
| in | 每秒被中断的进程次数 |
| cs | 每秒钟进行的事件切换次数,数值越大,系统与接口设备的通信越繁忙 |
cpu:CPU信息字段
| 字段 | 说明 |
|---|---|
| us | 非内核进程消耗CPU运算时间的百分比 |
| sy | 内核进程消耗CPU运算时间的百分比 |
| id | 空闲CPU的百分比 |
| wa | 等待I/O所消耗的CPU百分比 |
| st | 被虚拟机盗用的CPU时间百分比 |
dmesg开机时内核检测信息
dmesg
# 查看开机时内核检测信息
dmesg | grep CPU
# 查看CPU信息free命令查看内存使用状态
free [-b|-k|-m|-g]| 选项 | 说明 |
|---|---|
| -b | 以字节为单位显示 |
| -k | 以KB为单位显示,默认就是以KB为单位显示 |
| -m | 以MB为单位显示 |
| -g | 以GB为单位显示 |
示例:
free -m
# 以MB为单位显示内存使用情况缓存和缓冲的区别:
- 缓存(cache):用来加速数据从硬盘中”读取”的
- 缓冲(buffer):用来加速数据”写入”硬盘的
查看CPU信息
cat /proc/cpuinfo
# 查看CPU信息uptime命令
uptime
# 显示系统的启动时间和平均负载
# 也就是top命令的第一行查看系统与内核相关信息
uname [选项]| 选项 | 说明 |
|---|---|
| -a | 查看系统所有相关信息 |
| -r | 查看内核版本 |
| -s | 查看内核名称 |
示例:
uname -a
# 查看所有信息
uname -r
# 查看内核版本判断当前系统的位数
file /bin/ls
# 查看外部命令的文件类型,从而判断系统位数查看系统发行版本
lsb_release -a
# 查看系统发行版本
cat /etc/redhat-release
# RedHat系列查看发行版列出进程打开或使用的文件信息
lsof [选项]
# 列出进程调用或打开的文件的信息| 选项 | 说明 |
|---|---|
| -c 字符串 | 只列出以字符串开头的进程打开的文件 |
| -u 用户名 | 只列出某个用户的进程打开的文件 |
| -p pid | 列出某个PID进程打开的文件 |
示例:
lsof | more
# 查看所有进程打开的文件
lsof -c httpd
# 查看httpd进程打开的文件
lsof -u root
# 查看root用户进程打开的文件
lsof -p 1
# 查看PID为1的进程打开的文件系统定时任务
crond服务管理与访问控制
service crond restart
# 重启crond服务
chkconfig crond on
# 设置crond服务开机自启动用户的crontab设置
crontab [选项]| 选项 | 说明 |
|---|---|
| -e | 编辑crontab定时任务 |
| -l | 查询crontab任务 |
| -r | 删除当前用户所有的crontab任务 |
crontab基本格式:
* * * * * 执行的任务
| 项目 | 含义 | 范围 |
|---|---|---|
| 第一个”*“ | 一小时当中的第几分钟 | 0-59 |
| 第二个”*“ | 一天当中的第几小时 | 0-23 |
| 第三个”*“ | 一个月当中的第几天 | 1-31 |
| 第四个”*“ | 一年当中的第几月 | 1-12 |
| 第五个”*“ | 一周当中的星期几 | 0-7(0和7都代表星期日) |
特殊符号说明:
| 特殊符号 | 含义 |
|---|---|
| * | 代表任何时间。比如第一个”*“就代表一小时中每分钟都执行一次的意思 |
| , | 代表不连续的时间。比如”0 8,12,16 * * * 命令”,就代表在每天的8点0分,12点0分,16点0分都执行一次命令 |
| - | 代表连续的时间范围。比如”0 5 * * 1-6 命令”,代表在周一到周六的凌晨5点0分执行命令 |
| */n | 代表每隔多久执行一次。比如”*/10 * * * * 命令”,代表每隔10分钟就执行一遍命令 |
示例:
| 时间 | 含义 |
|---|---|
| 45 22 * * * 命令 | 在22点45分执行命令 |
| 0 17 * * 1 命令 | 每周1的17点0分执行命令 |
| 0 5 1,15 * * 命令 | 每月1号和15号的凌晨5点0分执行命令 |
| 40 4 * * 1-5 命令 | 每周一到周五的凌晨4点40分执行命令 |
| */10 4 * * * 命令 | 每天的凌晨4点,每隔10分钟执行一次命令 |
| 0 0 1,15 * 1 命令 | 每月1号和15号,每周1的0点0分都会执行命令 |
⚠️ 注意:星期几和几号最好不要同时出现,因为它们定义的都是天,非常容易让管理员混乱
示例:
*/5 * * * * /bin/echo "11" >> /tmp/test
# 每隔5分钟,向/tmp/test文件中写入11
0 2 1,10,15 * * /root/sh/autobak.sh
# 每月1号、10号、15号的凌晨2点执行autobak.sh脚本注意事项:
- 六个选项都不能为空,必须填写。如果不确定使用”*“代表任意时间
- crontab定时任务,最小有效时间是分钟,最大时间范围是月
- 写定时任务时,命令的路径最好写绝对路径
- 定时任务的执行结果,会通过邮件发送给用户,所以如果输出内容较多,建议重定向到文件或/dev/null
日志管理简介
日志服务
在CentOS 6.x中日志服务已经由rsyslogd取代了原先的syslogd服务。rsyslogd日志服务更加先进,功能更多。但是不论该服务的使用,还是日志文件的格式其实都是和syslogd服务相兼容的,所以学习起来基本和syslogd服务一致。
rsyslogd的新特点
- 基于TCP网络协议传输日志信息
- 更安全的网络传输方式
- 有日志消息的及时分析框架
- 后台数据库
- 配置文件中可以写简单的逻辑判断
- 与syslog配置文件相兼容
确定服务启动
ps aux | grep rsyslogd
# 查看服务是否启动
chkconfig --list | grep rsyslog
# 查看服务是否自启动常见日志的作用
| 日志文件 | 说明 |
|---|---|
| /var/log/cron | 记录了系统定时任务相关的日志 |
| /var/log/cups/ | 记录打印信息的日志 |
| /var/log/dmesg | 记录了系统在开机时内核自检的信息。也可以使用dmesg命令直接查看内核自检信息 |
| /var/log/btmp | 记录错误登录的日志。这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看 |
| /var/log/lastlog | 记录系统中所有用户最后一次的登录时间的日志。这个文件也是二进制文件,不能直接vi,而要使用lastlog命令查看 |
| /var/log/maillog | 记录邮件信息 |
| /var/log/messages | 记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件 |
| /var/log/secure | 记录验证和授权方面的信息,只要涉及账户和密码的程序都会记录。比如说系统的登录,ssh的登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中 |
| /var/log/wtmp | 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看 |
| /var/run/utmp | 记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询 |
除了系统默认的日志之外,采用RPM方式安装的系统服务也会默认把日志记录在/var/log/目录中(源码包安装的服务日志是在源码包指定目录中)。不过这些日志不是由rsyslogd服务来记录和管理的,而是各个服务使用自己的日志管理文档来记录自身日志。
RPM包安装服务的日志:
| 日志文件 | 说明 |
|---|---|
| /var/log/httpd/ | RPM包安装的apache服务的默认日志目录 |
| /var/log/mail/ | RPM包安装的邮件服务的额外日志目录 |
| /var/log/samba/ | RPM包安装的samba服务的日志目录 |
| /var/log/sssd/ | 守护进程安全服务目录 |
rsyslogd日志服务
日志文件格式
基本日志格式包含以下四列:
- 事件产生的时间
- 发生事件的服务器的主机名
- 产生事件的服务名或程序名
- 事件的具体信息
/etc/rsyslog.conf配置文件
authpriv.* /var/log/secure
格式说明:
- 服务名称[连接符号]日志等级 日志记录位置
- 认证相关服务.所有日志等级 记录在 /var/log/secure日志中
服务名称
| 服务名称 | 说明 |
|---|---|
| auth | 安全和认证相关消息(不推荐使用authpriv替代) |
| authpriv | 安全和认证相关消息(私有的) |
| cron | 系统定时任务cront和at产生的日志 |
| daemon | 和各个守护进程相关的日志 |
| ftp | ftp守护进程产生的日志 |
| kern | 内核产生的日志(不是用户进程产生的) |
| local0-local7 | 为本地使用预留的服务 |
| lpr | 打印产生的日志 |
| 邮件收发信息 | |
| news | 与新闻服务器相关的日志 |
| syslog | 有syslogd服务产生的日志信息 |
| user | 用户等级类别的日志信息 |
| uucp | uucp子系统的日志信息 |
连接符号
| 连接符号 | 说明 |
|---|---|
| ”*“ | 代表所有日志等级 |
| ”.” | 代表只要比后面的等级高的(包含该等级)日志都记录下来 |
| ”=“ | 代表只记录所需等级的日志,其他等级的都不记录 |
| ”.!” | 代表不等于,也就是除了该等级的日志外,其他等级的日志都记录 |
日志等级
| 等级名称 | 说明 |
|---|---|
| none | 没有等级,相当于没有 |
| debug(低) | 一般的调试信息说明 |
| info | 基本的通知信息 |
| notice | 普通信息,但是有一定的重要性 |
| warning | 警告信息,但是还不会影响到服务或系统的运行 |
| err | 错误信息,一般达到err等级的信息已经可以影响到服务或系统的运行了 |
| crit | 临界状况信息,比err等级还要严重 |
| alert | 警告状态信息,比crit还要严重。必须立即采取行动 |
| emerg(高) | 疼痛等级信息,系统已经无法使用了 |
日志记录位置
- 日志文件的绝对路径,如
/var/log/secure - 系统设备文件,如
/dev/lp0 - 转发给远程主机,如
@192.168.0.210:514 - 用户名,如
root - 忽略或丢弃日志,如
~
日志轮替
日志文件的命名规则
-
如果配置文件中拥有
dateext参数,那么日志会用日期来作为日志文件的后缀,例如secure-20130605。这样日志文件名不会重叠,所以也就不需要日志文件的改名,只需要保存指定的日志个数,删除多余的日志文件即可。 -
如果配置文件中没有
dateext参数,那么日志文件就需要进行改名了。当第一次进行日志轮替时,当前的secure日志会自动改名为secure.1,然后新建secure日志,用来保存新的日志。当第二次进行日志轮替时,secure.1会自动改名为secure.2,当前的secure日志会自动改名为secure.1,然后也会新建secure日志,用来保存新的日志,以此类推。
logrotate配置文件
| 参数 | 参数说明 |
|---|---|
| daily | 日志的轮替周期是每天 |
| weekly | 日志的轮替周期是每周 |
| monthly | 日志的轮替周期是每月 |
| rotate 数字 | 保留的日志文件的个数。0指没有备份 |
| compress | 日志轮替时,旧的日志进行压缩 |
| create mode owner group | 建立新日志,同时指定新日志的权限与所有者和所属组 |
| mail address | 当日志轮替时,输出内容通过邮件发送到指定的邮件地址 |
| missingok | 如果日志不存在,则忽略该日志的警告信息 |
| notifempty | 如果日志为空文件,则不进行日志轮替 |
| minsize 大小 | 日志轮替的最小值。也就是日志一定要达到这个最小值才会轮替 |
| size 大小 | 日志只有大于指定大小才进行日志轮替,而不是按照时间轮替 |
| dateext | 使用日期作为日志轮替文件的后缀 |
把apache日志加入轮替
vi /etc/logrotate.conf添加配置:
/usr/local/apache2/logs/access_log {
daily
create
rotate 30
}
logrotate命令
logrotate [选项] 配置文件名| 选项 | 说明 |
|---|---|
| -v | 显示日志轮替过程 |
| -f | 强制进行日志轮替 |
如果此命令没有选项,则会按照配置文件中的条件进行日志轮替
CentOS 6.x启动管理
系统运行级别
运行级别
| 运行级别 | 含义 |
|---|---|
| 0 | 关机 |
| 1 | 单用户模式,可以想象为windows的安全模式,主要用于系统修复 |
| 2 | 不完全的命令行模式,不含NFS服务 |
| 3 | 完全的命令行模式,就是标准字符界面 |
| 4 | 系统保留 |
| 5 | 图形模式 |
| 6 | 重启动 |
运行级别命令
runlevel
# 查看运行级别命令,N代表无,进入3级别之前的级别
init 运行级别
# 改变运行级别命令系统默认运行级别
vim /etc/inittab配置项:
id:3:initdefault:
系统开机后直接进入哪个运行级别
系统启动过程
initramfs内存文件系统
CentOS 6.x中使用initramfs内存文件系统取代了CentOS5.x中的initrd RAM Disk。它们的作用类似,可以通过启动引导程序加载到内存中,然后加载启动过程中所需要的内核模块,比如USB、SATA、SCSI硬盘的驱动和LVM、RAID文件系统的驱动。
操作示例:
mkdir /tmp/initramfs
# 建立测试目录
cp /boot/initramfs-2.6.32-279.el6.i686.img /tmp/initramfs/
# 复制initramfs文件
cd /tmp/initramfs/
file initramfs-2.6.32-279.el6.i686.img
# 查看此文件的类型
mv initramfs-2.6.32-279.el6.i686.img initramfs-2.6.32-279.el6.i686.img.gz
# 修改文件的后缀名为gz
gunzip initramfs-2.6.32-279.el6.i686.img.gz
# 解压缩
file initramfs-2.6.32-279.el6.i686.img
cpio -ivcdu < initramfs-2.6.32-279.el6.i686.img
# 解压缩调用/etc/init/rcS.conf配置文件
主要功能是两个:
- 先调用
/etc/rc.d/rc.sysinit,然后由/etc/rc.d/rc.sysinit配置文件进行Linux系统初始化 - 然后再调用
/etc/inittab,然后由/etc/inittab配置文件确定系统的默认运行级别
由/etc/rc.d/rc.sysinit初始化
- 获得网络环境
- 挂载设备
- 开机启动画面Plymouth(取替了过往的RHGB)
- 判断是否启用SELinux
- 显示于开机过程中的欢迎画面
- 初始化硬件
- 用户自定义模块的加载
- 配置内核的参数
- 设置主机名
- 同步存储器
- 设备映射器及相关的初始化
- 初始化软件磁盘阵列(RAID)
- 初始化LVM的文件系统功能
- 检验磁盘文件系统(fsck)
- 设置磁盘配额(quota)
- 重新以可读写模式挂载系统磁盘
- 更新quota(非必要)
- 启动系统虚拟随机数生成器
- 配置机器(非必要)
- 清除开机过程当中的临时文件
- 创建ICE目录
- 启动交换分区(swap)
- 将开机信息写入
/var/log/dmesg文件中
调用/etc/rc.d/rc文件
运行级别参数传入 /etc/rc.d/rc 这个脚本之后,由这个脚本文件按照不同的运行级别启动 /etc/rc[0-6].d/ 目录中的相应的程序
/etc/rc3.d/K??开头的文件(??是数字),会按照数字顺序依次关闭/etc/rc3.d/S??开头的文件(??是数字),会按照数字顺序依次启动
启动引导程序grub
grub中分区表示
| 硬盘 | 分区 | Linux中设备文件名 | Grub中设备文件名 |
|---|---|---|---|
| 第一块SCSI硬盘 | 第一个主分区 | /dev/sda1 | hd(0,0) |
| 第二个主分区 | /dev/sda2 | hd(0,1) | |
| 扩展分区 | /dev/sda3 | hd(0,2) | |
| 第一个逻辑分区 | /dev/sda5 | hd(0,4) | |
| 第二块SCSI硬盘 | 第一个主分区 | /dev/sdb1 | hd(1,0) |
| 第二个主分区 | /dev/sdb2 | hd(1,1) | |
| 扩展分区 | /dev/sdb3 | hd(1,2) | |
| 第一个逻辑分区 | /dev/sdb5 | hd(1,4) |
grub配置文件
vi /boot/grub/grub.conf| 配置项 | 说明 |
|---|---|
| default=0 | 默认启动第一个系统 |
| timeout=5 | 等待时间,默认是5秒 |
| splashimage=(hd0,0)/grub/splash.xpm.gz | 指定grub启动时的背景图像文件的保存位置 |
| hiddenmenu | 隐藏菜单 |
| title CentOS (2.6.32-279.el6.i686) | title就是标题的意思 |
| root (hd0,0) | 是指启动程序的保存分区 |
| kernel /vmlinuz-2.6.32-279.el6.i686 ro root=UUID=… | 定义内核加载时的选项 |
| initrd /initramfs-2.6.32-279.el6.i686.img | 指定了initramfs内存文件系统镜像文件的所在位置 |
系统修复模式
单用户模式常见的错误修复
- 遗忘root密码
- 修改系统默认运行级别
重要系统文件丢失,导致系统无法启动
使用光盘修复模式:
bash-4.1# chroot /mnt/sysimage
# 改变主目录
sh-4.1# cd /root
sh-4.1# rpm -qf /etc/inittab
# 查询下/etc/inittab文件属于哪个包
sh-4.1# mkdir /mnt/cdrom
# 建立挂载点
sh-4.1# mount /dev/sr0 /mnt/cdrom
# 挂载光盘
sh-4.1# rpm2cpio /mnt/cdrom/Packages/initscripts-8.45.3-1.i386.rpm | cpio -idv ./etc/inittab
# 提取inittab文件到当前目录
sh-4.1# cp etc/inittab /etc/inittab
# 复制inittab文件到指定位置Grub加密与字符界面分辨率调整
grub加密
grub-md5-crypt
# 生成加密密码串然后修改grub配置文件:
vi /boot/grub/grub.conf添加password配置:
default=0
timeout=5
password --md5 $1$Y84LB1$8tMY2PibScmuOCc8z8U35/
# password选项放在整体设置处
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
...
纯字符界面分辨率调整
查询内核是否支持分辨率修改:
grep "CONFIG_FRAMEBUFFER_CONSOLE" /boot/config-2.6.32-279.el6.i686分辨率对照表:
| 色深 | 640×480 | 800×600 | 1024×768 | 1280×1024 |
|---|---|---|---|---|
| 8位 | 769 | 771 | 773 | 775 |
| 15位 | 784 | 787 | 790 | 793 |
| 16位 | 785 | 788 | 791 | 794 |
| 32位 | 786 | 789 | 792 | 795 |
修改grub配置:
vi /boot/grub/grub.conf在kernel行末尾添加vga参数:
kernel /vmlinuz-2.6.32-279.el6.i686 ro root=UUID=... vga=791
📌 笔记说明
- 本笔记基于原始学习资料整理,保留所有原始知识点
- 采用 Obsidian 优化格式,支持内部双链接跳转
- 所有章节均可通过目录快速跳转
- 每个章节底部都有返回目录和顶部的导航链接