0

0

LinuxShell脚本安全实践_权限与环境控制解析【教程】

冰川箭仙

冰川箭仙

发布时间:2026-01-06 18:48:08

|

528人浏览过

|

来源于php中文网

原创

脚本执行权限必须设为750且组严格限定,禁止755;需用set -euo pipefail、IFS=、引号化变量、重置PATH、校验二进制完整性、mktemp创建临时文件并设600权限。

linuxshell脚本安全实践_权限与环境控制解析【教程】

脚本执行权限设置必须用 chmod 750 而非 755

如果脚本含敏感操作(如修改系统配置、读取 /etc/shadow),执行权限开放给“其他用户”(o+r-x)等于默认放行任意本地账户调用。实际中 chmod 750 确保仅属主+同组可执行,且组应严格限定(如新建专用组 adminscripts,仅加入必要账号)。755 常见于 Web 可读目录,但 Shell 脚本一旦被普通用户执行,可能绕过 sudo 策略或触发环境变量污染。

  • 检查当前权限:ls -l /path/to/script.sh,确认输出第三段不含 x(如 -rwxr-x--- 合规,-rwxr-xr-x 不合规)
  • 设权后立即验证:sudo -u nobody /path/to/script.sh 应报 Permission denied,而非静默失败或意外执行
  • 避免在 /tmp/var/tmp 中存放带执行权限的脚本——这些目录通常设了 sticky bit,但不阻止同组用户覆盖或重命名

set -euo pipefail 是基础安全开关,但需配合 IFS= 和引号化

仅加 set -euo pipefail 不足以防御路径遍历或空格分词攻击。例如 for file in $(ls *.log) 在文件名含空格时会崩,而 find ... -print0 | while IFS= read -r -d '' f 才可靠。关键点在于:IFS= 阻止 read 自动裁剪首尾空白,read -r 禁用反斜杠转义,所有变量引用必须用 "$var"

  • set -u 会让未定义变量(如 $USER_HOME 拼写错成 $USER_HOMR)直接退出,避免静默使用空值
  • set -o pipefail 使管道中任一命令失败即整体失败,否则 grep xxx /etc/passwd | head -1 可能因 grep 无匹配而返回 1,但 head 仍成功,脚本误判为“找到结果”
  • 禁止裸写 cp $src $dst,必须写成 cp "$src" "$dst";若 $src/tmp/my file.txt,不加引号会拆成两个参数

PATH 和 LD_LIBRARY_PATH 必须显式重置,不能依赖用户环境

脚本启动时若继承用户 PATH(如含 ~/bin/usr/local/bin),攻击者可通过篡改其中的 lsawk 等命令劫持执行流。正确做法是开头就覆盖:PATH="/usr/bin:/bin:/usr/sbin:/sbin",并用 command -v 校验关键工具存在。

PHP 网络编程技术与实例(曹衍龙)
PHP 网络编程技术与实例(曹衍龙)

PHP网络编程技术详解由浅入深,全面、系统地介绍了PHP开发技术,并提供了大量实例,供读者实战演练。另外,笔者专门为本书录制了相应的配套教学视频,以帮助读者更好地学习本书内容。这些视频和书中的实例源代码一起收录于配书光盘中。本书共分4篇。第1篇是PHP准备篇,介绍了PHP的优势、开发环境及安装;第2篇是PHP基础篇,介绍了PHP中的常量与变量、运算符与表达式、流程控制以及函数;第3篇是进阶篇,介绍

下载
  • 清除危险变量:unset LD_PRELOAD LD_LIBRARY_PATH PYTHONPATH PERL5LIB,这些可被用于动态库/解释器注入
  • 用绝对路径调用核心命令更稳妥(如 /bin/cp 而非 cp),但前提是已确认该路径在目标系统存在(CentOS 和 Alpine 的 /bin 内容差异大)
  • 若脚本需调用自定义二进制,应先 sha256sum -c checksums.sha256 校验完整性,再加入 PATH

临时文件必须用 mktemp 创建,且禁止 /tmp 下硬编码路径

写死 /tmp/myscript.pid/tmp/output.log 是典型竞争条件漏洞:攻击者可在 if [ ! -f /tmp/myscript.pid ]; then touch /tmp/myscript.pid 的间隙创建符号链接,指向 /etc/passwd。必须用 mktemp 生成唯一路径,并立即 chmod 600

  • 正确模式:
    tmpdir=$(mktemp -d) || exit 1
    chmod 700 "$tmpdir"
    trap 'rm -rf "$tmpdir"' EXIT
  • 单文件也需 mktemptmpfile=$(mktemp) && chmod 600 "$tmpfile",不可用 $$(进程号)拼接,因 PID 可预测
  • 避免 mktemp /tmp/myapp.XXXXXX —— 这种用法在旧版 mktemp 中不安全,现代应只用无参数形式或 -t 指定模板前缀
脚本里最易被忽略的不是语法错误,而是对环境变量和临时资源的假设——它们在开发机上总“恰好工作”,一到生产环境就因权限收紧、路径变更或并发访问暴露问题。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

722

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

83

2023.09.25

centos
centos

PHP中文网为大家提供centos相关信息,CentOS(Community Enterprise Operating System,中文意思是社区企业操作系统)是Linux发行版之一,是免费的、开源的、可以重新分发的开源操作系统,PHP中文网提供centos相关文章,以及安装教程。

431

2023.06.16

常见的linux系统有哪些
常见的linux系统有哪些

linux系统有Ubuntu、Fedora、CentOS、Debian、openSUSE、Arch Linux、Gentoo、Slackware、Linux Mint、Kali Linux。更多关于linux系统的文章详情请阅读本专题下面的文章。php中文网欢迎大家前来学习。

796

2023.10.27

java学习网站推荐汇总
java学习网站推荐汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

6

2026.01.08

java学习网站汇总
java学习网站汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.01.08

正则表达式 删除
正则表达式 删除

本专题整合了正则表达式删除教程大全,阅读专题下面的文章了解更多详细教程。

20

2026.01.08

java 元空间 永久代
java 元空间 永久代

本专题整合了java中元空间和永久代的区别,阅读专题下面的文章了解更多详细内容。

3

2026.01.08

java 永久代和元空间
java 永久代和元空间

本专题整合了java中元空间和永久代的区别,阅读专题下面的文章了解更多详细内容。

0

2026.01.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.8万人学习

Git 教程
Git 教程

共21课时 | 2.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号