一、认识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 脚本中的常用特性

特性

说明

变量

无类型,直接赋值 x=5,取值用 $x

条件语句

if [ 条件 ]; then ... fi

循环

for、while、until

函数

function name() { ... } 或 name() {}

输入输出

read、echo、重定向 > < >>

参数

$1 $2 $@ $#

管道/重定向

`


 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

仅用户访问,适合私密数据


Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐