Всем привет. У меня не работает телеграм, поэтому буду писать здесь.
Иногда нужно запускать скрипт от root, иначе он не заработает. Казалось бы, что проще:
#Variant 1
if [[ "$UID" -gt 0 ]] ;then
echo "Скрипт должен выполняться администратором."
exit
fi
echo $UID
и скрипт будет прерван. Хочешь выполнения - авторизуйся и сам запускай снова.
Я раньше использовал более удобный вариант:
#Variant 2
[[ "$UID" -gt 0 ]] && { sudo "$0";exit;}
echo $UID
Если скрипт запущен обычным пользователем - он перезапустится через sudo. и пользователя попросят ввести пароль.
У этой конструкции есть пара недостатков. Один из которых, что в процессах висят два скрипта с одним названием, один от обычного пользователя, второй от root. Причем прерывание любого из них приводит к прерыванию скрипта. Т.е. Пользователь может прервать скрипт, выполняемый с привилегиям. Я долго думал, и немного модифицировал конструкцию, чтобы избавиться от этого недостатка:
#Variant 3
[[ "$UID" -gt 0 ]] && exec sudo "$0"
echo $UID
или “спортивный”
#Variant 3 sport
((UID)) && exec sudo "$0"
echo $UID
exec полностью передает управление sudo “$0” .
У второго и третьего вариантов есть маленький недостаток:
При запуске в неявном виде типа ./root.sh - проблем нет, но если попробовать запустить скрипт в явном виде bash root.sh - получим ошибку, потому что баш выполнить скрипт без ведущего пути может, а sudo - нет. Если скрипты пишете для себя, на это можно забить, а вот чтобы было совсем правильно, нужно использовать следующую конструкцию:
#Variant 4
SCR=$(readlink -e "$0")
((UID)) && exec sudo "$SCR"
echo $UID
readlink -e “$0” вернет полный путь, и ошибок не будет.
Ну, и на последок. любителям баш задача, не относящаяся к теме:
Без ИИ и запуска определите, что делает данный скрипт:
#!/bin/bash
declare -ix VAR
echo TEST $VAR
((++VAR<10)) && exec “$0”
echo END
Кто угадает результат с точностью до знака - почет и уважуха. ![]()
Всем работы без багов.
man sudo
man readlink
help exec
(c) Tagd