無法使用“echo”寫入 /etc/shadow,但使用“nano”我可以

無法使用“echo”寫入 /etc/shadow,但使用“nano”我可以

我的目標是寫入 /etc/passwd 以將權限升級到 root。

我為新的 root 使用者產生了密碼「test1」:openssl passwd test1 並且我使用 echo 在 /etc/passwd 檔案中附加一個新條目:sudo echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd

但是當我執行最後一個命令時,它顯示我沒有執行此操作的權限:bash: /etc/passwd: Permission denied

但是當我使用該命令sudo nano /etc/passwd並複製到root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash文件末尾時,它就可以工作了!

命令有什麼問題echo

答案1

已經透過評論回答了,但請擴展一下:

sudo echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd

翻譯如下:

  1. 指示 bash(未提升)開啟檔案 /etc/passwd 進行寫入
  2. 指示 bash(仍未提升)使用一些參數來執行指令sudo,並使用步驟 1 中的檔案描述子作為 stdout
    1. echo指示 sudo(即 setuid root)使用一些參數來 運行命令
      1. 指示 echo(以 root 身份運行,注意這可能類似於 /usr/bin/echo,通常echo會呼叫 shell 內建命令),並從 sudo 繼承 stdout)將一些文字輸出到 stdout
      2. 工作完成,echo 退出
    2. 它的工作完成了, sudo 退出;沒有任何東西以 root 身份運行
  3. Bash(仍未提升)關閉 /etc/passwd 的檔案描述符(刷新寫入佇列)
  4. Bash 等待下一個命令

當然,除了步驟 1 失敗之外! Bash 未提升權限,無法開啟 /etc/passwd 進行寫入。因此,bash: /etc/passwd: Permission denied步驟 2 或 3 的任何部分都不會發生,包括步驟 2 的任何子步驟。

sudo nano /etc/passwd運作得很好,因為提升的進程(nano,從 sudo 繼承 root 權限)是開啟檔案進行寫入的進程。

如果您想在此處使用 echo,則需要提升 bash 本身。這可以透過在 sudo 中明確調用 bash(或任何其他 shell)然後告訴它要做什麼來完成:
sudo bash -c 'echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd'
或者等效地作為三個單獨的命令(其中後兩個命令提供給 bash 的提升實例):
sudo bash echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd exit

相關內容