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

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

#!/bin/bash

touch dummy.txt

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

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

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

1
задан 18 November 2016 в 13:17

2 ответа

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

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

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

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

10
ответ дан 23 May 2018 в 04:06

По умолчанию файлы, созданные с помощью 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 для изменения разрешений на чтение и запись для пользователей и группы, но это не рекомендуется.

6
ответ дан 23 May 2018 в 04:06
  • 1
    Спасибо за ваш ответ. Но в Q я просто объяснил простой сценарий, в реальном случае оригинальный скрипт будет создавать много файлов. В linux мы не можем просто игнорировать sudo? – Anonymous 18 November 2016 в 10:54
  • 2
    @Anonymous, если вы выполняете весь скрипт с помощью sudo, тогда нет - вы не можете его игнорировать. Ваш вариант запускается как обычный пользователь (который я не понимаю, почему вы этого не делаете, поскольку вы просто создаете файл для своего пользователя здесь) или измените права собственности на файл, как я покажу в своем ответе. – Sergiy Kolodyazhnyy 18 November 2016 в 11:05
  • 3
    Это самое правильное решение, и его не должно быть трудно масштабировать. – chicks 18 November 2016 в 20:40

Другие вопросы по тегам:

Похожие вопросы: