如果在应用程序运行时,它使用的其中一个共享库被写入或截断,那么应用程序将崩溃。移动文件或使用'rm'批量移除文件不会导致崩溃,因为操作系统(在这种情况下是Solaris但我认为在Linux和其他* nix上也是如此)足够聪明,不能删除与之关联的inode当任何进程打开文件时该文件。
我有一个执行共享库安装的shell脚本。有时,它可能会用于重新安装已安装的共享库版本,而无需先卸载。因为应用程序可能正在使用已经安装的共享库,所以脚本足够智能化rm文件或将它们移开(例如,当我们不知道应用程序时,cron可能会清空的'已删除'文件夹)很重要将在安装新的之前运行),以便它们不会被覆盖或截断。
不幸的是,最近一个应用程序在安装后崩溃了。巧合?这很难说。这里真正的解决方案是切换到比旧的巨大shell脚本更强大的安装方法,但在切换之前有一些额外的保护是很好的。有没有办法包装一个shell脚本来保护它不被覆盖或截断文件(理想情况下大声失败),但仍然允许它们被移动或移动?
标准UNIX文件权限不会起作用,因为您无法区分移动/删除与覆盖/截断。别名可以工作,但我不确定整个命令需要别名。我想象一下像truss / strace之类的东西,除了在每个动作之前它检查过滤器是否真的这样做。我不需要一个完美的解决方案,甚至可以对付故意恶意的脚本。
答案 0 :(得分:2)
您可以通过
阻止脚本通过I / O重定向进行覆盖set noclobber
防止cp
之类的覆盖更难。我倾向于重置PATH
以使脚本运行PATH
只包含一个条目,一个“祝福”目录,您可以放置您知道安全的命令。例如,这可能意味着您的cp
版本始终使用--remove-destination
选项(可能是GNU-ism)。在任何情况下,您都安排脚本只执行来自blessed目录的命令。然后,您可以单独审查每个此类命令。
如果您可以通过绝对路径名阻止脚本执行命令,那将是件好事,但我不知道该怎么做。如果您在常规目录中进行安装,chroot
jail可能没有帮助,除非您进行大量环回安装以使这些目录可见。如果您安装的目录包含危险命令,我看不出您如何完全保护自己免受攻击。
顺便说一句,我尝试了,但是在安装之前install(1)
是否删除了desitination。它会间接学习。
答案 1 :(得分:1)
我假设的Bash脚本?脚本很长吗?如果没有,您可以手动执行此操作:
if [ ! -f /tmp/foo.txt ] #If file does not exist
then
...code
fi
但我认为你正在寻找一种方法来围绕脚本进行包装。您当然可以使用strace监视文件写入,但AFAIK它没有中断它们的功能,除非您使用规则等设置某种入侵检测系统。
但说实话,除非它是一个巨大的剧本,否则可能比它的价值更麻烦
答案 2 :(得分:0)
编写自己的safe_install()函数,并确保它们是唯一使用的方法。如果您确实需要确定,请运行两个进程。一个人有权进行更改,另一个人会提前删除所有权限,并告诉另一个脚本执行实际的磁盘工作。