1- # mktemp 命令
1+ # mktemp 命令,trap 命令
22
3- 有时, Bash 脚本需要创建临时文件或临时目录 。常见的做法是,自己在 ` /tmp ` 目录里面生成一个文件 ,这样做有很多弊端,使用` mktemp ` 命令是最安全的做法。
3+ Bash 脚本有时需要创建临时文件或临时目录 。常见的做法是,在 ` /tmp ` 目录里面创建文件或目录 ,这样做有很多弊端,使用` mktemp ` 命令是最安全的做法。
44
55## 临时文件的安全问题
66
@@ -16,13 +16,11 @@ $ ls -l /tmp/info.txt
1616
1717上面命令在` /tmp ` 目录直接创建文件,该文件默认是所有人可读的。
1818
19- 其次,如果攻击者知道临时文件的文件名,他可以创建符号链接,链接到临时文件,可能导致系统运行异常。攻击者也可能向脚本提供一些恶意数据。因此,临时文件最好使用不可预测、每次都不一样的文件名。
19+ 其次,如果攻击者知道临时文件的文件名,他可以创建符号链接,链接到临时文件,可能导致系统运行异常。攻击者也可能向脚本提供一些恶意数据。因此,临时文件最好使用不可预测、每次都不一样的文件名,防止被利用 。
2020
2121最后,临时文件使用完毕,应该删除。但是,脚本意外退出时,往往会忽略清理临时文件。
2222
23- ## 临时文件的最佳实践
24-
25- 脚本生成临时文件,应该遵循下面的规则。
23+ 生成临时文件应该遵循下面的规则。
2624
2725> - 创建前检查文件是否已经存在。
2826> - 确保临时文件已成功创建。
@@ -55,7 +53,7 @@ TMPFILE=$(mktemp)
5553echo " Our temp file is $TMPFILE "
5654```
5755
58- 为了确保临时文件创建成功,` mktemp ` 命令后面最好使用 OR 运算符(` || ` ),指定创建失败时退出脚本 。
56+ 为了确保临时文件创建成功,` mktemp ` 命令后面最好使用 OR 运算符(` || ` ),保证创建失败时退出脚本 。
5957
6058``` bash
6159#! /bin/bash
@@ -98,7 +96,85 @@ $ mktemp -t mytemp.XXXXXXX
9896/tmp/mytemp.yZ1HgZV
9997```
10098
99+ ## trap 命令
100+
101+ ` trap ` 命令用来在 Bash 脚本中响应系统信号。
102+
103+ 最常见的系统信号就是 SIGINT(中断),即按 Ctrl + C 所产生的信号。` trap ` 命令的` -l ` 参数,可以列出所有的系统信号。
104+
105+ ``` bash
106+ $ trap -l
107+ 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
108+ 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
109+ 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
110+ 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
111+ 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
112+ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
113+ 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
114+ 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
115+ 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
116+ 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
117+ 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
118+ 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
119+ 63) SIGRTMAX-1 64) SIGRTMAX
120+ ```
121+
122+ ` trap ` 的命令格式如下。
123+
124+ ``` bash
125+ $ trap [动作] [信号1] [信号2] ...
126+ ```
127+
128+ 上面代码中,“动作”是一个 Bash 命令,“信号”常用的有以下几个。
129+
130+ > - HUP:编号1,脚本与所在的终端脱离联系。
131+ > - INT:编号2,用户按下 Ctrl + C,意图让脚本中止运行。
132+ > - QUIT:编号3,用户按下 Ctrl + 斜杠,意图退出脚本。
133+ > - KILL:编号9,该信号用于杀死进程。
134+ > - TERM:编号15,这是` kill ` 命令发出的默认信号。
135+ > - EXIT:编号0,这不是系统信号,而是 Bash 脚本特有的信号,不管什么情况,只要退出脚本就会产生。
136+
137+ ` trap ` 命令响应` EXIT ` 信号的写法如下。
138+
139+ ``` bash
140+ $ trap ' rm -f "$TMPFILE"' EXIT
141+ ```
142+
143+ 上面命令中,脚本遇到` EXIT ` 信号时,就会执行` rm -f "$TMPFILE" ` 。
144+
145+ trap 命令的常见使用场景,就是在 Bash 脚本中指定退出时执行的清理命令。
146+
147+ ``` bash
148+ #! /bin/bash
149+
150+ trap ' rm -f "$TMPFILE"' EXIT
151+
152+ TMPFILE=$( mktemp) || exit 1
153+ ls /etc > $TMPFILE
154+ if grep -qi " kernel" $TMPFILE ; then
155+ echo ' find'
156+ fi
157+ ```
158+
159+ 上面代码中,不管是脚本正常执行结束,还是用户按 Ctrl + C 终止,都会产生` EXIT ` 信号,从而触发删除临时文件。
160+
161+ 注意,` trap ` 命令必须放在脚本的开头。否则,它上方的任何命令导致脚本退出,都不会被它捕获。
162+
163+ 如果` trap ` 需要触发多条命令,可以封装一个 Bash 函数。
164+
165+ ``` bash
166+ function egress {
167+ command1
168+ command2
169+ command3
170+ }
171+
172+ trap egress EXIT
173+ ```
174+
101175## 参考链接
102176
103177- [ Working with Temporary Files and Directories in Shell Scripts] ( https://www.putorius.net/working-with-temporary-files.html ) , Steven Vona
178+ - [ Using Trap to Exit Bash Scripts Cleanly] ( https://www.putorius.net/using-trap-to-exit-bash-scripts-cleanly.html )
179+ - [ Sending and Trapping Signals] ( https://mywiki.wooledge.org/SignalTrap )
104180
0 commit comments