有时,Bash 脚本需要创建临时文件或临时目录。

常见的做法是,自己在/tmp目录里面生成一个文件,这样做有很多弊端。本文介绍如何安全地处理临时文件。

一、临时文件的安全问题

直接创建临时文件,尤其在/tmp目录里面,往往会导致安全问题。

首先,/tmp目录是所有人可读写的,任何用户都可以往该目录里面写文件。创建的临时文件也是所有人可读的。

$ touch /tmp/info.txt
$ ls -l /tmp/info.txt
-rw-r--r-- 1 ruanyf ruanyf 0 12月 28 17:12 /tmp/info.txt

上面命令在/tmp目录直接创建文件,该文件默认是所有人可读的。

其次,如果攻击者知道临时文件的文件名,他可以创建符号链接,链接到临时文件,可能导致系统运行异常。攻击者也可能向脚本提供一些恶意数据。因此,临时文件最好使用不可预测、每次都不一样的文件名。

最后,临时文件使用完毕,应该删除。但是,脚本意外退出时,往往会忽略清理临时文件。

二、临时文件的最佳实践

脚本生成临时文件,应该遵循下面的规则。

  • 创建前检查文件是否已经存在。
  • 确保临时文件已成功创建。
  • 临时文件必须有权限的限制。
  • 临时文件要使用不可预测的文件名。
  • 脚本退出时,要删除临时文件(使用trap命令)。

三、mktemp 命令的用法

mktemp命令就是为安全创建临时文件而设计的。虽然在创建临时文件之前,它不会检查临时文件是否存在,但是它支持唯一文件名和清除机制,因此可以减轻安全攻击的风险。

直接运行mktemp命令,就能生成一个临时文件。

$ mktemp
/tmp/tmp.4GcsWSG4vj$ ls -l /tmp/tmp.4GcsWSG4vj
-rw------- 1 ruanyf ruanyf 0 12月 28 12:49 /tmp/tmp.4GcsWSG4vj

上面命令中,mktemp命令生成的临时文件名是随机的,而且权限是只有用户本人可读写。

Bash 脚本使用mktemp命令的用法如下。

#!/bin/bashTMPFILE=$(mktemp)
echo "Our temp file is $TMPFILE"

为了确保临时文件创建成功,mktemp命令后面最好使用 OR 运算符(||),指定创建失败时退出脚本。

#!/bin/bashTMPFILE=$(mktemp) || exit 1
echo "Our temp file is $TMPFILE"

为了保证脚本退出时临时文件被删除,可以使用trap命令指定退出时的清除操作(详见后文)。

#!/bin/bashtrap 'rm -f "$TMPFILE"' EXITTMPFILE=$(mktemp) || exit 1
echo "Our temp file is $TMPFILE"

四、mktemp 命令的参数

-d参数可以创建一个临时目录。

$ mktemp -d
/tmp/tmp.Wcau5UjmN6

-p参数可以指定临时文件所在的目录。默认是使用$TMPDIR环境变量指定的目录,如果这个变量没设置,那么使用/tmp目录。

$ mktemp -p /home/ruanyf/
/home/ruanyf/tmp.FOKEtvs2H3

-t参数可以指定临时文件的文件名模板,模板的末尾必须至少包含三个连续的X字符,表示随机字符,建议至少使用六个X。默认的文件名模板是tmp.后接十个随机字符。

$ mktemp -t mytemp.XXXXXXX
/tmp/mytemp.yZ1HgZV

五、trap 命令的用法

trap命令用来在 Bash 脚本中响应系统信号。

最常见的系统信号就是 SIGINT(中断),即按 Ctrl + C 所产生的信号。trap命令的-l参数,可以列出所有的系统信号。

$ trap -l1) SIGHUP   2) SIGINT   3) SIGQUIT4) SIGILL   5) SIGTRAP  6) SIGABRT... ...

trap的命令格式如下。

$ trap [动作] [信号]

上面代码中,"动作"是一个 Bash 命令,"信号"常用的有以下几个。

  • HUP:编号1,脚本与所在的终端脱离联系。
  • INT:编号2,用户按下 Ctrl + C,意图让脚本中止运行。
  • QUIT:编号3,用户按下 Ctrl + 斜杠,意图退出脚本。
  • KILL:编号9,该信号用于杀死进程。
  • TERM:编号15,这是kill命令发出的默认信号。
  • EXIT:编号0,这不是系统信号,而是 Bash 脚本特有的信号,不管什么情况,只要退出脚本就会产生。

trap命令响应EXIT信号的写法如下。

$ trap 'rm -f "$TMPFILE"' EXIT

上面命令中,脚本遇到EXIT信号时,就会执行rm -f "$TMPFILE"

trap 命令的常见使用场景,就是在 Bash 脚本中指定退出时执行的清理命令。

#!/bin/bashtrap 'rm -f "$TMPFILE"' EXITTMPFILE=$(mktemp) || exit 1
ls /etc > $TMPFILE
if grep -qi "kernel" $TMPFILE; thenecho 'find'
fi

上面代码中,不管是脚本正常执行结束,还是用户按 Ctrl + C 终止,都会产生EXIT信号,从而触发删除临时文件。

注意,trap命令必须放在脚本的开头。否则,它上方的任何命令导致脚本退出,都不会被它捕获。

如果trap需要触发多条命令,可以封装一个 Bash 函数。

function egress {command1command2command3
}trap egress EXIT

六、参考链接

  • Working with Temporary Files and Directories in Shell Scripts, Steven Vona
  • Using Trap to Exit Bash Scripts Cleanly, Steven Vona
  • Sending and Trapping Signals

(完)

Bash 脚本如何创建临时文件:mktemp 命令和 trap 命令教程相关推荐

  1. Bash脚本教程之mktemp 命令,trap 命令

    目录 临时文件的安全问题 mktemp 命令的用法 mktemp 命令的参数 trap 命令 Bash 脚本有时需要创建临时文件或临时目录.常见的做法是,在/tmp目录里面创建文件或目录,这样做有很多 ...

  2. bash脚本切换管理员_开始为系统管理员使用Bash脚本

    bash脚本切换管理员 Bash外壳绝对不是唯一的外壳,但它是功能最强大的外壳之一. 对于需要开发严肃的应用程序的系统管理员来说,这是一种流行的选择,这些应用程序超出了要在系统上运行的简单命令列表的范 ...

  3. linux trap命令

    trap命令用于指定在接收到信号后将要采取的行动,我们将在本书后面的内容中详细介绍信号.trap命令的一种常见用途是在脚本程序被中断时完成清理工作.历史上,shell总是用数字来代表信号,而新的脚本程 ...

  4. 【Linux】一步一步学Linux——trap命令(229)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 其它说明 05. 参考示例 06. 附录 01. 命令概述 trap命令用于指定在接收到信号后将要采 ...

  5. Linux 命令(54)—— trap 命令(builtin)

    1.命令简介 trap 命令是 Shell 内建命令,用于指定在接收到信号后将要采取的动作.常见的用途是在脚本程序被中断时完成清理工作. 2.命令格式 trap [-lp] [ARG] [SIGSPE ...

  6. Trap命令使用说明

    Trap命令使用说明 trap命令用于指定在接收到信号后将要采取的行动.trap命令的一种常见用途是在脚本程序被中断时完成清理工作.可以使用trap -l来查看具体信号列表. trap捕捉到信号之后, ...

  7. shell 创建临时目录和临时文件mktemp

    #!/bin/bash mktemp_local() {     tempfile=`mktemp temp.XXXXXX`                   #文件名格式 file.XXXXXX  ...

  8. Bash 脚本 set 命令教程

    http://www.ruanyifeng.com/blog/2017/11/bash-set.html set命令是 Bash 脚本的重要环节,却常常被忽视,导致脚本的安全性和可维护性出问题.本文介 ...

  9. bash脚本创建变量_创建一个Bash脚本模板

    bash脚本创建变量 在本系列的第一篇文章中,您创建了一个很小的单行Bash脚本,并探讨了创建Shell脚本的原因,以及为什么它们是系统管理员而非编译程序最有效的选择. 在第二篇文章中,您将开始创建一 ...

最新文章

  1. 水系影像分析_“天眼”助力 甘肃运用卫星影像精准研判灾情
  2. python中find函数忽略大小写_python字符串(大小写、判断、查找、分割、拼接、裁剪、替换、格式化)...
  3. Vue后台管理系统实现登录功能
  4. [开源] FreeSql.AdminLTE.Tools 根据实体类生成后台管理代码
  5. 【CCF】201803-2 碰撞的小球
  6. Android RecyclerView (十)组件化封装
  7. Clion添加Posix消息队列的-lrt连接
  8. Unity3d札记 --TanksTutorial收获与总结
  9. template.js的用法
  10. RoboWare Studio入门教程(一)
  11. Centos7安装Ant
  12. 基于单片机的温度监测系统proteus仿真
  13. 路畅畅云固件升级教程_【图】E-Link功能/智能语音 路畅畅云+车载导航评测_汽配中国网...
  14. 推荐一个好用的IDEA插件---Translation—中英互译
  15. elasticsearch6.4.3实现搜索同义词
  16. aws篇1 aws-cli的使用
  17. html粒子特效图片切换,javascript转换静态图片,增加粒子动画效果
  18. Scrapped or attached views may not be recycled
  19. 计算机考研高校改初试科目,考研初试科目修改!报考的考生注意了!
  20. 配置IIS6出现 出现验证码无法显示问题

热门文章

  1. 关于vue文件中template标签尖括号下的红波浪线问题
  2. 为什么安装了python在 cmd不显示_CMD提示Python不是内部或外部命令的解决方法
  3. 2021-11-07大数据学习日志——MySQL进阶——窗口函数
  4. 睡眠不足,让你更易神游网络不思工作
  5. 上海宝付一个程序员的面试经历
  6. c++后台开发适合入坑吗?就业前景如何?
  7. php中文网视频放不了,【杂谈】看php中文网视频课程的正确姿势!
  8. 怎么判断目标学校是强com还是弱com?
  9. 哪个学校计算机仿真专业,北京科技大学排名前五的专业有哪些呢?考上了,你该如何选择呢?...
  10. 宋仲基和宋慧乔要结婚了?盘点那些因戏生情的CP们