Игнорировать sudo в скрипте bash

9

У меня есть небольшой скрипт bash:

#!/bin/bash

touch dummy.txt

Если я выполню этот скрипт с, sudoто он создаст, dummy.txtкоторый будет защищен от корня .

Что я хочу сделать, это:

Независимо от того, выполняется ли этот сценарий с sudoпомощью обычного пользователя или с обычным пользователем, файл неdummy.txt должен быть защищен от корня.

анонимное
источник
4
Что бы вы не имели в виду под «защищенным от корня», вы можете использовать chownи chmodв своем скрипте, чтобы установить владельца и права доступа по желанию.
Фракием
1
Непонятно, что вы подразумеваете под «root-защита». Вы имеете в виду, что только пользователь root может читать / писать (например, права доступа к файлу установлены примерно на 700) или что пользователь root является владельцем файла?
1
@DoritoStyle извините за путаницу. Под root-защитой я подразумевал, что root-пользователь является владельцем файла.
Аноним

Ответы:

22

Вы можете проверить , если запущен скрипт , с помощью sudoиспользования EUIDи SUDO_USERпеременных, а затем выполнить , touchкак SUDO_USERесли это правда - что - то вроде

#!/bin/bash

if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
  sudo -u "$SUDO_USER" touch dummy.txt
else
  touch dummy.txt
fi
steeldriver
источник
2
Обратите внимание, что ==используется для сравнения строк. Поскольку $EUIDпредполагается возвращать целочисленное значение, я бы порекомендовал вам использовать -edсравнение. В именах пользователей допускаются пробелы , поэтому, вероятно, заключите в кавычки $SUDO_USERпеременную. В противном случае хороший ответ - это то, что я лично использовал бы.
Сергей Колодяжный
@steeldriver это то, что я искал. Спасибо!!
Аноним
1
Вы можете перезапустить скрипт самостоятельно, sudo -uесли он обнаружит, что работает от имени пользователя root. ОП говорил о наличии нескольких команд в одном скрипте. Но будьте осторожны, чтобы избежать бесконечного цикла ошибок.
Питер Кордес
1
Там нет разделения слов внутри, [[...]]так что нет необходимости строго заключать в кавычки переменную внутри оператора if @Serg, и я догадываюсь, что -edэто опечатка-eq
Arronical
@ Arronical да, это была опечатка для -eq. Не знал [[, нет разделения слов. Спасибо. Лично я бы все же цитировал ради хороших сценариев
Сергей Колодяжный
9

Если ваш сценарий не предназначен для запуска как root, самый безопасный способ решить проблему - прервать выполнение сценария в самом начале:

if [ "$EUID" = 0 ]; then
   echo "This script must NOT be run as root" 
   exit 1
fi

При желании вы можете повторно выполнить ваш сценарий в качестве запасного пользователя (например sudo -u FALLBACK_USER "$0") вместо простой отмены.

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

Дмитрий Григорьев
источник
6

По умолчанию файлы, созданные с помощью root-доступа, имеют такие права:

-rw-r--r-- 1 root root 0 11 17 23:25 rootfile.txt

Здесь файл принадлежит пользователю root и корневой группе и доступен для чтения и записи для пользователя root, но доступен только для чтения другим пользователям.

Самый простой подход - просто chownвернуть файл первоначальному пользователю.

chown username:group_name dummy.txt

Вы можете использовать $SUDO_USERпеременную, которая доступна только при sudoвызове, например:

chown "$SUDO_USER":"$SUDO_USER" dummy.txt

Если вы запускаете скрипт как обычный пользователь, эта chownчасть вообще не нужна, поэтому вы можете рассмотреть возможность использования оператора if или &&test для проверки случая, когда скрипт запускается от имени пользователя root, и сделать что-то вроде этого:

#!/bin/bash
touch dummy.txt
[ $UID -eq 0 ] && chown "$SUDO_USER":"$SUDO_USER" dummy.txt

Выше рекомендуемый подход. Есть и другие, например, использование chmodдля изменения прав на чтение-запись-выполнение для пользователей и групп, но это не рекомендуется.

Сергей Колодяжный
источник
Спасибо за ответ. Но в QI только что объяснил простой сценарий, в реальном случае оригинальный сценарий будет создавать много файлов. В Linux мы не можем просто игнорировать sudo?
Аноним
1
@ Аноним, если вы выполняете весь сценарий с помощью sudo, тогда нет - вы не можете игнорировать его. Вы можете либо запустить скрипт как обычный пользователь (чего я не понимаю, почему вы этого не делаете, поскольку вы просто создаете файл для своего пользователя здесь), либо изменить владельца файла, как я показываю в своем ответе.
Сергей Колодяжный
Это наиболее правильное решение, и его не должно быть так сложно масштабировать.
птенцы