Вопрос или проблема
В настоящее время я обновляю несколько скриптов и планирую выпустить некоторые полезные, чтобы другие могли ими пользоваться (поэтому они должны работать на широком спектре машин без сбоев и не нарушать ничего).
Один из них добавляет плагин pepperflash для chromium и несколько других вещей на машинах Fedora – изначально я сделал скрипт, потому что вещь russianfedora казалась ненадежной в то время, требовала неприятного набора зависимостей и иногда устаревала. Мой скрипт должен делать то, что, я думаю, делает скрипт для ubuntu – использовать пакет chrome и извлекать плагины, следовательно, он законно перераспределяемый.
Как только он поймет, что делает, ему нужно будет скопировать файлы в установку chromium и т. д., используя команды копирования, подобные этой (которая работает без проблем на моих машинах Fedora 21):
sudo cp -riv ${tmpdir}/* ${location}/
Где ${tmpdir}
может быть /tmp/tmp.IOfylQBAHT
и т. д., а ${location}
может быть /usr/lib64/chromium-browser/
– обе переменные зависят от того, на какой системе запущен скрипт и какие параметры используются. Часто нужно использовать две или три команды копирования.
Моя проблема в том, что, я думаю, не все системы используют sudo
(в некоторых нужно использовать su
, поскольку sudo
не установлен или не настроен, и на некоторых системах, возможно, у пользователя вообще нет прав root и т. д.), поэтому я задаюсь вопросом, что мне следует сделать – например:
- Использовать
sudo
и надеяться, что все будет хорошо - Использовать что-то странное, вроде
timeout 2 sudo -v > /dev/null 2>&1
и проверить$?
, чтобы увидеть, может ли пользователь делать что-либо от имени root с помощью sudo – если не может, выйти с сообщением, например,Для завершения установки, пожалуйста, выполните 'cp -riv ${tmpdir}/* ${location}/' от имени root
– если может, продолжить. (Команда теста может вызвать проблемы на некоторых системах с известным ‘это происшествие будет сообщено’, если пользователь попытается использовать sudo – это также может продлить таймаут пользователя или что-то еще …. источник) - Просто выйти с сообщением из последнего пункта (Примечание. Оно будет
echo
ировано, поэтому заменит${tmpdir}
и т. д. на соответствующие местоположения) -
Убедиться, что пользователь запускает скрипт от имени root – например, с помощью:
if [ "$(whoami)" != "root" ]; then echo -e "\e[31mERROR: Это нужно запускать от имени root\e[0m"; exit 1 ; fi
- Что-то еще 🙂
Лично я бы не делал предположений о sudo
, так же как и включать sudo
в скрипт – плохая идея. Наилучший, по моему мнению, ваш четвертый вариант (проверить, выполняется ли скрипт от имени root). Просто я предпочитаю проверять эффективный идентификатор пользователя, а не его имя:
[ -n "$EUID" ] && [ $EUID -eq 0 ] || <не root, выход>
Это оставит выбор пользователю, каким инструментом суперпользователя запускать ваш скрипт.
Ответ или решение
Установка скрипта с учётом совместимости авторизации sudo
При разработке и распространении скриптов для установки программного обеспечения, таких как плагин Pepper Flash для браузера Chromium на Fedora, важно учитывать способы получения прав суперпользователя. На разных системах могут использоваться разные инструменты для привилегированных операций: некоторые системы полагаются на sudo
, в то время как другие требуют su
. Безусловно, создание гибкого и надежного скрипта, который будет работать на широком круге машин, требует правильной структуры кода и внимания к условиям работы.
1. Совместимость с sudo и su
Одним из наиболее эффективных подходов к решению данной проблемы является проверка прав пользователя перед выполнением административных операций. Если скрипт будет запускаться от имени пользователя, который не имеет прав суперпользователя, это может привести к ошибкам или некорректной работе. Поэтому важно предусмотреть возможность проверки текущего пользователя:
if [ "$EUID" -ne 0 ]; then
echo -e "\e[31mERROR: Этот скрипт необходимо запускать от имени суперпользователя\e[0m"
exit 1
fi
Этот код проверяет, что эффективный идентификатор пользователя равен нулю (т.е. является ли пользователь суперпользователем) и завершает выполнение с ошибкой, если это не так. Он также оставляет выбор за пользователем, как именно запустить скрипт с правами суперпользователя, либо через sudo
, либо через su
.
2. Проверка доступности sudo
В случае, когда важно использовать sudo
, можно выполнить проверку на его доступность и корректную конфигурацию. Например, можно использовать команду sudo -v
, чтобы проверить, может ли текущий пользователь использовать sudo
:
timeout 2 sudo -v &> /dev/null
if [ $? -ne 0 ]; then
echo "Для завершения установки выполните 'cp -riv ${tmpdir}/* ${location}/' от имени суперпользователя."
exit 1
fi
Этот фрагмент кода проверяет, доступен ли sudo
для пользователя, и, если нет, выводит соответствующее сообщение.
3. Избежание жесткой привязки к конкретному инструменту
Избегайте жесткой привязки скрипта только к sudo
или su
. Возможно, вам придется поддерживать различные микроконфигурации, которые могут создать сложности. Всегда лучше предлагать пользователю выбор, который инструмент использовать для выполнения скрипта с правами суперпользователя, и информировать о необходимых действиях в случае отсутствия таковых.
4. Правильное использование команд копирования
После проверки прав пользователя и способностей к привилегированному доступу, можно безопасно выполнять команды копирования. Например, если важные директории и временные файлы заранее определены:
sudo cp -riv "${tmpdir}/"* "${location}/"
Таким образом, помимо использования проверок и выбора подходящего подхода для получения прав суперпользователя, важно, чтобы ваш скрипт был простым в использовании и оставлял пространство для необходимых изменений. Это не только улучшает пользовательский опыт, но также снижает риск возникновения ошибок и делает скрипт более универсальным.
Заключение
Создание скриптов, которые будут работать на разных системах и при различных условиях, требует тщательного планирования. Используйте проверки прав пользователя, избегайте привязки к конкретным инструментам и оставляйте пользователям ясные инструкции о том, как действовать в различных ситуациях. Эти шаги помогут обеспечить стабильную работу ваших скриптов и удовольствия от их использования.