У меня есть небольшой скрипт bash:
#!/bin/bash
touch dummy.txt
Если я запустил этот скрипт с sudo, он создаст dummy.txt, который будет защищен от root.
Что Я хочу сделать это:
Независимо от того, выполняется ли этот сценарий с помощью sudo или обычного пользователя, файл dummy.txt должен root protected быть защищен root.
Если ваш сценарий не предназначен для запуска как root, самым безопасным способом решения проблемы является прервать выполнение скрипта в самом начале:
if [ "$EUID" = 0 ]; then
echo "This script must NOT be run as root"
exit 1
fi
По желанию вы может повторно выполнить ваш сценарий в качестве резервного пользователя (например, sudo -u FALLBACK_USER "$0") вместо простого прерывания.
Попытка исправить причуды отдельных команд сделает ваш скрипт излишне сложным и трудным для отладки. Каждый раз, когда вы его изменяете, вам нужно будет выполнить все тестирование дважды (как обычный пользователь, затем как root) и исправить все связанные с root ошибки. Это не надежное решение, так сказать.
По умолчанию файлы, созданные с помощью root accound, имеют такие права:
-rw-r--r-- 1 root root 0 11月 17 23:25 rootfile.txt
Здесь файл принадлежит root-пользователю и корневой группе и доступен для чтения и записи root, но доступен только для чтения другими. [ ! d1]
Самый простой подход - это просто chown вернуть файл исходному пользователю.
chown username:group_name dummy.txt
Вы можете использовать переменную $SUDO_USER, доступную только при вызове sudo , так:
chown "$SUDO_USER":"$SUDO_USER" dummy.txt
Если вы используете скрипт как обычный пользователь, часть chown вообще не нужна, поэтому вам может потребоваться использовать if-statement или && test для проверки на случай, когда скрипт запущен как root, и выполните что-то в этом направлении:
#!/bin/bash
touch dummy.txt
[ $UID -eq 0 ] && chown "$SUDO_USER":"$SUDO_USER" dummy.txt
Вышеупомянутый подход рекомендуется. Существуют и другие, такие как chmod для изменения разрешений на чтение и запись для пользователей и группы, но это не рекомендуется.