首页 > 系统 > Linux > 正文

Shell中建立与使用临时性文件的方法详解

2019-10-26 18:53:58
字体:
来源:转载
供稿:网友

前言

在我们日常开发中经常会需要用到临时文件,本文就给大家介绍了关于Shell建立与使用临时性文件的相关内容,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍:

虽然使用管道可以省去建立临时性文件的需求,不过有时候临时性文件还是派的上用场的。UNIX不同于其他操作系统的地方就是:它没有那种将不再需要的文件设法神奇删除的想法。反倒提供了两个特殊目录:/tmp和/var/tmp(旧系统为:/usr/tmp),这些文件可正常被存储,当它们未被清理干净时也不会弄乱一般的目录。大部分系统上的/tmp都会在系统开机时清空,不过/var/tmp下的重新开机时仍需存在,因为有些文本编辑程序,会将它们的备份文件存放在这里,从而系统毁损后可用来恢复数据。

因为/tmp目录使用频繁,有些系统就会将它放在常驻内存型的文件系统里,以便快速访问,如下面这个例子:

root@localhost:~/training# df /tmp Filesystem     1K-blocks  Used Available Use% Mounted on swap      568048704 10772216 528398256 2% /tmp 

将文件系统放在替换空间区域里,表示它存在于内存中,直到内存资源消耗殆尽时,部分数据才会写入替换空间。

为确保临时性文件会在任务完成时删除,编译语言的程序员可以先开启文件,再下达unlink()系统调用。这么做就会马上删除文件,但因为它仍在开启状态,所以仍可继续访问,直到文件关闭或工作结束为止,只要其中一个先发生即可。打开后解除连接的技巧一般来说在非UNIX操作系统下是无法运行的,在加载于UNIX文件系统中目录上的外部文件系统也是这样,且在大多数脚本语言中无法使用它。

$$变量

共享的目录或同一个程序的多个执行实例,都可能造成文件名冲突,在Shell脚本里的传统做法就是使用进程ID,可以在Shell变量$$中取得,构建成临时性文件名的一部分。要解决完整临时性文件名发生问题的可能性,可使用环境变量覆盖目录名称,通常是TMPDIR。另外,你也应该使用trap命令,要求在工作完成时删除临时性文件,因此,常见的Shell脚本起始如下:

umask 077       # 删除用户以外其他人的所有访问权 TMPFILE=${TMPDIR-/tmp}/myprog.$$ # 产生临时性文件名 trap 'rm -f $TMPFILE' EXIT   # 完成时删除临时性文件  

mktemp程序

像/tmp/myprog.$$这样的文件名会有这个问题:太好猜了!攻击者只需要在目标程序执行时列出目录几次,就可以找出它正在使用的是哪些临时性文件。通过预先建立适当的指定文件,攻击者可以让你的程序失败或读取伪造的数据,甚至重设文件权限,以便于攻击者读取文件。

处理此类安全性议题时,文件名必须是不可预知的。BSD与GUN/Linux系统都提供了mktemp命令,供用户建立难以猜测的临时性文件名称。虽然底层的mktemp()函数库调用已由POSIX标准化,但mktemp命令却没有。如果你的系统没有mktemp,我们建议你安装OpenBSD的可移植版本

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表