Найкращі практики використання судо в баш-скрипті


11

У мене є довгий і тривалий скрипт bash, де кілька команд потрібно запустити як root, тоді як більшість команд потрібно виконувати як звичайний користувач перед sudo, тому що це зіпсує право власності на файл і таке інше.

Я придумав деякі методи, але кожен з них має деякі проблеми

Спосіб 1: Використання sudo всередині файлу

#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"

Це виглядало б добре, від того, як написано код. sudoпишеться перед кількома твердженнями, які насправді потрібно запускати під корінь, але якщо час між кожним sudoвикликом занадто довгий, sudoзнову запитує пароль. Крім того, якщо перше виконання sudoне вдалося, наприклад, через недійсний пароль, решта сценарію все ще виконується.

Спосіб 2: використання sudo для виклику файлу та повернення до початкового користувача при необхідності

#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"

Це теж відстійно, бо мені потрібно додавати su username -cперед майже кожним рядком. Також можна знайти оригінальне ім'я користувача після sudo, можливо, але громіздкого.

Чи є кращий спосіб?

Редагувати: Я розміщував тут лише невеликі, безглузді сценарії, щоб показати, про що я говорю. У фактичному сценарії у мене є рядки, для яких потрібен sudo (запуск та зупинка послуг), деякі рядки, де неважливо, чи є sudo і досить багато рядків, які дійсно потрібно виконувати без sudo.


4
Це дуже рідко потрібно. У більшості випадків ви просто запускаєте сценарій, sudoякщо він повинен мати підвищені дозволи. Але немає сенсу переходити su username -cна запуск echo. Іншими словами, це звучить як [XY]. Чи можете ви відредагувати та пояснити, що насправді робить ваш сценарій, і чому ви вважаєте, що потрібно так часто перемикати користувачів?
тердон

1
@ElderGeek ви вставили неправильне посилання? Це навіть не здається пов'язаним. Ймовірно, це дублікат того, як я запускаю команду 'sudo' всередині сценарію? але сподіваюся, що ОП може пояснити трохи більше.
тердон

@terdon Здавалося б, так. Очищення.
Старійшина Гейк

Це лише приклад сценарію. Я не хотів вставляти сюди сценарій з лінією 200+. Я відредагую відповідь для отримання більш детальної інформації.
Даккарон

Ви розглядали варіант підтвердження, який описаний у man sudo? -v, --validate 'Оновіть кешовані дані користувача, при необхідності автентифікуючи користувача. Для додатка sudoers це час подовжує тайм-аут sudoers ще на 15 хвилин, але не виконує команду. Не всі політики безпеки підтримують кешовані дані ". (Якщо ви запускаєте його досить часто, автентифікація
судо

Відповіді:


5

Щодо способу 2, простіше використовувати функцію. Наприклад:

#!/bin/bash

func(){
    echo "Username: $USER"
    echo "    EUID: $EUID"
}

export -f func

func
su "$SUDO_USER" -c 'func'

$SUDO_USERце ім'я користувача sudoer. Ви також можете використовувати $(logname)його місце.

Працює на моїй машині:

$ sudo bash test.sh
[sudo] password for wja: 
Username: root
    EUID: 0
Username: wja
    EUID: 1000

2

Читаючи man sudoers, видно:

 PASSWD and NOPASSWD

   By default, sudo requires that a user authenticate him or herself
   before running a command.  This behavior can be modified via the
   NOPASSWD tag.  Like a Runas_Spec, the NOPASSWD tag sets a default for
   the commands that follow it in the Cmnd_Spec_List.  Conversely, the
   PASSWD tag can be used to reverse things.  For example:

   ray     rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm

   would allow the user ray to run /bin/kill, /bin/ls, and /usr/bin/lprm
   as root on the machine rushmore without authenticating himself. 

Таким чином, ви можете дозволити regularхосту machine1виконувати command1і command2як root, без автентифікації пароля за допомогою:

reguser machine1 root = NOPASSWD: /usr/local/command1, /usr/local/command2  

але прочитайте кожну інформацію man -k sudoдля деталей.


0

Можливо, це може допомогти:

chmod 775 tvojecript.sh

Тоді ви можете використовувати sudo всередині сценарію (без запиту пароля) І не можете використовувати sudo для інших команд всередині вашого сценарію.


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