运行shell脚本时,如何保护它不被覆盖或截断文件?

时间:2010-03-06 20:28:47

标签: installation shell shared-libraries nfs reliability

如果在应用程序运行时,它使用的其中一个共享库被写入或截断,那么应用程序将崩溃。移动文件或使用'rm'批量移除文件不会导致崩溃,因为操作系统(在这种情况下是Solaris但我认为在Linux和其他* nix上也是如此)足够聪明,不能删除与之关联的inode当任何进程打开文件时该文件。

我有一个执行共享库安装的shell脚本。有时,它可能会用于重新安装已安装的共享库版本,而无需先卸载。因为应用程序可能正在使用已经安装的共享库,所以脚本足够智能化rm文件或将它们移开(例如,当我们不知道应用程序时,cron可能会清空的'已删除'文件夹)很重要将在安装新的之前运行),以便它们不会被覆盖或截断。

不幸的是,最近一个应用程序在安装后崩溃了。巧合?这很难说。这里真正的解决方案是切换到比旧的巨大shell脚本更强大的安装方法,但在切换之前有一些额外的保护是很好的。有没有办法包装一个shell脚本来保护它不被覆盖或截断文件(理想情况下大声失败),但仍然允许它们被移动或移动?

标准UNIX文件权限不会起作用,因为您无法区分移动/删除与覆盖/截断。别名可以工作,但我不确定整个命令需要别名。我想象一下像truss / strace之类的东西,除了在每个动作之前它检查过滤器是否真的这样做。我不需要一个完美的解决方案,甚至可以对付故意恶意的脚本。

3 个答案:

答案 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()函数,并确保它们是唯一使用的方法。如果您确实需要确定,请运行两个进程。一个人有权进行更改,另一个人会提前删除所有权限,并告诉另一个脚本执行实际的磁盘工作。