替换重要的符号链接'安全'

时间:2009-09-06 08:53:23

标签: bash symlink

我想在bash脚本中更改符号链接的目标。问题是符号链接非常重要(它是/bin/sh,即),我想以时尚的方式做到:

  1. 新目标将在删除旧目标后立即可用,即不会有任何东西会注意到它消失,
  2. 中间不可能出现更改失败的情况,即删除删除了符号链接的用户,而不是新用户。
  3. 我想到了两种方法。使用普通ln

    ln -fs /bin/bash /bin/sh
    

    或使用mv

    ln -s /bin/bash /bin/sh.new
    mv /bin/sh.new /bin/sh
    

    哪一个更符合我的需求?是否有可能其中一个会尝试替换符号链接目标而不是符号链接本身?

2 个答案:

答案 0 :(得分:22)

重命名(mv)是一个原子操作;创建一个新的符号链接不是(删除旧的符号链接;创建一个新的符号链接)。所以你应该使用mv

$ ln -s new current_tmp && mv -Tf current_tmp current

这是一个blog post讨论这个问题。另外,如果您担心会发生什么,为什么不首先在非关键符号链接上尝试呢?

答案 1 :(得分:-1)

看起来(从手册页)ln -f在创建符号链接之前取消链接符号链接,这意味着mv是更好的选择。

但是,我强烈建议反对/bin/shbash相关联。许多脚本使用:

#!/bin/sh

并且假设shell是经典的Bourne shell而编写。如果要运行bash,则可能很容易在脚本假定sh执行的内容与bash 实际之间的内容之间产生模糊的不兼容性。这几乎是不可能追查的。

相关问题