续前文
7、权限管理
- 权限
- r
- w
- x
- 三类用户
- u:属主
- g:属组
- o:其他用户
- 改变用户
- chown:只有管理员可以,改属主与属组
- chgrp:管理员,改属组
- chmod: 数字;ugoa=rwx;用户类别+-权限
- 新建一个没有家目录的用户
- # useradd -M user
- 手动添加用户
- nano /etc/group:添加基本组,附加组后添加用户名
- nano /etc/passwd:
- nano /etc/shadow:86400秒/天,date +%s
- cp -r /etc/skel /home/user
- chown -R user.user /home/uder
- chmod -R go= /home/user
- openssl passwd -1 -salt '12121212': 生成密码加密,复制到shadow
- umask:遮罩码
- 666-umask:文件
- 777-umask:文件夹
- umask 022:修改
- 文件不具有默认执行权限,若设定默认有,则权限+1
- shell的类型
- 登陆式
- 正常
- su - user
- su -l user
- 读取步骤:/etc/profile -->/etc/profile.d/*.sh --> ~/.bash_profile -->~/.bashrc -->/etc/bashrc
- 非登陆式
- su user
- 图形终端
- 自动执行
- 读取步骤:~/.bashrc --> /etc/bashrc -->/etc/profile.d/*.sh
- 登陆式
- bash的配置文件
- 全局
- /etc/profile, /etc/prifile.d/*.sh, /etc/bashrc
- 个人
- ~/.bash_profile,~/.bashrc
- profile类配置文件
- 设定环境变量
- 运行命令或脚本
- bashrc类的文件
- 设定本地变量
- 定义命令别名
- 修改 ./.bashrc 添加alias cls='clear'
- 全局
8、管道及IO重定向
- 权限
- r
- w
- x
- 三类用户
- u:属主
- g:属组
- o:其他用户
- 改变用户
- chown:只有管理员可以,改属主与属组
- chgrp:管理员,改属组
- chmod: 数字;ugoa=rwx;用户类别+-权限
- 新建一个没有家目录的用户
- # useradd -M user
- 手动添加用户
- nano /etc/group:添加基本组,附加组后添加用户名
- nano /etc/passwd:
- nano /etc/shadow:86400秒/天,date +%s
- cp -r /etc/skel /home/user
- chown -R user.user /home/uder
- chmod -R go= /home/user
- openssl passwd -1 -salt '12121212': 生成密码加密,复制到shadow
- umask:遮罩码
- 666-umask:文件
- 777-umask:文件夹
- umask 022:修改
- 文件不具有默认执行权限,若设定默认有,则权限+1
- shell的类型
- 登陆式
- 正常
- su - user
- su -l user
- 读取步骤:/etc/profile -->/etc/profile.d/*.sh --> ~/.bash_profile -->~/.bashrc -->/etc/bashrc
- 非登陆式
- su user
- 图形终端
- 自动执行
- 读取步骤:~/.bashrc --> /etc/bashrc -->/etc/profile.d/*.sh
- 登陆式
- bash的配置文件
- 全局
- /etc/profile, /etc/prifile.d/*.sh, /etc/bashrc
- 个人
- ~/.bash_profile,~/.bashrc
- profile类配置文件
- 设定环境变量
- 运行命令或脚本
- bashrc类的文件
- 设定本地变量
- 定义命令别名
- 修改 ./.bashrc 添加alias cls='clear'
- 全局
9、grep及正则表达式
- grep:根据模式搜索文本,并将符合模式的文本行显示出来。不一定全部匹配,一部分匹配即显示。
- grep [OPTIONS] PATTERN [FILE...]
- pattern:文本字符和正则表达式的元字符组合而成匹配条件
- -i:忽略大小写
- --color
- -v:显示没有被模式匹配到的行
- -o:只显示被模式匹配到的字符串
- -E:扩展的正则表达式
- -A:某行被匹配,其后n行也显示,
- -B:某行被匹配,其前n行也显示。
- -C:前后n行显示
- 正则表达式
- *:任意长度任意字符
- ?:任意单个字符
- 元字符:
- . :点表示任意单个字符
- []:指定范围
- 匹配次数(贪婪模式)
- *:匹配其前面的字符任意次,a*b可匹配b,ab,aab,
- .*:任意长度的任意字符
- ?:匹配其前面的字符一次或者零次,需要使用转义\?
- \{m,n\}:匹配其前面的字符至少一次,至多n次。
- 位置锚定
- ^:锚定行首,此字符后面出现的字符必须出现在行首
- $:锚定行尾,此字符前面出现的字符必须出现在行尾
- ^$:空白行
- \<:其后面的任意字符必须作为单词的首部出现\b,锚定词首
- \>:其前面的任意字符必须作为单词的尾部出现\b,锚定词尾
- 分组
- \(\)
- \(ab\)*:ab可出现任意次
- 后向引用:匹配He love his lover,grep '\(l..e\).*\1' test.txt
- \1:第一个左括号以及与之对应的右括号所包括的所有内容
- \(\)
- []:匹配指定范围内的任意单个字符
- [^]:匹配指定范围外的任意单个字符,digit,lower,upper,punct,space,alpha,alnum
- REGEXP:regular expression,正则表达式
- 正则表达式分类
- basic regexp:基本的
- 元字符,匹配次数,锚定,
- extended regexp:扩展的egrep==grep -E
- 元字符:
- 次数
- +:匹配其前面的字符至少一次,相当于\{1,\}
- 无需反斜线:{m,n}
- 位置锚定
- 分组:(),支持引用\1,无需转义。
- 支持 or:| a|b C|cat:C或者cat
- basic regexp:基本的
- 找1-255之间的整数: egrep --color '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
- 匹配IP v4地址ifconfig | egrep --color -o '(\<([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}(\<([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>)'
- fgrep:fast
- 不支持正则表达式,执行速度快。
10、bash脚本编程变量,变量类型
- 语言
- 编译器,解释器
- 编程语言:机器语言,汇编语言,高级语言。
- 静态语言:编译型语言,强类型,转化二进制。
- 事先转化程可执行程序。
- c,c++,Java,c#
- 动态语言:解释型语言,弱类型,执行时转化。
- 边解释边执行。
- asp,asp.net,php,shell,python,perl
- 解释器本身通常是静态语言开发的
- 面向过程
- Linux内核由c写成
- shell脚本
- 面向对象
- 大型软件开发
- Java,python,c++
- 变量
- 内存空间,命令,内存是编址的存储单元
- 变量映射内存地址
- 变量类型:整型,浮点型,
- 事先确定存储格式与存储长度
- 溢出问题:缓冲区溢出,判断大小,软件外包(中,印)
- 逻辑运算:与,或,非,异或
- shell:弱类型编程语言
- 强:变量在使用前,必须事先声明,甚至还需要初始。
- 弱:变量用时声明,甚至不区分类型,
- (本地)变量赋值:var_name=value,作用域整个bash进程
- bash变量类型
- 环境变量
- 作用域当前shell进程及其子进程
- export varname=value “导出”
- 脚本在执行时会启动一个子shell进程(命令行中启动的 脚本会继承当前shell环境变量)
- 系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量
- 本地变量(局部变量)
- 变量引用:${varname},括号可省
- 局部:local varname=value,作用域当前代码段
- 位置变量
- $1,$2,...:
- 特殊变量(系统变量)
- $?:保存上一个命令执行状态返回值,0正确执行,1-255错误执行(1,2,127系统预留,其他可自定义含义)。
- 程序执行,可能有两类状态:正确和错误
- 输出重定向dev/null(软件模拟设备,数据黑洞):# id student &> /dev/null; echo $?
- $?:保存上一个命令执行状态返回值,0正确执行,1-255错误执行(1,2,127系统预留,其他可自定义含义)。
- 撤销变量:unset varname
- 查看当前shell中变量:set
- 查看环境:printenv,env,export
- 变量附加:animals=$animals:goat,不做算数运算,只做字符串相加
- 脚本:命令的堆砌,按实际需要
- 环境变量
11、bash脚本编程条件判断
- 实现条件判断
- $?:
- 条件测试类型
- 整数测试
- 字符测试
- 文件测试
- 条件测试的表达式
- [ expression ]
- [[ expression ]]
- test expression
- 整数比较的实现
- -eq:测试两个整数是否相等,[ $A -eq $B ],取状态返回值
- -ne:测试两个整数是否不等
- -gt:测试一个数是否大于另一个数
- -lt:测试一个数是否小于另一个数
- -ge:大于等于
- -le:小于等于
- 命令间的逻辑关系
- 逻辑与:短路操作,&&,
- id user &> /dev/null && echo "hello,student!",
- 用户不存在则添加 !id user && useradd user
- 第一个条件为真,第二个条件必须得判断
- 第一个条件为假,第二个条件不再判断(执行)
- 逻辑或:短路操作,||,
- id user || useradd user用户不存在则添加
- 逻辑与:短路操作,&&,
- 变量名称:只能包含字母,数字,下划线,且不能以数字开头,不应与系统中的环境变量名重名
- if-else变种:[ expression ] && if-true || else
- ! id user1 && useradd user1 && echo "password" | passed --stdin user &> /dev/null || echo "user1 exists."
- 取得当前系统用户数
- USERS=`wc -l /etc/passwd | cut -d: -f1`
- echo USERS
- 条件判断
- 单分支
- if 判断条件; then
- statement1
- statement2
- ...
- fi
- if 判断条件; then
- 双分支
- if 判断条件; then statement statement ... else statement statement fi
- 单分支
- 做算数运算
- let C=$A+$B
- $[算数运算表达式]:C=$[$A+$B]
- $((算术运算表达式)):D=$(($A+$B))
- expr 算数运算表达式:表达式中各操作数及运算符之间要有空格,而且要有命令引用,C=`expr $A + $B`
- 提前结束脚本:exit
- 定义执行状态结果:exit n,0-255,
- 文件测试
- -e FILE :测试文件是否存在 [ -e /etc/inittab ]
- -f FILE :测试文件是否为普通文件
- -d FILE :测试指定路径是否为目录
- -r FILE :测试当前用户对该文件是否有读权限
- -w FILE :
- -x FILE :
- 文件测试的使用
- 多分支的if语句
- if elif elif ... else fi
- 多分支的if语句
- 测试脚本是否有错误
- 位置变量:
- $1,$2,对应命令的参数
- shift:轮换
- 特殊变量:
- $?,
- $#,返回参数的个数,判定有无参数
- $*,参数列表
- $@,参数列表
12、sed
- 基本用法
- 流编辑器
- 行编辑器(全屏编辑器:vi)
- 模式空间,
- 默认不编辑源文件,只对模式空间中的数据做处理
- sed [options] 'AddressCommand' file ...
- Address
- Startline,Endline:1,100,$表示最后一行,$-1.
- /RegExp:/root,以root开头的字符串
- /pattern1/,/pattern/:第一次被模式一匹配到的行开始,到第一次被模式二匹配到的行结束。
- LineNumber:指定的行
- StartLine,+n:从startline开始,向后n行
- Command
- d:删除符合条件的行,sed "1,2d" /etc/fstable
- p:显示符合条件的行
- a \string:在指定的行后面追加新行,内容为string
- i \string:在指定的行前面追加新行,内容为string
- r fife:将指定的文件的内容添加至符合条件的行后(文件合并),
- w file:将指定范围的内容另存至指定的文件中
- s/pattern/string/:查找并替换,默认只替换每行中第一次被模式匹配到的字符串,# (其他)也可做分隔符。
- 加修饰符
- g:全局替换:sed '/\//#/g' /etc/passwd
- i:查找时忽略字符大小写
- 加修饰符
- options
- -n:静默模式,不再默认显示模式空间中的内容
- -i:直接修改原文件
- -e script ...:同时执行多个脚本
- -f FILE: sed -f /path/to/scripts file
- -r:使用扩展正则表达式
- 后向引用
- sed 's#l..e#&r#g' sed.txt
- &表示模式匹配到的所有字符串
- sed 's#\(l..e\)#\1r#g' sed.txt 类似于grep的用法
- sed 's#l\(..e\)#L\1r#g' sed.txt 将l替换为L