From cf7017c9c6de0dff046fb5820a660f5f6c482f7f Mon Sep 17 00:00:00 2001 From: CyberLeo Date: Sat, 6 Mar 2010 14:01:20 -0600 Subject: [PATCH] Add reexec scriptlet to exec things via sudo/su --- example.sh | 10 +++++++++- lib/sh/reexec.sh | 30 ++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 lib/sh/reexec.sh diff --git a/example.sh b/example.sh index fc7ebcb..14ddcf6 100755 --- a/example.sh +++ b/example.sh @@ -3,7 +3,9 @@ # Source shlib _root="$(dirname "${0}")"; . "${_root}/lib/sh/env.sh" -want log ask +want log ask reexec + +id note This is a note. log ...and a log... @@ -12,5 +14,11 @@ warn ...warning... log "Are you sure?" yn || err you said no +if [ "$(id -u)" -ne 0 ] +then + note "Restart script as root" + reexec "${0}" "${@}" +fi + err the end diff --git a/lib/sh/reexec.sh b/lib/sh/reexec.sh new file mode 100644 index 0000000..d45f45a --- /dev/null +++ b/lib/sh/reexec.sh @@ -0,0 +1,30 @@ +# reexec library script + +if [ -z "${__reexec_sh_loaded}" ] +then + __reexec_sh_loaded=yes + + # exec a command via sudo/su + # Can be used to reexec this process, if run like this from the top-level: + # reexec "${0}" "${@}" + # Specify target user name with -u as the first parameter + # reexec -u user "${0}" "${@}" + reexec() { + user="root" + # Set name if user provided + if [ "${1}" = "-u" ] + then + user="${2}" + shift 2 + fi + + # reexec if needed + if [ "$(id -un)" != "${user}" ] + then + # Find a su/sudo + cmd="sudo -u ${user}" + [ -x "$(which sudo 2>/dev/null)" ] || cmd="su ${user} -c" + exec ${cmd} "${@}" + fi + } +fi -- 2.42.0