Запрос 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 шт):

Автор решения: Zt.

Как-то сложно вы всё делаете, зачем-то пароль через 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 ).

→ Ссылка