我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Shell中如何建立并使用临时性文件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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次方,种可能的副文件名。如果该文件名建立在仅用户可列出的目录中,则攻击者无从猜测!

感谢各位的阅读!关于“Shell中如何建立并使用临时性文件”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Shell中如何建立并使用临时性文件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Shell中如何建立并使用临时性文件

这篇文章给大家分享的是有关Shell中如何建立并使用临时性文件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。虽然使用管道可以省去建立临时性文件的需求,不过有时候临时性文件还是派的上用场的。UNIX不同于其他操作系
2023-06-09

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

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

如何使用Python临时文件

小编给大家分享一下如何使用Python临时文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、前言临时文件通常用来保存无法保存在内存中的数据,或者传递给必须从文
2023-06-14

如何使用golang中的io/ioutil.TempFile函数创建临时文件

如何使用golang中的io/ioutil.TempFile函数创建临时文件在许多编程语言中,我们经常需要创建临时文件来存储临时数据或进行一些临时操作。在Golang中,我们可以使用io/ioutil包中的TempFile函数来创建临时文件
如何使用golang中的io/ioutil.TempFile函数创建临时文件
2023-11-18

java中怎么使用File.createTempFile创建临时文件

使用`File.createTempFile()`方法可以创建一个临时文件,并返回一个`File`对象表示该临时文件。以下是使用`File.createTempFile()`方法创建临时文件的示例代码:```javaimport java.
2023-08-17

Dreamweaver如何使用临时文件工作

小编给大家分享一下Dreamweaver如何使用临时文件工作,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Dreamweaver使用临时文件将一些未经保存的数据传
2023-06-08

Windows7 系统如何下使用无线建立临时网络

处理方案:1、翻开网络和共享中心2、挑选“配置新android的衔接或网络”3、配置无线临时网javascript络4、5、配置无线网络的称号、安全类型和密钥6、启用Internet共享(可议决计算机实行Intern
2023-05-25

Python实用技巧之临时文件如何使用

本篇内容主要讲解“Python实用技巧之临时文件如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python实用技巧之临时文件如何使用”吧!当我们用Python编写程序时,有时候需要临时存
2023-07-05

怎么在python中使用tempfile模块创建临时文件

本篇文章给大家分享的是有关怎么在python中使用tempfile模块创建临时文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python是什么意思Python是一种跨平台的
2023-06-14

聊聊Angular中如何创建简单独立组件并使用

本篇文章带大家了解一下Angular中的独立组件,介绍一下如何创建简单的独立组件以及如何在 Angular 应用程序中使用它们,希望对大家有所帮助!
2023-05-14

如何使用内存作linux下的/tmp临时文件夹

这篇文章主要介绍“如何使用内存作linux下的/tmp临时文件夹”,在日常操作中,相信很多人在如何使用内存作linux下的/tmp临时文件夹问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用内存作linu
2023-06-10

Linux中如何使用ln命令在文件之间建立连接

这篇文章主要介绍“Linux中如何使用ln命令在文件之间建立连接”,在日常操作中,相信很多人在Linux中如何使用ln命令在文件之间建立连接问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux中如何使用l
2023-06-12

如何使用shell创建文本菜单与窗口部件

这篇文章主要介绍了如何使用shell创建文本菜单与窗口部件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。创建文本菜单创建交互式shell脚本最常用的方法是使用菜单,它提供了各
2023-06-09

如何使用golang中的io/ioutil.TempDir函数创建带有指定前缀和后缀的临时文件夹

如何使用golang中的io/ioutil.TempDir函数创建带有指定前缀和后缀的临时文件夹,需要具体代码示例在Go语言的开发中,有时候我们需要创建用于临时存储文件的文件夹,这些文件夹往往是临时的,使用完毕后需要删除。Go语言的标准库中
如何使用golang中的io/ioutil.TempDir函数创建带有指定前缀和后缀的临时文件夹
2023-11-18

Win7卸载程序提示无法创建临时文件安装中止如何解决?

win7系统打开控制面板的程序与功能,卸载程序时提示“无法创建临时文件,安装终止 错误5:拒绝访问”,这是怎么回事呢?主要是系统中临时文件的文件夹被删除引起的,来看看下文的解决方法吧。 解决步骤: 1、在桌面上计算机
2023-05-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录