Shell
為什麼 shell 腳本中的“sudo su”不以 root 身份執行腳本的其餘部分?
範例腳本如下:
#!/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”,因此它不會執行 || 的右側