IdeFun

努力不一定成功,但不努力真的很舒服。

0%

Linux学习笔记

Linux学习笔记

Linux注意事项

Ctrl+a 快速回到行首

Ctrl+e 快速回到行末

Linux严格区分大小写.

Linux中所有内容以文件形式保存,包括硬件

  • 硬盘文件是/dev/sd[a-p]
  • 光盘文件是/dev/sr0

Linux不靠扩展名区分文件类型(扩展名便于用户使用),靠文件权限

  • 压缩包: “*.gz”、”*.bz2”、”*.tar.bz2”、”*.tgz”等
  • 二进制软件包: “*.rpm”
  • 网页文件: “*.html”、”*.php”
  • 脚本文件: “*.sh”
  • 配置文件: “*.conf”

Linux所有的存储设备都必须挂载,之后用户才能使用,包括硬盘、U盘和光盘

Windows下的程序不能直接在Iinux中安装和运行

服务器管理和维护

目录及作用

目录名 目录作用
/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, 但是到底在哪个目录中挂载什么设备都可以由管理员自己决定。例如在/mnt下建立不同目录挂载不同设备。如/mnt/cdrom挂载光盘,/mnt/usb挂载U盘
/opt/ 第三方安装的软件保存位置。这个目录就是放置和安装其他软件的位置,手工安装的源码包软件都可以安装到这个目录当中。/usr/local目录也可以用来安装软件(更为常用)
/proc/ 虚拟文件系统,该目录中的数据并不保存到硬盘当中,而是保存到内存当中。主要保存系统的内核,进程,外部设备状态和网络状态灯。如/proc/cpuinfo是保存CPU信息的,/proc/devices是保存设备驱动的列表的,/proc/filesystems是保存文件系统列表的,/proc/net/是保存网络协议信息的
/sys/ 虚拟文件系统。和/proc 目录相似,都是保存在内存当中的,主要是保存于内核相关信息的
/root/ 超级用户的家目录。普通用户家目录在“home”下,超级用户家目录直接在“/”下
/srv/ 服务数据目录。一些系统服务启动之后,可以在这个目录中保存所需要的数据
/tmp/ 临时目录。系统存放临时文件的目录,该目录下所有用户都可以访问和写入。建议此目录中不能保存重要数据,最好每次开机都把该目录清空
/usr/ 系统软件资源目录。注意usr不是user的缩写,而是“Unix Softwre Resource”的缩写,所以不是存放用户数据,而是存放系统软件资源的目录。系统中安装的软件大多数保存在这里
/var/ 动态数据保存位置。主要保存缓存、日志以及软件运行所产生的文件

服务器注意事项

  • 远程服务器不允许关机,只能重启
  • 重启时应该正确关闭服务
  • 不要在服务器访问高峰运行高负载命令(搜索)
  • 远程配置防火墙时不要把自己踢出服务器
  • 指定合理的密码规范并定期更新
  • 合理分配权限
  • 定期备份重要数据和日志

Linux常用命令

文件处理命令

命令格式

命令格式:命令 [-选项] [参数]
例:ls -la /etc
说明:

  1. 个别命令使用不遵循此格式
  2. 当有多个选项时,可以写在一起,绝大多数顺序也可以改变
  3. 简化选项与完整选项
    -a等于--all

目录处理命令

ls命令

命令名称: ls
命令英文原意:list
命令所在路径: /bin/ls
执行权限:所有用户
功能描述:显示目录文件
语法: ls 选项[-ald] [文件或目录]
-a 显示所有文件,包括隐藏文件
-1 详细信息显示
-d 查看目录属性
-i 查看i节点(linux中,文件查找不是通过文件名称来查找的。实际上是通过i节点来实现文件的查找定位的。)

-rw-r--r--

  • - 文件类型(-二进制文件 d目录 l软链接文件)
  • rw- r-- r--
    u g o
    u所有者 g所属组 o其他人
    r读 w写 x执行
mkdir命令

命令名称: mkdir
命令英文原意: make directories
命令所在路径: /bin/mkdir
执行权限: 所有用户
语法: mkdir -p [目录名]
功能描述:创建新目录
-p 递归创建(不加-p只能在已有目录创建一个新目录,而不能创建一个带有子目录的目录)

mkdir可同时创建多个目录

cd命令

命令名称: cd
命令英文原意: change directory
命令所在路径: shell内置命令
执行权限: 所有用户
语法: cd [目录]
功能描述: 切换目录

pwd命令

命令名称: pwd
命令英文原意: print working directory
命令所在路径: /bin/pwd
执行权限: 所有用户
语法: pwd
功能描述: 显示当前目录

rmdir命令

命令名称: rmdir
命令英文原意: remove empty directories
命令所在路径: /bin/rmdir
执行权限: 所有用户
语法: rmdir [目录名]
功能描述: 只能删除空目录

cp命令

命令名称: cp
命令英文原意: copy
命令所在路径: /bin/cp
执行权限: 所有用户
语法: cp -rp [原文件或目录] [目标目录]
-r 复制目录
-p 保留文件属性(不加-p时会改变文件的修改时间)
功能描述: 复制文件或目录到另一个文件(改名)或目录

cp命令可以同时复制多个目录或文件,可以复制并同时改名

mv命令

命令名称: mv
命令英文原意: move
命令所在路径: /bin/mv
执行权限: 所有用户
语法: mv [原文件或目录] [目标目录]
功能描述: 剪切文件、改名

rm命令

命令名称: rm
命令英文原意: remove
命令所在路径: /bin/rm
执行权限: 所有用户
语法: rm -rf [文件或目录]
-r 删除目录
-f 强制执行
-i 询问删除
功能描述: 删除文件

Linux没有回收站概念,删除文件要谨慎.删除文件前要备份,一旦发现误删除情况,尽量不要对硬盘做过多的读写或查找操作.

文件处理命令

touch命令

命令名称: touch
命令所在路径: /bin/touch
执行权限: 所有用户
语法: touch [文件名]
功能描述: 创建空文件

cat命令

命令名称: cat
命令所在路径: /bin/cat
执行权限: 所有用户
语法: cat -n [文件名]
功能描述: 显示文件内容(只能用于查看内容较少的文件,否则滚动条会一直滚动,只显示最后一页,内容较多用more命令)
-n 显示行号
-A 查询所有文件内容,包括隐藏字符

tac命令

命令名称: tac
命令所在路径: /usr/bin/tac
执行权限: 所有用户
语法: tac [文件名]
功能描述: 显示文件内容(反向列示,与cat相反)

more命令

命令名称: more
命令所在路径: /bin/more
执行权限: 所有用户
语法: more [文件名]
(空格)或f 翻页
(Enter) 换行
q或Q 退出
功能描述: 分页显示文件内容(无法向上翻页)

less命令

命令名称: less
命令所在路径: /usr/bin/less
执行权限: 所有用户
语法: less [文件名]
(空格)或f 翻页
(Enter) 换行
q或Q 退出
pgup 向上翻页
pgdn 向下翻页
/[关键词] 搜索
n 搜索下一个
功能描述: 分页显示文件内容(可向上翻页),可进行搜索

head命令

命令名称: head
命令所在路径: /usr/bin/head
执行权限: 所有用户
语法: head -n [行数] [文件名]
功能描述: 显示文件前面几行
-n 指定行数(不加默认显示前10行)

tail命令

命令名称: tail
命令所在路径: /usr/bin/tail
执行权限: 所有用户
语法: tail -n [行数] [文件名]
功能描述: 显示文件后面几行
-n 指定行数(不加默认显示后10行)
-f 动态显示文件末尾内容(监控日志)

链接命令

ln命令

命令名称: ln
命令英文原意: link
命令所在路径: /bin/ln
执行权限: 所有用户
语法: ln -s [原文件] [目标文件]
-s 创建软链接(不加创建硬链接)
功能描述: 生成链接文件

软链接
  1. 软链接全部都为lrwxrwxrwx,软链接权限不决定源文件权限,用户对软链接操作时具有什么权限由软链接对应的源文件确定
  2. 文件大小只是符号链接
  3. 软链接有箭头指向源文件
  4. 源文件删除,软链接失效
硬链接
  1. 拷贝(保留文件属性)cp -p + 同步更新
  2. 通过i节点识别(ls -i [文件名])(一个文件对应一个i节点,一个i节点可以对应多个文件)
  3. 不能跨分区(类似将windowsC盘的文件硬链接到D盘)
  4. 不能针对目录使用
  5. 源文件删除,硬链接依旧存在

权限管理命令

chmod命令

命令名称: chmod
命令英文原意: change the permissions mode of a file
命令所在路径: /bin/chmod
执行权限: 所有用户
语法: chmod [{ugoa} {+-=} {rwx}] [文件或目录]
[mode=421(rwx)] [文件或目录]
-R 递归修改主目录及主目录下所有目录或文件的权限
功能描述:改变文件或目录权限

如果有几个类型的用户需要同时设置权限,用逗号分隔

文件目录权限总结

代表字符 权限 对文件的含义 对目录的含义
r 读权限 可以查看文件内容 可以列出目录中内容
w 写权限 可以修改文件内容 可以在目录中创建、删除文件
x 执行权限 可以执行文件 可以进入目录

只有文件所有者和root可以改变文件权限

其他权限管理命令

chown命令

命令名称: chown
命令英文原意: change file ownership
命令所在路径: /bin/chown
执行权限: 所有用户
语法: chown [用户] [文件或目录]
功能描述: 改变文件或目录的所有者

只有root可以改变文件或目录的所有者

chgrp命令

命令名称: chgrp
命令英文原意: change file group ownership
命令所在路径: /bin/chgrp
执行权限: 所有用户
语法: chgrp [用户组] [文件或目录]
功能描述: 改变文件或目录的所属组

umask命令

命令名称: umask
命令英文原意: the user file-creation mask
命令所在路径: Shell内置命令
执行权限: 所有用户
语法: umask [-S]
-S 以rwx形式显示新建文件缺省(默认)权限
功能描述:显示、设置文件的缺省权限(默认)

新建文件默认不具有可执行权限;使用umask命令会显示0022,其中,0表示特殊权限,022为权限掩码,真正的权限(缺省)为777-022=755;修改默认权限可以通过下面方式

umask 权限掩码

文件搜索命令

搜索会占用大量的系统资源

find命令

命令名称: find
命令所在路径: /bin/find
执行权限: 所有用户
语法: find [搜索范围] [匹配条件]
-name 根据文件名搜索(严格区分大小写)
-iname 根据文件名搜索(不区分大小写)
-size 根据文件大小搜索
-user 根据所有者搜索
-group 根据所属组搜索
-amin 访问时间(access)
-cmin 文件属性(change)
-mmin 文件内容(modify)
-a 两个条件同时满足(and)
-o 两个条件满足任意一个即可(or)
-type 根据文件类型查找(f文件 d目录 l软链接文件)
-exec/-ok 命令 {} \; 对搜索结果执行操作(花括号表示对搜索结果做替换,反斜杠表示转义符,分号表示结束;-ok和-exec最大的区别是有一个询问确认的环节)
-inum 根据i节点搜索
功能描述: 文件搜索

find /etc -name init //在etc目录搜索文件名为init的文件和目录(精准搜索)
find /etc -name *init* //在etc目录搜索文件名中包含init的文件和目录(模糊搜索)
find /etc -name init* //在etc目录搜索以init开头的文件和目录(*匹配任意字符)
find /etc -name init??? //在etc目录搜索以init开头并且后面还有三个字母的文件或目录(问号匹配单个字符)
find / -size +204800 //在根目录下查找大于100MB的文件和目录
+n 大于 -n 小于 n 等于 1数据块=512字节=0.5k
find /etc -cmin -5 //在/etc下查找5分钟内被修改过属性的文件和目录
find /etc -mmin +5 //在/etc下查找5分钟前被修改过内容的文件和目录
find /etc -size +163840 -a -size -204800 //在/etc下查找大于8OMB小于100MB的文件和目录
find /etc -name init* -a -type f //在etc目录搜索以init开头的文件(没有目录)
find /etc -name inittab -exec ls -l {} \; //在/etc下查找inittab文件并显示其详细信息
find . -inum 123 -exec rm {} \; //在当前目录搜索i节点为123的文件和目录并删除

不要在服务器高峰期使用find命令;搜索范围越小越好,搜索条件越精准越好

其他搜索命令

locate命令

命令名称: locate
命令所在路径: /usr/bin/locate
执行权限: 所有用户
语法: locate 文件名
功能描述: 在文件资料库(自动定期更新)中查找文件(比find快)
-i 不区分大小写(不加区分大小写)

如果一个新建立的文件没有被收录,就查找不到,可以使用updatedb更新文件资料库;/tmp存放临时文件,(存放临时文件的目录)不在locate文件资料库收录范围,无法查找/tmp中文件

which命令

命令名称: which
命令所在路径: /usr/bin/which
执行权限: 所有用户
语法: which 命令名称
功能描述: 搜索命令所在目录及别名信息

whereis命令

命令名称: whereis
命令所在路径: /usr/bin/whereis
执行权限: 所有用户
语法: whereis [命令名称]
功能描述: 搜索命令所在目录及帮助文档路径(配置文件)

grep命令

命令名称: grep
命令所在路径: /bin/grep
执行权限: 所有用户
语法: grep -iv [指定字串] [文件]
功能描述: 在文件中搜寻字串匹配的行并输出
-i 不区分大小写
-v 排除指定字串
-n 输出行号
--color=auto 搜索出的关键字用颜色显示

grep -v ^# /etc/inittab  //搜索时去掉以#号开头的内容

帮助命令

man命令

命令名称: man
命令英文原意: manual
命令所在路径: /usr/bin/man
执行权限: 所有用户
语法: man [命令或配置文件]
功能描述: 获得(命令或配置文件的)帮助信息

man命令与more和less类似;man查看配置文件的帮助信息不要加绝对路径,只要加配置文件名称即可;1表示命令的帮助,5表示配置文件的帮助

whatis命令

命令名称: whatis
命令所在路径: /usr/bin/whatis
执行权限: 所有用户
语法: whatis [命令]
功能描述: 获得命令(相对man命令更为简短)的帮助信息

apropos命令

命令名称: apropos
命令所在路径: /usr/bin/apropos
执行权限: 所有用户
语法: apropos [配置文件]
功能描述: 获得配置文件(相对man命令更为简短)的帮助信息

info命令

命令名称: info
命令英文原意: information
命令所在路径: /usr/bin/info
执行权限: 所有用户
语法: info [命令或配置文件]
功能描述: 获得(命令或配置文件的)帮助信息

info命令与man命令类似,只是显示方式不同

--help

命令名称: --help
执行权限: 所有用户
语法: 命令 --help
功能描述: 获得命令主要选项的帮助信息(适用于外部命令)

help命令

命令名称: help
命令所在路径: Shell内置命令
执行权限: 所有用户
语法: help 命令
功能描述: 获得Shell(命令解释器)内置命令(找不到路径)的帮助信息(不能使用man查看)

可以使用type [命令名称],来查看是外部命令还是内置命令

用户管理命令

useradd命令

命令名称: useradd
命令所在路径: /usr/sbin/useradd
执行权限: root
语法: useradd 用户名
功能描述: 添加新用户

passwd命令

命令名称: passwd
命令所在路径: /usr/bin/passwd
执行权限: 所有用户
语法: passwd 用户名
功能描述: 设置用户密码

root用户更改密码不用遵循密码复杂度要求;普通用户更改密码必须遵循密码复杂度要求.root可以更改任何人的密码,普通用户只能更改自己的密码

who命令

命令名称: who
命令所在路径: /usr/bin/who
执行权限: 所有用户
语法: who
功能描述: 查看登录用户信息

登录用户名 登录终端(tty本地终端,pts远程终端) 登录时间 登录ip

w命令

命令名称: w
命令所在路径: /usr/bin/w
执行权限: 所有用户
语法: w
功能描述: 查看登录用户详细信息(比who更详细)

压缩解压命令

du命令

命令名称: du
命令英文原意: disk usage
命令所在路径: /usr/bin/du
执行权限: 所有用户
语法: du [文件或目录] -h
-h 以K,M,G为单位,提高信息的可读性
-s 仅显示每个参数的总计
功能描述: 显示文件或目录的大小

tar命令

命令名称: tar
命令所在路径: /bin/tar
执行权限:所有用户
语法: tar 选项[-cvf] 打包文件 源文件(可以有多个源文件,只打包解包不压缩)
-c 创建tar包
-x 解tar包
-v 显示详细信息(进度)
-f 备份文件(f必须放在后面)
-C 解包到指定路径
-z 压缩为.gz文件(将.gz文件解压)
-j 压缩为.bz2文件(将.bz2文件解压)
功能描述: 归档管理

tar -cvf xxx.tar 1.c 2.c 3.c    //将1.c,2.c,3.c打包至tar文件(* 全部打包)
tar -xvf xxx.tar -C 路径 //指定目录解包,不指定路径,默认在当前路径解包
tar -czvf xxx.tar.gz 1.c 2.c //打包同时压缩为.gz文件
tar -xzvf xxx.tar.gz //解压并解包
tar -cjvf xxx.tar.bz2 1.c 2.c //打包同时压缩为.bz2文件
tar -xjvf xxx.tar.bz2 //解压并解包

gzip命令

命令名称: gzip
命令英文原意: GNU zip
命令所在路径: /bin/gzip
执行权限: 所有用户
语法: gzip [文件]
功能描述: 压缩文件(自动生成.gz文件,且不保留源文件)
-d 解压文件
-r 压缩所有子目录中文件(不能压缩目录)
压缩后文件格式: .gz

gzip -r 目录(假设为test) //将test目录及其子目录下所有文件压缩为.gz文件
gzip -d -r 目录(假设为test) //将test目录及其子目录下所有文件解压

gunzip命令

命令名称: gunzip
命令英文原意: GNU unzip
命令所在路径: /bin/gunzip
执行权限: 所有用户
语法: gunzip [压缩文件]
功能描述: 解压.gz的压缩文件

bzip2命令

命令名称: bzip2
命令所在路径: /usr/bin/bzip2
执行权限: 所有用户
语法: bzip2 [文件]
功能描述: 压缩文件(自动生成.bz2文件,且不保留源文件,不能压缩目录,没有-r选项)
-d 解压文件
-k 产生压缩文件后保留源文件
压缩后文件格式: .bz2

bunzip2命令

命令名称: bunzip2
命令所在路径: /usr/bin/bunzip2
执行权限: 所有用户
语法: bunzip2 选项[-k] [压缩文件]
-k 解压后保留原文件
功能描述: 解压.bz2文件

zip命令

命令名称: zip
命令所在路径: /usr/bin/zip
执行权限: 所有用户
语法: zip 选项[-r] [压缩后文件名] [文件或目录]
-r 压缩目录
功能描述: 压缩文件或目录(能保留源文件)
压缩后文件格式: .zip

unzip命令

命令名称: unzip
命令所在路径: /usr/bin/unzip
执行权限: 所有用户
语法: unzip [压缩文件]
功能描述: 解压.zip的压缩文件

网络命令

write命令

命令名称: write
命令所在路径: /usr/bin/write
执行权限: 所有用户
语法: write <用户名>
功能描述: 给指定在线用户发信息,以Ctrl+D保存结束

wall命令

命令名称: wall
命令英文原意: write all
命令所在路径: /usr/bin/yvall
执行权限: 所有用户
语法: wall [message]
功能描述: 发广播信息(给所有在线用户发送)

ping命令

命令名称: ping
命令所在路径: /bin/ping
执行权限: 所有用户
语法: ping 选项 IP地址
-c 指定发送次数
功能描述: 测试网络连通性
范例: ping -c 3 ip地址 //ping三次

ifconfig命令

命令名称: ifconfig
命令英文原意: interface configure
命令所在路径: /sbin/ifconfig
执行权限: root
语法: ifconfig 网卡名称 IP地址
功能描述:查看和设置网卡信息
范例: #ifconfig eth0 192.168.8.250

mail 命令

命令名称: mail
命令所在路径: /bin/mail
执行权限: 所有用户
语法: mail [用户名]
功能描述: 查看发送电子邮件(以Ctrl+D保存结束)(查看邮件时直接使用mail,按q退出)

last命令

命令名称: last
命令所在路径: /usr/bin/last
执行权限: 所有用户
语法: last
功能描述: 列出目前与过去登入系统的用户信息

lastlog命令

命令名称: lastlog
命令所在路径: /usr/bin/lastlog
执行权限: 所有用户
语法: lastlog
-u 用户uid 查看指定用户登录
功能描述:检查某特定用户上次登录的时间

traceroute命令

命令名称: traceroute
命令所在路径: /bin/traceroute
执行权限: 所有用户
语法: traceroute
功能描述:显示数据包到主机间的路径

netstat命令

命令名称: netstat
命令所在路径: /bin/netstat
执行权限: 所有用户
语法: netstat [选项]
-a 全部信息
-t TCP协议
-u UDP协议
-l 监听
-r 路由(网关)
-n 显示IP地址和端口号
功能描述: 显示网络相关信息
范例:
netstat -tlun 查看本机监听的端口
netstat -an 查看本机所有的网络连接
netstat -rn 查看本机路由表

setup命令(red hat专有)

命令名称: setup
命令所在路径: /usr/bin/setup
执行权限: root
语法: setup
功能描述:配置网络

mount命令

命令名称: mount
命令位置: /bin/mount
执行权限: 所有用户
命令语法: mount [-t 文件系统] 设备文件名 挂载点
功能描述: 挂载设备
范例: mount -t iso9660 /dev/sr0 /mnt/cdrom

umount命令

命令名称: umount
命令位置: /bin/umount
执行权限: 所有用户
命令语法: umount 设备文件名
功能描述: 卸载设备
范例: umount /dev/sr0

关机重启命令

shutdown命令

命令名称: shutdown
命令语法: shutdown [选项] 时间
-c 取消前一个关机命令
-h 关机
-r 重启
功能描述: 关机重启
范例:
shutdown -h now 现在关机
shutdown -r 12:00 12:00重启
shutdown -c 取消前一个关机命令

halt命令

命令名称: halt
命令语法: halt
功能描述: 关机

poweroff命令

命令名称: poweroff
命令语法: poweroff
功能描述: 关机

相当于直接断电

init 0命令

命令名称: init 0
命令语法: init 0
功能描述: 关机

reboot命令

命令名称: reboot
命令语法: reboot
功能描述: 重启

init 6命令

命令名称: init 6
命令语法: init 6
功能描述: 重启

logout命令

命令名称: logout
命令语法: logout
功能描述: 退出登录

系统运行级别

0 关机
1 单用户(root用户,与windows下安全模式类似,启动最少的核心程序进行修复)(无图形界面)
2 不完全多用户,不含NFS(网络文件系统)服务(NFS不太安全)(无图形界面)
3 完全多用户(无图形界面)
4 未分配
5 图形界面(X)
6 重启

查看运行级别相关信息
cat /etc/inittab
查询系统当前运行级别
runlevel

文本编辑器Vim

Vim是一个功能强大的全屏幕文本编辑器,是Linux/UNIX上最常用的文本编辑器,它的作用是建立、编辑、显示文本文件.Vim没有菜单,只有命令.

Vim工作模式分为命令模式,插入模式和编辑模式.

Vim常用命令

插入命令

命令 作用
a 在光标所在字符后插入
A 在光标所在行行尾插入
i 在光标所在字符前插入
I 在光标所在行行首插入
o 在光标下插入新行
O 在光标上插入新行

定位命令

命令 作用
:set nu 设置行号
:set nonu 取消行号
gg
G
到第一行
到最后一行
nG 到第n行
:n 到第n行
$ 移至行尾
0 移至行首

删除命令

命令 作用
x 删除光标所在处字符
nx 删除光标所在处后n个字符
dd 删除光标所在行,ndd删除n行
dG 删除光标所在行到文件末尾内容
D 删除光标所在处到行尾内容
:x,yd 删除指定范围(x行到y行)的行

复制和剪切命令

命令 作用
yy 复制当前行
nyy 复制当前行(包括当前行)以下n行
dd 剪切当前行
ndd 剪切当前行(包括当前行)以下n行
p
P
粘贴在当前光标所在行下(p)
粘贴在当前光标所在行上(P)

替换和取消命令

命令 作用
r 取代光标所在处字符
R 从光标所在处开始替换字符,按Esc结束
u 取消上一步操作

搜索和搜索替换命令

命令 作用
/string 搜索指定字符串,搜索时忽略大小写:set ic(不忽略大小写:set noic)
n 搜索指定字符串的下一个出现位置
:%s/要被替换的字符串/新的字符串 全文替换指定字符串
:起始行,终止行s/要被替换的字符串/新的字符串 在一定范围内替换指定字符串
:%s/world/世界/g      //在全文范围内,将world替换为世界(g表示不询问,c表示询问确认)
:3,6s/world/世界/c //在3到6行,将world替换为世界(/g或/c可加可不加)

保存和退出命令

命令 作用
:w 保存修改
:w filename 另存为指定文件(可指定为某路径下的某文件)
:wq 保存修改并退出
ZZ 快捷键,保存修改并退出
:q! 不保存修改退出
:wq! (只读文件强行保存)保存修改并退出(文件所有者及root可使用)

Vim使用技巧

导入外部文件

:r 文件位置 //导入文件到当前vim编辑的文件中

不退出vim使用linux命令

:!命令 //不退出vim的情况下使用linux命令

将命令执行结果导入当前编辑文件

:r !date(或其他命令) //直接将date命令执行结果导入当前编辑文件

自定义快捷键(单行注释)

:map 快捷键 触发命令 //自定义快捷键

:map Ctrl+p I#<ESC>     //将在首行(I)添加#并退出插入模式(ESC)设置为快捷键Ctrl+p
:map Ctrl+b 0x //将光标移至行首并删除行首字符设置为快捷键Ctrl+b

连续行注释

:2,5s/^/#/g        //(类似于前面的替换)将2至5行的行首(^)增加#(g表示不询问)

:2,5s/#//g         //将2至5行中所有#删除

:2,5s/^#//g         //将2至5行的行首的所有#删除

:2,5s/^/\/\//g     //将2至5行的行首添加双斜杠(//),其中\/代表一个斜杠(转义)

:2,5s/^\/\///g    //将2至5行的行首的双斜杠(//)删除

文本替换

ab mymail 5201314@qq.com   //在文件中输入mymail,空格或回车后会自动替换为5201314@qq.com 

软件包管理

软件包管理简介

软件包分类

  • 源码包(绝大多数是C语言)
    1. 脚本安装包
  • 经过编译后的二进制包(RPM包,系统默认包)(现在更常用)
源码包

源码包的优点:

  • 开源,如果有足够的能力,可以修改源代码
  • 可以自由选择所需的功能
  • 软件是编译安装,所以更加适合自己的系统,更加稳定也效率更高
  • 卸载方便(直接删除源码包)

源码包的缺点:

  • 安装过程步骤较多,尤其安装较大的软件集合时( 如LAMP环境搭建),容易出现拼写错误
  • 编译过程时间较长,安装比二进制包安装时间长
  • 因为是编译安装,安装过程中一旦报错新手很难解决
二进制包

二进制包的优点:

  • 包管理系统简单,只通过几个命令就可以实现包的安装、升级、查询和卸载
  • 安装速度比源码包安装快的多

二进制包的缺点:

  • 经过编译,不再可以看到源代码
  • 功能选择不如源码包灵活
  • 依赖性

RPM包管理

rpm命令管理

包命名与依赖
RPM包命名规则

httpd-2.2.15-15.el6.centos.1.i686.rpm(包全名)
httpd 软件包名
2.2.15 软件版本
15 软件发布的次数
el6.centos 适合的Linux平台
i686 适合的硬件平台
rpm rpm包扩展名

RPM包依赖性
安装升级与卸载
RPM包安装

rpm -ivh 包全名

选项:
-i (install) 安装
-v (verbose) 显示详细信息
-h (hash) 显示进度
--nodeps 不检查依赖性

RPM包升级

rpm -Uvh 包全名

选项:
-U (upgrade) 升级

RPM包卸载

rpm -e 包名

选项:
-e (erase) 卸载
--nodeps 不检查依赖性

查询
查询是否安装

rpm -q 包名

选项:
-q (query) 查询

rpm -qa

选项:
-a (all) 全部

查询软件包详细信息

rpm -qi 包名

选项:
-i (information) 查询软件信息

rpm -qp 包全名

选项:
-p (package) 查询未安装包信息

查询包中文件安装位置

rpm -ql 包名

选项:
-l (list) 查询文件安装位置列表

rpm -qlp 包全名

选项:
-p (package) 查询未安装包的默认安装位置

查询系统文件属于哪个RPM包

rpm -qf 系统文件名

选项:
-f (file) 查询系统文件属于哪个RPM包

查询软件包的依赖性

rpm -q[p]R 包名[包全名]

选项:
-R (requires) 查询软件包的依赖性
-p (package) 查询未安装包的依赖性

校验和文件提取
RPM包校验

判断系统文件是否更改

rpm -V 包名

选项:
-V (verify) 校验指定RPM包中的文件

验证内容中的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)
RPM包中文件提取
rpm2cpio 包全名 | \ cpio -idv .文件绝对路径

“\\”代表一条命令没有输入完,(太长了)换行;”.”代表把指定路径的文件提取到当前路径下;

rmp2cpio /mnt/cdrom/Package/coreutils-8.4-19.el6.i686.rpm | cpio -idv ./bin/ls
//提取RPM包中ls命令到当前目录的/bin/ls下

rpm2cpio //将rpm包转换为cpio格式的命令

cpio //是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件

cpio 选项 <[文件/设备]

选项:
-i copy-in模式,还原
-d 还原时自动新建目录
-v 显示还原过程
< 输入重定向

yum在线管理

网络yum源
  • [base] 容器名称,一定要放在[]中
  • name 容器说明,可以自己随便写
  • mirrorlist 镜像站点,这个可以注释掉
  • baseurl yum源服务器的地址(为http)
  • enabled 此容器是否生效,如果不写或写成enable=1都是生效,写成enable=0就是不生效
  • gpgcheck 如果是1则指RPM的数字证书生效,如果是0则不生效
  • gpgkey 数字证书的公钥文件保存位置.不用修改
yum命令
查询
yum list           //查询所有可用软件包列表
yum search 关键字 //搜索服务器上所有和关键字相关的包
安装
yum -y install 包名

选项:
-y 自动回答yes

升级
yum -y update 包名   //不加包名时,升级所有软件包(包括linux内核,linux内核升级完成后需要在本地做一定的配置才能正常使用)
卸载
yum -y remove 包名

尽量不卸载

yum软件组管理命令
yum grouplist             //列出所有可用的软件组列表
yum groupinstall 软件组名 //安装指定软件组,组名可以由group1ist查询出来(如果组名有空格,用双引号括起来)
yum groupremove 软件组名 //卸载指定软件组
光盘yum源搭建

1.挂载光盘

mount /dev/cdrom /mnt/cdrom

2.让网络yum源文件失效

cd /etc/yum/repos.d/
将yum源文件(除了Centos-Meidia.repo)中改为enable=0;或者将它们改名

3.修改光盘yum源文件

vim Centos-Meidia.repo
将baseurl=http://修改baseurl=file://光盘挂载的绝对路径
注释多余的file:///路径(不存在的地址)
设置enable=1

源码包管理

源码包和RPM包的区别

  • 安装之前的区别: 概念上的区别
  • 安装之后的区别: 安装位置不同
RPM包安装位置

默认安装路径(绝大多数):

路径 作用
/etc/ 配置文件安装目录
/usr/bin/ 可执行的命令安装目录
/usr/lib/ 程序所使用的函数库保存位置
/usr/share/doc/ 基本的软件使用手册保存位置
/usr/share/man/ 帮助文件保存位置
源码包安装位置

安装在指定位置当中,一般是/usr/loca1/软件名/

安装位置不同带来的影响

RPM包安装的服务可以使用系统服务管理命令(service)来管理,例如RPM包安装的apache的启动方法是:

  1. /etc/rc.d/init.d/httpd start (方法1)
  2. service httpd start (方法2)

而源码包安装的服务则不能被服务管理命令管理,因为没有安装到默认路径中.所以只能用绝对路径进行服务的管理,如:

  • /usr/1oca1/apache2/bin/apachectl start

源码包安装过程

RPM包安装和源码包安装并不冲突(以apache为例)

1.安装准备
  1. 安装gcc编译器
  2. 下载源码包
2.安装注意事项
  • 源代码保存位置: /usr/local/src/
  • 软件安装位置: /usr/local/
  • 如何确定安装过程报错:
    • 安装过程停止
    • 并出现error、warning或no的提示
3.源码包安装过程
  1. 解压下载的源码包

  2. 进入解压目录(INSTALL是安装说明,README是使用说明)

  3. ./configure —prefix=/usr/local/apache2(指定安装路径)

    ./configure 软件配置与检查

    • 定义需要的功能选项
    • 检测系统环境是否符合安装要求
    • 把定义好的功能选项和检测系统环境的信息都写入Makefile文件,用于后续的编辑
  4. make 编译

  5. make install 编译安装(向真正的安装目录写入数据)

  6. /usr/1oca1/apache2/bin/apachectl start 启动

./configure和make都不会向真正的指定安装位置写任何数据,如果这两步报错不用删除软件包,只需执行make clean,清空编译产生的临时文件

源码包的卸载

不需要卸载命令,直接删除安装目录即可,不会遗留任何垃圾文件.

脚本安装包

脚本安装包简介

  • 脚本安装包并不是独立的软件包类型,常见安装的是源码包
  • 是人为把安装过程写成了自动安装的脚本,只要执行脚本,定义简单的参数,就可以完成安装
  • 非常类似于Windows下软件的安装方式
  • 主要是安装驱动

脚本安装包安装过程

  1. 下载脚本安装包
  2. 解压脚本安装包
  3. 进入解压目录
  4. ./setup.sh
  5. 可能会询问一些可选的选项(回车->默认),Ctrl+退格删除输入错误的字符

用户和用户组管理

用户配置文件

用户管理简介

  • 越是对安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范
  • 在Linux中主要是通过用户配置文件来查看和修改用户信息

用户信息文件

用户信息文件/etc/passwd(使用man 5 passwd查看[注意:是文件名而不是绝对路径])(用冒号分开),7个字段

  1. 第1字段: 用户名称
  2. 第2字段: 密码标志(x表示有密码,否则只允许本机登录,禁用ssh)
  3. 第3字段: UID (用户ID)

    • 0: 超级用户
    • 1-499:系统用户(伪用户,不能登录,不能删除)
    • 500-65535:普通用户
  4. 第4字段: GID (用户初始组ID)
  5. 第5字段: 用户说明(备注)
  6. 第6字段: 家目录
    • 普通用户: /home/用户名/
    • 超级用户: /root/
  7. 第7字段: 登录之后的Shell
初始组和附加组
  • 初始组:就是指用户一登录就立刻拥有这个用户组的相关权限,每个用户的初始组必须有且只能有一个,一般就是和这个用户的用户名相同的组名作为这个用户的初始组
  • 附加组:指用户可以加入多个其他的用户组,并拥有这些组的权限,附加组可以有多个

用户密码文件(影子文件)

影子文件/etc/shadow(权限为000)(用冒号分隔),9个字段

  1. 第1字段: 用户名称
  2. 第2字段: 加密密码
    • 加密算法升级为SHA512散列加密算法
    • 如果密码位是”!!”或”*“代表没有密码,不能登录
  3. 第3字段: 密码最后一次修改日期

    • 使用1970年1月1日作为标准时间,每过一天时间戳加1
  4. 第4字段: 两次密码的修改间隔时间(和第3字段相比)(多少天后密码才能修改)
  5. 第5字段: 密码有效期(和第3字段相比)
  6. 第6字段: 密码修改到期前的警告天数(和第5字段相比)
  7. 第7字段: 密码过期后的宽限天数(和第5字段相比)(如果不改会禁止登陆)
    • 0: 代表密码过期后立即失效
    • -1: 代表密码永远不会失效
  8. 第8字段: 账号失效时间
    • 要用时间戳表示
  9. 第9字段: 保留
时间戳换算

把时间戳换算为日期:

  • date -d “1970-01-01 时间戳 days”

把日期换算为时间戳:

  • echo $(($(date —date=”日期” +%s)/86400+1))

组信息文件

组信息文件/etc/group,4个字段

  1. 第1字段: 组名称
  2. 第2字段: 组密码标志(x)
  3. 第3字段: GID (初始组ID)

  4. 第4字段: 组中附加用户

组密码文件

组密码文件/etc/gshadow,4个字段

  1. 第1字段: 组名称
  2. 第2字段: 组密码
  3. 第3字段: 组管理员用户名
  4. 第4字段: 组中附加用户

用户管理相关文件

用户家目录

  • 普通用户: /home/用户名/,所有者和所属组都是此用户,权限是700
  • 超级用户: /root/, 所有者和所属组都是root用户,权限是550

把普通用户变为超级用户可以修改UID,但家目录保持不变

用户邮箱

/var/spool/mail/用户名/

用户模板目录

/etc/skel/

创建新用户时,新用户家目录会包含这些模板

用户管理命令

添加用户

useradd [选项] 用户名

选项:
-u UID 添加用户并指定用户的UID号
-d 家目录 添加用户并指定用户的家目录
-c 用户说明 添加用户并指定用户的说明
-g 组名 添加用户并指定用户的初始组
-G 组名 添加用户并指定用户的附加组(指定多个附加组用逗号分隔)
-s shell 添加用户并指定用户的登录shell,默认是/bin/bash

用户默认值文件

/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 #最大UID范围
  • ENCRYPT_METHOD SHA512 #密码加密模式

修改用户密码

passwd [选项] 用户名

选项:
-S 查询用户密码的密码状态,仅root用户可用
-l 暂时锁定用户,仅root用户可用(实际是在/etc/shadow中加密密码前添加!!)
-u 解锁用户,仅root用户可用
--stdin 可以通过管道符输出的数据作为用户的密码

root和普通用户可以使用passwd修改自己的密码,root也可以修改其他用户的密码

echo "123" | passwd --stdin user   //将123作为用户user的密码

修改用户信息

usermod [选项] 用户名

选项:
-u UID 手工修改已存在用户的UID号
-d 家目录 手工修改已存在用户的家目录
-c 用户说明 手工修改已存在用户的说明
-g 组名 手工修改已存在用户的初始组
-G 组名 手工修改已存在用户的附加组(指定多个附加组用逗号分隔)
-s shell 手工修改已存在用户的登录shell,默认是/bin/bash
-L 临时锁定已存在用户(Lock)
-U 解锁已存在用户锁定(Unlock)

usermod语法与useradd基本类似,usermod是修改已存在用户的信息,而useradd是添加一个新用户并修改相关信息(/etc/passwd)

修改用户密码状态

chage [选项] 用户名

选项:
-l 列出用户的详细密码状态
-d 日期 修改密码最后一次更改日期(shadow3字段)
-m 天数 两次密码修改间隔(4字段)
-M 天数 密码有效期(5字段)
-W 天数 密码过期前警告天数(6字段)
-I 天数 密码过后宽限天数(7字段)
-E 日期 账号失效时间(8字段)

(修改的是/etc/shadow)

chage -d 0 user   //user登录后要求修改密码

删除用户

userdel [-r] 用户名

选项:
-r 删除用户的同时删除用户家目录

手工删除用户

手工删除用户user
vi /etc/passwd 前4条命令是删除文件中与user相关的语句
vi /etc/shadow
vi /etc/group
vi /etc/gshadow
rm -rf /var/spool/mail/user
rm -rf /home/user/

切换用户

su [选项] 用户名

选项:
- 选项只使用”-“代表连带用户的环境变量一起切换(这个不能省)
-c 命令 仅执行一次命令,而不切换用户身份

su -root -c "useradd user"  //不切换成root,但是借助root执行useradd命令添加user用户

查看用户ID

id 用户名

uid(用户id),gid(初始组id),group(附加组id)

用户组管理命令

添加用户组

groupadd [选项] 组名

选项:
-g GID 指定组id(不加默认从500依次往后排)

修改用户组

groupmod [选项] 组名

选项:
-g GID 修改已存在组的组id
-n 新组名 老组名 修改组名

删除用户组

groupdel 组名

组中有初始用户则不能删除(必须先删除初始用户再删除组),组中只有附加用户则可以删除

把用户添加入组或从组中删除

gpasswd 选项 组名

选项:
-a 用户名 把用户加入组(附加用户)
-d 用户名 把用户从组中删除

权限管理

ACL权限

任何文件只能有一个所属组;当所有者,所属组,其他人身份不够用时,要用到ACL权限给用户分配权限

ACL权限简介与开启

查看分区是否支持ACL权限

默认都支持,保险起见查一下

dumpe2fs -h 分区

dumpe2fs命令是查询指定分区详细文件系统信息的命令(使用df -h查看分区信息),查看Default mount options处是否支持ACL

选项:
-h 仅显示超级块中信息,而不显示磁盘块组的详细信息

临时开启分区ACL权限

mount -o remount,acl

重新挂载根分区,并挂载加入acl权限(-o表示支持特殊挂载选项,remount重新挂载)

永久开启分区ACL权限
vi /etc/fstab    #(fstab是系统开机自动挂载文件,改这个文件要谨慎)在UUID的defaults后面添加",acl",保存并重启   
#如果不重启,将根分区重新挂载
mount -o remount / #将根分区重新挂载

查看与设定ACL权限

查看ACL权限

getfacl 文件名 #查看ACL权限(不支持绝对路径,但不影响执行)

设定ACL权限

setfacl 选项 文件名

选项:
-m 设定ACL权限
-x 删除指定的ACL权限
-b 删除所有的ACL权限
-d 设定默认ACL权限
-k 删除默认ACL权限
-R 递归设定ACL权限

setfacl -m u:用户名:权限 文件名或目录    #其中u代表用户,g代表组
setfacl -m u:user:rx /project/

用ll命令查看会多个加号

最大有效权限与删除ACL权限

最大有效权限mask

mask是用来指定最大有效权限的.如果给用户赋予了ACL权限,是需要和mask的权限“相与”才能得到用户的真正权限

以读权限(r)为例

a b and
r r r
r - -
- r -
- - -
修改最大有效权限
setfacl -m m:权限 文件名或目录  #m表示最大有效权限mask(修改后可能会多出#effective注释,代表实际权限)
删除ACL权限

方法一

setfacl -x u:用户名 文件名或目录     #删除指定用户的ACL权限
setfacl -x g:组名 文件名或目录 #删除指定用户组的ACL权限

方法二

setfacl -b 文件名或目录      #删除所有的ACL权限

默认ACL权限与递归ACL权限

默认ACL权限
  • 默认ACL权限的作用是如果给父目录设定了默认ACL权限,那么父目录中所有新建的子文件都会继承父目录的ACL权限
  • setfacl -m d:u:用户名:权限 目录 (d表示设定默认ACL权限)
递归ACL权限
  • 递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限
  • setfacl -m u:用户名:权限 -R 目录

文件特殊权限

SetUID

SetUID的功能
  • 只有可以执行的二进制程序才能设定SUID权限(才有意义)
  • 命令执行者要对该程序拥有x(执行)权限
  • 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
  • SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
  • 在所有者(u)范围拥有s权限(超级用户)
  • passwd命令拥有SetUID权限,所以普通可以修改自己的密码
  • cat命令没有SetUID权限,所以普通用户不能查看/etc/shadow文件内容
设定SetUID的方法
  1. chmod 4755 文件名 #4代表SUID,2代表SGID,1代表SBIT
  2. chmod u+s 文件名

如果命令执行者对该程序没有x(执行)权限,设定后的s权限为S(大写),此时SUID不能生效

取消SetUID的方法
  1. chmod 755 文件名
  2. chmod u-s 文件名
注意事项
  • 关键目录应严格控制写权限.比如”/“、”/usr”等
  • 用户的密码设置要严格遵守密码三原则
  • 对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限

SetGID

在所属组(g)范围拥有s权限(locate具有SGID)

SetGID针对文件的作用
  • 只有可执行的二进制程序才能设置SGID权限
  • 命令执行者要对该程序拥有x(执行)权限
  • 命令执行在执行程序的时候,组身份升级为该程序文件的属组
  • SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
SetGID针对目录的作用
  • 普通用户必须对此目录拥有r和x权限,才能进入此目录
  • 普通用户在此目录中的有效组会变成此目录的属组
  • 若普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组
设定SetGID
  1. chmod 2755 文件名 (2代表SGID)
  2. chmod g+s 文件名
取消SetGID的方法
  1. chmod 755 文件名
  2. chmod g-s 文件名

Sticky BIT

在其他人范围拥有t权限(/tmp)

SBIT粘着位作用
  • 粘着位目前只对目录有效
  • 普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限
  • 如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件.一但赋予了粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件
设置粘着位
  1. chmod 1755 目录名
  2. chmod o+t 目录名
取消粘着位
  1. chmod 755 目录名
  2. chmod o-t 目录名

文件系统属性chattr权限

chattr命令

chattr [+-=][选项] 文件或目录名 #对root用户也生效

  • + 增加权限
  • - 删除权限
  • \= 赋予权限

选项:

  • i:如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i属性,那么只能修改目录下文件的数据,但不允许建立和删除文件
  • a:如果对文件设置a属性,那么只能在文件中增加数据,但是不能删除也不能修改已有数据;如果对目录设置a属性,那么只允许在目录中建立和修改文件,但是不允许删除

查看文件系统属性

lsattr 选项 文件名

选项:
-a 显示所有文件和目录
-d 若目标是目录,仅列出目录本身的属性,而不是子文件的

系统命令sudo权限

sudo权限

  • root把本来只能超级用户执行的命令赋普通用户执行
  • sudo的操作对象是系统命令

sudo使用

sudo赋予命令

sudo的配置文档是/etc/sudoers ,我们能够用他的专用编辑工具visudo对其进行编辑 ,此工具的好处是在添加规则有误时,保存退出会提示给我们错误信息

[root@localhost ~ ]# visudo

实际修改的是/etc/sudoers文件

root ALL=(ALL) ALL

用户名 被管理主机的地址(本机IP或ALL)=(可使用的身份) 授权命令 (绝对路径)

%wheel ALL=(ALL) ALL

%组名 被管理主机的地址= (可使用的身份) 授权命令 (绝对路径)

[root@localhost ~ ]#visudo      修改/etc/sudoers文件
user ALL=/sbin/shutdown -r now 授权user用户可以重启服务器
普通用户执行sudo赋予的命令

sudo -l #查看可用的sudo命令

sudo /sbin/shutdown -r now #sudo执行重启

文件系统管理

分区与文件系统

分区类型

  • 主分区:总共最多只能分四个
  • 扩展分区:只能有一个,也算作主分区的一种,也就是说主分区加扩展分区最多有四个.但是扩展分区不能存储数据和格式化,必须再划分成逻辑分区才能使用
  • 逻辑分区:逻辑分区是在扩展分区中划分的,如果是IDE硬盘(hd),Linux最多持59个逻辑分区,如果是SCSI硬盘(sd)Linux最多支持11个逻辑分区
分区方法一

分区 设备文件名
主分区1 /dev/sda1(a代表第一块硬盘)
主分区2 /dev/sda2
主分区3 /dev/sda3
拓展分区 /dev/sda4
逻辑分区1 /dev/sda5
逻辑分区2 /dev/sda6
逻辑分区3 /dev/sda7
分区方法二

分区 设备文件名
主分区1 /dev/sda1
拓展分区 /dev/sda2
逻辑分区1 /dev/sda5
逻辑分区2 /dev/sda6
逻辑分区3 /dev/sda7

文件系统

  • ext2: 是ext文件系统的升级版本,Red Hat Linux7.2版本以前的系统默认都是ext2文件系统.最大支持16TB的分区和最大2TB的文件
  • ext3 : ext3文件系统是ext2文件系统的升级版本,最大的区别就是带日志功能,以便在系统突然停止时提高文件系统的可靠性.支持最大16TB的分区和最大2TB的文件
  • ext4: 它是ext3文件系统的升级版.ext4在性能、伸缩性和可靠性方面进行了大量改进.ext4的变化可以说是翻天覆地的,比如向下兼容ext3、最大1EB文件系统和16TB文件、无限数量子目录、Extents连续数据块概念、多块分配、延迟分配、持久预分配、快速FSCK、日志校验、无日志模式、在线碎片整理、inode增强、默认启用barrier等.是CentOS 6.3的默认文件系统.
    (1EB=1024PB=1 024*1024TB )

文件系统常见命令

文件系统查看命令(df)

df [选项] [挂载点]

选项:
-a 显示所有的文件系统信息,包括特殊文件系统,如/proc、/sysfs
-h 使用习惯单位显示容量,如KB,MB或GB等
-T 显示文件系统类型
-m 以MB为单位显示容量
-k 以KB为单位显示容量,默认就是以KB为单位

统计目录或文件大小(du)

du [选项] [目录或文件名]

选项:
-a 显示每个子文件的磁盘占用量,默认只统计子目录的磁盘占用量
-h 使用习惯单位显示磁盘占用量,如KB,MB或GB等
-s 统计总占用量,而不列出子目录和子文件的占用量

统计文件大小一般用ls;统计目录大小用du命令,不要用ls命令

df命令与du命令的区别

  • df命令是从文件系统考虑的,不光要考虑文件占用的空间,还要统计被命令或程序占用的空间(最常见的就是文件已经删除但是程序并没有释放空间)(df看到的一般比du大)(df更准确)
  • du命令是面向文件的,只会计算文件或目录占用的空间

文件系统修复命令(fsck)

fsck [选项] 分区设备文件名

选项:
-a 不用显示用户提示,自动修复文件系统
-y 自动修复,和-a作用一致,不过有些文件系统只支持-y

一般不需要手工执行

显示磁盘状态命令(dump2fs)

dump2fs 分区设备名

可以查看硬盘的UUID

挂载命令(mount)

查询与自动挂载

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命令执行时,是否会自动安装/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 写入代表文件系统支持组磁盘配额,默认不支持
mount -o remount,noexec /home
挂载光盘和U盘
挂载光盘
  1. mkdir /mnt/cdrom #建立挂载点
  2. mount -t iso9660 /dev/cdrom /mnt/cdrom #挂载光盘
  3. mount /dev/sr0 /mnt/cdrom #2,3均可以挂载光盘
  4. 去挂载点访问光盘
  5. umount 设备文件名或挂载点 #卸载光盘,注意不能在光盘中执行此命令

光盘设备名:

  • /dev/cdrom
  • /dev/sr0
挂载U盘

U盘设备文件名是自动分配的

  1. fdisk -l #查看U盘设备文件名
  2. mount -t vfat /dev/sdb1 /mnt/usb #挂载U盘
  3. umount 设备文件名或挂载点

注意:Linux把fat16识别为fat,把fat32识别为vfat;Linux默认是不支持NTFS文件系统的

支持NTFS文件系统

可通过内核编译(复杂且使用较少)或使用NTFS插件使Linux支持NTFS文件系统,详细过程点击链接查看

fdisk分区

fdisk命令分区过程

  1. 添加新硬盘
  2. fdisk -l #查看新硬盘
  3. fdisk /dev/sdb #使用fdisk命令分区(Ctrl+退格删除)
  4. partprobe或重启 #重新读取分区表信息(如果分区表被占用)
  5. mkfs -t ext4 /dev/sdb1 #格式化分区
  6. mkdir /disk1 #建立挂载点
  7. mount /dev/sdb1 /disk1/ #挂载

Linux通过id识别Linux分区到底是什么,Linux标准分区id是83,swap分区id是82;详细过程点击链接查看

分区自动挂载与fstab文件修复

/etc/fstab文件
  • 第一字段: 分区设备文件名或UUID(硬盘通用唯一识别码)
  • 第二字段: 挂载点
  • 第三字段: 文件系统名称
  • 第四字段: 挂载参数
  • 第五字段: 指定分区是否被dump备份,0代表不备份,1代表每天备份,2代表不定期备份
  • 第六字段: 指定分区是否被fsck检测,0代表不检测,其他数字代表检测的优先级,那么当然1的优先级比2高
分区自动挂载

方法1:手工修改/etc/fstab(写错会系统崩溃)

  1. vi /etc/fstab
  2. /dev/sdb1 /disk1 ext4 defaults 1 2 #安装格式填入挂载内容

方法2:使用mount命令

  1. mount -a #依据配置文件/etc/fstab的内容,自动挂载
/etc/fstab文件修复

系统崩溃后,修改/etc/fstab文件时无法写入,使用下面命令

  1. mount -o remount,rw / #这种修复方式不是万能的

分配swap分区

free命令

[root@localhost ~]# free -m #查看内存与swap分区使用状况,m不是按照MB查看

  • cached(缓存): 是指把读取出来的数据保存在内存当中,当再次读取时,不用读取硬盘而直接从内存当中读取,加速了数据的读取过程
  • buffer(缓冲): 是指在写入数据时,先把分散的写入操作保存到内存当中,当达到一定程度再集中写入硬盘,减少了磁盘碎片和硬盘的反复寻道,加速了数据的写入过程

新建swap分区

[root@localhost ~]# fdisk /dev/sdb #注意要把swap分区id改为82

格式化

[root@localhost ~]# mkswap /dev/sdb6

加入swap分区

[root@localhost ~]# swapon /dev/sdb6 #加入swap分区

[root@localhost ~]# swapoff /dev/sdb6 #取消swap分区

swap分区开机自动挂载

[root@localhost ~]# vi /etc/fstab
/dev/sdb6 swap swap defaults 0 0

shell基础

Shell概述

Shell简介

  • Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序
  • Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强.Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令

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

Linux支持的Shell

打开/etc/shells文件查看Linux支持的Shell

Shell脚本的执行方式

echo输出命令

[root@localhost ~]# echo [选项] [输出内容]
选项:
-e 支持反斜线控制的字符转换

控制字符 作用
\\\\ 输出\本身
\\a 输出警告音
\\b 退格键,也就是向左删除键
\\c 取消输出行末的换行符,和“-n”选项一致
\\e ESCAPE键
\\f 换页符
\\n 换行符
\\r 回车键
\\t 制表符,也就是Tab键
\\v 垂直制表符
\\0nnn 按照八进制ASCII码表输出字符,其中0为数字零,nnn是三位八进制数
\\xhh 按照十六进制ASCII码表输出字符,其中hh是两位十六进制数
echo -e "\e[1;31mabcd\e[0m"    #输出颜色
#30m=黑色,31m=红色,32m=绿色,33m=黄色
#34m=蓝色,35m=洋红,36m=青色,37m=白色

脚本执行

  1. 赋予执行权限,直接运行
    • chmod 755 hello.sh
    • ./hello.sh
  2. 通过Bash调用执行脚本
    • bash hello.sh

在Linux中回车符识别为$,windows回车符识别为^M$,所以Linux无法识别在windows编写的脚本,将在windows编写的脚本转换为Linux可识别的脚本,可使用dos2unix命令

格式: dos2unix 文件名

Bash的基本功能

历史命令与命令补全

历史命令

[root@localhost~]# history [选项] [历史命令保存文件]
选项:
-c 清空历史命令
-w 把缓存中的历史命令写入历史命令保存文件~/.bash_history

历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改,超过1000条会删除前面的,保留后面的.

  • 使用上、下箭头调用以前的历史命令
  • 使用”!n”重新执行第n条历史命令
  • 使用”!!”重新执行上一条命令
  • 使用”!字串”重新执行最后一条以该字串开头的命令
命令补全

在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件
时,按”Tab”键就会自动进行补全,如果有很多条可能不会显示,再按一下即可

命令别名与常用快捷键

命令别名

[root@localhost ~]# alias 别名=’原命令’

设定命令别名

[root@localhost ~]# alias

查询命令别名

使用命令行设定别名只会临时生效;使用别名时要注意命令执行顺序

命令执行顺序
  1. 第一顺位执行用绝对路径或相对路径执行的命令
  2. 第二顺位执行别名
  3. 第三顺位执行Bash的内部命令
  4. 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
让别名永久生效

[root@localhost ~]# vi /用户名/.bashrc #修改其中相关内容

常用快捷键
快捷键 作用
Ctr1+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 恢复屏幕输出

输入输出重定向

标准输入输出
设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /dev/stderr 2 标准错误输出
输出重定向
类型 符号 作用
标准输出重定向 命令 > 文件 以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中
命令 >> 文件 以追加的方式,把命令的正确输出输出到指定的文件或设备当中
标准错误输出重定向 错误命令 2> 文件 以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中
错误命令 2>> 文件 以追加的方式,把命令的错误输出输出到指定的文件或设备当中
正确输出和错误输出同时保存 命令 > 文件 2>&1 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
命令 >> 文件 2>&1 以追加的方式,把正确输出和错误输出都保存到同一个文件当中
命令 &> 文件 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
命令 &>> 文件 以追加的方式,把正确输出和错误输出都保存到同一个文件当中
命令 >> 文件1 2>>文件2 把正确的输出追加到文件1中,把错误的输出追加到文件2中
  • 注意2与大于号(>)之间不能有空格,命令与大于号之间,文件与大于号之间最好也有空格
  • 2>&1表示把错误输出保存到正确输出中
  • ls &> /dev/null #把ls结果丢进垃圾箱
输入重定向

[root@localhost~] # wc [选项] [文件名]
选项:
-c 统计字节数
-w 统计单词数
-l 统计行数

Ctrl+d结束输入(wc会统计回车符)

wc < 文件名   #统计该文件行数等信息
wc << test #当第一次遇到test时停止,统计test之前的内容

多命令顺序执行与管道符

多命令顺序执行
多命令执行符 格式 作用
; 命令1 ; 命令2 多个命令顺序执行,命令之间没有任何逻辑联系
&& 命令1 && 命令2 逻辑与
当命令1正确执行,则命令2才会执行
当命令1执行不正确,则命令2不会执行
\ \ 命令1 \ \ 命令2 逻辑或
当命令1执行不正确,则命令2才会执行
当命令1正确执行,则命令2不会执行
dd命令

用于磁盘复制

[root@localhost ~]# dd if=输入文件 of=输出文件 bs=字节数 count=个数
选项:
if=输入文件 指定源文件或源设备
of=输出文件 指定目标文件或目标设备
bs=字节数 指定一次输入/输出多少字节,即把这些字节看做一个数据块
count=个数 指定输入/输出多少个数据块

date ; dd if=/dev/zero of=/root/test bs=1k count=102400 ; date     #记录/dev/zero向/root/test复制100MB
命令 && echo yes || echo no #如果命令正确执行则输出yes,否则输出no
管道符

[root@localhost ~]# 命令1|命令2

命令1的正确输出作为命令2的操作对象

通配符与其他特殊符号

通配符
通配符 作用
? 匹配一个任意字符
* 匹配0个或任意多个任意字符,也就是可以匹配任何内容
[] 匹配中括号中任意一个字符.例如:[abc]代表一定匹配一个字符,或者是a,或者是b,或者是c
[-] 匹配中括号中任意一个字符,代表一个范围.例如: [a-z]代表匹配一个小写字母
逻辑非,表示匹配不是中括号内的一个字符.例如: [\^0-9]代表匹配一个不是数字的字符
其他特殊符号
符号 作用
‘’ 单引号.在单引号中所有的特殊符号,如”$“和”`”(反引号)都没有特殊含义
“” 双引号.在双引号中特殊符号都没有特殊含义,但是”$“、”`”和”\\”是例外,拥有”调用变量的值”、”引用命令”和”转义符”的特殊含义
` 反引号.反引号括起来的内容是系统命令,在bash中会先执行它.和$()作用一样,不过推荐使用​$(),因为反引号非常容易看错
$() 和反引号作用一样,用来引用系统命令
# 在Shell脚本中,#开头的行代表注释
$ 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值
\\ 转义符.跟在\\之后的特殊符号将失去特殊含义,变为普通字符.如$将输出”$“符号,而不当做是变量引用

Bash的变量

shell中默认变量类型为字符型

变量分类

  • 用户自定义变量(本地变量)
  • 环境变量: 这种变量中主要保存的是和系统操作环境相关的数据
  • 位置参数变量: 这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
  • 预定义变量: 是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的

用户自定义变量

或者叫本地变量

变量设置规则
  • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头
  • 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必需指定变量类型为数值型
  • 变量用等号连接值,等号左右两侧不能有空格
  • 变量的值如果有空格,需要使用单引号或双引号括起来
  • 在变量的值中,可以使用”\\”转义符
  • 如果需要增加变量的值,那么可以进行变量值的叠加.不过变量需要用双引号包含”$变量名”或用${变量名}包含
  • 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令
  • 环境变量名建议大写,便于区分
变量叠加
abc=123           #abc值为123
abc="$abc"456 #给abc的值追加456
abc=${abc}789 #给abc的值追加789
变量调用

echo $变量名

变量查看

set

查看系统所有变量

变量删除

unset 变量名

环境变量

环境变量特点
  • 用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效.如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效
设置环境变量

export 变量名[=变量值] #声明变量(export表示把变量声明为全局变量)

查询环境变量

env

专门用于查询环境变量(删除变量依旧是unset+变量名)

系统常见环境变量
PATH

系统查找命令的路径

如果想令自己的脚本在任何路径都能直接运行,可以将其加入PATH

方法一:

直接将脚本拷贝到PATH所指向的路径

方法二:

通过变量叠加,为PATH增加新的路径(临时生效,必须写入指定文件)

例如:PATH=”$PATH”:/root #将root目录加入环境变量

PS1

定义系统提示符的变量

严格来说PS1不是环境变量(env查询不到,set可以查询到),PS1是系统预留的专门用来定义系统操作环境的变量

\d: 显示日期,格式为“星期 月 日”
\h: 显示简写主机名.如默认主机名“localhost”
\t: 显示24小时制时间,格式为“HH:MM:SS”
\T: 显示12小时制时间,格式为“HH:MM:SS”
\A: 显示24小时制时间,格式为“HH:MM”
\u: 显示当前用户名
\w: 显示当前所在目录的完整名称
\W: 显示当前所在目录的最后一个目录
\#: 执行的第几个命令
\\$: 提示符.如果是root用户会显示提示符为“#”,如果是普通用户会显示提示符为“$”

位置参数变量

位置参数变量 作用
$n n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}
$* 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,$@把每个参数区分对待
$# 这个变量代表命令行中所有参数的个数
for x in "$*"
do
echo $x
done
for y in "$@"
do
echo $y
done

预定义变量

预定义变量 作用
$? 最后一次执行的命令的返回状态.如果这个变量的值为0,证明
上一个命令正确执行;如果这个变量的值为非0(具体是哪个
数,由命令自己来决定),则证明上一个命令执行不正确
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)
接收键盘输入

[root@localhost ~]# read [选项] [变量名]
选项:
-p “提示信息” 在等待read输入时,输出提示信息
-t 秒数 read命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数 read命令只接受指定的字符数,就会执行
-s 隐藏输入的数据,适用于机密信息的输入

Bash的运算符

数值运算与运算符

变量直接相加无法达到预计的效果.

declare声明变量类型

[root@localhost ~]# declare [+/-] [选项] 变量名
选项:
- 给变量设定类型属性
+ 取消变量的类型属性
-i 将变量声明为整数型(integer)
-x 将变量声明为环境变量
-p 显示指定变量的被声明的类型

使用export声明环境变量其实就是赋予变量declare -x属性

数值运算
方法1

使用declare将变量声明为整数型

x=11
y=22
declare -i z=$x+$y
echo $z

方法2

使用expr或let数值运算工具

x=11
y=22
z=$(expr $x + $y) 注意“+”号左右两侧必须有空格

方法3(推荐)

“$((运算式))”或”$[运算式]”

x=11
y=22
m=$(($x+$y))
n=$[$y-$x]
echo $m
echo $n

运算符

变量测试与内容替换

环境变量配置文件

环境变量配置文件简介

source命令

[root@localhost~]# source 配置文件

[root@localhost~]# . 配置文件

让配置文件直接生效而不用注销或重新登录

环境变量配置文件简介
  • 环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME等默认环境变量
  • /etc/profile
  • /etc/profile.d/*.sh
  • ~/.bash_profile
  • ~/.bashrc
  • /etc/bashrc
  • 位于/etc目录下的环境变量配置文件对全局(任何用户)起作用

环境变量配置文件作用

越往后文件优先级越高

/etc/profile的作用
  • USER变量
  • LOGNAME变量
  • MAIL变量
  • PATH变量
  • HOSTNAME变量
  • HISTSIZE变量
  • umask
  • 调用/etc/profile.d/* .sh文件
~/.bash_profile的作用
  • 调用了~/.bashrc文件
  • 在PATH变量后面加入了”:$HOME/bin”这个目录
/etc/bashrc的作用
  • 定义登录提示符

其他配置文件和登录信息

注销时生效的环境变量配置文件
  • ~/.bash_logout
  • 默认为空
其他配置文件
  • ~/bash_history
shell登录信息
  • 本地终端欢迎信息(登录前):/etc/issue

  • 远程终端欢迎信息(登录前):/etc/issue.net
    • 转义符在/etc/issue.net文件中不能使用
    • 是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入“Banner /etc/issue.net”行才能显示(记得重启SSH服务:service sshd restart)
  • 登录后欢迎信息:/etc/motd
    • 不管是本地登录,还是远程登录,都可以显示此欢迎信息,只不过是登录后显示欢迎信息

shell编程

基础正则表达式

正则表达式与通配符

  • 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配. grep、awk、sed等命令可以支持正则表达式
  • 通配符用来在系统中匹配符合条件的文件名,通配符是完全匹配. ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了

基础正则表达式

元字符 作用
* 前一个字符匹配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位的小写字母
#"*" 前一个字符匹配0次或任意多次
grep "a*" test.txt
#匹配所有内容,包括空白行
grep "aa*" test.txt
#匹配至少包含有一个a的行
grep "aaa*" test.txt
#匹配最少包含两个连续a的字符串
grep "aaaaa*" test.txt
#匹配最少包含四个连续a的字符串

#"." 匹配除了换行符外任意一个字符
grep "s..d" test.txt
#“s..d”会匹配在s和d这两个字母之间一定有两个字符的单词
grep "s.*d" test.txt
#匹配在s和d字母之间有任意字符(任意个)
grep ".*" test.txt
#匹配所有内容

#"^" 匹配行首,"$" 匹配行尾
grep "^M" test.txt
#匹配以大写“M”开头的行
grep "n$" test.txt
#匹配以小写“n”结尾的行
grep -n "^$" test.txt
#匹配空白行

#"[]"匹配中括号里面指定的任意一个字符,只匹配一个字符
grep "s[ao]id" test.txt
#匹配s和i字母之间,要不是a、要不是o
grep "[0-9]" test.txt
#匹配任意0到9中一个数字
grep"^[a-z]" test.txt
#匹配用小写字母开头的行

#"[^]"匹配除中括号里面字符以外的任意一个字符
grep "^[^a-z]" test.txt
#匹配不用小写字母开头的行
grep "^[^a-zA-Z]" test.txt
#匹配不用字母开头的行

#"\" 转义符
grep "\.$" test.txt
#匹配使用“.”结尾的行

#“\{n\}”表示其前面的字符恰好出现n次
grep "a\{3\}" test.txt
#匹配a字母连续出现三次的字符串
grep "[0-9]\{3\}" test.txt
#匹配包含连续的三个数字的字符串

#“\{n,\}”表示其前面的字符出现不小于n次
grep "^[0-9]\{3,\}" test.txt
#匹配最少用连续三个数字开头的行

#“\{n,m)}”匹配其前面的字符至少出现n次,最多出现m次
grep "sa\{1,3\}i" test.txt
#匹配在字母s和字母i之间有最少一个a,最多三个a

拓展

字符截取命令

cut命令

cut命令要和grep命令结合使用

[root@localhost ~]# cut [选项] 文件名
选项:
-f 列号 提取第几列(列与列之间是制表符(Tab键),不能是空格)
-d 分隔符 按照指定分隔符分割列(默认为制表符)

下面以test.txt为例说明

cut -f 2 test.txt

cut -f 2,3 test.txt

cut -d ":" -f 1,3 /etc/passwd
#/etc/passwd以冒号分隔
使用cut截取用户名

使用cut截取登录shell为/bin/bash的用户(root除外)

cat /etc/passwd | grep /bin/bash | grep -v root | cut -d ":" -f 1

说明:

  • cat /etc/passwd 查看/etc/passwd文件
  • grep /bin/bash 查找/etc/passwd中含有/bin/bash的行(root也在内)
  • grep -v root 排除含有/bin/bash的行中的root
  • cut -d “:” -f 1 以”:”为分隔符截取第一列的用户名
cut命令的局限

根据下面例子感受cut命令的局限

使用df -h查看系统占用情况

df -h

我们想要达到这样的效果,当根目录的Use%(使用率,上图中为14%)达到70%会警告用户,因此我们需要截取根目录的Use%部分

首先查找根目录所在行,可以看到根目录在/dev/vad1,使用grep查找其中含有vad1字段的行

df -h | grep "vda1"

接下来截取图中的14%,我们使用cut截取,可以看到14%在第5列

df -h | grep "vda1" | cut -f 5 

可以看出并没有截取到14%,这是因为列与列的间隙不是制表符,而是空格,那么我们使用下面这个命令

df -h | grep "vda1" | cut -d " " -f 5 

可见提取出的是空白,这是因为我们选择的分隔符为一个空格,所以提取到空白列

想要实现该功能需要借助awk命令,cut命令无法做到

awk命令

在awk命令的输出中支持print和printf命令

  • print命令:print会在每个输出之后自动加入一个换行符(Linux 默认没有print命令)
  • printf命令:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符
printf命令

printf命令后不能直接跟文件名,cat命令运行的结果也不能通过管道符使用printf输出

格式化输出命令

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键

例子

printf %s 1 2 3 4 5 6
#没有加引号,把后面的数字当成整体输出
printf %s %s %s 1 2 3 4 5 6
#只有第一个%s起了作用,后面其他的被当成普通字符串输出
printf '%s %s %s' 1 2 3 4 5 6
#三个%s均起作用,分别输出1,2,3,(空格输出空格)然后直接输出4 5 6,因为最后一个%s后面没有空格,使用3和4之间没有空格
printf '%s %s %s\n' 1 2 3 4 5 6
#三个%s均起作用,分别输出1,2,3,然后\n换行,再输出4 5 6
printf '%s %s %s ' 1 2 3 4 5 6

#使用cat查看test.txt
cat test.txt

#将cat test.txt的结果作为printf的输入
printf '%s' $(cat test.txt)
#printf命令后不能直接跟文件名
printf '%s' test.txt
#cat命令运行的结果也不能通过管道符使用printf输出
cat test.txt | printf '%s'

awk命令格式
awk '条件1{动作1} 条件2{动作2}...' 文件名

条件:

  • 关系表达式,例如: x>10,x<=10
  • BEGIN (在读取数据之前执行其后的动作)
  • END (在所有动作执行完,再执行其后动作)

动作:

  • 格式化输出
  • 流程控制语句

下面以test.txt为例说明:

查看test.txt cat test.txt

使用awk截取其中的第2,4列

awk '{printf $2 "\t" $4"\n"}' test.txt
#$2表示第2列,$4表示第4列

关于cut命令的局限,awk命令则不存在,下面举例说明

使用df -h查看系统相关信息

使用awk截取/dev/vda1行中的14%

df -h | grep vda1 | awk '{print $5}' | cut -d "%" -f 1

关系表达式

使用cat test.txt查看test.txt

提取其中Mark小于80的姓名

cat test.txt | grep -v Name | awk '$4<=80{print $2"\n"}'

image-20210228194925571

BEGIN

在读取数据之前执行其后的动作

在截取test.txt第2,4列之前先执行BEGIN后的命令

awk 'BEGIN{print "hello world!"} {print $2 "\t" $4"\n"}' test.txt

截取/etc/passwd的第1,3列

awk '{FS=":"} {print $1 "\t" $3}' /etc/passwd

由下图可见,/etc/passwd中的第一行并没有处理

awk会先读入第一行数据,再执行命令

加上BEGIN,会在读入第一行数据之前,先执行命令

END

在所有命令执行完毕,再执行其后的命令

太长了,拼的图

FS内置变量

用于指定分隔符

awk '{print $1 "\t" $3}' /etc/passwd

并没有起到提取第1列和第3列的效果

awk '{FS=":"} {print $1 "\t" $3}' /etc/passwd

sed命令

sed是一种几乎包括在所有UNIX平台(包括Linux)的轻量级流编辑器.sed主要是用来将数据进行选取、替换、删除、新增的命令

字符处理命令

条件判断

流程控制

-------------本文结束感谢您的阅读-------------