跳到正文
本地阅读 · 用户、权限及环境变量

用户、权限及环境变量

计算机基础 · Linux

前置知识:管道、重定向与 Shell 引号

本章目录

本章学习目标

  • 解释文件与目录的读写执行位
  • 使用最小权限和 umask
  • 区分 Shell 变量与导出环境变量

所有者、组与其他用户

Linux 每个文件有所有者和组,权限分为所有者、组、其他用户三套读写执行位。r 是读,w 是写,x 是执行或目录搜索。数字四、二、一分别对应读写执行,六表示读写,四表示只读,零表示无权限,因此六四零让所有者读写、同组只读、其他用户无权访问。权限判断还受父目录和访问控制列表影响。

id 显示当前用户和组,ls -l 可初步查看权限。读文件是读内容,写文件是改内容,执行文件允许以程序形式启动;脚本可以被 bash script.sh 读取运行,所以直接执行位并不是读取脚本的唯一条件。执行任意文件不代表其内容可信,工作中还需确认来源和解释器。

目录权限不能照搬文件含义

目录 r 允许列出名字,x 允许按名字进入或访问其中对象,w 配合 x 允许创建和删除目录项。一个只读文件若所在目录可写,仍可能被删除,因为删除修改的是目录项,不是文件内容。反过来,即使文件可读,如果父目录缺少搜索权限也可能无法访问。诊断 permission denied 需检查完整路径。

数据分析任务常将原始数据目录设为只读,将派生输出目录单独可写,防止脚本误改源数据。不要为了消除报错使用 chmod -R 777,这让所有人可写且改变大量对象。课程只给自己创建的 private.txt 设置权限,不修改系统、用户家目录或真实业务数据。

umask 与新文件默认权限

umask 是创建时剔除的权限位,不是已有文件的权限,也不是简单十进制减法。常见新文件基准六六六、目录七七七,umask 零二七 得到文件六四零、目录七五零。程序可以自行指定更严格模式,后续 chmod 又可修改,因此不能只看 umask 就推断所有文件最终权限。

示例先记录旧 umask,再设置零二七,创建练习文件并显示模式,最后恢复。子进程中的 umask 不会永久改父 Shell,但脚本仍记录边界,帮助理解作用域。Windows 挂载路径和 Git Bash 的权限表现可能由挂载选项或 Windows ACL 决定,不等同 Ubuntu 原生文件系统;验证报告必须如实说明差异。

变量、export 与凭据

name=value 创建当前 Shell 变量,等号两侧不能有空格;export name 让后续子进程在环境中继承它。子进程不能直接修改父进程变量。示例先设置 LOCAL_LABEL 而不导出,子 Bash 看到 unset;再导出后子 Bash 看到 course。环境变量是跨进程配置接口,并不是加密容器。

PATH 决定命令搜索目录,追加路径要保留已有值并引用。不要为了课程覆盖 HOME 等系统变量。数据库密码等凭据可由环境注入,但不能随意 env 输出所有内容或写入公开日志。用明确字段检查必要配置,对未设置和空值分别定义行为,连接程序才容易给出清晰错误。

执行环境与验证边界

本课程命令使用 GNU 工具和 Bash 语法。Windows PowerShell 中的变量、引号、重定向和程序解析与 Bash 并不相同;请在 WSL 的 Ubuntu 终端运行示例,不能把整段 Bash 直接粘贴进 PowerShell。Git Bash 可以运行部分命令,但进程、权限、用户和工具选项可能不同;在 Git Bash 上成功不能证明已经在 Ubuntu 上验证。安装 WSL 是读者的环境准备步骤,课程脚本不会替读者更改系统配置。

每个可运行示例从脚本自身位置确定课程根目录,并只在课程 outputs/linux 子目录或自己建立的临时目录操作。首次运行前先阅读脚本,辨认哪些语句读取、哪些写入、哪些清理。检查路径中有空格时是否仍能运行,检查失败后是否返回非零状态,检查重新运行是否得到同样的结果。对生产数据进行操作时不能照搬练习目录的删除命令,必须重新确认目标范围。

Linux 学习应关注输入、输出、错误输出和退出状态这四件事。标准输出用于数据,标准错误用于诊断,退出状态用于让上层脚本判断成功与否;三者不能互相替代。把手工执行过程写成小脚本后,再通过独立目录重复运行一次。遇到差异时记录操作系统、Bash 和工具版本,把环境限制和代码错误区分开,这比无条件写下“全部通过”更有用。

完整示例与实际输出

#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../.." && pwd)"
WORK="$ROOT/outputs/linux/linux-permissions"
mkdir -p -- "$WORK"
old_umask="$(umask)"
trap 'umask "$old_umask"' EXIT
umask 027
printf '%s\n' 'permission demo' > "$WORK/private.txt"
chmod 640 -- "$WORK/private.txt"
printf 'owner uid: '; id -u
printf 'mode: '; stat -c '%a' "$WORK/private.txt"
unset LOCAL_LABEL
LOCAL_LABEL='course'
bash -c 'printf "before export: %s\n" "${LOCAL_LABEL-unset}"'
export LOCAL_LABEL
bash -c 'printf "after export: %s\n" "$LOCAL_LABEL"'

实际运行通过Git Bash/MSYS on Windows compatibility run; Ubuntu and remote behavior not verified.

owner uid: 197609
mode: 640
before export: unset
after export: course

五道自测:先回答,再核对

01 · 640 分别允许什么?

查看提示

四二一。

查看参考答案

所有者读写、同组只读、其他无权限。

02 · 目录 x 是执行目录程序吗?

查看提示

路径搜索。

查看参考答案

不是,是进入和按名字访问其中对象的搜索权限。

03 · 只读文件一定不能被删除吗?

查看提示

删除修改目录项。

查看参考答案

不是,目录写和搜索权限等决定删除,还可能受粘滞位等限制。

04 · umask 修改已有文件吗?

查看提示

创建时过滤。

查看参考答案

不,它影响后续新对象的初始模式,已有文件需 chmod。

05 · Shell 变量自动传给子进程吗?

查看提示

export。

查看参考答案

普通未导出变量不会,export 后才进入子进程环境。

两项动手任务

任务 1 · 创建临时文件,仅自己读写,并展示权限。

提示

chmod 600。

完整参考解答与检查方式tmp_file=$(mktemp); printf '%s\n' private > "$tmp_file"; chmod 600 -- "$tmp_file"; stat -c '%a' "$tmp_file"; rm -f -- "$tmp_file" Ubuntu 原生文件系统应显示 600;Git Bash 或 Windows 挂载可能不同,应记录实际环境。

任务 2 · 证明子进程无法修改父进程变量。

提示

先 export 后子进程赋新值。

完整参考解答与检查方式LABEL='parent'; export LABEL; bash -c 'LABEL=child; printf "child: %s\n" "$LABEL"'; printf 'parent: %s\n' "$LABEL"; unset LABEL 子进程显示 child,父 Shell 仍显示 parent。只使用课程自定义变量。

官方资料与掌握状态

完成两项任务后,按独立完成程度记录。状态会尽量保存在当前浏览器,可导出备份。

动手任务记录

掌握状态与复习

关掉资料独立完成后记 A;提示后完成记 B;需要重学记 C。

记录尽量保存在当前浏览器,建议定期导出备份。