Подтвердить что ты не робот

Использовать sudo без пароля INSIDE a script

По какой-то причине мне нужно, как пользователь, запускать без sudo script script.sh, которому нужны права root для работы.
Я видел единственное решение, которое нужно было ввести sudo INSIDE script.sh. Возьмем пример:

script.sh :

#!/bin/sh
sudo apt-get update

Конечно, если я выполню этот script, я получаю приглашение с запросом пароля. Затем я добавил в файл sudoers (в конце, чтобы переопределить все остальное):

user ALL=(ALL:ALL) NOPASSWD:/path/to/script.sh

Кстати, я также пробовал строку:

user ALL=(ALL) NOPASSWD:/path/to/script.sh

(я думаю, что я не совсем понял разницу)

Но это не решает мою проблему, если я не использую sudo для выполнения этого script:

# ./script.sh
[sudo] password for user: 
# sudo ./script.sh
Starts updating...

Хорошо, поэтому я говорю себе: "Хорошо, это означает, что если у меня есть файл, который упоминается в sudoers, как и я, он будет работать без подсказки, только если я позвоню ему с sudo, чего я не хочу". < ш > Итак, хорошо, я создаю еще один script script2.sh следующим образом:

script2.sh

#!/bin/sh
sudo /path/to/script.sh

На самом деле это работает. Но я действительно не удовлетворен этим решением, особенно тем фактом, что я должен использовать 2 скрипта для каждой команды.

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

Не стесняйтесь делиться своими идеями!


ИЗМЕНИТЬ 1:

Я хочу настаивать на том, что это "apt-get update" было всего лишь примером FAR из того, что на самом деле есть мой script. У моего script есть много команд (с некоторыми конфигурационными файлами cd для root-access-only), и решение не может быть "Ну, просто сделайте это прямо с apt-get".

Принцип примера - помочь пониманию, а не быть оправданием для упрощения ответа общей проблемы.

4b9b3361

Ответ 1

Если вы хотите запустить sudo /usr/bin/apt-get update без пароля, вам потребуется запись sudoers:

user ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update

Для большей проблемы script в целом существует два возможных подхода:

Подход 1

Для каждой команды в script, которая нуждается в sudo, создайте строку в sudoers специально для этой команды. В этом случае script можно вызвать нормально:

./script1.sh

Подход 2

Поместите строку в sudoers для script в целом. Когда это будет сделано, отдельным командам не потребуется sudo. Тем не менее, sudo необходимо использовать для запуска script, как в:

sudo ./script.sh

Ответ 2

Если ваш пароль не является чем-то, над чем вы хотите быть очень безопасным (возможно, какой-то сервер тестирования в компании и т.д.), вы можете поднять в sudo в script через эхо, например:

echo YourPasswordHere | sudo -S Command

В подсказке по-прежнему печатается текст "ввести пароль" для вывода. Поэтому не ожидайте, что это будет аккуратно.

(Заметьте, нашел это из другого ресурса иначе. Не могу вспомнить, где.)

Ответ 3

Как вы отметили, файл, который должен отображаться в конфигурации sudoers, - это тот, который запускается sudo, а не тот, который запускает sudo.

Говоря, что мы часто делаем, есть что-то вроде

user ALL=(ALL:ALL) NOPASSWD:/path/to/script.sh

в конфигурации sudo, где script.sh имеет все команды, которые должен выполнить script.

Затем мы определяем либо функцию Bash, либо псевдоним, так что script.sh на самом деле

sudo /path/to/script.sh

Единственная проблема заключается в том, что некоторые команды не должны запускаться как root, вам нужно вставить несколько команд su - user -c "command" в script.

Ответ 4

Из моего блога: IDMRockstar.com:

Кикер - это то, что иногда мне нужно запускать команды как root. Вот быстрый и грязный способ, которым я выполняю это без разглашения паролей:

#! /bin/bash
read -s -p "Enter Password for sudo: " sudoPW
echo $sudoPW | sudo -S yum update

Таким образом пользователю будет предложено ввести пароль (и скрыт от терминала), а затем передать в команды по мере необходимости, поэтому я не запускаю весь script как root =)

Если у вас есть лучший способ, я бы хотел его услышать! Я не эксперт по сценариям оболочки любыми способами.

Ура!

: Adam

Ответ 5

Я предлагаю вам посмотреть переменные среды sudo - в частности, вы можете использовать (и проверять) $SUDO_USER. Вызовите ваш script с помощью sudo (1 запись в sudoers), затем сделайте пользовательский материал как SUDO_USER и корневой файл как root.

Ответ 6

Просто, чтобы выполнять команды как root, вы должны использовать su (даже sudo использует su) Пока вы выполняете только sudo./script2.sh:   sudo su   "#" // команду от имени root здесь   "#" Выход // команды как использовать здесь вы можете сделать его оболочкой с именем sudo, но нет другого лучшего способа, я думаю, однако это дело со скриптами inti, rc android..etc должен быть аккуратным;)

однако это требует, чтобы вы поставили NOPASSWD: su, который действительно надежно защищен

В любом случае здесь просто отсутствует принцип полномочий POISX, который фильтрует, поэтому не разрешайте что-либо для всех пользователей или наоборот просто назовите sudo столько, сколько хотите, без дополнительной вещи:

chown root script.sh
chmod 0755 script.sh
chgrp sudo script.sh

"сделать root владельцем .sh" "сделайте это только для чтения и exec для других" "и положил его в группу судо" конечно, под sudo что он

Ответ 7

В новом файле /etc/sudoers.d/apt-get поместите одну строку:

user ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update

Здесь требуется полный путь к исполняемому файлу.

Затем используйте следующее в script:

sudo apt-get update

Здесь полное имя не требуется. Sudo использует переменную среды PATH для исполняемого разрешения.

При изменении и проверке конфигурации sudoers не забудьте открыть еще один корневой сеанс для восстановления ошибок.

Ответ 8

Как уже упоминалось Basilevs, вам нужно добавить своего пользователя в файл sudoers, чтобы избежать того, чтобы команды sudo в script застряли в ожидании пароля.

На Ubuntu 16 существует более простой способ: просто добавьте пользователя в sudo group, например:

sudo usermod -aG sudo *username*

С этого момента он должен работать как шарм.

Примечание:

Это работает при условии, что следующая строка находится в файле /etc/sudoers:

%sudo ALL=NOPASSWD: ALL

(такая строка предоставляет привилегии sudo без пароля на уровне группы, в данном случае группе sudo)

(если этой строки нет и вы хотите добавить ее, убедитесь, что вы используете visudo)