Linux系统编程Day4-- Shell与权限
本文介绍了Linux中的Shell编程和权限管理两大核心内容。Shell作为命令解释器,支持bash、zsh等多种类型,用于编写自动化脚本;Shell脚本包含变量、条件判断、循环等结构,执行方式包括bash执行或添加x权限后运行。权限管理方面,Linux通过三元组(所有者/组/其他人)控制文件访问,使用chmod(数字/符号法)、chown等命令修改权限,并解释权限与目录操作的关系。此外还涉及ro
一、认识Shell
在 Linux 中,Shell 编程 是一种通过编写脚本(脚本文件)与操作系统进行交互的方式。它是自动化系统管理、批处理任务和构建工具链的重要手段。下面是对 Shell 和 Shell 编程的详细介绍:
1、什么是 Shell?
-
Shell 是命令解释器(Command Interpreter),位于用户和操作系统之间。
-
用户输入命令,Shell 解析命令并传给操作系统内核去执行。
-
Linux 中常见的 Shell 有:
bash(最常用)
-
sh(最早期,POSIX兼容)
-
zsh(功能增强版)
-
csh, ksh(老牌 Shell)
-
2、什么是 Shell 脚本(Shell Script)?
-
是一系列命令的集合,写在一个文本文件中。
-
每条命令就像你在终端输入的一样。
-
脚本以 .sh 结尾(不是强制的,只是习惯)
示例脚本 hello.sh:
#!/bin/bash echo "Hello, Linux!"
3、Shell 脚本的基本结构
#!/bin/bash # 指定解释器 # 注释以 # 开头 # 变量定义 name="Zhang" # 输出内容 echo "Hello, $name" # 条件判断 if [ "$name" = "Zhang" ]; then echo "Welcome, Zhang!" else echo "Unknown user" fi # 循环 for i in {1..5} do echo "Number $i" done
4、Shell 脚本中的常用特性
|
|---|
5、执行 Shell 脚本的方法
方式一:使用 bash 或 sh 执行
bash script.sh sh script.sh
方式二:加执行权限后运行
chmod +x script.sh ./script.sh
6、Shell 编程的用途
|
用途 |
示例 |
|---|---|
|
自动化运维 |
批量部署、定时备份、服务监控 |
|
数据处理 |
日志分析、过滤数据、统计 |
|
编译打包 |
自动编译 C/C++、构建发布版本 |
|
系统任务 |
自动登录、环境变量设置、网络测试 |
|
与其他命令结合 |
用 awk、grep、sed 处理复杂数据 |
二、权限的认识
在 Linux 系统中,权限(Permissions) 是保障系统安全和资源控制的基础。权限控制了用户对文件、目录和可执行程序(包括 Shell 脚本)的访问和操作能力。
1、从 root 用户说起
1. 什么是 root 用户?
-
root 是 Linux 系统中的超级用户(Superuser)。
-
拥有对系统中所有文件、进程、服务、网络等的完全控制权。
-
能执行任何操作,包括删除系统文件、修改权限、安装内核模块等。
-
UID(用户ID)为 0。
常见 root 使用方式:
su # 切换为 root 用户(需要输入 root 密码) sudo command # 临时以 root 权限执行命令(当前用户需在 sudoers 中)但是当你在阿里云服务器使用普通用户进行sudo操作时,可能无法操作, 报错如下:
Zds is not in the sudoers file. This incident will be reported.
[Zds@iZwz9b70mwpeltilcusk8bZ ~]$
这个错误提示说明你当前的用户 Zds 没有被授权使用 sudo 命令,即:
用户 Zds 不在 sudoers 文件中(不具备使用 sudo 的权限),而这个未经授权的尝试会被系统记录下来。
你用的是非管理员账户(比如 Zds);
想运行 sudo 获取超级用户权限;
但这个用户没有在 /etc/sudoers 文件中授权。
如何解决:
用 root 给 Yajun 添加 sudo 权限:
以 root 用户身份编辑 sudoers 文件:推荐使用 visudo(它会自动检查语法):
visudo在sudoer文件中添加如下内容:
Yajun ALL=(ALL) ALL保存并退出(通常是 Ctrl+X, 然后按 Y, 再按 Enter)。
2、Linux 的权限模型是如何构建的?
1、Linux 权限三元组:
每个文件/目录都记录有:文件权限 = 人(元素) +文件属性。
|
元素 |
说明 |
|---|---|
|
所有者 (user) |
创建文件或分配所有权的用户 |
|
所属组 (group) |
文件归属的用户组 |
|
其他人 (others) |
除了所有者和组的其他所有用户 |
三种权限:
|
权限 |
对文件的意义 |
对目录的意义 |
|---|---|---|
|
r |
可读 |
可列出目录内容(ls) |
|
w |
可写 |
可创建/删除/重命名文件 |
|
x |
可执行(或访问) |
可进入目录(cd) |
2、Linux 支持的主要文件类型
|
符号 |
文件类型 |
说明 |
|---|---|---|
|
- |
普通文件 |
最常见的文件类型:文本、二进制、脚本等 |
|
d |
目录文件 |
包含其他文件或目录的“文件” |
|
l |
符号链接(软链接) |
类似 Windows 的快捷方式,指向另一个文件, 使用 ln -s 创建: |
|
b |
块设备文件 |
用于访问块设备(如硬盘、U 盘) |
|
c |
字符设备文件 |
用于访问字符设备(如串口、键盘) |
|
p |
管道文件(FIFO) |
进程间通信的一种方式 |
|
s |
套接字文件 |
用于进程间网络通信 |
|
D |
门(Door) |
Solaris 系统中用于进程通信(Linux 很少用) |
3、权限的本质——操作系统控制访问的机制
1. 系统调用与权限检查
所有 shell 命令(比如 cp、mv、chmod)最终都会转换为系统调用(syscalls),由内核来执行。内核会:
检查当前用户的 UID/GID.
-
查阅目标文件的权限位(在 inode 中).
-
决定是否允许访问.
cat /etc/shadow # 普通用户无读权限,会被内核拒绝
4、如何修改权限
1、Linux 权限结构
每个文件/目录都有三个权限对象:
-
u:用户(user)— 文件所有者
-
g:组(group)— 文件所属组
-
o:其他人(others)
-
a:所有人(all)= u+g+o
2、使用 chmod 修改权限
方法 1:数字法(推荐)
每类权限用一个数字表示:利用二进制,1为可,0为否,则rwx = 1 1 1 = 8,r-x= 1 0 1 = 5;
r = 4;w = 2; x = 1;无权限 = 0
三位数字分别表示 u、g、o 的权限总和。
示例
chmod 754 file.txt解释:
u = 7 = 4+2+1 → rwx
g = 5 = 4+0+1 → r-x
o = 4 = 4+0+0 → r–
方法 2:符号法
可以更灵活添加/去除单一权限。
chmod u+x file.sh # 给用户增加执行权限 chmod g-w file.txt # 去掉组的写权限 chmod o=r file.txt # 设置其他用户为只读 chmod a+x script.sh # 所有人增加执行权限
3、修改文件拥有者:chown
chown username file.txt # 更改文件所有者 chown username:groupname file.txt # 更改文件所有者和组
4、更改所属组:chgrp
chgrp groupname file.txt
5、总结
|
命令 |
含义 |
|---|---|
|
chmod 755 script.sh |
用户:rwx,组&其他人:rx(常见于脚本) |
|
chmod 644 file.txt |
用户:rw,组&其他人:r(常用于文本配置) |
|
chmod +x install.sh |
所有人添加执行权限 |
|
chown root:root file |
设置 root 为文件所有者和所属组 |
|
chgrp users file |
更改所属组为 users |
✔️ 进入目录(cd 进入)
必须有:x(执行)权限
cd mydir # 仅当你对 mydir 有执行权限时才可进入
✔️ 查看目录内容(ls):
必须有:r(读)权限
ls mydir # 需要 r 权限;若无则不能列出文件名
✔️ 创建文件/目录(touch, mkdir):
必须有:w(写)权限 和 x(执行)权限
touch mydir/test.txt # 必须有 w + x 权限
✔️ 删除文件:
不需要对文件本身有权限
-
只需要对其所在目录具有:w(写)权限;x(执行)权限。
rm mydir/test.txt # 你必须对 mydir 拥有 wx 权限
4、Shell 与权限的联系
1. Shell 本质上是一个命令解释器:
它并不决定权限,而是借助操作系统的权限机制来:
调用可执行文件
-
读取、写入文件
-
启动或终止进程
Shell 自身不做权限控制,但执行每个命令都会受内核权限控制。
2. Shell 脚本运行时权限
-
如果通过 ./script.sh 执行:必须有执行权限(x)
-
如果通过 bash script.sh 执行:只需要有读权限(r)
举个例子:
给脚本添加可执行权限
chmod +x myscript.sh ./myscript.sh # 可以执行 bash myscript.sh # 也可以(解释器执行)
3. 使用 sudo 执行脚本/命令
sudo ./myscript.sh提升当前 shell 脚本的运行权限到 root 级别。
这对修改系统配置、写入系统目录至关重要。
三、权限掩码
一、什么是权限掩码?
当你使用命令(如 touch, mkdir, echo > file)创建文件或目录时,系统会根据 默认权限 减去 权限掩码(umask)来决定最终权限。
-
默认权限(理论上):
-
文件:666(rw-rw-rw-)
-
目录:777(rwxrwxrwx)
-
-
最终权限 = 默认权限 - 掩码(按位减)
二、查看当前 umask
umask输出:0022
表示:
所有者不会被限制(0)
组去掉写权限(2)
其他人去掉写权限(2)
三、计算实际权限
📝 文件权限计算:
默认文件权限为 666;如果 umask = 0022
默认权限: 666 (rw-rw-rw-)
掩码: -022 (--- -w- -w-)
实际权限: 644 (rw-r--r--)
📁 目录权限计算:
默认目录权限为 777
默认权限: 777 (rwxrwxrwx)
掩码: -022 (--- -w- -w-)
实际权限: 755 (rwxr-xr-x)
在当前 shell 会话中更改:
umask 0002
创建的目录权限变为 775,文件变为 664,适合协作开发。
四、常见 umask 设置意义
|
umask |
文件权限 |
目录权限 |
说明 |
|---|---|---|---|
|
0000 |
666 |
777 |
所有人读写(不安全) |
|
0022 |
644 |
755 |
组和其他人不可写(默认) |
|
0002 |
664 |
775 |
组可写,适合协作 |
|
0077 |
600 |
700 |
仅用户访问,适合私密数据 |
更多推荐



所有评论(0)