在sudoers文件里:
huang这个用户只能用USERMANAGER
到底是sudo好,还是suid权限好,给用户授权的时候?
还是sudo好 控制的更加精准 比较安全
Suid是不分用户,任何用户都可以执行
Sudo是认用户名的,不是任何都可以执行的,sudo要更加精准
Linux下面的正则一般是用来过滤的 和grep命令相结合
grep是每一行作为一个元素进行匹配
-v是取反
-n 添加行号
过滤空行:grep “^$” 文件名 (过滤文件里面的所有空行)
Python里面的匹配时字符匹配 Linux里面的时一行一行匹配
newgrp:一个用户的附属组有多个组 newgrp 命令切换用户的有效组
newgrp [群组名称]
SELinux:是一个Linux系统的一个安全方面的子系统,用来提升Linux的整体的安全级别
所以一般会关闭SELinux
临时关闭:
永久关闭SELinux:
修改
将SELinux等于后面改为disabled
shell编程:
开发先行!
shell编程只能用在Linux里面
shell编程有时间相关 日志分析类 监控类 一键部署类 安全类 用户管理类 备份类 数据库操作类
- 抽奖程序:从班级名单里随机抽取学生名字
学生名单:student_name.txt
产生随机数 RANDOM
产生1-15的随机数((RANDOM%15+1))
在双圆括号里面 变量名可以不接$
双圆括号也可以不空格 双中括号有空格
- 监控类:内存的使用率
top
free -m
双圆括号里面只能是整数运算
bc是Linux的计算器 使用bc进行小数的运算和比较
scale=n 表示精确到小数点后n位
bc进行小数的比较 看输出值 不能看$?
vim mem_monitor.sh
- 局域网扫描工具:知道哪些ip地址在使用,哪些没有使用
Ping命令
-c 1 只ping一次
-w 1 ping不通就1秒
两行代码可以替换成 echo “Host $i is up”|tee -a up.txt
组合一个案例集:
$? 代表上一条命令执行的返回值 0 1
返回值:不等于输出结果
0 说明上一条命令执行成功 非0 说明上一条命令执行失败
token 理解为不能再进行分割的部分
eval:执行2次
如:myfile=’cat test.txt’
echo $myfile 显示cat test.txt 这个字符串
eval $myfile 显示test.txt里面的内容(第一次提取出cat test.txt 第二次执行cat test.txt)
执行命令的过程是内核创建进程
if 命令(若是命令执行成功,if会拿到返回值0,故if自动判断执行成功,执行if后面内容)
vim编辑器 V选中 shift+>缩进
串行:一个一个的执行 有顺序的执行的
并行:同时执行,不分顺序
shell里的多进程并行:大大提升了速度
(命令)& :启动一个子进程去执行命令,并且将这个命令放到后台执行
()表示启动子进程
& 表示扔到后台去进行
前台:人可以看到的界面
后台:人看不到的程序界面
为什么串行顺序是对的,而并行顺序是乱的?
并行:
进程调度的先后顺序不一样
在就绪队列到运行队列里面run的时候就有一定的随机性
强类型 弱类型 静态和动态
go语言是解释型
ss -anplut|grep sshd :查看sshd占用了哪个端口
登录shell:远程或本地 输入用户名密码
Sshd运行bash
然后bash运行
Shell启动配置文件的区别:
/etc/profile:配置全局环境变量(变量和函数 别名),影响所有用户
~/.bash_profile:配置个人环境变量,影响一个用户
/etc/bashrc:配置全局的别名或者函数,影响所有用户
~/.bashrc:配置个人别名或者函数,影响一个用户
影响全局:所有人
/etc/profile,/etc/bashrc
影响局部:个人
~/.bashrc ,~/.bash_profile
非登录shell:
直接敲bash 只执行~/.bashrc
Shell脚本的4种执行方式:
bash a.sh 和./a.sh 调用子bash进程
(子进程调用不了父进程的私有变量 若要调用 需要export 变量名)
. a.sh 当前bash里运行
source a.sh 当前bash里运行
$$ 当前终端的pid号
pstree -p 显示所有的进程tree
export 变量名:就把变量变成全局变量
bashrc中的rc :runing config ==》运行哪些配置
unset 取消变量
位置变量只能传到传到脚本主体里,但是脚本里函数不能直接使用位置变量,因为相当于传了两层,如果函数想调用就需要用变量接受一下
shell变成里面的函数定义
函数名()
{
函数体
函数体里面的return语句没有什么用 一般不怎么用
}
shell里调用函数不需要加小圆括号 只需要写函数名就好了
间接引用:shell中值不会传递
如 a=10;b=a;
echo b得到的结果为a
若echo ${!b} 得到的结果为10 (也就是引用了两次 间接引用)
${#变量名}:得到变量的长度
for循环取出所有位置变量
for i in “$*”:
自增方法:
((n++))或者((++n))
let n++ 或者 let ++n
这里不用eval会报错:报错显示num1=$1不是命令
所以需要eval 进行两次调用 第二次调用才能把位置参数真正的赋值给脚本里的变量
产生子进程的四个方法:
1.& 提交给后台作业
2.()
3.执行外部脚本,程序 如直接敲bash 或者 mkdir
4.管道符号 后面那个命令也相当于开了一个子进程
定义新的函数:推荐用第二种
1.function 函数名
{
命令序列
}
2.函数名()
{
命令序列
}
调用函数:直接敲函数名
像函数内传参(可以使用位置参数)但不是脚本外面的位置参数
main函数:一般脚本最后一个写main函数,通过case语句去调其他函数
默认函数里的变量是全局变量 ,其他函数也可以使用
local 变量名:表示变量只能在函数中使用
return表示函数返回值:范围是0-255
遇到return就退出函数且后面的语句不再执行
而遇到exit是退出(脚本)子bash进程 exit后面可以接数字作为退出进程的返回值
变量=$(函数) 把函数的输出结果赋值给变量 而不是把返回值赋值给变量
每个脚本只需要一条语句调用库文件即可:
. 库文件名字或者source 库文件名字(相当于import 库文件)
. /etc/init.d/functions(shell里面的库文件)
看懂这四个脚本
case语句:
case 变量值 in
命令序列
;;
模式2|模式3)
命令序列
;;
……
*)
命令序列
;;
esac
while循环:
无线循环的写法:
while
while true
while [1]
在shell编程里面 i++和++i是有区别的
++i:先运算再赋值
i++:先引用再运算
grade文件中一行有3个变量,且用空格分开,while会自动识别并且赋值
也可以只用一个变量 代表整行
locale可以查看语言编码
产生10-200之内的数字 $((RANDOM%190 +10))