热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

shell脚本学习指南[六](ArnoldRobbins&NelsonH.F.Beebe著)

这篇文章主要介绍了shell脚本学习指南[六](ArnoldRobbins&NelsonH.F.Beebe著),需要的朋友可以参考下

学shell到现在了,一直以为自己不会犯一个大家常说的非常二的问题,结果这本书最后的时候犯了个十分2的事,晚节不保啊!!!我在测试文件路径下除了通配符*和?外还能用啥正则那样的东西,结果就在$HOME下执行了rm .* 。。。好吧,蛋疼了一下午!还木找回任何一个配置文件。警示后人,千万别使用rm试通配符!任何时候小心使用rm!


第十四章shell可移植性议题和扩展


可以先通读这篇文章。
想写出好的可移植性shell,不仅要了解各种shell版本间的差异,还要有很多编程技巧,比如尽量从环境变量中获取需要的信息等。

第十五章安全的shell脚本:起点


安全性shell脚本的提示:
1、不要将当前目录(点号)置于PATH下。可执行程序应该只能放在标准的系统目录下,将当前目录放在PATH里,无疑是打开特洛伊木马(Trojan Horse)的大门。
2、为bin目录设置保护。确认$PATH下的每一个目录都只有它的拥有者可以写入,其余任何人都不能。用样的道理也应该应用于bin目录里所有的程序。
3、写程序前,先想清除。花点时间想想你要做什么,该如何实行。不要一开始就在文字编辑器上写。错误与失败的优雅处理也应该设计在程序里。
4、应对所有输入参数检查其有效性。如果期待的是数字,那就验证它是数字,并且是否在要求的范围内。其他的需要也是这样检测。
5、对所有可返回错误的命令,检查错误处理代码。不在你预期内的失败情况,很可能是有问题的强迫失败,导致脚本出现不当的行为。例如,如果参数为NFS加载磁盘或面向字符的设备文件时,即便是以root的身份执行,也可能导致有些命令失败。
6、不要信任传进来的环境变量。如果它们被接下来的命令(如TZ、PATH、IFS等)使用时,请检查并重设为已知的值。无论在什么情况下,最好的方式就是明确的设置自己需要的(如PATH只包含系统bin目录,设置IFS为空格定位符和换行)。
7、从已知的地方开始。在脚本开始时,确切cd到已知目录,这么一来,接下来任何相对路径名称才能指到已知位置。确认cd操作成功:cd app-dir || exit 1
8、使用syslog(8)保留审计跟踪。记录引用的日期与时间、username等,参见logger(1)的使用手册。如果没有logger,可建立一个函数保留日志文件:

代码如下:

logger(){
printf "%s\n" "$*" >> /var/adm/logsysfile
}
logger "Run by user " $(id -un) "($USER) at " $(/bin/date)

9、当使用该输入时,一定将用户输入引用起来。例如:"$1"与"$*",这么做可以防止居心不良的用户输入超出范围的计算与执行。
10、勿在用户输入上使用eval。甚至在引用用户输入之后,也不要使用eval将它交给shell再处理。如果用户读取了你的脚本,发现你使用eval,就能很轻松的利用这个脚本进行任何破坏。
11、引用通配符展开的结果。你可以将空格、分号、反斜杠等放在文件名里,让棘手的事情交给系统管理员处理。如果管理的脚本未引用文件名参数,此脚本将会造成系统的问题。
12、检查用户输入是否有meta字符。如果使用eval或$(...)里的输入,请检查是否有像$或`这类的meta字符。
13、检测你的代码,并小心谨慎阅读它。寻找是否有可被利用的漏洞与错误。把所有坏心眼的想法都考虑进去,小心研究你的代码,试着找出破坏它的方式,再修正发现的问题。
14、留意竞争条件(race condition)攻击者是不是可以在你脚本里的任两个命令之间执行任意命令,这对安全性是否有危害?如果是,换个方式处理你的脚本。
15、对符号性连接心存怀疑。在chmod文件或是编辑文件时,检查它是否真的是一个文件,而非连接到某个关键性系统文件的符号性连接(利用[ -L file ] 或 [ -h file ]检测file是否为一符号性连接。
16、找其他人重新检查你的程序,看看是否有问题。
17、尽可能用setgid而不要用setuid。这些术语稍后讨论,简之就是使用setgid能将损害范围限制在某个组内。
18、使用新的用户而不是root。如果你必须使用setuid访问一组文件,请考虑建立一个新的用户,非root的用户做这件事并设置setuid给他。
19、尽可能限制使用setuid的代码。尽可能让setuid代码减到最少。将它移到一个分开的程序,然后在大型脚本里需要时才引用它。无论如何,请做好代码防护,好像脚本可以被任何人于任何地方引用那样。
20、一个安全shell的开场白:
代码如下:

IFS=' \t\n' #之前几篇见过很多次
unset -f unalias #确保unalias不是一个函数
\unalias -a #unset all aliases and quote unalias so it's not alias-expanded
unset -f command #确保调用的command不是以函数
#获得可靠的路径前缀,处理getconf不可用的情况。
#get a reliable path prefix,handling case where getconf is not available.
SYSPATH="$(command -p getconf PATH 2>/dev/null))"
if [[ -z "$SYSPATH" ]];then
SYSPATH="/usr/bin:/bin"
fi
PATH="$SYSPATH:$PATH"

这段代码使用了许多非POSIX的扩展,需要注意。

该书最后给出了如何编写自己的shell程序的manual,和unix的文件和文件系统的介绍。至此该书通读完毕。


推荐阅读
  • 三星W799在2011年的表现堪称经典,以其独特的双屏设计和强大的功能引领了双模手机的潮流。本文详细介绍其配置、功能及锁屏设置。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 如何使用PyCharm及常用配置详解
    对于一枚pycharm工具的使用新手,正确了解这门工具的配置及其使用,在使用过程中遇到的很多问题也可以迎刃而解,文中有非常详细的介绍, ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 如何在CAD查看器中同时打开并对比两张DWG图纸
    本文将详细介绍如何使用专业的CAD查看软件,如迅捷CAD看图,来同时打开和对比两张DWG格式的CAD图纸。无论是在设计审核还是项目管理中,掌握这一技能都能显著提高工作效率。 ... [详细]
  • 编写了几个500行左右代码的程序,但基本上解决问题还是面向过程的思维,如何从问题中抽象出类,形成类的划分和设计,从而用面向对象的思维解决问题?有这方面的入门好书吗?最好是结合几个具体的案例分析的 ... [详细]
  • Qt QTableView 内嵌控件的实现方法
    本文详细介绍了在 Qt QTableView 中嵌入控件的多种方法,包括使用 QItemDelegate、setIndexWidget 和 setIndexWidget 结合布局管理器。每种方法都有其适用场景和优缺点。 ... [详细]
  • Ulysses Mac v29:革新文本编辑与写作体验
    探索Ulysses Mac v29,这款先进的纯文本编辑器为Mac用户带来了全新的写作和编辑环境。它不仅具备简洁直观的界面,还融合了Markdown等标记语言的最佳特性,支持多种格式导出,并提供强大的组织和同步功能。 ... [详细]
  • 本文详细介绍了Vim编辑器的三种主要模式及其常用命令,帮助用户更好地掌握这一强大的文本编辑工具。 ... [详细]
  • 解决Windows 10开机频繁自检问题的实用方法
    许多用户在使用Windows 10系统时,经常会遇到开机时自动进行磁盘检查的情况。这不仅影响了开机速度,还可能带来不必要的麻烦。本文将详细介绍如何通过简单的注册表修改来避免每次开机时的磁盘自检,提升系统启动效率。 ... [详细]
  • 本文详细介绍了流编辑器sed中的G、H、g、h命令,探讨了它们的工作原理及应用场景。通过实例解析和图解分析,帮助读者掌握这些高级命令的使用方法。 ... [详细]
  • HTML基础入门指南
    本文将深入浅出地介绍HTML的基础知识,包括其定义、开发工具、制定机构、特性、基本标签及更多实用内容。 ... [详细]
  • 本文介绍了解决Oracle 10G数据库中ORA-12541 TNS: no listener错误的详细步骤。该错误通常发生在监听器服务未正确启动或配置不当的情况下,文章将指导您通过检查服务状态、配置注册表和启动监听器来解决问题。 ... [详细]
  • 在安装 SQL Server 时,选择混合验证模式可以提供更高的灵活性和管理便利性。如果您已经安装了 SQL Server 并使用单一的 Windows 身份验证模式,可以通过以下步骤将其更改为混合验证模式。 ... [详细]
author-avatar
手机用户2502859667
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有