Zsh

在別名中有 sudo 和非 sudo 部分 - 為什麼它不適用於 >>?

  • February 11, 2020

我試圖使用一個應該執行兩個命令的別名,其中第一個可以使用普通使用者權限執行,第二個需要 sudo 權限。

alias hosts-get="scp user@host.com:/etc/hosts /tmp/ && sudo cat /tmp/hosts >> /etc/hosts"

案例是拉取遠端伺服器的主機文件,然後將其附加到我自己電腦上的主機文件中(遠端伺服器包含所有 IP 到客戶端系統的域資訊)。

但是,在執行我得到的別名時zsh: permission denied: /etc/hosts,看起來 sudo 被忽略了,或者 zsh 無法解釋它或其他東西。

經過一番搜尋後,我將別名更改為:

alias hosts-get="scp user@host.com:/etc/hosts /tmp/ && cat /tmp/hosts | sudo tee -a /etc/hosts"

這看起來工作正常。有人可以解釋一下這件事的背景嗎?

雖然您的第一個別名中的 sudo 命令提供了用於cat /tmp/hosts重定向的root 權限,但>> /etc/hosts將使用您的使用者權限進行嘗試。

由於這些通常不夠高,您會收到“權限被拒絕”錯誤。

為了使這項工作,您可以像這樣在子shell中執行命令:

alias hosts-get="scp user@host.com:/etc/hosts /tmp/ && sudo sh -c \"cat /tmp/hosts >> /etc/hosts\""  

或者只是按照您使用第二種方法的方式進行操作。

在這裡,您將“非特權”cat 命令的輸出重定向到特權“tee”命令,然後該命令有權將資訊附加到 /etc/hosts。

引用自:https://unix.stackexchange.com/questions/566903