Ігноруйте судо в сценарії bash


9

У мене невеликий сценарій bash:

#!/bin/bash

touch dummy.txt

Якщо я sudoвиконаю цей скрипт, тоді він створить, dummy.txtякий буде захищений коренем .

Що я хочу зробити:

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


4
Що б ви не мали на увазі під "захищеним коренем", ви можете використовувати chownта chmodу своєму скрипті, щоб встановити право власності та дозволи за бажанням.
fkraiem

1
Незрозуміло, що ви маєте на увазі під "захищеним коренем". Ви маєте на увазі, що лише користувач root може читати / записувати (наприклад, права доступу до файлів встановлені приблизно як 700), або що користувач root є власником файлу?

1
@DoritoStyle вибачте за плутанину. Під захистом корінь , я мав в виду суперкористувача є власником файлу.
Анонімний

Відповіді:


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

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 acound, мають такі дозволи:

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

Тут файл належить користувачу root та кореневій групі, він читається та записується коренем, але читається лише іншими.

Найпростішим підходом буде лише chownповернення файлу до початкового користувача.

chown username:group_name dummy.txt

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

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

Якщо ви запускаєте скрипт як звичайний користувач, chownчастина взагалі не потрібна, тому ви, можливо, захочете скористатися if-оператором або &&тестом для перевірки на випадок, коли сценарій запускається як root, і зробити щось у цьому рядку:

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

Сказане вище - рекомендований підхід. Є й інші, як-от використання chmodдля зміни дозволів для читання-запису-виконання для користувачів та груп, але це не рекомендується.


Дякуємо за Ваш відповідь. Але в QI щойно пояснили простий сценарій, в реальному випадку оригінальним сценарієм буде створення багатьох файлів. У Linux не можемо просто проігнорувати sudo?
Анонім

1
@Anonymous, якщо ви виконуєте весь сценарій за допомогою sudo, то ні - ви не можете його ігнорувати. Ваша опція - або запустити скрипт як звичайний користувач (чого я не розумію, чому ви цього не робите, оскільки ви просто створюєте файл для свого користувача тут) або змінити право власності на файл, як я показую у своїй відповіді.
Сергій Колодяжний

Це найбільш правильне рішення, і це не повинно бути таким важким для масштабування.
пташенята
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.