Запрос sudo на выполнение скрипта (ранее введенные данные пропадают)
Пишу скрипт, который в процессе выполнения запросит авторизацию суперпользователя и продолжит выполнение.
У меня ошибка при запросе прав, но не могу понять в какой момент она происходит.
Дело в том, что переменная TS_DIRECTORY обнуляет введенные ранее данные после запроса прав sudo. Прошу помощи:
#!/bin/sh
SRC_PATH=$(pwd)/build
PACKAGES=./packages.list
read -ep "Путь расположения корневого каталога: " TS_DIRECTORY
DST_PATH=$TS_DIRECTORY/build
if [ "$(id -nu)" != "root" ]; then
sudo --reset-timestamp
read -sp "Для выполнения необходимо ввести пароль суперпользователя: " PASSWORD
exec sudo --stdin --prompt '' "$0" "$@" <<< "$PASSWORD"
exit 1
fi
if [ ! -e $TS_DIRECTORY ]; then
echo "Указанной директории не существует!"
exit 1
fi
echo $TS_DIRECTORY
echo $DST_PATH
Ответы (1 шт):
Как-то сложно вы всё делаете, зачем-то пароль через read запрашиваете, а после пытаетесь его втиснуть в sudo, ради чего ? красивую надпись можно и с помощью того же ключа --prompt вывести.
Потом, если вам нужно чтобы скрипт работал от суперпользователя то почему проверку не сделать в начале скрипта ? Вот запустили скрипт от простого пользователя, ввели корневой каталог, а потом оказалось что пользователь не супер, и что теперь ? опять вводить данные по новой ? тот же корневой каталог.
Вот немного пригладил ваш скрипт до рабочего состояния
#!/bin/sh
SCRIPT=$(realpath "$0")
DIR=$(dirname "$SCRIPT")
if [ "$USER" != "root" ]; then
sudo --reset-timestamp
exec sudo --prompt 'Для выполнения необходимо ввести пароль суперпользователя: ' "$SCRIPT" "$@"
exit 1
fi
until [ -e "$TS_DIRECTORY" ]; do
read -ep "Путь расположения корневого каталога: " TS_DIRECTORY
done
DST_PATH="$TS_DIRECTORY/build"
PACKAGES="$DIR/packages.list"
SRC_PATH="$DIR/build"
хотя лучше вообще так не делать и не использовать внутри скрипта вызов sudo и подобных разрешающих утилит. Если скрипт делаете не только для себя но и для других то нету никакой гарантии что у пользователя вообще установлен sudo или возможно вообще используется како-то другой аналог, например doas.
Верным решением будет после проверки на наличие прав суперпользователя завершить скрипт и вывести предупреждение о том что в доступе отказанно ( ... : permission denied ).