#!/usr/bin/env sh # YES_ZSH # YES_BASH # YES_DASH # YES_ASH maybesudo_() ( ### @- ### mimic certain features of `sudo` for systems without it installed. ### as it stands, this mostly just handles some environment variables. ### ### try this: `maybesudo_ -u "$USER" printenv` name= env_cleanup=0 while getopts :AEHKPSVbhiklnsvC:U:g:p:r:t:u: name; do case "$name" in K|V|k) # K: sure kill # V: version # k: kill note 'maybesudo: your system does not have sudo installed!' return 0 ;; h) printf "%s\n" 'maybesudo - a dumb utility for systems without sudo' printf "\n" printf "%s\n" 'usage: maybesudo -h | -V' printf "%s\n" 'usage: maybesudo [command]' return 0 ;; A|E|H|P|S|n|p) # A: askpass # E: preserve environment # H: HOME # P: preserve group vector # S: stdin (password) # n: non-interactive # p: prompt note 'maybesudo: option has no effect --' "'$name'" ;; C|U|b|g|i|l|r|s|t) # C: close from (fd) # U: other user (in conjunction wiht -l) # b: background # g: group # i: simulate initial login (TODO) # l: list # r: role (SELinux) # s: shell (TODO) # t: type (SELinux) note "maybesudo: unsupported option --" "'$name'" return 1 ;; u) # user if [ -z "$USER" -o "$OPTARG" != "$USER" ]; then note 'maybesudo: users other than yourself are unsupported!' return 1 fi env_cleanup=1 ;; :) note 'maybesudo: option requires an argument --' "'$OPTARG'" return 1 ;; default) note 'maybesudo: invalid option --' "'$OPTARG'" return 1 ;; esac done shift "$((OPTIND-1))" if [ "$env_cleanup" = 1 ]; then # portably listing exported variable names is virtually impossible # without the blessing of null-terminated strings, so don't even try. # just export the bare minimum that a fairly stock sudo would. # TODO: you know, awk has an ENVIRON array that might be easier to work with. # don't eat up precious command space with dumb colors. # xargs --show-limits says: # Maximum length of command we could actually use: 5080 [ "${#LS_COLORS}" -le 1024 ] || LS_COLORS= # doas seems to override PATH with /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin # sudo also sets SUDO_COMMAND, SUDO_GID, SUDO_UID, SUDO_USER, and MAIL, # but who needs those? # "${USER:+DOAS_USER}=${USER}" # "${USER:+SUDO_USER}=${USER}" # coreutils treats '=' arguments as no-ops, but busybox does not, so... env -i \ "${COLORS:+COLORS=}${COLORS:--i}" \ "${DISPLAY:+DISPLAY=}${DISPLAY:--i}" \ "${DPKG_COLORS:+DPKG_COLORS=}${DPKG_COLORS:--i}" \ "${HOME:+HOME=}${HOME:--i}" \ "${HOSTNAME:+HOSTNAME=}${HOSTNAME:--i}" \ "${KRB5CCNAME:+KRB5CCNAME=}${KRB5CCNAME:--i}" \ "${LOGNAME:+LOGNAME=}${USER:--i}" \ "${LS_COLORS:+LS_COLORS=}${LS_COLORS:--i}" \ "${PATH:+PATH=}${PATH:--i}" \ "${SHELL:+SHELL=}${SHELL:--i}" \ "${TERM:+TERM=}${TERM:--i}" \ "${USER:+USER=}${USER:--i}" \ "${USERNAME:+USERNAME=}${USERNAME:--i}" \ "${XAUTHORITY:+XAUTHORITY=}${XAUTHORITY:--i}" \ "${XAUTHORIZATION:+XAUTHORIZATION=}${XAUTHORIZATION:--i}" \ -- "$@" else # run it through env anyway for consistency. env -- "$@" fi # don't put any code here or you'll clobber $?. ) [ -n "${preload+-}" ] || maybesudo_ "$@"