在别名中包含 sudo 和非 sudo 部分 - 为什么它不能与 >> 一起使用?

在别名中包含 sudo 和非 sudo 部分 - 为什么它不能与 >> 一起使用?

我试图使用应该运行两个命令的别名,其中第一个命令可以使用普通用户权限运行,第二个命令需要 sudo 权限。

alias hosts-get="scp [email protected]:/etc/hosts /tmp/ && sudo cat /tmp/hosts >> /etc/hosts"

用例是拉取远程服务器的主机文件,然后将其附加到我自己计算机上的主机文件中(远程服务器包含客户端系统的所有 IP 到域信息)。

但是,当运行我得到的别名时zsh: permission denied: /etc/hosts,看起来 sudo 被忽略了,或者 zsh 无法解释它或其他东西。

经过一番搜索后,我将别名更改为:

alias hosts-get="scp [email protected]:/etc/hosts /tmp/ && cat /tmp/hosts | sudo tee -a /etc/hosts"

这看起来工作正常。有人可以解释一下这个的背景吗?

答案1

虽然第一个别名中的 sudo 命令提供了 root 权限,但将使用您的用户权限尝试cat /tmp/hosts重定向。 由于这些通常不够高,您会收到“权限被拒绝”错误。 >> /etc/hosts

要实现此功能,您可以在子 shell 中运行该命令,如下所示:

alias hosts-get="scp [email protected]:/etc/hosts /tmp/ && sudo sh -c \"cat /tmp/hosts >> /etc/hosts\""  

或者按照第二种方法的方式进行操作。
在这里,您将“非特权”cat 命令的输出重定向到特权“tee”命令,然后该命令有权将信息附加到 /etc/hosts。

相关内容