Linux哲学思想
ps aux
1.查看当前终端设备
[19:30:06 root@RC ~]#tty
/dev/pts/0
2.当前登录终端设备
[19:41:59 root@RC ~]#who am i
root pts/0 2020-07-27 18:14 (10.0.0.1)
3.查看所有终端设备
[19:39:00 root@RC ~]#who
root pts/0 2020-07-27 18:14 (10.0.0.1)
rc tty2 2020-07-27 19:39 (tty2)
[19:46:08 root@RC ~]#w
19:48:59 up 1:35, 3 users, load average: 0.03, 0.42, 0.40
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 18:14 1.00s 0.53s 0.01s w
rc tty2 tty2 19:39 1:34m 53.10s 0.06s /usr/libexec/g
root pts/2 10.0.0.1 19:48 4.00s 0.02s 0.02s -bash
GNU Bourne-Again Shell(bash)是GN90U计划中重要的工具软件之一,目前也是 Linux标准的shell,与 sh兼容
[19:29:18 root@RC ~]#echo $SHELL
/bin/bash
[19:29:24 root@RC ~]#echo ${SHELL}
/bin/bash
[19:48:59 root@RC ~]#cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/usr/bin/tmux
/bin/tmux
#显示当前主机名
[20:09:09 root@RC ~]#hostname
RC
#临时修改
hostname NAME
#永久保存,因为是一个子进程,需要exit退出保存
hostnamectl set-hostname NAME
#修改文件以设置主机名
vim /ect/hostname
注意:主机名不支持使用下划线,但是支持横线。可使用字母,横线或数字组合
#为管理员
$为普通用户
提示符可以被修改,查uid。uid=0为管理员,uid>1000为普通用户
[14:09:38 root@RC profile.d]#id -u
0
[09:54:14 root@RC ~]#id root
uid=0(root) gid=0(root) groups=0(root)
[09:55:41 root@RC ~]#id rc
uid=1000(rc) gid=1000(rc) groups=1000(rc)
[09:55:48 root@RC ~]#echo $PS1
\[\e[1;31m\][\[\e[0m\]\t \[\e[1;32m\]\u\[\e[36m\]@\h\[\e[1;35m\] \W\[\e[1;31m\]]\[\e[0m\]\$
vim /etc/profile.d/env.sh #centos写入此文件可永久保存
:set paste #从Windows复制粘贴格式出错时使用
vim ~/.bashrc #ubuntu写入此文件可永久保存
在linux中,PS1是一个全局变量
\e:控制符\003
\u:当前用户的账户名称
\h:主机名简称
\H: 完整的主机名称
\d: 代表日期,格式为weekday month date,例如:“Mon Aug 1”
\w:当前工作目录
\t:显示时间为24小时格式,如:HH:MM:SS
\T:显示时间为12小时格式
\v: BASH的版本信息
!:命令历史数
#开机后命令历史数
颜色表
前景 | 背景 | 颜色 |
---|---|---|
30 | 40 | 黑色 |
30 | 41 | 红色 |
32 | 42 | 绿色 |
33 | 43 | 黄色 |
34 | 44 | 蓝色 |
35 | 45 | 紫红色 |
36 | 46 | 青蓝色 |
37 | 47 | 白色 |
其他
0 OFF
1 高亮显示
4 underline
7 反白显示
8 不可见
内部命令:由shell自带,而且通过某命令形式提供
外部命令:在文件系统路径下有对用的可执行程序文件
区分内部命令还是外部命令
type COMMAND
[12:51:09 rc@rc ~]$type echo
echo is a shell builtin
type -a COMMAND
[13:05:20 rc@rc ~]$type -a echo
echo is a shell builtin
echo is /bin/echo
help 内部命令列表
enable 管理内部命令
查看外部命令路径
[15:49:18 root@RC ~]#which date
/usr/bin/date
which -a date
[15:49:27 root@RC ~]#whereis date
date: /usr/bin/date /usr/share/man/man1/date.1.gz /usr/share/man/man1p/date.1p.gz
Hash缓存表
系统初始hash表为空,但外部命令执行时, 默认会从PATH路径下寻找命令,找到后会将这条命令的路径保记录到hash表中,当再次使用该命令时shell解释器首先会查看hash表,存在将执行之,如果不存在,将会去PATH路径下寻找,利用hash缓存表可大大提高命令的调用问速率。
常见用法
将较长的命令定义成较短的命令,以方便执行
alias
`alias name= ’value‘`
优先级:别名>内部命令>外部命令
如果别名同原命令同名,如果要执行原命令,可使用
\ALIASNAME
“ALIASNAME”
‘ALIASNAME’
command ALIASNAME
/path/commmand
范例:
[10:22:00 root@RC data]#alias c='cd'
[10:22:28 root@RC data]#c ~
[10:22:36 root@RC ~]#
unalibs #取消别名
unalias -a #取消所有别名
注意 : 在命令行中定义的别名。仅对当前shell进程有用
如果想永久有效,要定义在配置文件中
编辑配置给出的新配置不会立即生效,bash进程重新读取配置文件
source /path/to/config_file
. /path/to/config_file
COMMAND [OPTIONS...] [ARGUMENTS...]
选项:用于启用或关闭命令的某个或某些功能
注意:
查看硬件信息
[10:34:53 root@RC ~]#lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 2
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
[10:40:06 root@RC ~]#cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 78
model name : Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz
stepping : 3
microcode : 0xcc
cpu MHz : 2592.003
cache size : 4096 KB
[10:35:00 root@RC ~]#lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 100G df 0 part /
├─sda3 8:3 0 2G 0 part [SWAP]
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 50G 0 part /data
sr0 11:0 1 1024M 0 rom
[10:50:19 root@RC ~]#cat /proc/partitions
major minor #blocks name
8 0 209715200 sda
8 1 1048576 sda1
8 2 104857600 sda2
8 3 2097152 sda3
8 4 1 sda4
8 5 52428800 sda5
11 0 1048575 sr0
[10:50:31 root@RC ~]#uname -r
4.18.0-80.el8.x86_64
16:28:35 rc@RC data]$cat /etc/os-release
NAME="CentOS Linux"
VERSION="8 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
[10:52:17 root@RC ~]#cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core)
Linux的两种时钟
相关命令
date 显示或修改时间
[10:53:09 root@RC ~]#date +%F_%T
2020-07-25_10:58:48
显示前n天的时间
[19:35:39 root@centos8 ~]#date -d '-1 day' +%F
2020-07-28
[19:36:46 root@centos8 ~]#date -d '-3 day' +%F
2020-07-26
修改系统时间
date -s '-1 day' +%F
clock,hwclock: 显示硬件时钟
timedatectl set-timezones 州/地点 #修改时区
显示日历
[11:02:04 root@RC ~]#cal -y
时区
/ect/localtime
[14:08:57 root@RC ~]#ll /etc/localtime
lrwxrwxrwx. 1 root root 35 Jul 15 10:53 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai
关机
重启
reboot
关机或重启:shutdown -r now 0
命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称"窗口"),在里面输入命 令。用户与计算机的这种临时的交互,称为一次"会话"(session) 会话的一个重要特点是,窗口与其 中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终 止,不管有没有运行完 一个典型的例子就是,SSH 登录远程计算机,打开一个远程窗口执行命令。这 时,网络突然断线,再次登录的时候,是找不回上一次执行的命令的。因为上一次 SSH 会话已经终止 了,里面的进程也随之消失了。为了解决这个问题,会话与窗口可以"解绑":窗口关闭时,会话并不终 止,而是继续运行,等到以后需要的时候,再让会话"绑定"其他窗口 终端复用器软件就是会话与窗口的"解绑"工具,将它们彻底分离。 (1)它允许在单个窗口中,同时访 问多个会话。这对于同时运行多个命令行程序很有用。 (2) 它可以让新窗口"接入"已经存在的会话。 (3)它允许每个会话有多个连接窗口,因此可以多人实时共享会话。 (4)它还支持窗口任意的垂直 和水平拆分。 类似的终端复用器还有Screen,Tmux
利用screen可以实现会话管理,如新建会话,共享会话等
注意 :centOS7来自于base源,centOS8来自epel源
[19:08:50 root@centos7 ~]#yum -y install screen
[11:14:32 root@RC ~]#yum -y instal screen
screen常见用法
[11:14:32 root@RC ~]#yum install tmux
[11:24:26 root@RC ~]#tmux
[exited]
[11:26:41 root@RC ~]#exit
logout
mux 窗口有大量的快捷键。所有快捷键都要通过前缀键唤起。默认的前缀键是 Ctrl+b ,即先按下 Ctrl+b ,快捷键才会生效。帮助命令的快捷键是 Ctrl+b ? 然后,按下 q 键,就可以退出帮助 新建会话 第一个启动的 Tmux 窗口,编号是0,第二个窗口的编号是1,以此类推。这些窗口对应的会 话,就是 0 号会话、1 号会话。使用编号区分会话,不太直观,更好的方法是为会话起名。
tmux new -s <session-name>
tmux ls
tmux list-session
tmux detach
tmux attach -t <session-name>
tmux kill-session -t <session-name>
tmux switch -t <session-name>
tmux split-window
ctrl+b,"
tmux split-window -h
ctrl+b,%
Ctrl+b %:划分左右两个窗格。
Ctrl+b ":划分上下两个窗格。
Ctrl+b :光标切换到其他窗格。是指要切换到的窗格的方向键,比如切换到下方窗格,就按方向键↓。
Ctrl+b ;:光标切换到上一个窗格。
Ctrl+b o:光标切换到下一个窗格。
Ctrl+b {:当前窗格左移。
Ctrl+b }:当前窗格右移。
Ctrl+b Ctrl+o:当前窗格上移。
Ctrl+b Alt+o:当前窗格下移。
Ctrl+b x:关闭当前窗格。
Ctrl+b !:将当前窗格拆分为一个独立窗口。
Ctrl+b z:当前窗格全屏显示,再使用一次会变回原来大小。
Ctrl+b Ctrl+:按箭头方向调整窗格大小。
Ctrl+b q:显示窗格编号
窗口管理 除了将一个窗口划分成多个窗格,Tmux 也允许新建多个窗口
tmux new-window
tmux new-window -n <window-name>
tmux select-window -t <window-number>
tmux select-window -t <window-name>
Ctrl+b c:创建一个新窗口,状态栏会显示多个窗口的信息。
Ctrl+b p:切换到上一个窗口(按照状态栏上的顺序)。
Ctrl+b n:切换到下一个窗口。
Ctrl+b :切换到指定编号的窗口,其中的是状态栏上的窗口编号
Ctrl+b w:从列表中选择窗口
Ctrl+b ,:窗口重命
tmux list-keys
tmux list-commands
echo 命令可以将后面跟的字符进行输出
功能:显示字符,echo会将输入的字符串送往标准输出。输出
的字符串间以空白字符隔开, 并在最后加上换行号 语法:
语法:
echo [-n,e,E] [字符串]
选项:
显示变量
echo "SAVR_NAME " #用变量值替换,弱引用
echo ’SAVR_NAME ‘ #变量不会替换,强引用
启用命令选项-e,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出
许多场合下,字符集与编码这两个概念常被混为一谈,但两者是有差别的。字符集与字符集编码是两个不同层面的概念。 charset是character set的简写,即字符集。 encoding是charset encoding的简写,即字符集编码,简称编码
计算机内部,所有信息最终都是一个二进制值。上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定,即ASCII(American Standard Code for Information Interchange) 码
ASCII 码一共规定了128个字符的编码,占用了一个字节的后面7位,最前面的一位统一规定为0
由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,即ASCII编码,但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。 全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码为了表示世界上所有语言中的所有字符。每一个符号都给予一个独一无二的编码数字,Unicode 是一个很大的集合,现在的规模可以容纳100多万个符号。Unicode 仅仅只是一个字符集,规定了每个字符对应的二进制代码,至于这个二进制代码如何存储则没有规定
Unicode编码方案:
把一个命令的输出打印给另一个命令的参数
$(CMD) 或 `CMD`
比较 “ ” ,‘ ’ ,``
[09:47:53 root@RC ~]#echo "echo $SHELL"
echo /bin/bash
[09:53:25 root@RC ~]#echo 'echo $SHELL'
echo $SHELL
[09:54:00 root@RC ~]#echo `echo $SHELL`
/bin/bash
双 引 号:不能识别命令,可以识别变量
单 引 号:六亲不认,变量和命令都不能识别 都当成普通字符串
反向单引号:B变量和命令都识别,并且会将反向单引号的内容当成命令执行后,在交给调用反向单引号的命令继续
{ } 可以实现打印重复字符串的简化形式
[09:58:22 root@RC ~]#echo {1..10}
1 2 3 4 5 6 7 8 9 10
[10:09:57 root@RC ~]#echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[10:11:47 root@RC ~]#echo {A..z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z
[10:10:43 root@RC ~]#echo {1,2,3}.txt
1.txt 2.txt 3.txt
tab键可以实现命令及路径等补全,提高输入效率,避免出错
保存你输入的命令历史。可以用它来重复执行命令 登录shell时,会读取命令历史文件中记录下的命令 ~/.bash_history 登录进shell后新执行的命令只会记录在缓存中;这些命令会用户退出时“追加”至命令历 史文件中
命令:history
命令历史相关环境变量
持久保存变量
调用历史命令行
#重复前一个命令方法
重复前一个命令使用上方向键,并回车执行
按 !! 并回车执行
输入 !-1 并回车执行
按 Ctrl+p 并回车执行
!:0 执行前一条命令(去参数)
!-n 执行history历史中倒数第n个命令
!string 重复前一个以“string”开头的命令
!?string 重复前一个包含string的命令
!string:p 仅打印命令历史,而不执行
!$:p打印输出 !$ (上一条命令的最后一个参数)的内容
!*:p 打印输出 !*(上一条命令的所有参数)的内容
^string 删除上一条命令中的第一个string
^string1^string2 将上一条命令中的第一个string1替换为string2
!:gs/string1/string2 将上一条命令中所有的string1都替换为 string2
使用up(向上)和down(向下)键来上下浏览从前输入的命令
ctrl-r来在命令历史中搜索命令
(reverse-i-search)`’:
Ctrl+g:从历史搜索模式退出
#要重新调用前一个命令中最后一个参数
!$ 表示
Esc , . 点击Esc键后松开,然后点击 . 键
Alt+ . 按住Alt键的同时点击 . 键
command !^ 利用上一个命令的第一个参数做cmd的参数
command !$ 利用上一个命令的最后一个参数做cmd的参数
command !* 利用上一个命令的全部参数做cmd的参数
command !:n 利用上一个命令的第n个参数做cmd的参数
command !n:^ 调用第n条命令的第一个参数
command !n:$ 调用第n条命令的最后一个参数
command !n:m 调用第n条命令的第m个参数
command !n:* 调用第n条命令的所有参数
command !string:^ 从命令历史中搜索以 string 开头的命令,并获取它的第一个参数
command !string:$ 从命令历史中搜索以 string 开头的命令,并获取它的最后一个参数
command !string:n 从命令历史中搜索以 string 开头的命令,并获取它的第n个参数
command !string:* 从命令历史中搜索以 string 开头的命令,并获取它的所有参数执行前一条命令(去除参数
Ctrl + l 清屏,相当于clear命令
Ctrl + o 执行当前命令,并重新显示本命令
Ctrl + s 阻止屏幕输出,锁定
Ctrl + q 允许屏幕输出
Ctrl + c 终止命令
Ctrl + z 挂起命令
Ctrl + a 光标移到命令行首,相当于Home
Ctrl + e 光标移到命令行尾,相当于End
Ctrl + f 光标向右移动一个字符
Ctrl + b 光标向左移动一个字符
Alt + f 光标向右移动一个单词尾
Alt + b 光标向左移动一个单词首
Ctrl + xx 光标在命令行首和光标之间移动
Ctrl + u 从光标处删除至命令行首
Ctrl + k 从光标处删除至命令行尾
Alt + r 删除当前整行
Ctrl + w 从光标处向左删除至单词首
Alt + d 从光标处向右删除至单词尾
Ctrl + d 删除光标处的一个字符
Ctrl + h 删除光标前的一个字符
Ctrl + y 将删除的字符粘贴至光标后
Alt + c 从光标处开始向右更改为首字母大写 的单词
Alt + u 从光标处开始,将右边一个单词更改为大写
Alt + l 从光标处开始,将右边一个单词更改 为小写
Ctrl + t 交换光标处和之前的字符位置
Alt + t 交换光标处和之前的单词位置
Alt + # 提示输入指 定字符后,重复显示该字符#次
注意:Alt组合快捷键经常和其它软件冲突
多层次的帮助
whatis command
whatis 使用数据库来显示命令的简短描述 刚安装后不可立即使用,需要制作数据库
#CentOS 7 版本以后
mandb
#CentOS 6 版本之前
makewhatis
内部命令:
[19:57:33 root@centos8 ~]#type cd
cd is a shell builtin
[19:57:43 root@centos8 ~]#help cd
cd: cd [-L|[-P [-e]] [-@]] [dir]
Change the shell working directory.
Change the current directory to DIR. The default DIR is the value of the
HOME shell variable.
外部命令和软件帮助:
显示用法总结和参数列表,大多数命令使用,但并非所有的
[15:36:48 root@RC ~]#date --help
Usage: date [OPTION]... [+FORMAT]
or: date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
Display the current time in the given FORMAT, or set the system date.
[20:05:53 root@centos8 ~]#cd --help
cd: cd [-L|[-P [-e]] [-@]] [dir]
Change the shell working directory.
Change the current directory to DIR. The default DIR is the value of the
HOME shell variable.
格式说明:
[ ]表示可选项
CAPS或 <> 表示变化的数据
… 表示一个列表
x |y| z 的意思是“ x 或 y 或 z ”
-abc的 意思是-a -b –c
{ } 表示分组
man 提供命令帮助的文件,手册页存放在/usr/share/man
几乎每个命令都有man的“页面”
中文man需安装包
man页面分组为不同的“章节”,统称为Linux手册,man 1 man
man命令的配置文件:
#centos6之前版man的配置文件
/etc/man.config
#centos7之后版man的配置文件
/etc/man_db.conf
#ubuntu man 的配置文件
/etc/manpath.config
查看man 手册页
man [OPTION...] [SECTION] PAGE..
man [章节] keyword
man帮助段落说明
man命令的操作方法:使用less命令实现
space, ^v, ^f, ^F: 向文件尾翻屏
b, ^b: 向文件首部翻屏
d, ^d: 向文件尾部翻半屏
u, ^u: 向文件首部翻半屏
RETURN, ^N, e, ^E or j or ^J: 向文件尾部翻一行
y or ^Y or ^P or k or ^K:向文件首部翻一行
q: 退出
#:跳转至第#行
1G: 回到文件首部
G:翻至文件尾部
/KEYWORD 以KEYWORD指定的字符串为关键字,从当前位置向文件尾部搜索;不区分字符大小写
n: 下一个
N:上一个
?KEYWORD 以KEYWORD指定的字符串为关键字,从当前位置向文件首部搜索;不区分字符大小写
n: 跟搜索命令同方向,下一个
N:跟搜索命令反方向,上一个
常用选项
man -a keyword
man -f keyword
http://httpd.apache.org
http://www.nginx.org
https://mariadb.com/kb/en
https://dev.mysql.com/doc/
http://tomcat.apache.org
http://www.python.org
通过发行版官方的文档光盘或网站可以获得安装指南、部署指南、虚拟化指南等
http://kbase.redhat.com
http://www.redhat.com/docs
http://access.redhat.com
https://help.ubuntu.com/lts/serverguide/index.html
rhn.redhat.com或者本地卫星服务器/代理服务器
RHN账户为及其注册和基于网络管理的RHN用户
sosreport 收集所有系统上的日志信息的工具,并自动打成压缩包,方便技术支持人员和红帽全球支持提供分析问题依据
http://tldp.org
http://www.slideshare.net
http://www.google.com
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3kzUFQz5-1598174225427)(C:\Users\RC\Pictures\Saved Pictures\QQ截图20200807115935.png)]
文件和目录被组织成一个单根倒置树结构
文件系统从根目录下开始,用“/”表示
根文件系统(rootfs):root filesystem
标准Linux文件系统(如ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL
以.开头的文件为隐藏文件
路径分隔的 /
文件名最长255个字节
包括路径在内文件名称最长4095个字节
蓝色–>目录 绿色–>可执行文件 红色–>压缩文件 浅蓝色–>链接文件 灰色–>其他文件
除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用
每个文件都有两类相关数据:
元数据:metadata
数据:data
Linux的文件系统分层结构:FHS Filesystem Hierarchy Standard
/boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub)都存放于此目录
/bin:所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
/sbin:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序
/lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
/lib64:专用于x86_64系统上的辅助共享库文件存放位置
/etc:配置文件目录
/home/USERNAME:普通用户家目录
/root:管理员的家目录
/media:便携式移动设备挂载点
/mnt:临时文件系统挂载点
/dev:设备文件及特殊文件存储位置
b: block device,随机访问
c: character device,线性访问
/opt:第三方应用程序的安装位置
/srv:系统上运行的服务用到的数据
/tmp:临时文件存储位置
/usr: universal shared, read-only data
bin: 保证系统拥有完整功能而提供的应用程序
sbin:
lib:32位使用
lib64:只存在64位系统
include: C程序的头文件(header files)
share:结构化独立的数据,例如doc, man等
local:第三方应用程序的安装位置
bin, sbin, lib, lib64, etc, share
/var: variable data files
cache: 应用程序缓存数据目录
lib: 应用程序状态信息数据
local:专用于为/usr/local下的应用程序存储可变数据
lock: 锁文件
log: 日志目录及文件
opt: 专用于为/opt下的应用程序存储可变数据
run: 运行中的进程相关数据,通常用于存储进程pid文件
spool: 应用程序数据池
tmp: 保存系统两次重启之间产生的临时数据
/proc: 用于输出内核与进程信息相关的虚拟文件系统
/sys:用于输出当前系统上硬件设备相关信息虚拟文件系统
/selinux: security enhanced Linux,selinux相关的安全策略等信息的存储位置
CentOS 7 以后版本目录结构变化
/bin 和 /usr/bin
/sbin 和 /usr/sbin
/lib 和/usr/lib
/lib64 和 /usr/lib64
二进制程序:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin
库文件:/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64
配置文件:/etc, /etc/DIRECTORY, /usr/local/etc
帮助文件:/usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/doc
每个shell和系统进程都有一个当前的工作目录 CWD:current work directory
显示当前shell CWD的绝对路径
pwd命令: printing working directory
绝对路径
以正斜杠开始
完整的文件的位置路径
可用于任何想指定一个文件名的时候
相对路径名
不以斜线开始
一般情况下,指定相对于当前工作目录或某目录的位置。特殊情况下,是相对于某目录的位置
可以作为一个简短的形式指定一个文件名
基名:basename,只取文件名而不要路径
目录名:dirname,只取路径,不要文件名
命令 cd : change directory 改变目录
选项:-P 切换至物理路径,而非软链接目录
可以使用绝对或相对路径
相关的环境变量:
ls 命令可以列出当前目录的内容或指定目录
常见选项:
文件相关信息:metadata (元数据,文件属性信息), data(数据本身)
每个文件有三个时间戳:
[14:45:06 root@centos8 ~]#stat anaconda-ks.cfg
File: anaconda-ks.cfg
Size: 1535 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 201720846 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:admin_home_t:s0
Access: 2020-07-29 10:40:51.028884220 +0800
Modify: 2020-07-29 10:40:51.112886162 +0800
Change: 2020-07-29 10:40:51.112886162 +0800
Birth: -
文件可以包含多种类型的数据,使用file命令检查文件的类型,然后确定适当的打开命令或应用程序使用
file [OPTION...] [FILE...]
常用选项:
文件通配符可以用来匹配符合条件的多个文件,方便批理管理文件
通配符采有特定的符号,表示特定的含义,此特符号称为元字符
常见的通配符如下:
* 匹配零个或多个字符
? 匹配任何单个字符
~ 当前用户家目录
~mage 用户mage家目录
~+和. 当前工作目录
~- 前一个工作目录
[0-9] 匹配数字范围
[a-z] 字母
[A-Z] 字母
[wang] 匹配列表中的任何的一个字符
[^wang] 匹配列表中的所有字符以外的字符
[15:39:53 root@centos8 data]#ls f[a-c].txt
fa.txt fA.txt fb.txt fB.txt fc.txt
[15:40:53 root@centos8 data]#ls f[a-C].txt
fa.txt fA.txt fb.txt fB.txt fc.txt fC.txt
别外还有在Linux系统中预定义的字符类:man 7 glob
[:digit:]:任意数字,相当于0-9
[:lower:]:任意小写字母,表示 a-z
[:upper:]: 任意大写字母,表示 A-Z
[:alpha:]: 任意大小写字母
[:alnum:]:任意数字或字母
[:blank:]:水平空白字符
[:space:]:水平或垂直空白字符
[:punct:]:标点符号
[:print:]:可打印字符
[:cntrl:]:控制(非打印)字符
[:graph:]:图形字符
[:xdigit:]:十六进制字符
touch命令可以用来创建空文件或刷新文件的时间
touch [OPTION]... FILE...
选项说明:
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
常用选项
-i 覆盖前提示
-n不覆盖,注意两者顺序
-r, -R 递归复制目录及内部的所有内容
-a 归档,相当于-dR --preserv=all,常用于备份
-d --no-dereference --preserv=links 不复制原文件,只复制链接名
–preserv[=ATTR_LIST]
mode: 权限
ownership: 属主属组
timestamp:
links
xattr
context
all
-p (保留属性,权限所有者)等同–preserv=mode, ownership, timestamp
-v --verbose (详细过程)
-f --force
-u --update 只复制源比目标更新文件或目标不存在的文件
-b 目标存在,覆盖前先备份,形式为 filename~
–backup=numbered 目标存在,覆盖前先备份加数字后缀
mv 命令可以实现文件或目录的移动和改名
同一分区移动数据,速度很快:数据位置没有变化
不同分区移动数据,速度相对慢:数据位置发生了变化
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...
常用选项:
-i 交互式
-f 强制
-b 目标存在,覆盖前先备份
利用rename 可以批量修改文件名
rename [options] <expression> <replacement> <file>...
#为所有的conf文件加上.bak后缀:
rename 'conf' 'conf.bak' f*
#去掉所有的bak后缀:
rename '.bak' '' *.bak
使用rm 命令可以删除文件
rm [OPTION]... [FILE]...
常用选项:
rm虽然删除了文件,但是被删除的文件仍然可能被恢复,在安全要求较高的场景下,可以使用shred安全删除文件
格式
shred [OPTION]... FILE...
常见选项:
[20:24:49 root@centos8 data]#shred -zvun 4 df.txt
shred: df.txt: pass 1/5 (random)...
shred: df.txt: pass 2/5 (ffffff)...
shred: df.txt: pass 3/5 (000000)...
shred: df.txt: pass 4/5 (random)...
shred: df.txt: pass 5/5 (000000)...
shred: df.txt: removing
shred: df.txt: renamed to 000000
shred: 000000: renamed to 00000
shred: 00000: renamed to 0000
shred: 0000: renamed to 000
shred: 000: renamed to 00
shred: 00: renamed to 0
shred: df.txt: removed
常见选项:
-d: 只显示目录
-L level:指定显示的层级数目
-P pattern: 只显示由指定wild-card pattern匹配到的路径
常见选项:
-p: 存在于不报错,且可自动创建所需的各目录
-v: 显示详细信息
-m MODE: 创建目录时直接指定权限
常见选项:
-p 递归删除父空目录
-v 显示详细信息
注意:rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树
练习
(1) 如何创建/testdir/dir1/x, /testdir/dir1/y, /testdir/dir1/x/a, /testdir/dir1/x/b, /testdir/dir1/y/a, /testdir/dir1/y/b
[20:37:12 root@centos8 data]#mkdir -p testdir/dir1/{x/{a,b},y/{a,b}}
[20:38:10 root@centos8 data]#tree testdir
testdir
└── dir1
├── x
│ ├── a
│ └── b
└── y
├── a
└── b
(2) 如何创建/testdir/dir2/x, /testdir/dir2/y, /testdir/dir2/x/a, /testdir/dir2/x/b
[20:46:32 root@centos8 data]#mkdir -p testdir/dir2/{x/{a,b},y}
[20:46:45 root@centos8 data]#tree testdir/
testdir/
├── dir1
│ ├── x
│ │ ├── a
│ │ └── b
│ └── y
│ ├── a
│ └── b
└── dir2
├── x
│ ├── a
│ └── b
└── y
(3) 如何创建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6, /testdir/dir5/dir7
[21:00:58 root@centos8 data]#mkdir -p testdir/dir{3,4,5/dir{6,7}}
[21:01:37 root@centos8 data]#tree testdir/
testdir/
├── dir1
│ ├── x
│ │ ├── a
│ │ └── b
│ └── y
│ ├── a
│ └── b
├── dir2
│ ├── x
│ │ ├── a
│ │ └── b
│ └── y
├── dir3
├── dir4
└── dir5
├── dir6
└── dir7
每个文件的属性信息,比如:文件的大小,时间,类型等,称为文件的元数据(meta data)。这此元数据是存放在inode(index node)表中。node 表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息
第一个node表记录对应的保存了以下信息:
目录
目录是个特殊文件,文件内容保存了目录中文件的列表及inode number
cp和inode
cp 命令:
rm 命令:
mv和inode
硬链接本质上就给一个文件起一个新的名称,实质是同一个文件
硬链接特性
格式
ln filename [linkname ]
一个符号链接指向另一个文件,就像windows中快捷方式,软链接文件和原文件本质上不是同一个文件
软链接特点
格式:
ln -s filename [linkname ]
硬链接 | 软链接 | |
---|---|---|
本质 | 本质是同一个文件 | 本质不是同一个文件 |
跨设备 | 不支持 | 支持 |
inode | 相同 | 不同 |
链接数 | 创建新的硬链接,链接数会增加,删除硬链接,链接数会减少 | 创建或删除,链接数不会变化 |
文件夹 | 不支持 | 支持 |
相对路径 | 原始文件相对路径是相对于当前工作目录 | 原始文件相对路径是相对于链接文件的相对路径 |
删除文件源 | 只是链接数减一,但链接文件的访问不受影响 | 链接文件将无法访问 |
文件类型 | 和源文件相同 | 链接文件,和源文件无关 |
文件大小 | 和源文件相同 | 源文件的路径的长度 |
案例1:提示空间满 NO space left on device ,但是df可以看到空间很多,为什么?
答:节点编号用光了
案例2:提示空间快满,使用rm删除了很大的无用文件后,df仍然看到空间不足,为什么?如何解决?
答:被删除文件被某个进程打开或使用。可以通过kill命令将进程杀掉从而释放空间
程序:指令加数据
读入数据:Input
输出数据:Output
打开的文件都有一个fd: file descriptor (文件描述符)
Linux给程序提供三种 I/O 设备
I/O重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标
STDOUT和STDERR可以被重定向到指定文件,而非默认的当前终端
命令 操作符号 文件名
1> 或 > 把STDOUT重定向到文件
>| 强制覆盖
2> 把STDERR重定向到文件
&> 把所有输出重定向到文件
以上如果文件已存在,文件内容会被覆盖
以上如果文件已存在,文件内容会被覆盖
set -C 禁止将内容覆盖已有文件,但可追加
set +C 允许覆盖
>> 可以在原有内容基础上,追加内容
把输出和错误重新定向追加到文件
>> 追加标准输出重定向至文件
2>> 追加标准错误重定向至文件
COMMAND > /path/to/file.out 2> /path/to/error.out
COMMAND > /path/to/file.out 2>&1 (顺序很重要)
COMMAND >> /path/to/file.out 2>&1
(CMD1,CMD2…)或者{CMD1,CMD2…} 合并多个程序的STDOUT
范例
从文件中导入STDIN,代替当前终端的输入设备,使用 < 来重定向标准输入 某些命令能够接受从文件中导入的STDIN
tr转换或删除字符
tr [OPTION]... SET1 [SET2]
选项:
-c –C --complement:取字符集的补集
-d --delete:删除所有属于第一字符集的字符
-s --squeeze-repeats:把连续重复的字符以单独一个字符表示,即去重
-t --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符
[:alnum:]:字母和数字
[:alpha:]:字母
[:digit:]:数字
[:lower:]:小写字母
[:upper:]:大写字母
[:space:]:空白字符
[:print:]:可打印字符
[:punct:]:标点符号
[:graph:]:图形字符
[:cntrl:]:控制(非打印)字符
[:xdigit:]:十六进制字符
#范例:把/etc/os-release文件中的小写字母转换为大写字母转换
[20:50:17 root@centos8 data]#tr [a-z] [A-Z] < /etc/os-release
NAME="CENTOS LINUX"
VERSION="8 (CORE)"
ID="CENTOS"
ID_LIKE="RHEL FEDORA"
VERSION_ID="8"
PLATFORM_ID="PLATFORM:EL8"
PRETTY_NAME="CENTOS LINUX 8 (CORE)"
ANSI_COLOR="0;31"
CPE_NAME="CPE:/O:CENTOS:CENTOS:8"
HOME_URL="HTTPS://WWW.CENTOS.ORG/"
BUG_REPORT_URL="HTTPS://BUGS.CENTOS.ORG/"
CENTOS_MANTISBT_PROJECT="CENTOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"
REDHAT_SUPPORT_PRODUCT="CENTOS"
REDHAT_SUPPORT_PRODUCT_VERSION="8"
范例:压缩df.txt文件里重复的空格
[16:35:03 root@centos8 data]#cat df.txt
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 910244 0 910244 0% /dev
tmpfs 924700 0 924700 0% /dev/shm
tmpfs 924700 8852 915848 1% /run
tmpfs 924700 0 924700 0% /sys/fs/cgroup
/dev/sda2 104806400 2091232 102715168 2% /
/dev/sda5 52403200 398592 52004608 1% /data
/dev/sda1 999320 122172 808336 14% /boot
tmpfs 184940 0 184940 0% /run/user/0
[16:35:09 root@centos8 data]#tr -s ' ' < df.txt
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 910244 0 910244 0% /dev
tmpfs 924700 0 924700 0% /dev/shm
tmpfs 924700 8852 915848 1% /run
tmpfs 924700 0 924700 0% /sys/fs/cgroup
/dev/sda2 104806400 2091232 102715168 2% /
/dev/sda5 52403200 398592 52004608 1% /data
/dev/sda1 999320 122172 808336 14% /boot
tmpfs 184940 0 184940 0% /run/user/0
使用 “<<终止词” 命令从键盘把多行重导向给STDIN,直到终止词位置之前的所有文本都发送给STDIN,有时被称为就地文本(here documents)
其中终止词可以是任何一个或多个符号,比如:!,@,$,EOF(End Of File),magedu等,其中EOF
比较常用
管道(使用符号“|”表示)用来连接多个命令
格式:
命令1 | 命令2 | 命令3 | …
功能说明:
将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN
所有命令会在当前shell进程的子shell进程中执行
组合多种工具的功能
注意:STDERR默认不能通过管道转发,可利用2>&1 或 |& 实现,格式如下
命令1 2>&1 | 命令2
命令1 |& 命令2
利用tee命令可以重定向到多个目标,经常配合管道符一起使用
格式:
命令1 | tee [-a ] 文件名 | 命令2
以上可以把命令1的STDOUT保存在文件中,做为命令2的输入
选项:
-a 追加
功能:
资源分派:
Authentication:认证,验证用户身份
Authorization:授权,不同的用户设置不同权限
Accouting|Audition:审计
当用户登录时,系统会自动分配令牌token,包括用户标识和组成员等信息
Linux中每个用户是通过User Id (UID)来唯一标识的。
管理员:root, 0
普通用户:1-60000 自动分配
系统用户:1-499 (CentOS 6以前), 1-999 (CentOS7以后)
对守护进程获取资源进行权限分配
登录用户:500+ (CentOS6以前), 1000+(CentOS7以后)
给用户进行交互式登录使用
Linux中可以将一个或多个用户加入用户组中,用户组是通过Group ID(GID) 来唯一标识的。
Linux安全上下文Context:运行中的程序,即进程 (process),以进程发起者的身份运行,进程所能够访问资源的权限取决于进程的运行者的身份
比如:root 身份运行/bin/cat /etc/shadow和 wang的身份运行/bin/cat /etc/shadow ,得到的结果是不同的,shadow能否能被访问是由运行者的身份决定,非程序本身
login name:登录用名(wang)
passwd:密码 (x)
UID:用户身份编号 (1000)
GID:登录默认所在组编号 (1000)
GECOS:用户全名或注释
home directory:用户主目录 (/home/wang)
shell:用户默认使用shell (/bin/bash)
登录用名
用户密码:一般用sha512加密
从1970年1月1日起到密码最近一次被更改的时间
密码再过几天可以被变更(0表示随时可被变更)
密码再过几天必须被变更(99999表示永不过期)
密码过期前几天系统提醒用户(默认为一周)
密码过期几天后帐号会被锁定
从1970年1月1日算起,多少天后帐号失效
更改密码加密算法:
authconfig --passalgo=sha256 --update
密码的安全策略
群组名称:就是群组名称
群组密码:通常不需要设定,密码是被记录在 /etc/gshadow
GID:就是群组的 ID
以当前组为附加组的用户列表(分隔符为逗号)
群组名称:就是群的名称
群组密码:
组管理员列表:组管理员的列表,更改组密码和成员
以当前组为附加组的用户列表:多个用户间用逗号分隔
用户管理命令
组帐号维护命令
useradd 命令可以创建新的Linux用户
格式:
useradd [options] LOGIN
常见选项:
-u UID
-o 配合-u 选项,不检查UID的唯一性
-g GID 指明用户所属基本组,可为组名,也可以GID
-c "COMMENT“ 用户的注释信息
-d HOME_DIR 以指定的路径(不存在)为家目录
-s SHELL 指明用户的默认shell程序,可用列表在/etc/shells文件中
-G GROUP1[,GROUP2,...] 为用户指明附加组,组须事先存在
-N 不创建私用组做主组,使用users组做主组
-r 创建系统用户 CentOS 6之前: ID<500,CentOS 7以后: ID<1000
-m 创建家目录,用于系统用户
-M 不创建家目录,用于非系统用户
显示或更改默认设置
useradd -D
useradd –D -s SHELL
useradd –D –b BASE_DIR
useradd –D –g GROUP
新建用户的相关文件
批量创建用户
newusers passwd格式文件
批量修改用户口令
echo username:passwd | chpasswd
usermod 命令可以修改用户属性
格式:
usermod [OPTION] login
常见选项:
-u UID: 新UID
-g GID: 新主组
-G GROUP1[,GROUP2,...[,GROUPN]]]:新附加组,原来的附加组将会被覆盖;若保留原有,则要同时使用-a选项
-s SHELL:新的默认SHELL
-c 'COMMENT':新的注释信息
-d HOME: 新家目录不会自动创建;若要创建新家目录并移动原家数据,同时使用-m选项
-l login_name: 新的名字
-L: lock指定用户,在/etc/shadow 密码栏的增加 !
-U: unlock指定用户,将 /etc/shadow 密码栏的 ! 拿掉
-e YYYY-MM-DD: 指明用户账号过期日期
-f INACTIVE: 设定非活动期限
userdel可以删除linux用户
格式:
userdel [OPTION]... Login
常见选项
f, --force 强制
-r, --remove 删除用户家目录和邮箱
id命令可以查看用户的UID,GID等相关信息
id [OPTION]... [USER]
常见选项:
-u: 显示UID
-g: 显示GID
-G: 显示用户所属的组的ID
-n: 显示名称,需配合ugG使用
su: 即switch user,命令可以切换用户身份,并且以指定用户的身份执行命令
格式:
su [options...] [-] [user [args...]]
切换用户的方式:
说明:root su至其他用户无须密码;非root用户切换时需要密码
换个身份执行命令:
su [-] UserName -c 'COMMAND
常见选项:
-l --login su -l UserName 相当于 su - UserName
3.6设置密码
passwd可以修改用户密码
格式:
passwd [OPTIONS] UserName
常用选项:
-d:删除指定用户密码
-l:锁定指定用户
-u:解锁指定用户
-e:强制用户下次登录修改密码
-f:强制操作
-n mindays:指定最短使用期限
-x maxdays:最大使用期限
-w warndays:提前多少天开始警告
-i inactivedays:非活动期限
--stdin:从标准输入接收用户密码
chage可以修改用户密码策略
格式:
chage [OPTION]... LOGIN
常见选项:
-d LAST_DAY
-m --mindays MIN_DAYS
-M --maxdays MAX_DAYS
-W --warndays WARN_DAYS
-I --inactive INACTIVE 密码过期后的宽限期
-E --expiredate EXPIRE_DATE 用户的有效期
-l 显示密码策略
3.8用户相关的其他命令
groupadd实现创建组
格式:
groupadd [OPTION]... group_name
常见选项:
-g GID 指明GID号;[GID_MIN, GID_MAX]
-r 创建系统组,CentOS 6之前: ID<500,CentOS 7以后: ID<1000
组属性修改:groupmod
格式:
groupmod [OPTION]... group
常见选项:
-n group_name: 新名字
-g GID: 新的GID
groupctl可以删除组
格式:
groupdel [options] GROUP
常见选项:
-f, --force 强制删除,即使是用户的主组也强制删除组
组密码:passwd
格式:
gpasswd [OPTION] GROUP
常见选项:
-a user 将user添加至指定组中
-d user 从指定组中移除用户user
-A user1,user2,... 设置有管理权限的用户列表
newgrp命令可以临时切换主组, 如果用户本不属于此组,则需要组密码
格式:
newgrp [-] [group]
如果使用 - 选项,可以初始化用户环境
groupmems可以管理组成员关系
格式:
groupmems [options] [action]
常见选项:
-g, --group groupname 更改为指定组 (只有root)
actions:
-a, --add username 指定用户加入组
-d, --delete username 从组中删除用户
-p, --purge 从组中清除所有成员
-l, --list 显示组成员列表
groups 可查看用户组关系
格式
#查看用户所属组列表
groups [OPTION].[USERNAME]...
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3HiyMorG-1598174225429)(C:\Users\12550\Pictures\Camera Roll\45.png)]
chown 命令可以修改文件的属主,也可以修改文件属组
格式:
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
用法说明:
OWNER 只修改所有者
OWNER:GROUP 同时修改所有者和属组
:GROUP 只修改属组,冒号也可用 . 替换
-R: 递归
--reference=RFILE 参考指定的的属性,来修改
chgrp 命令可以只修改文件的属组
格式:
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
-R递归
文件的权限主要针对三类对象进行定义
owner 属主, u
group 属组, g
other 其他, o
注意:用户的最终权限是从左向右顺序匹配的,即,所有者,所属组,其他人,一旦匹配权限立即生效,不再向右查看其权限
每个文件针对每类访问者都定义了三种权限
r Readable #可使用文件查看类工具,比如cat可以查看其内容
w Writable #可修改其内容
x eXcutable #可以把此文件提请内核启动为一个进程,即可以执行(运行)此文件(此文件的内容必须是可执行的)
r 可以使用ls查看此目录中文件列表
w 可在此目录中创建文件,也可删除此目录中的文件
x 可以使用ls -l查看此目录中文件元数据(须配合r),可以cd进入此目录
X 只给目录x权限,不给无执行权限的文件x权限
八进制数字
--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7
格式:
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
说明:
MODE:who opt permission
who=u,g,o,a
opt:+,-,=
permission:r,w,x
修改一类用户的所有权限
u= g= o= ug= a= u=,g=
修改一类用户某位或某些位权限
u+ u- g+ g- o+ o- a+ a- + -
-R: 递归修改权限
umask的值可以用来保留在创建文件权限
实现方式:
查看umask
umask #模式方式显示
umask -S #输出可被调用
umask -p
修改umask
umask #
持久保存umask
前面介绍了三种常见的权限:r, w, x 还有三种特殊权限:SUID, SGID, Sticky
前提:进程有属主和属组;文件有属主和属组
二进制的可执行文件上SUID权限功能:
SUID权限设定:
chmod u+s FILE...
chmod 6xxx FILE
chmod u-s FILE...
二进制的可执行文件上SGID权限功能:
SGID权限设定:
chmod g+s FILE...
chmod 2xxx FILE
chmod g-s FILE...
目录上的SGID权限功能:
默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
sticky 设置在文件上无意义
Sticky权限设定:
chmod o+t DIR...
chmod 1xxx DIR
chmod o-t DIR.
SUID SGID STICKY
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
范例;
chmod 4777 /tmp/a.txt
权限位映射
SUID: user,占据属主的执行权限位
SGID: group,占据属组的执行权限位
Sticky: other,占据other的执行权限位
设置文件的特殊属性,可以防止root用户误操作删除或修改文件
不能删除,改名。更改
chattr +i
只能追加内容,不能删除,改名
chattr +a
显示特定属性
lsattr
ACL:Access Control List,实现灵活的权限管理
除了文件的所有者,所属组和其它人,可以对更多的用户设置权限
CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
tune2fs –o acl /dev/sdb1
mount –o acl /dev/sdb1 /mnt/test
ACL生效顺序:
所有者,自定义用户,所属组|自定义组,其他人
ACL相关命令
setfacl 可以设置ACL权限
getfacl 可查看设置的ACL权限
mask 权限
备份和还原ACL
主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息
vim命令格式
vim [OPTION]... FILE...
常用选项:
+# 打开文件后,让光标处于第#行的行首,+默认行尾
+/PATTERN 让光标处于第一个被PATTERN匹配到的行行首
-b file 二进制方式打开文件
-d file1 file2… 比较多个文件,相当于 vimdiff
-m file 只读打开文件
-e file 直接进入ex模式,相当于执行ex file
-y file Easy mode (like “evim”,modeless),直接可以操作文件,ctrl+o;wq|q! 保存和不保存退出
说明:
三种主要模式和切换
三种常见模式:
模式转换
w 写(存)磁盘文件
wq 写入并退出
x 写入并退出
X 加密
q 退出
q! 不存盘退出,即使更改都将丢失
r filename 读文件内容到当前文件中
w filename 将当前文件内容写入另一个文件
!command 执行命令
r!command 读入命令的输出
格式:
:start_pos,end_pos cmd
# # 具体第#行,例如2表示第2行
#,# 从左侧#表示起始行,到右侧#表示结尾行
#,+# 从左侧#表示的起始行,加上右侧#表示的行数,范例:2,+3 表示2到5行
. 当前行
$ 最后一行
.,$-1 当前行到倒数第二行
% 全文, 相当于1,$
/pattern/ 从当前行向下查找,直到匹配pattern的第一行,即:正则表达式
/pat1/,/pat2/ 从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束
#,/pat/ 从指定行开始,一直找到第一个匹配patttern的行结束
/pat/,$ 向下找到第一个匹配patttern的行到整个文件的结尾的所有行
地址定界后跟一个编辑命令
d 删除
y 复制
w file: 将范围内的行另存至指定文件中
r file:在指定位置插入指定文件中的所有内容
格式:
s/要查找的内容/替换为的内容/修饰符
要查找的内容:可使用正则表达式模式
替换为的内容:不能使用模式,但可以使用\1, \2, …等后向引用符号;还可以使用“&”引用前面查找时查找到的整个内容
修饰符:
i #忽略大小写
g #全局替换,默认情况下,每一行只替换第一次出现
gc #全局替换,每次替换前询问
说明:查找替换中的分隔符/可替换为其它字符,如:#,@
扩展命令模式的配置只是对当前vim进程有效,可以将配置存放在文件中持久保存
/etc/vimrc #全局
~/.vimrc #个人
行号
显示:set number,简写 set nu
取消显示:set nonumber, 简写 set nonu
忽略字符的大小写
启用:set ignorecase,简写 set ic
不忽略:set noic
自动缩进
启用:set autoindent,简写 set ai
禁用:set noai
复制保留格式
启用:set paste
禁用:set nopaste
显示Tab和换行符 ^I 和$显示
启用:set list
禁用:set nolist
高亮搜索
启用:set hlsearch
禁用:set nohlsearch
语法高亮
启用:syntax on
禁用:syntax off
文件格式
启用windows格式:set fileformat=dos
启用unix格式:set fileformat=unix
简写 set ff=dos|unix
设置文本宽度
set textwidth=65 (vim only)
set wrapmargin=15
设置光标所在行的标识线
启用:set cursorline,简写 set cul
禁用:set nocursorline
加密
启用: set key=password
禁用: set key=
了解更多
set 帮助
:help option-list
:set or :set all
命令模式功能强大,只是按键时,看不到输入,所以需要大量的记忆才能更好的使用。
ZZ 保存退出
ZQ 不保存退出
字符间跳转:
h: 左 L: 右 j: 下 k: 上
#COMMAND:跳转由#指定的个数的字符
单词间跳转:
w:下一个单词的词首
e:当前或下一单词的词尾
b:当前或前一个单词的词首
#COMMAND:由#指定一次跳转的单词数
当前页跳转:
H:页首 M:页中间行 L:页底
zt:将光标所在当前行移到屏幕顶端
zz:将光标所在当前行移到屏幕中间
zb:将光标所在当前行移到屏幕底端
行首行尾跳转:
^ 跳转至行首的第一个非空白字符
0 跳转至行首
$ 跳转至行尾
行间移动:
#G 或者扩展命令模式下:# 跳转至由第#行
G 最后一行
1G, gg 第一行
句间移动:
) 下一句 ( 上一句
段落间移动:
} 下一段 { 上一段
命令模式翻屏操作
Ctrl+f 向文件尾部翻一屏
Ctrl+b 向文件首部翻一屏
Ctrl+d 向文件尾部翻半屏
Ctrl+u 向文件首部翻半屏
x 删除光标处的字符
#x 删除光标处起始的#个字符
xp 交换光标所在处的字符及其后面字符的位置
~ 转换大小写
J 删除当前行后的换行符
r 替换光标所在处的字符
R 切换成REPLACE模式(在末行出现–REPLACE–提示),按ESC回到命令模式
d 删除命令,可结合光标跳转字符,实现范围删除
d$ 删除到行尾
d^ 删除到非空行首
d0 删除到行首
dw
de
db
#COMMAND
#dd 多行删除
D:从当前光标位置一
直删除到行尾,等同于d$
y 复制,行为相似于d命令
y$
y0
y^
ye
yw
yb
#COMMAND
yy:复制行
#yy 复制多行
Y:复制整行
p 缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面
P 缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面
c: 删除后切换成插入模式
c$
c^
c0
cb
ce
cw
#COMMAND
cc:删除当前行并输入新内容,相当于S
#cc
C:删除当前光标到行尾,并切换成插入模式,相当于c$
/PATTERN:从当前光标所在处向文件尾部查找
?PATTERN:从当前光标所在处向文件首部查找
n:与命令同方向
N:与命令反方向
u 撤销最近的更改
#u 撤销之前多次更改
U 撤消光标落在这行后所有此行的更改
Ctrl - r 重做最后的“撤消”更改
. 重复前一个操作
#. 重复前一个操作#次
<start position><command><end position>
常见Command:y 复制、d 删除、gU 变大写、gu 变小写
范例:
0y$ 命令
0 → 先到行头
y → 从这里开始拷贝
$ → 拷贝到本行最后一个字符
di" 光标在”“之间,则删除”“之间的内容
yi( 光标在()之间,则复制()之间的内容
vi[ 光标在[]之间,则选中[]之间的内容
dtx 删除字符直到遇见光标之后的第一个 x 字符
ytx 复制字符直到遇见光标之后的第一个 x 字符
允许选择的文本块
可视化键可用于与移动键结合使用
w ) } 箭头等
突出显示的文字可被删除,复制,变更,过滤,搜索,替换等
范例:
输入ctrl+v 进入可视化模式
输入 G 跳到最后1行,选中第一行
输入 I 切换至插入模式
输入 #
按 ESC 键
vim FILE1 FILE2 FILE3 …
:next 下一个
:prev 前一个
:first 第一个
:last 最后一个
:wall 保存所有
:qall 不保存退出所有
:wqall保存退出所有
多文件分割
vim -o|-O FILE1 FILE2 …
-o: 水平或上下分割
-O: 垂直或左右分割(vim only)
在窗口间切换:Ctrl+w, Arrow
单文件窗口分割
Ctrl+w,s:split, 水平分割
Ctrl+w,v:vertical, 垂直分割
ctrl+w,q:取消相邻窗口
ctrl+w,o:取消全部窗口
:wqall 退出
有26个命名寄存器和1个无命名寄存器,常存放不同的剪贴版内容,可以不同会话间共享
寄存器名称a,b,…,z,格式:“寄存器 放在数字和命令之间
范例:
3"tyy 表示复制3行到t寄存器中
"tp 表示将t寄存器内容粘贴
未指定,将使用无命名寄存器
有10个数字寄存器,用0,1,…,9表示,0存放最近复制内容,1存放最近删除内容。当新的文本变更
和删除时,1转存到2,2转存到3,以此类推。数字寄存器不能在不同会话间共享
ma 将当前位置标记为a,26个字母均可做标记, mb 、 mc 等等
'a 跳转到a标记的位置,实用的文档内标记方法,文档中跳跃编辑时很有用
qa 录制宏 a,a为宏的名称
q 停止录制宏
@a 执行宏 a
@@ 重新执行上次执行的宏
#以二进制方式打开文件
vim -b binaryfile
#扩展命令模式下,利用xxd命令转换为可读的十六进制
:%!xxd
#插入模式下,编辑二进制文件
#扩展命令模式下,利用xxd命令转换回二进制
:%!xxd -r
#保存退出
:help
:help topic
Use :q to exit help
vimtutor
格式:
cat [OPTION]... [FILE]...
常见选项
-E:显示行结束符$
-A:显示所有控制符
-n:对显示出的每一行进行编号
-b:非空行编号
-s:压缩连续的空行成一行
nl 显示行号,相当于cat -b
tac 逆向显示文本内容
rev 将同一行的内容逆向显示
查看非文本内容
hexdump
od 即dump files in octal and other formats
xxd
more 可以实现分页查看文件,可以配合管道实现输出信息的分页
格式:
more [options] file...
选项:
-d: 显示翻页及退出提示
less 也可以实现分页查看文件或STDIN输出
查看时有用的命令包括:
/文本 搜索 文本
n/N 跳到下一个 或 上一个匹配
less 命令是man命令使用的分页器
head 可以显示文件或标准输入的前面行
格式:
head [OPTION]... [FILE]...
选项:
-c # 指定获取前#字节
-n # 指定获取前#行
-# 同上
tail 和head 相反,查看文件或标准输入的倒数行
格式:
tail [OPTION]... [FILE]...
选项:
-c # 指定获取后#字节
-n # 指定获取后#行
-# 同上
-f 跟踪显示文件fd新追加的内容,常用日志监控,相当于 --follow=descriptor,当文件删除再新建同名文
件,将无法继续跟踪文件
-F 跟踪文件名,相当于--follow=name --retry,当文件删除再新建同名文件,将可以继续跟踪文件
tailf 类似tail –f,当文件不增长时并不访问文件
cut 命令可以提取文本文件或STDIN数据的指定列
格式:
cut [OPTION]... [FILE]...
选项:
-d DELIMITER: 指明分隔符,默认tab
-f FILEDS:
#: 第#个字段,例如:3
#,#[,#]:离散的多个字段,例如:1,3,6
#-#:连续的多个字段, 例如:1-6
混合使用:1-3,7
-c 按字符切割
--output-delimiter=STRING指定输出分隔符
paste 合并多个文件同行号的列到一行
格式:
paste [OPTION]... [FILE]...
选项:
d 分隔符:指定分隔符,默认用TAB
-s : 所有行合成一行显示
文本数据统计:wc
整理文本:sort
比较文件:difpatch
wc 命令可用于统计文件的行总数、单词总数、字节总数和字符总数 可以对文件或STDIN中的数据统计
常用选项 :
-l 只计数行数
-w 只计数单词总数
-c 只计数字节总数
-m 只计数字符总数
-L 显示文件中最长行的长度
把整理过的文本显示在STDOUT,不改变原始文件
格式:
sort [options] file(s)
常用选项:
r 执行反方向(由上至下)整理
-R 随机排序
-n 执行按数字大小整理
-f 选项忽略(fold)字符串中的字符大小写
-u 选项(独特,unique)删除输出中的重复行
-t c 选项使用c做为字段界定符
-k # 选项按照使用c字符分隔的 # 列来整理能够使用多次
uniq命令从输入中删除前后相接的重复的行
格式:
uniq [OPTION]... [FILE]...
常见选项:
-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行
uniq常和sort 命令一起配合使用:
diff 命令比较两个文件之间的区别
REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)
不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能
正则表达式被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql 等
正则表达式分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块,如:PCRE(Perl Compatible Regular
Expressions)
正则表达式的元字符分类:字符匹配、匹配次数、位置锚定、分组
帮助:man 7 regex
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符,示例:[^wang]
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
用在要指定次数的字符后面,用于指定前面的字符要出现的次数
* 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
\? 匹配其前面的字符0或1次,即:可有可无
\+ 匹配其前面的字符至少1次,即:肯定有
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
位置锚定可以用于定位出现的位置
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定,用于单词模式的右侧
\<PATTERN\> 匹配整个单词
范例:
分组:() 将一个或多个字符捆绑在一起,当作一个整体处理,如:(root)+ 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, …
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
或者:\
. 任意单个字符
[wang] 指定范围的字符
[^wang] 不在指定范围的字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
^ 行首
$ 行尾
\<, \b 语首
\>, \b 语尾
() 分组
后向引用: \1, \2, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat
扩展正则表达式练习
1、显示三个用户root、mage、wang的UID和默认shell
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
4、使用egrep取出上面路径的目录名
5、统计last命令中以root登录的每个主机IP地址登录次数
6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
7、显示ifconfig命令结果中所有IPv4地址
8、将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面
grep 命令主要对文本的(正则表达式)行基于模式进行过滤
sed:stream editor,文本编辑工具
awk:Linux上的实现gawk,文本报告生成器
grep: Global search REgular expression and Print out the line
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
格式:
grep [OPTIONS] PATTERN [FILE...]
常见选项:
--color=auto 对匹配到的文本着色显示
-m # 匹配#次后停止
-v 显示不被pattern匹配到的行
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ’ -e ‘dog’ file
-w 匹配整个单词
-E 使用ERE,相当于egrep
-F 相当于fgrep,不支持正则表达式
-f file 根据模式文件处理
-r 递归目录,但不处理软链接
-R 递归目录,但处理软链接
范例:
[20:03:29 root@centos8 ~ ]#grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[20:09:52 root@centos8 ~ ]#grep "rc" /etc/passwd
rc:x:1000:1000:RC:/home/rc:/bin/bash
[20:10:14 root@centos8 ~ ]#grep 'rc' /etc/passwd
rc:x:1000:1000:RC:/home/rc:/bin/bash
范例:
[20:10:18 root@centos8 ~ ]#df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 394148 0 394148 0% /dev
tmpfs 408604 0 408604 0% /dev/shm
tmpfs 408604 5780 402824 2% /run
tmpfs 408604 0 408604 0% /sys/fs/cgroup
/dev/sda2 104806400 2091052 102715348 2% /
/dev/sda5 52403200 398740 52004460 1% /data
/dev/sda1 999320 122076 808432 14% /boot
tmpfs 81720 0 81720 0% /run/user/0
[20:11:01 root@centos8 ~ ]#df|grep '^/dev/sd' | tr -s ' ' %|cut -d% -f5
2
1
14
[20:12:20 root@centos8 ~ ]#df|grep '^/dev/sd' | tr -s ' ' %|cut -d% -f5|sort -n
1
2
14
[20:12:45 root@centos8 ~ ]#df|grep '^/dev/sd' | tr -s ' ' %|cut -d% -f5|sort -n|tail -1
14
范例:
[20:32:20 root@centos8 ~ ]#ifconfig |grep -Eo '([0-9]{1,3}\.){3}[1-9]{1,3}'
10.0.0.8
10.0.0.255
127.0.0.1
[20:38:19 root@centos8 ~ ]#ifconfig |grep -Eo '([0-9]{1,3}\.){3}[1-9]{1,3}'|head -1
10.0.0.8
[20:38:41 root@centos8 ~ ]#ifconfig |grep -Eo '([0-9]{1,3}\.){3}[1-9]{1,3}'|head -2
10.0.0.8
10.0.0.255
范例:
[20:38:50 root@centos8 ~ ]#grep -E 'root|bash' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rc:x:1000:1000:RC:/home/rc:/bin/bash
[20:41:41 root@centos8 ~ ]#grep -e 'root' -e 'bash' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rc:x:1000:1000:RC:/home/rc:/bin/bash
sed 即 stream EDitor,和 vi 不同,sed是行编辑器
Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到 最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(Pattern Space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下 一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时 不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为 vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理, 打开速度非常快,执行速度也很快
参考网站:http://www.gnu.org/software/sed/manual/sed.html
格式:
sed [option]... 'script;script;...' inputfile...
常见选项:
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f FILE 从指定文件中读取编辑脚本
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑
script格式:
“地址命令”
地址格式:
1. 不给地址:对全文进行处理
2. 单地址:
#:指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行
3. 地址范围:
#,# #从#行到#行,3,6 从第三行到第六行
#,+# #从#行到+#行,3,+4 表示从第三行到第七行
/pat1/,/pat2/
#,/pat/
4. 步进:~
1~2 奇数行
2~2 偶数行
命令:
p 打印当前模式空间内容,追加到默认输出之后
Ip 忽略大小写
d 删除模式空间匹配的行,并立即启用下一轮循环
a [\]text 在指定行后面追加文本,支持使用\n实现多行追加
i [\]text 在行前面插入文本
c [\]text 替换行为单行或多行文本
w file 保存模式匹配的行至指定文件
r file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
s/pattern/string/ 修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###替换修饰符:
g 行内全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中
I,i 忽略大小写
范例:
[20:58:18 root@centos8 ~ ]#sed -n ' ' /etc/issue
[20:58:40 root@centos8 ~ ]#sed 'p' /etc/issue
FBI warning
FBI warning
[20:58:56 root@centos8 ~ ]#sed -n ' ' /etc/issue
[20:59:02 root@centos8 ~ ]#sed -n 'p' /etc/issue
FBI warning
范例:
[21:01:25 root@centos8 ~ ]#seq 10|sed -n 'p'
1
2
3
4
5
6
7
8
9
10
[21:00:52 root@centos8 ~ ]#seq 10|sed -n '1~2p'
1
3
5
7
9
[21:01:20 root@centos8 ~ ]#seq 10|sed -n '2~2p'
2
4
6
8
10
范例:
[21:01:54 root@centos8 ~ ]#sed -n '1p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[21:02:54 root@centos8 ~ ]#sed -n '1,3p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
范例:
[21:04:01 root@centos8 ~ ]#ifconfig |sed -n '2p'
inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255
范例:
#删除所有以#开头的行
[11:05:22 root@centos8 data ]#sed -i '/^#/d' /data/f1.txt
[11:08:50 root@centos8 data ]#cat f1.txt
UUID=f4649a8a-7afd-411b-977a-60f93851dfe9 / xfs defaults 0 0
UUID=b97bc31f-c03d-4fe9-8715-c1c198790fcb /boot ext4 defaults 1 2
UUID=53ef4f7b-6dfb-4966-8d53-4e821d68d5d1 /data xfs defaults 0 0
UUID=038ae1c0-0d16-4088-8a15-0f41829c30ea swap swap defaults 0 0
#只显示非#开头的行
[11:12:29 root@centos8 data ]#sed -n '/^#/!p' /data/f1.txt
UUID=f4649a8a-7afd-411b-977a-60f93851dfe9 / xfs defaults 0 0
UUID=b97bc31f-c03d-4fe9-8715-c1c198790fcb /boot ext4 defaults 1 2
UUID=53ef4f7b-6dfb-4966-8d53-4e821d68d5d1 /data xfs defaults 0 0
UUID=038ae1c0-0d16-4088-8a15-0f41829c30ea swap swap defaults 0 0
范例:在文本后面追加内容
[21:10:12 root@centos8 ~ ]#sed '/root/a line1\nline2' /etc/passwd
root:x:0:0:root:/root:/bin/bash
line1
line2
[21:10:23 root@centos8 ~ ]#sed '/root/a\ line1\n line2' /etc/passwd
root:x:0:0:root:/root:/bin/bash
line1
line2
范例:替换行文本
[21:21:45 root@centos8 data ]#sed -n '/enforcing$/p' /etc/selinux/config
SELINUX=enforcing
[21:24:20 root@centos8 data ]#sed -i '/enforcing$/cSELINUX=disabled' /etc/selinux/config
[21:25:49 root@centos8 data ]#cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
范例:文本搜索替代
[09:10:53 root@centos8 data ]#sed -n '/root/p' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[09:13:34 root@centos8 data ]#sed -n '/r..t/[email protected]@admin@p' passwd
admin:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin
ftp:x:14:50:FTP User:/vaadminp:/sbin/nologin
[09:18:06 root@centos8 data ]#sed -n '/r..t/[email protected]@admin@gp' passwd
admin:x:0:0:admin:/admin:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin
ftp:x:14:50:FTP User:/vaadminp:/sbin/nologin
范例:
[10:40:37 root@centos8 data ]#df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 394148 0 394148 0% /dev
tmpfs 408604 0 408604 0% /dev/shm
tmpfs 408604 10888 397716 3% /run
tmpfs 408604 0 408604 0% /sys/fs/cgroup
/dev/sda2 104806400 2090000 102716400 2% /
/dev/sda5 52403200 398744 52004456 1% /data
/dev/sda1 999320 122076 808432 14% /boot
tmpfs 81720 0 81720 0% /run/user/0
[10:42:28 root@centos8 data ]#df |sed -rn '/^\/dev\/sd/s@.*([0-9]+)%@\1@p'
2% /
1% /data
4% /boot
[10:42:30 root@centos8 data ]#df |sed -rn '/^\/dev\/sd/s@.*([0-9]+)%.*@\1@p'
2
1
4
范例:在搜索到的文本后/前追加文本
[09:20:07 root@centos8 data ]#sed -n '/r..t/[email protected]@&er@gp' passwd
rooter:x:0:0:rooter:/rooter:/bin/bash
operator:x:11:0:operator:/rooter:/sbin/nologin
ftp:x:14:50:FTP User:/var/fterp:/sbin/nologin
[09:22:12 root@centos8 data ]#sed -n '/r..t/[email protected]@er&@gp' passwd
erroot:x:0:0:erroot:/erroot:/bin/bash
operator:x:11:0:operator:/erroot:/sbin/nologin
ftp:x:14:50:FTP User:/vaerr/ftp:/sbin/nologin
范例:取基名和目录名
[09:22:18 root@centos8 data ]#echo /etc/sysconfig/network-scripts/
/etc/sysconfig/network-scripts/
[09:29:12 root@centos8 data ]#echo /etc/sysconfig/network-scripts/ |sed -rn 's#(^/.*/)([^/]+/?)#\2#p' #取基名
network-scripts/
[09:29:33 root@centos8 data ]#echo /etc/sysconfig/network-scripts/ |sed -rn 's#(^/.*/)([^/]+/?)#\1#p' #取目录名
/etc/sysconfig/
范例:取文件的前缀和后缀
[09:41:15 root@centos8 data ]#echo a.c.x.txt |sed -rn 's/(.*)\.([^.]+)$/\2/p'
txt
[09:41:35 root@centos8 data ]#echo a.c.x.txt |sed -rn 's/(.*)\.([^.]+)$/\1/p'
a.c.x
[09:41:39 root@centos8 data ]#echo a.c.x.txt |grep -Eo '[^.]+$'
txt
[09:46:19 root@centos8 data ]#echo a.c.x.txt |grep -Eo '.*\.'
a.c.x.
范例:取 IP地址
[10:11:42 root@centos8 data ]#ifconfig ens160|sed -n '2p'|sed 's/^.*inet//'|sed 's/ netmask.*//'
10.0.0.8
[10:17:49 root@centos8 data ]#ifconfig ens160 |sed -ne '2s/^.*inet //' -e 's/ netmask.*//p'
10.0.0.8
[10:30:37 root@centos8 data ]#ifconfig ens160 |sed -rn '2s/[^0-9]+([0-9.]+).*/\1/p' #通用方式
10.0.0.8
sed 中除了模式空间,还另外还支持保持空间(Hold Space),利用此空间,可以将模式空间中的数 据,临时保存至保持空间,从而后续接着处理,实现更为强大的功能。
常见高级命令:
P 打印模式空间开端至\n内容,并追加到默认输出之前
h 把模式空间中的内容覆盖至保持空间中
H 把模式空间中的内容追加至保持空间中
g 从保持空间取出数据覆盖至模式空间
G 从保持空间取出内容追加至模式空间
x 把模式空间中的内容与保持空间中的内容进行互换
n 读取匹配到的行的下一行覆盖至模式空间
N 读取匹配到的行的下一行追加至模式空间
d 删除模式空间中的行
D 如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环
练习:
1、删除centos7系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符
2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
3、在centos6系统/root/install.log每一行行首增加#号
4、在/etc/fstab文件中不以#开头的行的行首增加#号
5、处理/etc/fstab路径,使用sed命令取出其目录名和基名
6、利用sed 取出ifconfig命令中本机的IPv4地址
7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
8、统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现) 9、将文本文件的n和n+1行合并为一行,n为奇数行
面向过程语言
面向对象语言
计算机:运行二进制指令
编程语言:人与计算机之间交互的语言。分为两种:低级语言和高级语言
低级编程语言:
机器:二进制的0和1的序列,称为机器指令。与自然语言差异太大,难懂、难写
汇编:用一些助记符号替代机器指令,称为汇编语言
如:ADD A,B 将寄存器A的数与寄存器B的数相加得到的数放到寄存器A中
汇编语言写好的程序需要汇编程序转换成机器指令
汇编语言稍微好理解,即机器指令对应的助记符,助记符更接近自然语言
高级编程语言:
编译:高级语言–>编译器–>机器代码文件–>执行,如:C,C++
解释:高级语言–>执行–>解释器–>机器代码,如:shell,python,php,JavaScript,perl
三种逻辑处理方式
2.2shell脚本基本结构
shell脚本编程:是基于过程式、解释执行的语言
编程语言的基本结构:
shell脚本:包含一些命令或声明,并符合一定格式的文本文件
格式要求:首行shebang机制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
第一步:使用文本编辑器来创建文本文件
第一行必须包括shell声明序列:#!
示例:
#!/bin/bash
添加注释,注释以#开头
第二步:加执行权限
给予执行权限,在命令行上指定脚本的绝对或相对路径
第三步:运行脚本
直接运行解释器,将脚本作为解释器程序的参数运行
1、第一行一般为调用使用的语言
2、程序名,避免更改文件名为无法找到正确的文件
3、版本号
4、更改后的时间
5、作者相关信息
6、该程序的作用,及注意事项
7、最后是各版本的更新简要说明
只检测脚本中的语法错误,但无法检查出错误命令,但不真正执行脚本
bash -n /path/to/some_script
t调试并执行
bash -x /path/to/some_script
脚本常见的三种错误:
语法错误:会导致后续的命令不继续执行,可以用bash -n检查错误,提示的出错行不一定是准确的
命令错误:默认后续的命令还会继续执行,用bash -n无法检查出来,可以使用bash -x进行观察
逻辑错误:只能使用bash -x进行观察
第一个脚本:备份etc文件:
[17:30:42 root@centos8 data ]$cat backup.sh
#!/bin/bash
COLOR='echo -e \e[1;33m'
END='\e[0m'
SRC=/etc
BACKUP=backup
DATE=`date +%F_%T`
${COLOR}starting backup....$END
sleep 2
cp -av $SRC /data${SRC}_${BACKUP}_${DATE}
${COLOR}backup is finished$END
变量表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据
**变量类型:**普通变量,内置变量,环境变量,位置变量,只读变量
不同的变量存放的数据不同,决定了以下
变量数据类型:
静态和动态语言
强类型和弱类型语言
变量的生效范围等标准划分变量类型
变量赋值
name='value'
value可以是以下多种形式
直接字串:name='root'
变量引用:name="$USER"
命令引用:name=`COMMAND` 或者 name=$(COMMAND)
变量引用:
$name
${name}
弱引用和强引用
范例:变量的赋值方法和引用
[10:39:37 root@centos8 ~ ]$NAME=rc
[10:45:20 root@centos8 ~ ]$echo $NAME
rc
[10:45:32 root@centos8 ~ ]$echo I am $NAME
I am rc
[10:45:55 root@centos8 ~ ]$echo "I am $NAME"
I am rc
[10:46:07 root@centos8 ~ ]$echo 'I am $NAME'
I am $NAME
[10:46:19 root@centos8 ~ ]$NAME=$USER
[10:48:11 root@centos8 ~ ]$echo $NAME
root
[10:49:34 root@centos8 ~ ]$seq 10
1
2
3
4
5
6
7
8
9
10
[10:51:02 root@centos8 ~ ]$NUM=`seq 10`
[10:51:13 root@centos8 ~ ]$echo $NUM
1 2 3 4 5 6 7 8 9 10
[10:51:15 root@centos8 ~ ]$echo "$NUM"
1
2
3
4
5
6
7
8
9
10
[10:52:46 root@centos8 ~ ]$NAME="
> rc
> ruchao
> "
[10:54:01 root@centos8 ~ ]$echo $NAME
rc ruchao
[10:54:10 root@centos8 ~ ]$echo "$NAME"
rc
ruchao
范例:变量引用
[10:54:23 root@centos8 ~ ]$NAME=RC
[11:11:16 root@centos8 ~ ]$AGE=24
[11:11:29 root@centos8 ~ ]$echo $NAME
RC
[11:11:36 root@centos8 ~ ]$echo $AGE
24
[11:11:42 root@centos8 ~ ]$echo $NAME $AGE
RC 24
[11:11:54 root@centos8 ~ ]$echo $NAME$AGE
RC24
[11:12:02 root@centos8 ~ ]$echo $NAME_$AGE
24
[11:12:09 root@centos8 ~ ]$echo ${NAME}_$AGE
RC_24
范例:变量追加赋值
[11:12:16 root@centos8 ~ ]$echo $NAME
RC
[11:14:44 root@centos8 ~ ]$NAME+=:CEO
[11:15:21 root@centos8 ~ ]$echo $NAME
RC:CEO
范例:利用变量实现动态命令
[11:16:23 root@centos8 ~ ]$CMD=hostname
[11:16:39 root@centos8 ~ ]$$CMD
centos8
[11:17:12 root@centos8 ~ ]$echo `$CMD`
centos8
显示已定义的所有变量:
set
unset name
环境变量:
#观察进程的父子关系
pstree -p
#查看当前所在shell
echo $BASHPID
#取代当前进程
exec CDM
变量声明和赋值
#声明和赋值
export name=VALUE
declare -x name=VALUE
#或者分两步实现
name=VALUE
expot name
变量引用
$name
${name}
显示所有环境变量
env
printenv
export
declare -x
删除变量:
unset name
bash内建的环境变量:
PATH
SHELL
USER
UID
HOME
PWD
SHLVL
LANG
MAIL
HOSTNAME
HISTSIZE
_ 下划线 表示前一命令的最后一个参数
只读变量:只能声明定义,但后续不能修改和删除
声明只读变量:
readonly name
declare -r name
查看只读变量:
readonly [-p]
declare -r
位置变量:在bash shell中内置的变量, 在脚本代码中调用通过命令行传递给脚本的参数
$1, $2, ... 对应第1个、第2个等参数,shift [n]换位置
$0 命令本身,包括路径
$* 传递给脚本的所有参数,全部参数合为一个字符串
$@ 传递给脚本的所有参数,每个参数为独立字符串
$# 传递给脚本的参数的个数
注意:$@ $* 只在被双引号包起来的时候才会有差异
清空所有位置变量
set --
进程执行后,将使用变量 ? 保 存 状 态 码 的 相 关 数 字 , 不 同 的 值 反 应 成 功 或 失 败 , ? 保存状态码的相关数字,不同的值反应成功或失败, ?保存状态码的相关数字,不同的值反应成功或失败,?取值范例 0-255
$?的值为0 代表成功
$?的值是1到255 代表失败
用户可以在脚本中使用以下命令自定义退出状态码
exit [n]
注意:
展开命令执行顺序
把命令行分成单个命令词
展开别名
展开大括号的声明({})
展开波浪符声明(~)
命令替换$() 和 ``
再次把命令行分成命令词
展开文件通配(*、?、[abc]等等)
准备I/0重导向(<、>)
运行命令
防止扩展
反斜线(\)会使随后的字符按原意解释
加引号来防止扩展
单引号(’’)防止所有扩展
双引号(”“)也可防止扩展,但是以下情况例外:$(美元符号)
变量扩展
`` : 反引号,命令替换
\:反斜线,禁止单个字符扩展
!:叹号,历史命令替换
set 命令:可以用来定制shell环境
$- 变量
set 命令实现脚本安全
-u 在扩展一个没有设置的变量时,显示错误信息, 等同set -o nounset
-e 如果一个命令返回一个非0退出状态值(失败)就退出, 等同set -o errexit
-o option 显示,打开或者关闭选项
显示选项:set -o
打开选项:set -o 选项
关闭选项:set +o 选项
-x 当执行命令时,打印命令及其参数,类似 bash -x
格式:
printf "指定的格式" "文本1" ”文本2“……
常用格式替换符
替换符 | 功能 |
---|---|
%s | 字符串 |
%f | 浮点格式 |
%b | 相对应的参数中包含转义字符时,可以使用此替换符进行替换,对应的转义字符会被转 义 |
%c | ASCII字符,即显示对应参数的第一个字符 |
%d,%i | 十进制整数 |
%o | 八进制值 |
%u | 不带正负号的十进制值 |
%x | 十六进制值(a-f) |
%X | 十六进制值(A-F) |
%% | 表示%本身 |
说明:%s 中的数字代表此替换符中的输出字符宽度,不足补空格,默认是右对齐,%-10s表示10个字 符宽,- 表示左对齐
常用转义字符
转义符 | 功能 |
---|---|
\a | 警告字符,通常为ASCII的BEL字符 |
\b | 后退 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ | 表示\本身 |
shell允许在某些情况下对算数表达式进行求值,比如:le和declare内置命令,(())复合命令和算数扩展。
注意:bash只支持整数,不支持小数
bash中的算术运算:
+, -, *, /, %取模(取余), **(乘方)
乘法符号有些场景中需要转义
实现算术运算:
(1) let var=算术表达式
(2) var=$[算术表达式]
(3) var=$((算术表达式))
(4) var=$(expr arg1 arg2 arg3 ...)
(5) declare –i var = 数值
(6) echo ‘算术表达式’ | bc
内建的随机数生成器变量
$RANDOM 取值范围:0-32767
范例:
#生成0-49之间的随机数
[16:20:22 root@centos8 ~ ]$echo $[RANDOM%50]
16
[16:20:37 root@centos8 ~ ]$echo $[RANDOM%50]
31
#随机颜色
[16:42:30 root@centos8 ~ ]$echo -e "\e[1;$[RANDOM%7+31]mRC\e[0m"
RC
[16:42:32 root@centos8 ~ ]$echo -e "\e[1;$[RANDOM%7+31]mRC\e[0m"
RC
增强型赋值
+= i+=10 相当于 i=i+10
-= i-=j 相当于 i=i-j
*=
/=
%=
++ i++,++i 相当于 i=i+1
-- i--,--i 相当于 i=i-1
#格式:
let varOPERvalue
#范例:
[18:38:50 root@centos8 ~ ]$let i=10*2
[19:16:47 root@centos8 ~ ]$echo $i
20
[19:16:59 root@centos8 ~ ]$((j=i+10))
[19:17:25 root@centos8 ~ ]$echo $j
30
#范例:自加,自减
[08:53:21 root@centos8 ~ ]$unset i j;i=1;let j=i++;echo "i=$i j=$j"
i=2 j=1
[09:06:19 root@centos8 ~ ]$unset i j;i=1;let j=++i;echo "i=$i j=$j"
i=2 j=2
true ,false
1,真
0,假
**与:&:**和0相与,结果为0,和1相与,结果保留原值
1 与 1 = 1
1 与 0 = 0
0 与 1 = 0
0 与 0 = 0
**或:|:**和1相或,结果为1 ,和0相或,结果保留原值
1 或 1 = 1
1 或 0 = 1
0 或 1 = 1
0 或 0 = 0
非:!
!1 = 0
!0 =1
异或:^
相同为假,不同为真
两个数字X、Y异或得到结果Z,Z再和任意两者之一异或,将得到另外一个值
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
范例:
[09:56:33 root@centos8 ~ ]#vi /etc/profile.d/env.sh
[10:06:13 root@centos8 ~ ]#x=110
[10:06:59 root@centos8 ~ ]#y=120
[10:07:02 root@centos8 ~ ]#temp=$x
[10:07:14 root@centos8 ~ ]#x=$y
[10:08:13 root@centos8 ~ ]#y=$temp
[10:08:57 root@centos8 ~ ]#echo $x
120
[10:09:03 root@centos8 ~ ]#echo $y
110
范例:
[10:13:38 root@centos8 ~ ]#x=110 y=120;let x=$[x^y];let y=$[x^y];let x=$[x^y];echo x=$x y=$y
x=120 y=110
短路与&&
CMD1 短路与 CMD2
第一个CMD1结果为 0 (假 ),总的结果必定为0,因此不需要执行CMD2
第一个CMD1结果为 1 (真),第二个CMD2必须要参与运算,才能得到最终的结果
短路或 ||
CMD1 短路或 CMD2
第一个CMD1结果为1 (真),总的结果必定为1,因此不需要执行CMD2
第一个CMD1结果为0 (假 ),第二个CMD2 必须要参与运算,,才能得到最终的结果
条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成测试过程
评估布尔声明,以便用在条件性执行中
若真,则状态码变量 $?返回 0
若假,则 状态码变量$?返回 1
条件测试命令
注意:EXPRESSION前后必须有空白字符
[10:16:29 root@centos8 ~ ]#help [
[: [ arg... ]
Evaluate conditional expression.
This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.
[11:08:57 root@centos8 ~ ]#help \[\[
[[ ... ]]: [[ expression ]]
Execute conditional command.
Returns a status of 0 or 1 depending on the evaluation of the conditional
expression EXPRESSION. Expressions are composed of the same primaries used
by the `test' builtin, and may be combined using the following operators:
( EXPRESSION ) Returns the value of EXPRESSION
! EXPRESSION True if EXPRESSION is false; else false
EXPR1 && EXPR2 True if both EXPR1 and EXPR2 are true; else false
EXPR1 || EXPR2 True if either EXPR1 or EXPR2 is true; else false
When the `==' and `!=' operators are used, the string to the right of
the operator is used as a pattern and pattern matching is performed.
When the `=~' operator is used, the string to the right of the operator
is matched as a regular expression.
The && and || operators do not evaluate EXPR2 if EXPR1 is sufficient to
determine the expression's value.
Exit Status:
0 or 1 depending on value of EXPRESSION.
#判断 NAME变量是否定义
[-v NAME]
3判断 NAME 变量是否定义并且是名称引用,bash4.4新特性
[-R NAME]
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于
算数表达比较:
== 相等
!= 不相等
<=
>=
<
>
test和[ ]用法
-z STRING 字符串是否为空,空为真,不空为假
-n STRING 字符串是否不空,不空为真,空为假
STRING 同上
STRING1 = STRING2 是否等于,注意 = 前后有空格
STRING1 != STRING2 是否不等于
> ascii码是否大于ascii码
< 是否小于
[[]]用法:
[[expression]]用法
== 左侧字符串是否和右侧的PATTERN相同
注意:此表达式用于[[ ]]中,PATTERN为通配符
=~ 左侧字符串是否能够被右侧的PATTERN所匹配
注意: 此表达式用于[[ ]]中;扩展的正则表达式
建议:当使用正则表达式或通配符时使用[[ ]],其他情况一般使用[ ]
范例:在比较字符串时,建议将变量放在" "中
[12:25:48 root@centos8 ~ ]#NAME="I LOVE YOU"
[12:26:01 root@centos8 ~ ]#[ $NAME ]
-bash: [: LOVE: binary operator expected
[12:26:18 root@centos8 ~ ]#[ "$NAME" ]
[12:26:24 root@centos8 ~ ]#echo $?
0
范例:[[ ]]和通配符
[12:26:44 root@centos8 ~ ]#FILE=txt.log
[12:33:22 root@centos8 ~ ]#[[ $FILE=*.log ]]
[12:33:58 root@centos8 ~ ]#echo $?
0
[[ ]]中如果不想使用通配符*,只想表达*本身,可以用""引起来,也可以使用转义符\
范例:判断合理的考试成绩
[12:51:53 root@centos8 ~ ]#SCORE=101
[12:52:03 root@centos8 ~ ]#[[ $SCORE =~ ^(100|[0-9]{1,2})$ ]]
[12:52:09 root@centos8 ~ ]#echo $?
1
存在性测试
-a FILE:同 -e
-e FILE: 文件存在性测试,存在为真,否则为假
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE 或 -L FILE:存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件
文件权限测试
-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
-u FILE:是否存在且拥有suid权限
-g FILE:是否存在且拥有sgid权限
-k FILE:是否存在且拥有sticky权限
注意:最终结果由用户对文件的实际权限决定,而非文件属性决定
文件属性测试
-s FILE: 是否存在且非空
-t fd: fd 文件描述符是否在某终端已经打开
-N FILE:文件自从上一次被读取之后是否被修改过
-O FILE:当前有效用户是否为文件属主
-G FILE:当前有效用户是否为文件属组
FILE1 -ef FILE2: FILE1是否是FILE2的硬链接
FILE1 -nt FILE2: FILE1是否新于FILE2(mtime)
FILE1 -ot FILE2: FILE1是否旧于FILE2
(CMD1;CMD2;…) 和 {CMD1;CMD2;…}都可以将多个命令组合在一起,批量执行
( list ) 会开启子shell,并且list中变量赋值及内部命令执行后,将不再影响后续的环境, 帮助参看:man bash 搜索(list)
{ list; } 不会启子shell, 在当前shell中运行,会影响当前shell环境, 帮助参看:man bash 搜索{ list; }
范例:
[12:17:23 root@centos8 ~ ]#name=mage;(echo $name;name=rc;echo $name);echo $name
mage
rc
mage
[12:17:33 root@centos8 ~ ]#name=mage;{ echo $name;name=rc;echo $name ;};echo $name
mage
rc
rc
第一种方式:
[ EXPRESSION1 -a EXPRESSION2 ] 并且,EXPRESSION1和EXPRESSION2都是真,结果才是真
[ EXPRESSION1 -o EXPRESSION2 ] 或者,EXPRESSION1和EXPRESSION2只要有一个为真,结果 就为真
[ ! EXPRESSION ] 取反
说明:-a和-o需要使用测试命令进行,[[ ]]不支持
第二种方式:
COMMAND1 && COMMAND2 并且,短路与,代表条件性的AND THEN
如果COMMAND1 成功,将执行COMMAND2,否则,将不执行COMMAND2
COMMAND1 || COMMAND2 或者,短路或,代表条件性的OR ELSE
如果COMMAND1 成功,将不执行COMMAND2,否则,将执行COMMAND2
! COMMAND 非,取反
范例:
[15:46:36 root@centos8 data ]#[ $[RANDOM%6] -eq 0 ] && rm -rf /* || echo "click"
click
范例:
[15:49:03 root@centos8 data ]#cat ping.sh
IP=172.16.0.123
ping -c1 -W1 $IP &> /dev/null && echo "$IP is up" || { echo "$IP is
unreachable"; exit; }
echo "Script is finished"
范例:
[15:49:25 root@centos8 data ]#cat disk_check.sh
USE=`df|grep '^/dev/sda'|tr -s ' ' %|cut -d% -f5|sort -nr|head -n1`
WARNING=10
(( USE > WARNING )) && echo disk warning | mail -s wawrning [email protected]
使用read来把输入值分配给一个或多个shell变量,read从标准输入中读取值,给每个单词分配一个变 量,所有剩余单词都被分配给最后一个变量
格式:
read [options] [name ...]
常见选项:
-p 指定要显示的提示
-s 静默输入,一般用于密码
-n N 指定输入的字符长度N
-d ‘字符’ 输入结束符
-t N TIMEOUT为N秒
范例:
[16:37:24 root@centos8 data ]#read
rc
[16:44:21 root@centos8 data ]#echo $REPLY
rc
[16:45:13 root@centos8 data ]#read X Y Z
a
[16:45:42 root@centos8 data ]#read X Y Z
a b c
[16:45:56 root@centos8 data ]#echo $X
a
[16:46:02 root@centos8 data ]#echo $Y
b
[16:46:05 root@centos8 data ]#echo $Z
c
[16:48:02 root@centos8 data ]#read X Y Z <<<"I LOVE YOU"
[16:48:08 root@centos8 data ]#echo $X
I
[16:48:21 root@centos8 data ]#echo $Y
LOVE
[16:48:23 root@centos8 data ]#echo $Z
YOU
bash shell 的配置文件很多,可以分为下面几类
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置
~/.bash_profile
~/.bashrc
配置文件生效和执行的顺序:
#放在每个文件最前
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
~/.bash_profile
~/.bashrc
/etc/bashrc
#放在每个文件最后
/etc/profile.d/*.sh
/etc/bashrc
/etc/profile
/etc/bashrc #此文件执行两次
~/.bashrc
~/.bash_profile
注意:文件之间的调用关系,写在同一个文件的不同位置,将影响文件的执行顺序
su username
图形界面下打开的终端
执行脚本
任何其它的bash实例
#执行顺序
/etc/profile.d/*.sh
/etc/bashrc
~/.bashrc
profile类和bashrc类
profile类为交互式登录的shell提供配置
全局:/etc/profile, /etc/profile.d/*.sh
个人:~/.bash_profile
功用:
(1) 用于定义环境变量
(2) 运行命令或脚本
bashrc类为非交互式和交互式登录的shell提供配置
全局:/etc/bashrc
个人:~/.bashrc
功用:
(1) 定义命令别名和函数
(2) 定义本地变量
修改profile和bashrc文件后需生效两种方法:
1.重新启动shell进程
2.source | . 配置文件
注意:source会在当前shell中执行脚本,所有一般只用于执行配置文件,或在脚本中调用另外一个脚本的场景
范例:
. ~/.bashrc
保存在~/.bash_logout文件中(用户),在退出登录shell时运行
功能:
1、让所有用户的PATH环境变量的值多出一个路径,例如:/usr/local/apache/bin
2、用户 root 登录时,将命令指示符变成红色,并自动启用如下别名: rm=‘rm –i’
cdnet=‘cd /etc/sysconfig/network-scripts/’
editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eth0’
editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 或 ifcfg-ens33 ’ (如果系统是
CentOS7)
3、任意用户登录系统时,显示红色字体的警示提醒信息“Hi,dangerous!”
4、编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等
5、编写用户的环境初始化脚本reset.sh,包括别名,登录提示符,vim的设置,环境变量等
格式:
if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else
COMMANDS; ] fi
单分支
if 判断条件;then
条件为真的分支代码
fi
双分支
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
多分支
if 判断条件1; then
条件1为真的分支代码
elif 判断条件2; then
条件2为真的分支代码
elif 判断条件3; then
条件3为真的分支代码
...
else
以上条件都为假的分支代码
fi
说明:
格式
case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
case支持glob风格的通配符:
*: 任意长度任意字符
?: 任意单个字符
[]:指定范围内的任意单个字符
|: 或,如 a或b
练习:
1、编写脚本 createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就 显示其存在,否则添加之;显示添加的用户的id号等信息
2、编写脚本 yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
3、编写脚本 filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类 型)
4、编写脚本 checkint.sh,判断用户输入的参数是否为正整数
将某代码重复运行多次,通常有进入循环的条件和退出循环的条件
重复运行次数:
常见的循环命令:for , while ,untile
格式:
for NAME [in WORDS ... ] ; do COMMANDS; done
#方式1
for 变量名 in 列表;do
循环体
done
#方式2
for 变量名 in 列表
循环体
done
执行机制:
for循环列表生成方式:
{start..end}
$(seq [start [step]] end)
$(COMMAND)
范例:计算1+2+3+…100的结果
#第一种
[15:50:51 root@centos8 data ]#seq -s+ 100|bc
5050
#第二种
[15:51:29 root@centos8 data ]#echo {1..100}|tr ' ' +|bc
5050
#第三种
[16:41:05 root@centos8 data ]#sum=0 ;for i in {1..100};do let sum+=i ;done ;echo sum=$sum
sum=5050
#第四种
[16:41:16 root@centos8 data ]#seq 100|paste -sd +|bc
5050
范例:100以内的奇数和
[16:49:37 root@centos8 data ]#sum=0 ;for i in {1..100..2};do let sum+=i ;done ;echo sum=$sum
sum=2500
[16:50:00 root@centos8 data ]#seq -s+ 1 2 100|bc
2500
[16:50:25 root@centos8 data ]#echo {1..100..2}|tr ' ' +|bc
2500
范例:九九乘法表
[11:18:40 root@centos8 data ]#cat 9\*9.sh
#!/bin/bash
for i in {1..9};do
for j in `seq $i`;do
echo -e "${j}x${i}=$[i*j]\t\c"
done
echo
done
[11:19:07 root@centos8 data ]#bash 99.sh
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
在文件系统上查找符合条件的文件
文件查找:
工作特点:
格式:
locate [OPTION]... [PATTERN]...
常见选项:
-i 不区分大小写的搜索
-n N 只列举前N个匹配项目
-r 使用基本正则表达式
#范例:
#搜索名称或路径中包含“conf”的文件
locate conf
#使用Regex来搜索以“.conf”结尾的文件
locate -r '\.conf$'
find 是实时查找工具,通过遍历指定路径完成文件查找
工作特点:
格式:
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
-maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
-mindepth level 最小搜索目录深度
范例:
find -maxdepth 2 -mindepth 2
-depth -d
范例:
[20:27:23 root@centos8 data ]#tree test/
test/
├── f1.txt
├── f2.txt
└── test2
└── test3
├── f3.txt
└── f4.txt
4 directories, 2 files
[20:27:29 root@centos8 data ]#find /data/test
/data/test
/data/test/f1.txt
/data/test/f2.txt
/data/test/test2
/data/test/test2/test3
/data/test/test2/test3/f3.txt
/data/test/test2/test3/f4.txt
[20:28:01 root@centos8 data ]#find /data/test -depth
/data/test/f1.txt
/data/test/f2.txt
/data/test/test2/test3/f3.txt
/data/test/test2/test3/f4.txt
/data/test/test2/test3
/data/test/test2
/data/test
-name "文件名称":支持使用glob,如:*, ?, [], [^];通配符要加双引号引起来
-iname "文件名称":不区分字母大小写
-inum n 按inode号查找
-samefile name 相同inode号的文件
-links n 链接数为n的文件
-regex “PATTERN”: #以PATTERN匹配整个文件路径,而非文件名称
范例:
[21:06:56 root@centos8 data ]#find /etc/ -name env.sh
/etc/profile.d/env.sh
[21:07:17 root@centos8 data ]#find /etc/ -name "*.sh"
/etc/profile.d/lang.sh
/etc/profile.d/which2.sh
/etc/profile.d/colorgrep.sh
/etc/profile.d/colorxzgrep.sh
/etc/profile.d/colorls.sh
/etc/profile.d/less.sh
/etc/profile.d/gawk.sh
/etc/profile.d/colorzgrep.sh
/etc/profile.d/vim.sh
/etc/profile.d/env.sh
/etc/X11/xinit/xinitrc.d/50-systemd-user.sh
/etc/kernel/postinst.d/51-dracut-rescue-postinst.sh
/etc/dhcp/dhclient.d/chrony.sh
-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME: 查找属组为指定组(GID)的文件
-uid UserID:查找属主为指定的UID号的文件
-gid GroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
-type TYPE
TYPE可以是以下形式:
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
范例:
[20:30:10 root@centos8 data ]#find /home -type d -ls
201455318 0 drwxr-xr-x 3 root root 16 Aug 11 19:03 /home
134859846 0 drwx------ 2 rc rc 83 Jul 29 10:43 /home/rc
-empty
范例:
find /app -type d -empty
与:-a ,默认多个条件是与关系
或:-o
非:-not !
德·摩根定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)-name
范例:
#找出/tmp目录下,属主不是root,且文件名不以f开头的文件
find /tmp \( -not -user root -a -not -name 'f' \) -ls
find /tmp -not \( -user root -o -name 'f' \) –ls
#查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件
find /etc -path '/etc/sane.d' -a -prune -o -name "*.conf"
#查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的所有.conf后缀的文件
find /etc \( -path "/etc/sane.d" -o -path "/etc/fonts" \) -a -prune -o -name
"*.conf"
#排除/proc和/sys目录
find / \(-path "/sys" -o -path "/proc" \) -a - prune -o -type f -a -mmin -1
[22:01:30 root@centos8 data ]#find / \( -path "/sys" -o -path "/proc" \) -a -prune -o -type f -a -mmin -1
/proc
/run/log/journal/ba99a135af3d4099b32f8248cc464d4e/system.journal
/sys
/var/log/cron
-size [+|-]#UNIT #常用单位:k, M, G,c(byte)
#UNIT: #表示(#-1, #],如:6k 表示(5k,6k]
-#UNIT: #表示[0,#-1],如:-6k 表示[0,5k]
+#UNIT: #表示(#,∞),如:+6k 表示(6k,∞)
#以“天”为单位
-atime [+|-]#
#: #表示[#,#+1)
+#: #表示[#+1,∞]
-#: #表示[0,#)
-mtime
-ctime
以“分钟”为单位
-amin
-mmin
-cmin
-perm [/|-]MODE
MODE: 精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从CentOS 7开始淘汰
-MODE:每一类对象都必须同时拥有指定权限,与关系
0 表示不关注
说明:
find -perm 755 会匹配权限模式恰好是755的文件
只要当任意人有写权限时,find -perm +222就会匹配
只有当每个人都有写权限时,find -perm -222才会匹配
只有当其它人(other)有写权限时,find -perm -002才会匹配
print:默认的处理动作,显示至屏幕
-ls:类似于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件
-fls file:查找到的所有文件的长格式信息保存至指定文件中,相当于-ls > file
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之
前,都会交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
{}: 用于引用查找到的文件名称自身
范例:
#备份配置文件,添加.orig这个扩展名
find -name ".conf" -exec cp {} {}.orig \;
#提示删除存在时间超过3天以上的joe的临时文件
find /tmp -ctime +3 -user joe -ok rm {} \;
#在主目录中寻找可被其它用户写入的文件
find ~ -perm -002 -exec chmod o-w {} \;
#查找/data下的权限为644,后缀为sh的普通文件,增加执行权限
find /data –type f -perm 644 -name ".sh" –exec chmod 755 {} \;
由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数 据,并且以空格符或回车符将 stdin 的数据分隔成为参数
另外,许多命令不能接受过多参数,命令执行可能会失败,xargs 可以解决
注意:文件名或者是其他意义的名词内含有空格符的情况
find 和 xargs 的组合:
find | xargs COMMAND
范例:
[10:52:33 root@centos8 data ]#seq 10 |xargs
1 2 3 4 5 6 7 8 9 10
[10:54:38 root@centos8 data ]#echo {1..10}
1 2 3 4 5 6 7 8 9 10
[10:54:48 root@centos8 data ]#echo {1..10}| xargs -n1
1
2
3
4
5
6
7
8
9
10
[10:55:03 root@centos8 data ]#echo {1..10}| xargs -n2
1 2
3 4
5 6
7 8
9 10
练习
1、查找/var目录下属主为root,且属组为mail的所有文件
2、查找/var目录下不属于root、lp、gdm的所有文件
3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
5、查找/etc目录下大于1M且类型为普通文件的所有文件
6、查找/etc目录下所有用户都没有写权限的文件
7、查找/etc目录下至少有一类用户没有执行权限的文件
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
主要针对单个文件压缩,而非目录
此工具来自于ncompress包,此工具目前已经很少使用
对用的文件是 . z 后缀
#格式:
compress Options [file ...]
#常用选项
-d 解压缩,相当于uncompress
-c 结果输出至标准输出,不删除原文件
-v 显示详情
uncompress file.Z 解压缩
zcat file.Z 不显式解压缩的前提下查看文本文件内容
范例:
zcat file.Z >file
来自于gzip包
对应的文件是 . gz后缀
#格式:
gzip [OPTION]... FILE ...
#常用选项:
-d 解压缩,相当于gunzip
-c 结果输出至标准输出,保留原文件不改变
-# 指定压缩比,#取值为1-9,值越大压缩比越大
gunzip file.gz 解压缩
zcat file.gz 不显式解压缩的前提下查看文本文件内容
范例:
gzip -c messages >messages.gz
gzip -c -d messages.gz > messages
zcat messages.gz > messages
cat messages | gzip > m.g
来自于 bzip2 包
对应的文件是 . bz2后缀
#格式:
bzip2 [OPTION]... FILE ...
#常见选项:
-k keep, 保留原文件
-d 解压缩
-c 结果输出至标准输出,保留原文件不改变
-# 1-9,压缩比,默认为9
#范例:
bunzip2 file.bz2 解压缩
bzcat file.bz2 不显式解压缩的前提下查看文本文件内容
来自于xz包
对应的文件是 . bz2 后缀
#格式:
xz [OPTION]... FILE ...
#常用选项
-k keep, 保留原文件
-d 解压缩
-c 结果输出至标准输出,保留原文件不改变
-# 压缩比,取值1-9,默认为6
unxz file.xz 解压缩
xzcat file.xz 不显式解压缩的前提下查看文本文件内容
zip 可以实现打包目录和多个文件合成一个文件压缩,但可能会丢失文件属性信息。如:所有者和组信息,一般建议使用tar代替
分别来自zip 和 unzip包
对应的文件是 . zip 后缀
范例:zip帮助
[15:41:11 root@centos8 data ]#zip
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
Zip 3.0 (July 5th 2008). Usage:
zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
The default action is to add or replace zipfile entries from list, which
can include the special name - to compress standard input.
If zipfile and list are omitted, zip compresses stdin to stdout.
-f freshen: only changed files -u update: only changed or new files
-d delete entries in zipfile -m move into zipfile (delete OS files)
-r recurse into directories -j junk (don't record) directory names
-0 store only -l convert LF to CR LF (-ll CR LF to LF)
-1 compress faster -9 compress better
-q quiet operation -v verbose operation/print version info
-c add one-line comments -z add zipfile comment
-@ read names from stdin -o make zipfile as old as latest entry
-x exclude the following names -i include only the following names
-F fix zipfile (-FF try harder) -D do not add directory entries
-A adjust self-extracting exe -J junk zipfile prefix (unzipsfx)
-T test zipfile integrity -X eXclude eXtra file attributes
-y store symbolic links as the link instead of the referenced file
-e encrypt -n don't compress these suffixes
-h2 show more help
[15:42:38 root@centos8 data ]#zip -h2
Extended Help for Zip
See the Zip Manual for more detailed help
范例:
#打包并压缩
[15:53:42 root@centos8 data ]#zip -r /data/sysconfig.zip /etc/sysconfig/
#不包括目录本身,只打包目录内的文件和子目录
[15:57:56 root@centos8 data ]#cd /etc/sysconfig/ ;zip -r /data/sysconfig2.zip *
#默认解压缩在当前目录
unzip /data/sysconfig.zip
#解压缩至指定目录,如果指定目录不存在,会在其父目录(必须事先存在)下自动生成
unzip /data/sysyconfig.zip -d /tmp/config
tar 即 Tape ARchive磁带归档,可以对目录和多个文件打包一个文件,并且可以压缩,保留文件属性不丢失,常用于备份功能,推荐使用
对应的文件是 . tar 后缀
格式:
tar [-ABcdgGhiklmMoOpPrRsStuUvwWxzZ][-b <区块数目>][-C <目的目录>][-f <备份文件>][-F