自我删除bash脚本

use*_*985 13 bash self-destruction

即使在遇到要删除自身的语句之后,bash脚本如何执行?例如,当我运行test.sh脚本时,该脚本具有以下特征:

<--some commands-->
rm test.sh
<--some more commands-->

end
Run Code Online (Sandbox Code Playgroud)

脚本在删除之前执行到结束

w00*_*00t 24

实际发生的是bash保持文件打开,rm不会停止.

所以rm调用libc函数"unlink()"将从它所在的目录中删除inode的"链接".这个"链接"实际上是一个文件名和一个inode号(你可以看到inode号码ls -i).

只要程序打开,inode就存在.

您可以按如下方式轻松测试此声明:

$ echo read a> ni
$ bash ni
Run Code Online (Sandbox Code Playgroud)

而在另一个窗口:

$ pgrep -lf bash\ ni
31662 bash ni
$ lsof -p 31662|grep ni
bash    31662 wmertens  255r   REG   14,2         7 12074052 /Users/wmertens/ni
$ rm ni
$ lsof -p 31662|grep ni
bash    31662 wmertens  255r   REG   14,2         7 12074052 /Users/wmertens/ni
Run Code Online (Sandbox Code Playgroud)

即使您无法再在ls中看到该文件,该文件仍会打开.所以不是bash读取整个文件 - 直到bash完成它才真正消失.