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

举报
孙叫兽 发表于 2021/03/25 23:15:48 2021/03/25
【摘要】 目录 临时文件的安全问题 mktemp 命令的用法 mktemp 命令的参数 trap 命令 Bash 脚本有时需要创建临时文件或临时目录。常见的做法是,在/tmp目录里面创建文件或目录,这样做有很多弊端,使用mktemp命令是最安全的做法。 临时文件的安全问题 直接创建临时文件,尤其在/tmp目录里面,往往会导致安全问题。 首先,/tmp目录是所有人可读写...

目录

临时文件的安全问题

mktemp 命令的用法

mktemp 命令的参数

trap 命令


Bash 脚本有时需要创建临时文件或临时目录。常见的做法是,在/tmp目录里面创建文件或目录,这样做有很多弊端,使用mktemp命令是最安全的做法。

临时文件的安全问题

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

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


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

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

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

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

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


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

 

mktemp 命令的用法

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

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


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

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

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


  
  1. #!/bin/bash
  2. TMPFILE=$(mktemp)
  3. echo "Our temp file is $TMPFILE"

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


  
  1. #!/bin/bash
  2. TMPFILE=$(mktemp) || exit 1
  3. echo "Our temp file is $TMPFILE"

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


  
  1. #!/bin/bash
  2. trap 'rm -f "$TMPFILE"' EXIT
  3. TMPFILE=$(mktemp) || exit 1
  4. echo "Our temp file is $TMPFILE"

 

mktemp 命令的参数

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


  
  1. $ mktemp -d
  2. /tmp/tmp.Wcau5UjmN6

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


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

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


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

 

trap 命令

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

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


  
  1. $ trap -l
  2. 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
  3. 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
  4. 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
  5. 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
  6. 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
  7. 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
  8. 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
  9. 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
  10. 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
  11. 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
  12. 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
  13. 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
  14. 63) SIGRTMAX-1 64) SIGRTMAX

trap的命令格式如下。

$ trap [动作] [信号1] [信号2] ...
 

上面代码中,“动作”是一个 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 脚本中指定退出时执行的清理命令。


  
  1. #!/bin/bash
  2. trap 'rm -f "$TMPFILE"' EXIT
  3. TMPFILE=$(mktemp) || exit 1
  4. ls /etc > $TMPFILE
  5. if grep -qi "kernel" $TMPFILE; then
  6. echo 'find'
  7. fi

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

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

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


  
  1. function egress {
  2. command1
  3. command2
  4. command3
  5. }
  6. trap egress EXIT

 

 

下一节Bash脚本教程之启动环境

文章来源: sunmenglei.blog.csdn.net,作者:孙叫兽,版权归原作者所有,如需转载,请联系作者。

原文链接:sunmenglei.blog.csdn.net/article/details/107238822

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。