返回顶部
首页 > 资讯 > 服务器 >Shell中建立与使用临时性文件的方法详解
  • 112
分享到

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

详解文件方法 2022-06-04 21:06:54 112人浏览 泡泡鱼
摘要

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

前言

在我们日常开发中经常会需要用到临时文件,本文就给大家介绍了关于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的可移植版本

mktemp采用含有结尾X字符的文件名模板(可选用的),我们建议至少使用12个X。程序会用从随机数字与进程ID所产生的文件或数字字符串来取代它们,所建立的文件名不允许与其他人访问,然后将文件名打印在标志输出上,这里看看mktemp的使用:


# TMPFILE=`mktemp /tmp/myprog.XXXXXXXXXXXX` || exit 1    # 建立唯一的临时性文件 
# ls -l $TMPFILE             # 列出临时性文件 
-rw------- 1 root root 0 8月 28 18:57 /tmp/myprog.yW0oosXxljx5 

进程编号在文件名尾号可以看出,但根本无法预测。当临时性文件无法建立或没有mktemp可用时,条件式exit命令可确保马上终止程序并带出错误输出。

最新版的mktemp允许省略模板;它会使用/tmp/tmp.XXXXXXXXXX。然而,较旧版本仍是需要模板,所以你的Shell版本请避免使用这种省略方式.

为避免在程序里将目录名称直接编码,可使用-t选项: 让mktemp使用环境变量TMPDIR所指定的目录或/tmp, -d选项要求建立临时性目录:


root@localhost:/tmp# DIR=`mktemp -d -t myprog.XXXXXXXXXXXX` || exit 1 # 建立临时性目录 
root@localhost:/tmp# ls -lFd $DIR 
drwx------ 2 root root 4096 8月 28 19:06 /tmp/myprog.Hayy9pDnDBEB/  # 列出目录本身 

由于组与其他人都无法访问目录,攻击者也无从得知你继续放入的文件名称,不过如果你的版本是开放公众读取的,当然还是可能猜出来!由于目录无法列出成列表,所以没有权限的攻击者就无法确认他的猜测。

/dev/random与/dev/urandom特殊文件

有些系统会提供两种随机伪设备:/dev/random与/dev/urandom。现在这些仅在BSD系统、GUN/linux、IBM AIX 5.2、Mac OS X与Sun Solaris 9, 搭配两个第三方的实例与早期Solaris版本的计算修整程序上,提供此支持。这些设备的任务,是提供永不为空的随机字节数据流:这样的数据来源是许多加密程序与安全应用程序所需要的。虽然已经有很多的简单算法可以产生这种虚拟随机数据流,但其实要产生一个真正的随机数据其实是很难的事。

这两个设备的差别,在/dev/random会一直封,直到系统产生的随机数已充分够用,所以它可以确保高品质的随机数。相对地,/dev/urandom不会死锁,其数据的随机程度也不高。

由于这些设备是共享资源,攻击者轻易就能加载拒绝服务,通过读取该设备并丢弃数据,阻断/dev/random。现在比较一下这两个设备,请注意它们两个在count参数下的不同:


root@localhost:/tmp# time dd count=1 ibs=1024 if=/dev/random > /dev/null # 读取1KB的随机码元祖 
0+1 records in 
0+1 records out 
110 bytes (110 B) copied, 0.000108837 s, 1.0 MB/s 
root@localhost:/tmp# time dd count=1024 ibs=1024 if=/dev/urandom > /dev/null # 读取1MB的随机码元祖 
1024+0 records in 
2048+0 records out 
1048576 bytes (1.0 MB) copied, 0.0832226 s, 12.6 MB/s 

/dev/random被读取的越多,它的响应越慢。我们用这两个设备在几个系统上试验,发现要自/dev/random上提取10MB的数据,竟耗掉了一天或一天以上的时间。而/dev/urandom在我们最快的系统上执行,三秒钟即可产生相同的数据。

这两个伪设备都可以取代mktemp,成为产生难以推测的临时性文件名的替代方案:


$ TMPFILE=/tmp/secret.$(cat /dev/urandom | od -x | tr -d ' ' | head -n 1) 
$ echo $TMPFILE 
/tmp/secret.00000003ba2c845df949a7535088c8805479fdf 

此处,我们从/dev/urandom读取二进制字节数据流,以od将其转换为十六进制,使用tr去掉空格,之后满一行时停止。因为od将每个输出行转换为16个字节,因而提供了16 * 8 = 128个随机位,或是2的128次方,种可能的副文件名。如果该文件名建立在仅用户可列出的目录中,则攻击者无从猜测!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程网的支持。

--结束END--

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

本文链接: https://lsjlt.com/news/18622.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Shell中建立与使用临时性文件的方法详解
    前言 在我们日常开发中经常会需要用到临时文件,本文就给大家介绍了关于Shell建立与使用临时性文件的相关内容,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍: 虽然使用管道可以省去建立临时性文件的...
    99+
    2022-06-04
    详解 文件 方法
  • Shell中如何建立并使用临时性文件
    这篇文章给大家分享的是有关Shell中如何建立并使用临时性文件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。虽然使用管道可以省去建立临时性文件的需求,不过有时候临时性文件还是派的上用场的。UNIX不同于其他操作系...
    99+
    2023-06-09
  • python怎么使用TemporaryFile()方法创建临时文件
    小编给大家分享一下python怎么使用TemporaryFile()方法创建临时文件,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本...
    99+
    2023-06-14
  • MySQL临时表的使用方法详解
    目录1. 写在前面的话2. 临时表的使用2.1 创建一个只存放亚洲国家信息的临时表2.1.1 创建临时表2.1.2 向临时表里写数据2.2 在查询过程中直接创建临时表2.3 查询临时表中的数据2.4 删除临时表3. 以上...
    99+
    2024-04-02
  • File.createTempFile创建临时文件的示例详解
    File.createTempFile是Java中用来创建临时文件的方法,它返回一个File对象,表示创建的临时文件。下面是一个示例...
    99+
    2023-08-16
    临时文件
  • MYSQL5.7中临时文件的用法
    这篇文章主要讲解了“MYSQL5.7中临时文件的用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MYSQL5.7中临时文件的用法”吧! ...
    99+
    2024-04-02
  • java中怎么使用File.createTempFile创建临时文件
    使用`File.createTempFile()`方法可以创建一个临时文件,并返回一个`File`对象表示该临时文件。以下是使用`F...
    99+
    2023-08-17
    java
  • 利用PHP POST临时文件机制实现任意文件上传的方法详解
    目录原理如何获取临时文件名$_FILESphpinfoglob如何利用该文件组合请求延长临时文件存在时间参考原理 向 PHP 发送 Post 数据包,如果数据包中包含文件,无论 ph...
    99+
    2024-04-02
  • 如何使用golang中的io/ioutil.TempFile函数创建临时文件
    如何使用golang中的io/ioutil.TempFile函数创建临时文件在许多编程语言中,我们经常需要创建临时文件来存储临时数据或进行一些临时操作。在Golang中,我们可以使用io/ioutil包中的TempFile函数来创建临时文件...
    99+
    2023-11-18
    Golang TempFile io/ioutil
  • 怎么在python中使用tempfile模块创建临时文件
    本篇文章给大家分享的是有关怎么在python中使用tempfile模块创建临时文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python是什么意思Python是一种跨平台的...
    99+
    2023-06-14
  • unix编程创建前缀固定的临时文件的方法
    这篇文章主要介绍“unix编程创建前缀固定的临时文件的方法”,在日常操作中,相信很多人在unix编程创建前缀固定的临时文件的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”unix编程创建前缀固定的临时文件...
    99+
    2023-06-09
  • 使用python怎么创建一个带有文件名的临时文件
    使用python怎么创建一个带有文件名的临时文件?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整...
    99+
    2023-06-14
  • CFile与CStdioFile的文件读写使用方法详解
    CFile//创建/打开文件CFile file;file.Open(_T("test.txt"),CFile::modeCreate|CFile::modeNoTruncate|C...
    99+
    2022-11-15
    CFile CStdioFile
  • 利用shell创建文本菜单与窗口部件的方法
    前言 创建交互式shell脚本最常用的方法是使用菜单。提供各种选项可以帮助脚本用户了解脚本能做什么,不能做什么;通常菜单脚本会清空显示区域,然后显示可用的选项列表。本文给大家详细介绍了shell创建文本菜单...
    99+
    2022-06-04
    部件 菜单 文本
  • shell去掉文件中空行(空白行)的方法详解
    本文详细介绍了使用shell去除文件中的空行的方法,学习下sed、awk、shell文件检测的方法,有需要的朋友可以作个参考。本节内容:shell去掉文件中空行 1,shell 去掉文件中的空行 cat ...
    99+
    2022-06-04
    空行 详解 空白
  • oracle临时表空间的作用与创建及相关操作详解
    目录1.1 临时表空间作用1.2 临时表空间和临时表空间组1.3 临时表空间操作(1) 查看表空间(2) 查看表空间详细信息(3) 查看除临时表空间外 表空间对应的数据文件(4) 查看临时表空间对应的数据文件(5) 查看...
    99+
    2022-07-25
    oracle 创建临时表空间 oracle默认临时表空间 oracle创建临时表空间语句
  • Golang实现文件夹的创建与删除的方法详解
    目录创建文件夹删除文件和文件夹小结补充学习笔记,写到哪是哪。 接着上一篇对纯文本文件读写操作,主要去实现一些文件夹操作。 创建文件夹 创建文件夹的时候往往要先判断文件夹是否存在。 样...
    99+
    2024-04-02
  • 1秒钟使用python建立文件服务器的方法步骤
    目录概述建立服务器使用浏览器下载服务器上的文件使用 wget 命令下载文件概述 Python 内部集成了很多有趣的工具,今天我们来研究一下如何使用 python 内置的下载服务器来传...
    99+
    2024-04-02
  • Linux下core文件的使用方法详解
    前言 有时候程序会异常退出而不带任何日志,此时就可以使用 code 文件进行分析,它会记录程序运行的内存,寄存器,堆栈指针等信息 什么是core文件 通常在 linux 下遇到程序异常退出或者中止,我们都会使用 cor...
    99+
    2022-06-04
    linux core文件 linux下core文件 linux生成core文件
  • Shell实现批量操作文件的方法详解
    目录1.文件夹结构2.查找某文件夹下指定文件所在的路径3.批量删除某个文件夹下的指定文件4.批量重命名某文件夹下指定的文件名5.批量将某文件夹下指定文件移至上级目录1.文件夹结构 准备如下文件夹 如E:\Code\She...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作