打补丁和生成补丁都是基于文本的
补丁:就是一个程序升级了 另外一个旧的程序可以通过这个补丁达到升级的一个目的
bug:问题
生成补丁:
(找出差异存入新文件)
打补丁:
patch:打补丁的命令
通过补丁包给需要的文件脚本打补丁
(一般是官方生成补丁包 个人客户进行补丁修补)
diff和patch只是适合纯文本的程序升级
-R 撤销打补丁 恢复原来的版本
patch -R 需要更新补丁的文件 <补丁文件
如果判断一个文件是否发生变化?
- diff
- md5sum
双中括号左右两边必须空格
md5sum:输出为两短 前面是值 后面是文件名
md5 信息摘要算法 ( 从一大堆的东西里面 摘取非常重要的内容)
一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致
散列值=摘要
sum求和
排错方法:输出值
shell编程里面不能有空格
流程控制语句:
if
for
while
shell编程:
变量的定义(命名规则和python差不多 变量命名不要空格 判断的时候要空格)
变量命名 :下划线(推荐) 驼峰
存放数据的一个地方
变量是容器
变量赋值时字符串中间有空格时一定要加引号
变量类型:
(在shell里如果一个变量没有定义 也是可以输出的 只是没有值 命令不报错)
这里也有一个bug:$a/$b 若变量a和变量b都没定义 则这个输出则是 /
自定义变量
环境变量 :(有PATH)
env 查看环境变量 set 查看所有变量
位置变量
预定义变量:系统里安装好就有的变量,不需要自定义(一般都是大写)
位置变量
函数
如何判断一个变量是否有值?
#变量 : 表示变量的长度 可以看出这个变量是否有值
echo ${#变量} 会输出变量的长度
用花括号把变量名括起来 :{变量}
用于将变量和后面字母区分开来 避免混淆
不过也可以用变量命名外的标点符号(标点符号是天然的分割符号)
如 s=kkk ${s}+jlk=kkk+jlk
位置变量:(这些可以理解为预定义变量)
作用:往脚本里传递参数—》传参
$0 代表脚本的文件名
$1 第1个位置变量
$2 第2个位置变量
以此类推
$# 代表位置变量的个数
$* ($@)代表所有的位置变量的内容
for循环中的位置变量的使用:
编写一个标本实现多个数字的求和
bash -x 脚本名字:可以看到整个脚本的执行过程
+ 表示执行了哪一条命令
set 给你看的变量是能够给你看的 位置变量不包括在里面
在环境变量里的命令可以不用绝对路径
不在环境变量的命令要用绝对路径
连续输入bash是bash里面包bash (按exit退出)
用户管理:
Linux里的用户与组:
administrator window里的超级用户
root Linux超级用户
为什么引入用户和组?
安全性 -- 权限管理
--资源管理(存储资源 io资源 计算资源 最直观的感受就是对硬盘资源的控制)
权限管理:哪些文件某个用户可以读写
哪些进程某个用户可以启动
有关用户的命令:
id:查看用户的信息(uid gid groups)
括号里面是名称 用户名称 组的名称 和 这个用户所在的组的名称
每一个用户有唯一的uid(相当于这个系统给你的身份证号) ,给计算机识别(超级用户 的uid号就是0 )
每一个组有唯一的gid
一个用户可以属于不同的组,一个组可以有不同的用户
groups是看你这个用户参加了哪些组
useradd 用户名: 增加用户
(若是第一次创建普通用户 ,uid是从1000开始计数的,每添加一个用户,uid加1)
(默认情况下, 创建用户的时候如果没有同名的组会同步创建一个和用户同名的组 默认将用户加入这个组)
创建一个用户会牵扯到哪些文件?
账户信息相关文件:
/etc/passwd
使用“:”分割
字段一:用户名
字段二:密码占位符,通常为x或者*(这个文件是谁都可以查看的,密码放在这里不安全)
字段三:用户id
字段四:所属基本组的id
字段五:用户的描述信息
字段六:家目录位置
字段七:登录的shell信息
用户密码放置文件:/etc/shadow
第二个字段存放的就是密码 “!!”表示没有密码
有密码的放置的是密码的sha512(哈希)
/etc/shadow- 是shadow 的备份文件 总比shadow少一次操作
/etc/passwd- 是passwd 的备份文件 总比passwd少一次操作
组信息相关文件:
/etc/group:存放组信息
/erc/gshadow:存放组的密码
/etc/group- 是组信息备份文件
/erc/gshadow- 是组密码的备份文件
/etc/这个目录就是放置配置文件的
家目录信息相关文件:
创建用户的时候,默认情况下会在/home目录下创建一个同名的文件夹
/home/放置普通用户的家目录的 /root 是root用户的家目录
su – 用户名: 切换用户且到达用户的家目录(exit或者CTRL+d退出)
普通用户基本上只能在家目录和tmp目录进行操作
一个新的用户家目录下的文件:
/etc/skel:用户环境默认设置文件
创建用户时会拷贝一份/etc/skel/下的文件到用户的家目录
用户默认属性设置文件:
/etc/login.defs :规定了uid从多少开始,密码的过期天数,密码的加密算法
邮件目录:
/var/spool/mail 下面创建一个同名的文件 (如果里面有东西说明root给你)
找出系统中uid大于等于1000的用户,显示出它的名字,uid,家目录,shell信息
userdel 用户名:删除用户
usermod 修改用户
users 查看当前是哪个用户
用户账户:(uid给系统识别的 名称给人识别的)
超级用户 root 皇帝 uid:0
程序用户 大臣 uid:1-999
普通用户 老百姓 uid:>=1000
程序用户:启动进程所用的用户
进程是正在进行的程序 ,计算机进行资源分配的最小单位(cpu资源 io资源 存储资源)
进程一般是从硬盘读取到内存中运行的 因为内存快
查看进程命令:这两种只是输出形式不一样
ps -aux
-a 打印所有的用户信息 用BSD语法表示
ps -ef 查看Linux进程的用户有效信息 用标准输出
在python里面查看进程的有效用户
import os
os.geteuid()可以得到有效用户的uid(一般来说以哪个用户启动 有效用户就是哪个)
os.getuid()可以得到有效用户的uid
os.getgid() 可以得到有效用户的gid
os.getpid()可以得到有效用户的pid
os库用法:os.mkdir(“python-test”) 在进入python3的目录下面创建了python-test目录
os.walk(“.”) 生成当前目录树 list(os.walk(“.”))把它转化成列表输出 相当于ls
对于脚本而言 怎么传参?
如bash 脚本名 参数1
$1 表示参数1
python 脚本传参?
如 python3 脚本名 参数1
使用sys.argv 会得到一个列表 sys.argv [1]表示参数1 sys.argv[0]表示脚本名
python里面调用Linux命令:
使用os 模块的os.system(“Linux命令”) 这个返回的是操作命令的返回值(状态码0和非0)
0表示命令执行成功 非0表示命令执行失败
os.popen(“Linux命令”)这个返回的是操作命令的输出内容
而相关内容用os.popen(“Linux命令”).read()读取
编写脚本判断用户是否存在 不存在就新建
要求: 命令行输入 bash 脚本名 用户名
命令行输入 python3 脚本名 用户名
服务一般都有一个客户端