韩顺平linux学习笔记

40 组

linux系统权限是分给三个对象的:

所有者,所作组,其他组


哪里可以看到权限呢?

在linux中输入ls -l

image-20260315212825837

具体图解权限介绍

image-20260315214211559

第0位:

l链接(类似于快捷方式)

d目录

c 字符设备文件character device file(键盘,硬盘:按顺序一个一个读取)

b 块设备文件block device file(u盘,硬盘sda:可不按顺序一块一块读取)->sda(sd:scsi disk a:顺序,可以也是bc…)

-普通文件

第1-9位:三权限

33对应,分别归属于user group other ->user的权限 group的权限 other的权限

详细字母对应权限:

1
2
3
4
5
r read

w write delete

x execute 执行/进入

可用数字代替:

简易记法:x1w2r4 1+2+4=7 即最高权限7

数字18

文件:硬链接数

目录:子目录数+文件数


附加知识点:

1.1 创建软连接ln -s

=link symbolic(象征性的,快捷方式就是象征性的)

1
ln -s /root/ myroot

创建一个软链接myroot,指向的是/root/

1.2 不加-s选项的创建硬链接ln
1
ln /root/ myroot

给/root/起了个别名myroot

硬链接:

在 Linux 文件系统中,一个文件实际上由两部分组成:

  1. Inode(索引节点):包含文件的实际内容、权限、大小等元数据。
  2. 文件名:指向这个 Inode 的指针。

硬链接就是给同一个 Inode 起了一个新的名字。

41 所有者

查看所有者,所在组

1
ls -alh

(选项a:all)(选项l:long长,详细)(选项a:human人性化)

chown改变文件的所有者

=change owner

语法:

1
chown [-R] 新所有者 文件/目录

选项-R:递归(把目录下所有东西的主人都改变)

42 所在组

groupadd创建组

=group add

语法:

1
2
groupadd idiots 
useradd -g idiots tom

chgrp改变文件所在组

语法:

1
2
3
chgrp [-R] 新组名 文件名

chgrp color yellow.txt

改变目录的所在组同上

43 其他者

usermod -g改变用户所在组

=user modify -group 新组名

语法:

1
usermod -g 新组名 用户名

usermod -d改变用户初始目录

=user modify -directory

语法:

1
usermod -d newdirectory新目录 用户名

注意:用户需要得到新目录的权限

查看所在组

1
id 用户名

44 其他组

46 修改权限

chmod

=change modify

语法:

u=user g=group o=other a=all

x1w2r4 1+2+4=7 即最高权限7

1
2
3
4
5
6
7
1.+-=
chmod u=rwx g=rx o=x 文件/目录
chmod o+w 文件/目录
chmod a-x 文件/目录

2.数字
chmod 751 文件/目录

90 shell编程入门

shell:命令解释器

多行注释:

1
:<<! 内容!

一. 执行

1.需要权限的执行

前期准备:

mkdir /root/codesh

cd /root/codesh

vim hello.sh

./hello.sh #会显示权限不够

chmod u+x hello.sh

ll

./hello.sh #执行成功

语法格式:

1
2
#!/bin/bash		此 为shell类型,一般是bashshell
echo "hello,world"

2.不需要权限的执行sh

语法:

1
sh hello.sh

二. 变量

定义变量规则:不能以数字开头,一般大写,=两边无空格

分类:

1.系统变量

查看:命令一:set (查看所有变量)

​ 命令二:echo $PATH

2.自定义变量

1
2
3
4
5
6
7
8
9
10
11
12
#!bin/bash
A=100 #定义变量

echo $A #输出变量
echo A=$A #此处A=会被当成字符串输出
echo "A=$A"

unset A #撤销变量

readonly B=2 #声明静态变量B=2,不能unset
echo "B=$B"
unset B #会报错

3.shell与命令

1
2
3
4
5
6
#!bin/bash
A=`date` #反引号运行命令,会把结果返回给A
B=$(date) #作用等价于反引号

echo $A
echo $B

三. 设置环境变量

基本语法:

export 变量名=值 #将shell变量输出为环境变量

source 配置文件 #让修改后的配置信息立即生效

echo $变量名 #查询环境变量的值

例子:

1
2
3
4
5
6
7
8
9
10
11
12
vim /etc/profile
export TOMCAT_HOME=/opt/tomcat

source /etc/profile

echo $TOMCAT_HOME

---

vim /123.sh
#echo $TOMCAT_HOME
echo $TOMCAT_HOME

四. 位置参数变量

执行脚本需要获取参数时,可以用位置参数

语法:

1
2
3
4
$n:(n为数字,$0为命令本身,第一到第九个参数$1-$9,十以上用大括号${10})
$*:命令行所有的参数,所有参数看成一个整体
$@:命令行所有的参数,把参数分开对待
$#:所有参数的个数

例子

1
2
3
4
5
6
7
8
9
10
touch 1.sh
vim /1.shell

echo "0=$0,1=$1,1=$2"
echo "*=$*"
echo "@=$@"
echo "#=$#"

chmod u+x 1.sh
./1.sh 100 200 #传入参数

五. 预定义变量

语法:

1
2
3
4
5
$$	#当前进程的进程号PID
$! #后台运行最后一个进程的进程号PID
$? #证明上一个命令是否正确执行:0为正确,非0为错误


例子:2.sh

1
2
3
4
5
# 以后台方式运行
/root/shcode/myshell.sh &
echo "当前执行pid=$$"
echo "最后一个后台方式运行进程的pid=$!"
echo "执行结果是:$?"

六. 运算符

语法

1
2
3
1. $((运算符)) 或 $[运算符] 或 expr m+n 	#expr=expression公式表达式
2. expr m+n被当成结果赋值时,要使用反引号 a=`expr m+n`
3. expr加减乘除 +,-,\*,/

计算

1
2
3
echo "(2+3)*4=$[(2+3)*4]"
echo "(2+3)*4=`expr (2+3)\*4`"
echo "sum=$[$1+$2]"

七. 条件判断

语法:非空返回true,可用$?验证

1
[ condition ]	#condition前后要有空格

常用判断条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1.字符串比较 =

2.整数比较
-eq equal
-nq not equal
-lt little
-le little equal
-gt great
-ge great equal

3.按照权限判断
-r
-w
-x

4.按照文件类型进行判断
-f file文件存在并且常规
-e exit文件存在
-d directory目录存在

例子1:简单if

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
if [ "ok" = "ok" ]
then
echo "equal"
fi
if [ 23 -ge 22 ]
then
echo "大于等于"
fi
if [ -f ./1.sh ]
then


例子:elif

1
2
3
4
5
6
7
8
if [ $1 -ge 60 ]
then
echo "及格"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi

八. 流程控制

1.case

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

# 定义变量
a=1

# Case 语句匹配
case "$a" in
"0")
echo "a=0"
;;
"2")
echo "a=2"
;;
*)
echo "a=1"
;;
esac

2.for循环

例一

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
for i in $@
do
echo "当前处理的数字是$i"
done

for (( i=1;i<4;i++ ))
do
echo "第$i次输出"
done

例二

1
2
3
4
5
6
#!/bin/bash
for (( i=1;i<=$1;i++ ))
do
sum=$[$sum+$i]
done
echo "sum=$sum"

3.while循环

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
sum=0
i=0
while [ $i -le $1 ]
do
sum=$[$sum+$i]
i=$[$i+1]
done
echo "$sum"
~

4.read读取控制台输入

语法:read [-t -p] 变量名

选项: -t 时间范围内

​ -p 输入提示词

1
2
3
4
#!/bin/bash 
read -p "please input your context:" num1
echo $num1


5.系统函数

5.1 basename

语法:dirname 完整路径 [suffix]

suffix为后缀,如果被指定了,会在路径中把suffix去掉

功能:去除目录部分,留下问价部分

5.2 dirname

语法:dirname 完整路径

功能:去除非文件部分,留下目录部分


  1. 自定义函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
    function add()
    {
    sum=$[$a+$b]
    echo "add=$sum"
    }

    read -p "please input:" a
    read -p "please input:" b

    add $a $b

九、案例


案例一:定时备份和删除

目标:

1.通过脚本/user/sbin/mysql_db_backup.sh完成以下功能;

2.每日2:30 备份hspedu数据库 到 /data/backup/db;

1
crond定时调用

3.备份文件名为备份时间,并打包成tar.gz格式:2021-01-01_230201.tar.gz

4.检查是否存在十天前的备份文件,有则删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
##数据库用户名,密码,所在主机地址,数据库名
DB_USER=root
DB_PW=123456
HOST=localhost
DATABASE=hspedu

# 1.创建目录(若没有就创建)
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
# 2.备份数据库
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/${DATETIME}.sql.gz

# 3.将文件夹${DATETIME}打包成tar,再吧原文件夹删除
cd ${BACKUP}
tar -czvf ${DATETIME}.tsr.gz ${DATETIME}
rm -rf ${BACKUP}/${DATETIME}

# 4.删除久远文件
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "备份数据库${DATABASE=}成功!"

定时执行

1
crontab -e

进入vim :分钟 时 * * * 文件

1
30 2 * * * /usr/sbin/2.sh

rm -rf

  • -r (recursive):递归删除。
  • -f (force):强制删除。

九. 网络配置

1.nat网络原理

nat模式是什么:

NAT 模式(Network Address Translation,网络地址转换)是 VMware 的默认设置

IP 分配:你的物理机 IP 可能是 192.168.1.105,而虚拟机在 NAT 下可能是 192.168.150.128。这两个 IP 不在一个段。

当两者互相访问的时候,通过 VMnet8 网卡当翻译官,让它们俩能连通。

image-20260323153206823

2.linux网络环境配置

方法一:DHCP获取ip(动态)

方法二:固定ip(静态)

思路:->1.修改ip(linux里面修改文件,vmware里面修改设置)-> 2.重启生效

方法:

配置文件路径:/etc/sysconfig/network-scripts/ifcfg-en33

修改配置文件ifcfg-en33内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1.接口名(设备,网卡)
DEVICE=eth0
# 2.MAC地址
HWADDR=00:OC:2x:6x:0x:xx
# 3.网络类型
TYPE=Ethernet
# 4.随机id
UUID=.....
# 5.使 系统其同时网络接口 有效
ONBOOT=yes
# 6.ip配置方法(none/static/bootp/dhcp)
BOOTPROTO=static
# 7.ip地址
IPADDR=192.168.200.130
# 8.网关
GATEWAY=192.168.200.2
# 9.域名解析器
DNS1=192.168.200.2

2.改变vmnet8的ip和网关,

3.重启

1
2
3
reboot
或者
service network restart

3.主机名与hosts映射

思路:->1.修改主机名(linux里面修改文件,vmware里面修改设置),重启生效

​ -> 2. 找翻译:设置主机名和ip地址的映射

方法:

方法一、在win中ping linux主机名

修改文件/etc/hostname

1
ubantu520

修改 C:\Windows\System32\drivers\etc\hosts

1
2
#添加
192.168.80.130 ubantu520

方法二、在linux中ping win的主机名

修改文件/etc/hosts

1
192.....(vmnet8网卡地址) BOSS

三、原理

**hosts:**文本文件->用来记录ip和hostname的映射关系

DNS:(domain name system)域名系统,是互联网上作为 域名 和 IP 相互映射的一个分布式数据库

流程:

–

浏览器访问一个域名,

->先找浏览器缓存里面有无域名解析的ip

->或没有,就找 本地DNS

->还是没有,再找 hosts文件

->仍然没有,最后去找 公网DNS

–

image-20260328163604516

在主机cmd输入:

1
2
ipconfig /displaydns	//DNS 域名解析缓存
ipconfig /flushdns //手动清理dns缓存