Как выполнить аргументы функции bash как root с помощью команды su? - PullRequest
0 голосов
/ 12 апреля 2020

Я пишу скрипт, в котором у меня есть функция, которая запускает команды как root. Это делается для того, чтобы он мог использовать sudo, doas или su в зависимости от того, что установил пользователь. Функция выглядит примерно так:

as_root() {
    # $SU_CMD contains either sudo, doas --, or nothing
    if [[ -n $SU_CMD ]]; then
        $SU_CMD $@
    else
        su root -- $@
    fi
}

Это не работает, если ни sudo, ни doas не доступны. Вместо того, чтобы выполнять команду как root, su root -- <command> записывает /usr/bin/<command>: /usr/bin/<command>: cannot execute binary file в терминал. Я также пробовал su -c "$@" среди других комбинаций, но без игры в кости.

Как мне go выполнить аргументы функции bash как root, используя su?

Ответы [ 2 ]

3 голосов
/ 12 апреля 2020

У вас есть три команды, которые вы можете запустить. Обратите внимание, что -- рекомендуется во всех трех случаях.

  1. sudo -- "$@"
  2. doas -- "$@"
  3. su root -- "$@"

Поскольку название функции подразумевает, что вы всегда хотите su root (а не su foo или какого-либо другого пользователя), нет смысла требовать, чтобы root был включен в SU_CMD. Таким образом, вы можете просто написать

as_root () {
  case $SU_CMD in
    sudo) sudo -- "$@" ;;
    doas) doas -- "$@" ;;
    su) su root -- -c "$*" ;;
    *) printf 'Invalid choice: %s\n' "$SU_CMD" >&2 ;;
  esac
}

(Это может быть изменено, но это вряд ли стоит усилий, учитывая простоту функции.)

1 голос
/ 12 апреля 2020

Используйте один da sh вместо двух или еще лучше -l, чтобы избежать путаницы:

as_root() {
    if [[ -n $SU_CMD ]]; then
        $SU_CMD "$@";
    else
        su root -l -c "$@";
    fi
}

morbeo@pc:~$ as_root whoami
Password:
root
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...