Shell

為什麼 shell 腳本中的“sudo su”不以 root 身份執行腳本的其餘部分?

  • October 5, 2020

範例腳本如下:

#!/bin/bash
sudo su
ls /root

以普通使用者身份使用時./test.sh,改為ls以超級使用者身份執行並退出,切換到root;當我註銷時,它ls /root以普通使用者身份執行。

誰能告訴我關於它的機制?

腳本中的命令一一獨立地執行。腳本本身作為腳本中所有命令的父程序,是另一個獨立的程序,su 命令不會也不能將其更改為 root:su 命令創建一個具有 root 權限的新程序。

該 su 命令完成後,仍以同一使用者身份執行的父程序將執行腳本的其餘部分。

您要做的是編寫一個包裝腳本。特權命令進入主腳本,例如~/main.sh

#!/bin/sh
ls /root

包裝腳本呼叫具有root權限的主腳本,像這樣

#!/bin/sh
su -c ~/main.sh root

要啟動此過程,您需要執行包裝器,它會在將使用者切換到 root 使用者後啟動主腳本。

這種包裝器技術可用於將腳本轉換為自身的包裝器。基本上檢查它是否以root身份執行,如果不是,使用“su”重新啟動自身。

$0 是一種讓腳本引用自身的便捷方式,而 whoami 命令可以告訴我們我們是誰(我們是 root 嗎?)

所以帶有內置包裝器的主腳本變成了

#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root

注意 exec 的使用。它的意思是“替換這個程序”,它有效地結束了它的執行並啟動了由su啟動的新程序,以root身份從頂部執行。替換實例是“root”,因此它不會執行 || 的右側

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