LINUX的用户及用户组
su 切换用户,如果带-则是完全切换,被把目录进入到用户家目录。
sudo 用自己的用户以其他用户身份执行命令
usermod用于修改用户的属性
usermod -d /home/w1 user3 可以用于用户的家目录
创建用户组
groupadd group1
usermod -g group1 user1 将user1的用户组改为group1
useradd -g group1 user2 新建用户并将它设置为group1
/etc/passwd 用来保存用户信息
/etc/shadow 保存用户密码
/etc/group 保存用户组相关信息 ,用来设置一个用户两个组
系统运行级别
checkconfig list查看各服务在什么init级别下运行
systemd的是在wanted里面的target有
和init级别对应的target,达到init的效
如,runlevel.target。
init各级别与systemd对应关系
linux后台运行
加&,后台运行
jobs列出后台运行的任务
fg jobid弹出到前台
ctrl+z收回到后台,挂起了。
bg1 重新后台运行
信号
管道和信号是两种进程通信的方式
ctrl+c其实是一种信号
kill -l查看所有信号
screen保持后台运行
screen: 即使网络断开了(关闭终端),也可以继续运行 程序。
screen 进入screen
ctrl + a + d退出screen
screen -ls查看当前screen的列表
screen -r screenid切入到screen
SELINUX
SELINUX防止权限控制不当
原理:给用户 进程 文件打上标签 ,标签一致才能修改文件。
vim /etc/selinux/config编辑是否开启selinux,重启生效。
查看磁盘及分区
如果swap不开启,内存不足会随机杀掉。
fdisk查看磁盘及它的分区
parted -l也可以查看 和上面的差不多
df -h看分区和挂载目录及容量
ls -l /etc/passwd,查看含有空洞文件
du /etc/passwd,查看实际占用的文件
dd创建空洞文件
linux文件的构成
ls -li /etc/passwd
查看passwd文件的i节点编号
i节点上存储了权限,所属组之类的信息,i节点链式挂载了datablock数据块
i节点,文件名记录到父目录的i节点中
ls 查看的数据块的整体大小
du是查看数据块实际使用大小
个体比较小的文件,在linux中也是用4K
这是各类文件服务器出现的原因
- mv改名会改变i节点吗?
不会,他只会改变目录里i节点的文件名
- mv移动会改变i节点吗?
离开分区时会,不离开分区不会,离开分区时很长。
- 正常vim修改文件会改变i节点吗?
会,原理是vim有个swp文件存在,这是vim对文件一致性的考虑,相当于改变了文件。
- rm是什么原理?
父目录的文件名和文件的i节点断开
- ln的原理(硬链接)?
让文件名指向i节点,就实现了多个文件名指向同一个i节点。
- 跨越分区,如何链接?
使用软连接,ln -s afile aafile,两者的i节点就不一样了, 它保存了其代表的文件的
绝对路径,是另外一种文件(链接文件),在硬盘上,有独立的区块,访问时会替换自己的路径。
所以,如果删除掉被链接的文件,再去打开软链接,被链接文件,自然打不开。(和win快捷方式一样),但是硬链接能打开,因为他不是替换。而是有相同的i节点引用。软连接的一切操作都是会替换到被链接的文件,虽然他们的i节点不同,但是修改软连接的权限,也是修改的被链接的文件。
普通权限的补充
普通的权限不满足,要使用facl
getfacl afile
setfacl -m :user1:r afile
给硬盘分区
fdisk查看硬盘
fdisk /dev/sdc 对sdc硬盘设备分区
n 新建分区
p 主分区
设置分区号 1
起始值回车用默认
last扇区:+50G 给分区1分配50G
fdisk -l查看分配的分区
mkfs.ext4 /dev/sdc1对分区做文件系统
mkdir /mnt/sdc1
mount /dev/sdc1/ /mnt/sdc1
大于2T的,用parted命令进行挂载
mount挂载是临时的,需要修改etc/fstab才能永久保存
这个文件
/dev/sdc1 /mnt/sdc1 ext4 defaults 0 0
给swap扩容
swap分区扩容
用分区的方式给swap扩容
mkswap /dev/sdd1
swapon /dev/sdd1
swapoff /dev/sdd1
用文件的方式给swap扩容
dd if=/dev/zero bs=4M count=1024 of=/swapfile
mkswap /swapfile
chmod 600 /swapfile
swapon /swapfile
永久保存需要修改fstab
vim /etc/fstab
/swapfile swap swap defaults 0 0
第一个0代表是否备份 第二个0代表自检
linux组RAID
RAID
多块硬盘组合
RAID 0 把一份数据拆成两份,单盘只存50%
RAID 1 镜像,两个硬盘存的一样
RAID 5 有奇偶校验
RAID 10
要使用RAID卡比较好
逻辑卷
LVM
卷:一个物理设备就是一个卷
物理卷分区扩容需要先拷走文件
逻辑卷: 叠在物理上面,逻辑上的一个设备
查看系统综合状态
系统综合状态
sar -u 1 10
sar -r 1 10
linux查看十六进制文件
hexdump可以看十六进制文件
各种方式执行shell脚本
bash ./filename.sh 子进程
./filename.sh 子进程,用#!后面的东西去解释这个脚本
source ./filename.sh 当前进程
. ./ filename.sh 当前进程
cat命令输入文件
cat > /tmp/a.sh < EOF
echo ‘hello’
EOF
let命令
使用let计算
let a=10+20
shell中最好不要计算
将命令结果给到变量
命令结果赋值给变量,也可以使用``
letc=$(ls -l /etc)
变量中如果有空格
name="xu jz "
查看环境变量
env 查看环境变量
set 查看环境变量及预变量
$号的作用
$$ 进程号
$0 进程名 不同执行方式 结果不一样 bash执行时,是shell文件名称
$? 上一个命令执行结果
$1 $2 ${10}读取位置参数
${2-k} 如果$2没值 那就用 'k’替换
默认环境变量加载
/etc/profile
/etc/profile.d
~/.bash_profile
~/.bashrc
/etc/bashrc
source 可以导入环境变量,如果修改了环境变量文件,则source则可以导入环境变量
原理:根据各种情况进入bash,调用不同的配置文件,则变量开始生效,比较nologin shell 和login shell是加载
不同配置。su - root 获取一个 login shell。
数组
IPTS=(10.0.0.1 10.0.0.2 10.0.0.3)
打印数组 echo ${IPTS[@]}
打印数组数量 echo ${#IPTS[@]}
完全引号和非完全引号
“”不完全引号,会去解析$
''是完全引用
``是命令
算数运算
expr 用于算数运算符 a=expr 4 + 5 记得 要空格
let a=4+5 让变量a为9
(( a=4+5 )) 双括号其实是let的简写, 让变量等于9
只支持整数运算
特殊符号总结
圆括号可以产生子shell (a=123),这个产生了一个子shell
数组pts=(10 23 30)
运算echo $(( 10+20))
( ) 用 于 在 里 面 加 入 一 个 命 令 , c m d 1 = () 用于在里面加入一个命令, cmd1= ()用于在里面加入一个命令,cmd1=(ls),则cmd1是ls的运行结果
echo {0…9} // 打印0 到 9,花括号与数字没有空格
cp /etc/passwd{,.bak} // 利用花括号复制省略
test命令 test 7 -gt 6 ,测试7是否大于6 是的话,是的话返回0,不是的话返回1,返回用$?查看
test等价于[ 7 -gt 6 ]是的话,打印出$?
测试的扩展 [[ 5 > 4 ]] 如果不用此扩展 则 []里面只能用gt这样的命令,[[]]能用数字运算比较
test akc = akc // 等号两侧记得加上空格
[ akc = akc ] // []和test等价,[]与test 只支持 =和 !=,不支持>这样的符号,要这样的逻辑只能用-gt, test 6 -gt 3
(( 5 > 3 && 6 > 5 ))
(( ! 5 > 4 ))
[ -e /tmp/xujz/test.json ] //判断是否存在
[ -d /tmp/xujz/test.json ] //判断是否是普通文件
[ -f /tmp/xujz/test.json ] //判断是否是普通文件
[[]] 里面可以加判断表达式,比如字符串的和数字的
(())里面只能用于数字运算的表达式
if 语句
if [ $UID = 0 ];
then
echo " i am root";
fi
if pwd;
then
echo "run pwd success"
fi
if [ $USER = root ]; then
echo 'you are root'
elif [ $USER = user1 ]; then
echo 'you are user1'
else
echo 'other user'
fi
case语句
#!/bin/bash
cmd=$1
echo $cmd
case "${cmd}" in
"START"|"start")
echo $0 start
;;
"STOP")
echo $0 stop
;;
*)
echo "usage: $0 start | stop"
;;
esac
shell的循环
- for循环
for filename in `ls *.mp3`
do
mv $filename $(basename $filename .mp3).mp4
done
- C语言风格的for
for (( i=1; i<=10; i++ ))
do
echo $i
done
- while循环
while [ $a -lt 10 ];
do
(( a++ ))
echo $a
done
# 写一个不断循环
while :;
do
echo "run"
done
- until循环
// 直到条件为真才结束循环
until [ 5 -lt 4 ];
do
echo always
done
break和continue
各种$参数的含义
$0 代表脚本的名字
∗ 和 *和 ∗和@ 获取所有参数
$# 代表参数个数,shitf是参数左移,即删掉第一个参数
while [ $# -ge 1 ]
do
echo $1
shitf
done
shell函数
function cdls() {
cd /var
ls
}
# 还可以将function省略掉
cdls() {
cd /var
ls
}
# 函数接参数,也是用$接收
cdls() {
cd /$1
ls
}
# 使用
cdls /tmp
# 使用local定义变量,防止变量影响到外部变量
checkpid() {
local i
for i in $*;do
[ -d "/proc/$i" ] && return 1
done
return 0
}
# 使用source或者. checkpid.sh方式导入函数,不能使用bash checkpid.sh方式导入,否则函数存在子进程中
source checkpid.sh
系统函数库
source /etc/init.d/functions
echo_succes
# pathmunge函数 用于加配置到PATH中
source /etc/profile
脚本资源控制
nice renice控制脚本优先级
# 查看资源限制
ulimit -a
shell 脚本信号捕获
有些时候,我们希望我们的脚本不被ctrl+c停止,就要捕获这个信号,ctrl+c是信号2,所以我们可以捕获他,9信号是不可捕获的。
# 捕获2信号,即ctrl+c
trap "can't no stop" 2
crontab定时任务
计划任务
at 18:01
echo hello > /tmp/hello.txt
# 配置crontab
crontab -e
# 查看crontab
crontab -l
# 存储cron任务的目录
cd /var/spool/cron
延时计划任务
# 查看延时计划任务
vim /etc/anacrontab
脚本单例运行
# flock -xn即排他,利用文件锁进行的
flock -xn "/tmp/f.lock" -c "/root/a.sh"
文本查找元字符
# 查找文件里的password
grep password /root/anaconda-ks.cfg
# 匹配换行符以外的任意单个字符,一个.代表一个字符
grep pass.... /root/anaconda-ks.cfg
# $是结尾,查找pass开头,接着四个字符,结尾的
grep pass....$ /root/anaconda-ks.cfg
# *匹配前一个字符的任意个,下面的能匹配 0个s(pas) 一个s(pass) 两个 s(passs)
grep pass* /root/anaconda-ks.cfg
# *与.搭配使用,可以匹配 passsdfdfe,即匹配pass开头
grep pass.* /root/anaconda-ks.cfg
# []匹配方括号任意字符,匹配Hello或者hello
grep [Hh]ello /root/anconda-ks.cfg
# 以开头 ^# 以#开头
grep ^# /root/anconda-ks.cfg
# 转义,查找带.号,记得带""
grep "\." anaconda-ks.cfg
扩展元字符
# + 匹配一次到多次
# ? 匹配零次或一次
# | 匹配它前面或后面的正则表达式
示例
# 这种只能使用通配符
find /etc/ -name passwd
find /etc/ -name passwd*
# 加上-regex就能使用元字符
find /etc/ -regex .*wd$
# 精确找到/etc/passwd
find /etc/ -regex .etc.*wd$
# 查找8小时内未访问的,ctime是改了i节点
find /etc/ -atime 8
cut命令
# 将每行用空格分开,然后取第一个
grep pass /root/anaconda-ks.cfg | cut -d " " -f 1
# 用空格分开,然后排序,然后统计每个出现次数,然后再排序。uniq只会对相邻的行做统计,所以第一次sort是为了这个
cut -d " " -f 7 /etc/passwd | sort | uniq -c | sort
Sed命令
sed命令,也是可以使用元字符的
将文件以行为单位读入内存(模式空间)
使用sed的每个脚本对改行进行操作
sed命令使用
// \1即捕获组的第一个,这里就是空格,所以代码的意思
// 将每一行以至少一个空格开头的行在行首加#
sed -i 's/\(^[[:space:]]\)/#\1/g' /tmp/rc.sysinit
sed 's/old/new/' filename
# 多个处理,也可以将-e去掉,然后用分号;隔开, sed 's/old/new/;s/old/new/'
sed -e 's/old/new/' -e 's/old/new/' filename
# 替换完成写到文件里
sed -i 's/old/new' 's/old/new' filename
# 支持扩展表达式,即支持+ ? |
sed -r 's/扩展正则表达式/new' filename
# sed的分组功能,用括号括起来,然后\1取得分组
sed -r 's/(a.*b)/\1:\1/'
# 全局替换/g ,第二个匹配则使用 /2
head -5 /etc/passwd | sed 's/root/!!!!/g'
sed命令加强版
# p打印模式空间,在行末打印模式空间
head -5 /etc/passwd | sed 's/root/!!!!/p'
# 只输出替换成功的行 -n,
head -5 /etc/passwd | sed -n 's/root/!!!!/p'
# 将替换成功的输出到文件中
head -5 /etc/passwd | sed -n 's/root/!!!!/w' /tmp/a.txt
sed寻址
# 使用正则表达式寻址
head -t /etc/passwd | sed '/^bin/s/adm/!/'
# 使用行号限制 n,ms,第n到m行,ns即第n行
head -t /etc/passwd | sed '1,3s/adm/!/'
# 混合使用,正则表达式混合行号 以bin开头直到结尾
head -t /etc/passwd | sed '/^bin/,$s/adm/!/'
# 寻址匹配多条命令
head -t /etc/passwd | sed '/^bin/{s/adm/!/;s/rdm/!/}'
其他sed指令
# d,删除匹配的模式空间,因为删除了,所以此模式空间的相关命令不会再执行
sed 'ab/d' bfile
# i,追加命令,在匹配ab的上一行插入Hello
sed 'ab/i Hello'
# a,追加命令,在匹配ab的下一行插入Hello
# c,将匹配的模式空间替换
sed 'ab/c Hello'
# 输出匹配book的行
sed -n '/book/p'
AWK的使用
sed将不规范的文本格式化为规范的文本,awk再将规范文本输出
// 读取以menu开头的行,以单引号分隔
awk -F "'" '/^menu/{print $2}' /boot/grubs/grub.cfg
// x++用于,可以用于显示得到的行号
awk -F "'" '/^menu/{print x++,$2}' /boot/grubs/grub.cfg
使用FS,及OF控制切割符及结果分割符
使用RS作为行分割符号, 默认是\n。
使用 NR和FNR显示行号
# 显示行号及该行内容
head -5 /etc/passwd | awk '{print NR, $0}'
# FNR会将文件各自的行号列出来,而FNR会将文件的行号递增
awk '{print FNR,$0}' /etc/hosts /etc/hosts
使用NF看字段数量
# 以:为分隔符,查看每行的字段数量
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print NF}'
# 以:为分隔符,查看每行的最后一个字段内容
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $NF}'
awk还能支持关系操作符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L8fUFQ5W-1611407403969)(C:\Users\Jazon\Desktop\linux\kpi.png)]
# 第二个字段大于等于80,打印第一个字段
awk '{if($2>=80) print $1}' /etc/kpi.txt
# 使用循环遍历每一个值
awk '{sum=0;for(c=2;c<=NF;c++) sum+=$c;print sum/(NF-1)}' kpi.txt
# END代表整个文件读取完成之后才会去做的操作
awk '{sum=0;for(column=2;column<=NF;column++) sum+=$column;average[$1]=sum/(NF-1)}END{for(user in average) sum2+=average[user];print sum2/NR}' kpi.txt
# 将awk(上面单引号那段)保存成文本文件avg.awk,后续直接用文本文件可以使用awk
awk -f avg.awk kpi.txt
# 命令行参数数组ARGC及ARGV
BEGIN{
for(x=0;x<ARGC;x++)
print ARGV[X]
PRINT ARGC
}
# awk还能自定义函数,下面的语句定义了一个函数double,结果将打印hello awkhello awk
awk 'function double(str) {return str str} BEGIN {print double("hello awk")}'
vim
shift+i ,光标停留行首
小写的a,光标进入之前光标的下一位
大写的a,光标进入到之前光标的行尾
小写的o进入当前的行的下一行,并且将下一行往下移,得到一个空行。
大写的o进入当前的上一行,并且把上面的内容都网上移一行
HJKL,左下上右
yy复制整行,3yy复制当前包含当前行的三行,y$复制当前光标到行尾
p进行黏贴
dd 剪切当行,d$当前光标到行尾剪切
ctrl+r将撤销的重做
x将单个字符的删除
r将当前字符进行替换
数字 加 shift+G移动到数字行
shift+G到最后一行
g到第一行
^字符到行首
$到行尾
:!可以用于执行其他linux 例如:!ifconfig
查找之后按n可以查看下一个,大写N(shift+n)查看上一个
:s/old/new
替换,将old替换为new默认支队光标所在行,:%s/x/X,将找到的x替换为X,两条
都是只替换一处,:%s/old/new/g可以替换整篇文档。:3,5s/x/X/g将3到5行的小写x替换为X
:set nu 设置行号 :set nonu取消行号
vim /etc/vimrc 这是vim的配置文件,可以配置为自动显示行号
可视模式:
小写v进入字符可视模式
shifit+v进入行可视模式
ctrl+v进入块可视模式
进入到可视模式,可以进行多行一起处理。shift+i,编辑第一行的,然后按两下ESC,即可全部行生效。按一下d,则全部选中的会被删除。
RPM的格式
RPM:
获得rpm的方法:
1.网上下载
2.系统光盘