Sed在特权符号链接上就位

时间:2016-05-04 17:33:14

标签: bash sed

曾几何时,我使用sedtee组合来更改特权文件。因为shell本身没有root权限,所以我必须创造性地将命令输出写入文件:

sed -r 'script' "/etc/hosts" | sudo tee "/etc/hosts" 1>/dev/null

当时,这非常有效。只有在我开始使用我的主机文件进行广告拦截之后,才意识到管道仅限于缓冲区,之后三通很乐意覆盖该文件,文件的其余部分将消失。

我还考虑了一个更简单的版本:

sed -r 'script' "/etc/hosts" > "/etc/hosts.tmp" && sudo mv "/etc/hosts.tmp" "/etc/hosts"

不幸的是,由于有问题的文件是符号链接,因此也无法使用。 mv将覆盖符号链接,而不是下面的文件。

我目前的解决方案是:

sed -r 'script' "/etc/hosts" | sudo tee "/etc/hosts.tmp" 1>/dev/null &&
    sudo cat "/etc/hosts.tmp" | sudo tee "/etc/hosts" 1>/dev/null &&
    sudo rm "/etc/hosts.tmp"

的E w!多么冗长!

有更清洁的方法吗?

1 个答案:

答案 0 :(得分:3)

如果您正在使用GNU sed,则可以使用其-i就地版本标志,以便将其执行结果直接保存到它处理的文件中。然后你只需要sudo sed命令,你应该没问题。

另外要编写文件而不是链接,请使用sed的--follow-symlinks标记。

在其他情况下,请检查this answer to a similar question on SO