Bash 脚本如何创建临时文件:mktemp 命令和 trap 命令教程
有时,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 命令教程相关推荐
- Bash脚本教程之mktemp 命令,trap 命令
目录 临时文件的安全问题 mktemp 命令的用法 mktemp 命令的参数 trap 命令 Bash 脚本有时需要创建临时文件或临时目录.常见的做法是,在/tmp目录里面创建文件或目录,这样做有很多 ...
- bash脚本切换管理员_开始为系统管理员使用Bash脚本
bash脚本切换管理员 Bash外壳绝对不是唯一的外壳,但它是功能最强大的外壳之一. 对于需要开发严肃的应用程序的系统管理员来说,这是一种流行的选择,这些应用程序超出了要在系统上运行的简单命令列表的范 ...
- linux trap命令
trap命令用于指定在接收到信号后将要采取的行动,我们将在本书后面的内容中详细介绍信号.trap命令的一种常见用途是在脚本程序被中断时完成清理工作.历史上,shell总是用数字来代表信号,而新的脚本程 ...
- 【Linux】一步一步学Linux——trap命令(229)
00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 其它说明 05. 参考示例 06. 附录 01. 命令概述 trap命令用于指定在接收到信号后将要采 ...
- Linux 命令(54)—— trap 命令(builtin)
1.命令简介 trap 命令是 Shell 内建命令,用于指定在接收到信号后将要采取的动作.常见的用途是在脚本程序被中断时完成清理工作. 2.命令格式 trap [-lp] [ARG] [SIGSPE ...
- Trap命令使用说明
Trap命令使用说明 trap命令用于指定在接收到信号后将要采取的行动.trap命令的一种常见用途是在脚本程序被中断时完成清理工作.可以使用trap -l来查看具体信号列表. trap捕捉到信号之后, ...
- shell 创建临时目录和临时文件mktemp
#!/bin/bash mktemp_local() { tempfile=`mktemp temp.XXXXXX` #文件名格式 file.XXXXXX ...
- Bash 脚本 set 命令教程
http://www.ruanyifeng.com/blog/2017/11/bash-set.html set命令是 Bash 脚本的重要环节,却常常被忽视,导致脚本的安全性和可维护性出问题.本文介 ...
- bash脚本创建变量_创建一个Bash脚本模板
bash脚本创建变量 在本系列的第一篇文章中,您创建了一个很小的单行Bash脚本,并探讨了创建Shell脚本的原因,以及为什么它们是系统管理员而非编译程序最有效的选择. 在第二篇文章中,您将开始创建一 ...
最新文章
- 水系影像分析_“天眼”助力 甘肃运用卫星影像精准研判灾情
- python中find函数忽略大小写_python字符串(大小写、判断、查找、分割、拼接、裁剪、替换、格式化)...
- Vue后台管理系统实现登录功能
- [开源] FreeSql.AdminLTE.Tools 根据实体类生成后台管理代码
- 【CCF】201803-2 碰撞的小球
- Android RecyclerView (十)组件化封装
- Clion添加Posix消息队列的-lrt连接
- Unity3d札记 --TanksTutorial收获与总结
- template.js的用法
- RoboWare Studio入门教程(一)
- Centos7安装Ant
- 基于单片机的温度监测系统proteus仿真
- 路畅畅云固件升级教程_【图】E-Link功能/智能语音 路畅畅云+车载导航评测_汽配中国网...
- 推荐一个好用的IDEA插件---Translation—中英互译
- elasticsearch6.4.3实现搜索同义词
- aws篇1 aws-cli的使用
- html粒子特效图片切换,javascript转换静态图片,增加粒子动画效果
- Scrapped or attached views may not be recycled
- 计算机考研高校改初试科目,考研初试科目修改!报考的考生注意了!
- 配置IIS6出现 出现验证码无法显示问题
热门文章
- 关于vue文件中template标签尖括号下的红波浪线问题
- 为什么安装了python在 cmd不显示_CMD提示Python不是内部或外部命令的解决方法
- 2021-11-07大数据学习日志——MySQL进阶——窗口函数
- 睡眠不足,让你更易神游网络不思工作
- 上海宝付一个程序员的面试经历
- c++后台开发适合入坑吗?就业前景如何?
- php中文网视频放不了,【杂谈】看php中文网视频课程的正确姿势!
- 怎么判断目标学校是强com还是弱com?
- 哪个学校计算机仿真专业,北京科技大学排名前五的专业有哪些呢?考上了,你该如何选择呢?...
- 宋仲基和宋慧乔要结婚了?盘点那些因戏生情的CP们