1

Я написал скрипт, который поможет очистить мои загрузки и аниме, но он не будет работать без рута.

Поэтому я попытался добавить его в /etc /sudoers (отредактировано с использованием рекомендаций techraf):

# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification


# Cmnd alias specification
Cmnd_Alias FILEPERM_CMDS = /bin/chown, /bin/chmod

# User privilege specification
root    ALL=(ALL:ALL) ALL
myUsernane ALL = NOPASSWD: /media/96e60511-62ca-48ba-bccc-9b365bfcc4e5/Programs/down.sh
myUsernane ALL = NOPASSWD: /media/96e60511-62ca-48ba-bccc-9b365bfcc4e5/Programs/rehamer.sh
myUsernane ALL=(ALL) NOPASSWD: /bin/chown
myUsernane ALL=(ALL) NOPASSWD: /bin/chmod
myUsernane ALL=(ALL) NOPASSWD: FILEPERM_CMDS

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d 

Но это не работает ...

Вот что внутри скрипта:

sudo chown -cR myUsername:users $downloads $anime >>"$default"logs/own.log 2>&1
echo owned
sudo chmod -cR 664 $anime >>"$default"logs/mod.log 2>&1
sudo chmod -cR 765 $downloads >>"$default"logs/mod.log 2>&1
sudo find $downloads $anime -type d -exec chmod a+x {} \; >>"$default"logs/mod.log 2>&1
echo moded
rm -vrf $downloads*.ignore >>"$default"logs/rm.log 2>&1
echo removed ignored files

Если я оставляю sudo в скрипте, он запрашивает мой пароль один раз и работает. Если я удаляю sudo из своего скрипта, он запускается без продвижения пароля, но я все равно получаю ошибки Permissions denied . Как вы можете это исправить?

2 ответа2

2

Добавляя следующее в sudoers:

myUsername ALL=(ALL) NOPASSWD: /path/to/down.sh

Вы разрешили myUsername запускать скрипт /path/to/down.sh с повышенными привилегиями. Это означает, что вы можете выполнить следующую команду:

sudo /path/to/down.sh

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

Это один из возможных способов.


Другой способ...

Вы не разрешили myUsername запускать chown или chmod в sudoers . Если вы хотите запускать скрипт от имени обычного пользователя и разрешать запуск только определенных команд от имени пользователя root , вы должны указать все из них в sudoers например:

myUsername ALL=(ALL) NOPASSWD: /usr/sbin/chown

ваш путь к двоичным файлам может быть другим

или укажите псевдонимы команд:

Cmnd_Alias FILEPERM_CMDS = /usr/sbin/chown, /usr/sbin/chmod
myUsername ALL=(ALL) NOPASSWD: FILEPERM_CMDS

Таким образом, вы можете использовать свой скрипт как есть.


Наконец, вы указали свои разрешения в разделе # User alias specification . Это только хороший совет, но это не то, о чем этот раздел. Лучше добавить его в # User privilege specification .

Посмотрите примеры sudoers для некоторых распространенных сценариев.

0

Одна из возможностей - иметь скрипт sudo. Добавьте это в /etc /sudoers:

myUsername ALL=(ALL) NOPASSWD: /path/to/down.sh

Затем добавьте это в начале скрипта:

#!/bin/bash

# If not already running as root, rerun via sudo
if [ $(id -u) -ne 0 ]; then
    exec sudo "$BASH_SOURCE" "$@"
    exit $? # in case something fails...
fi

Если путь к файлу совпадает с записью в /etc /sudoers, он должен иметь возможность прозрачно перезапускать себя как root (так что вы можете не указывать sudo в оставшейся части скрипта). Если по какой-либо причине он не совпадает, вы получите запрос пароля sudo .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .