我有一個腳本(myscript.sh),它運行一些需要提升權限的命令(即需要運行sudo)。
腳本相當復雜,但為了演示它,如下所示:
#!/bin/bash
echo "hello"
command1_which_needs_sudo
echo "hello2"
command2_which_needs_sudo
echo "hello3"
...
如果我以沒有所需權限的普通用戶身份運行它:
$ ./myscript.sh
hello
must be super-user to perform this action
但是,如果我以正確的權限運行它,它將正常作業:
$ sudo ./myscript.sh
hello
hello2
hello3
我能否以某種方式實作在myscript.sh沒有的情況下運行sudo,并使腳本在開始時只請求一次提升的權限(并在完成后將其傳回)?
所以很明顯,sudo command1_which_needs_sudo不會好,因為command2也需要權限。
如果我不想創建另一個檔案,并且由于腳本復雜性,我也不想使用 heredoc 語法來執行此操作,我該怎么做?
uj5u.com熱心網友回復:
如果您主要關心的是代碼的清晰性,那么使用包裝函式可以帶來很多好處。
# call any named bash function under sudo with arbitrary arguments
run_escalated_function() {
local function_name args_q
function_name=$1; shift || return
printf -v args_q '%q ' "$@"
sudo bash -c "$(declare -f "$function_name"); $function_name $args_q"
}
privileged_bits() {
command1_which_needs_sudo
echo "hello2"
command2_which_needs_sudo
}
echo "hello"
run_escalated_function privileged_bits
echo "hello3"
uj5u.com熱心網友回復:
如果您想以 root 權限運行腳本,而無需sudo在終端中輸入,也不必多次輸入密碼,那么您可以使用:
#!/bin/bash
if [ "$EUID" -ne 0 ]
then
exec sudo -s "$0" "$@"
fi
echo "hello"
command1_which_needs_sudo
echo "hello2"
command2_which_needs_sudo
echo "hello3"
# ...
sudo -k
更新:
如果您的目標是使用權限執行腳本的一部分,sudo那么使用此處參考的檔案可能是最簡單的解決方案;不會有任何語法問題,因為當前的 shell 不會在其中擴展任何內容。
#!/bin/bash
echo "hello"
sudo -s var="hello2" <<'END_OF_SUDO'
command1_which_needs_sudo
echo "$var"
command2_which_needs_sudo
END_OF_SUDO
sudo -k
echo "hello3"
#...
備注:請注意,您可以通過varname=value在sudo命令中設定來使用 here-document 腳本中的外部值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/451500.html
上一篇:用awk否定條件
