Использовать 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".
Принцип примера - помочь пониманию, а не быть оправданием для упрощения ответа общей проблемы.
Ответы
Ответ 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
)