Используйте sudo без пароля ВНУТРИ скрипта

Обычный способ, предложенный assert (3) справочной страницей и привычками (с в C или в C ++), заключается в определении NDEBUG в командной строке (например, для компиляции с gcc -Wall -DNDEBUG) для компиляции без отладки. В Makefile вы можете CPPFLAGS += -DNDEBUG в режиме деблокирования (и скомпилировать с g++ -Wall -g в режиме отладки).

Моя собственная привычка может иметь что-то вроде

#ifndef NDEBUG
#define dbgprintf(Fmt,...) do{fprintf(stderr,"%s:%d:" Fmt "\n", \
                               __FILE__, __LINE__, \ 
                              ##__VA_ARGS__);}while(0)
#else
#define dbgprintf(Fmt,...) do{}while(0)
#endif

в общем файле заголовка и использовать dbgprintf("i=%d", i) в другом месте кода. Обратите внимание, что я использую константную привязку строки в аргументе макроса Fmt, добавляя к ней постоянную новую строку, и что мой вывод отладки содержит имя исходного файла и номер строки (вы также можете использовать __func__, если хотите). В чистом C ++-коде я мог бы использовать

#ifndef NDEBUG
#define DBGOUT(Out) do{std::out << __FILE__ << ":" << __LINE__ \
                       << " " << Out << std::endl;}while(0)
#else
#define DBGOUT(Out) do{}while(0)
#endif

и использовать DBGOUT("i=" << i) с преимуществом использования определенных определений operator << для моих типов.

29
задан Nilexys 9 August 2014 в 08:11
поделиться

7 ответов

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

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

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

Подход 1

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

./script1.sh

Подход 2

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

sudo ./script.sh
16
ответ дан John1024 9 August 2014 в 08:11
поделиться

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

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

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

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

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

Ура!

: Адам

8
ответ дан Adam 9 August 2014 в 08:11
поделиться

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

Как говорится, то, что мы часто делаем, имеет что-то вроде

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

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

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

sudo /path/to/script.sh

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

5
ответ дан damienfrancois 9 August 2014 в 08:11
поделиться

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

2
ответ дан bryn 9 August 2014 в 08:11
поделиться
  • 1
    Когда Вам добавляющий Вас всегда нужен " extra" (или если я говорю цель), контейнер - быть телом или некоторым другим тегом. Если Вы don' t хотят это, это - циклы для Вас – Michal 15 February 2012 в 18:51
  • 2
    Когда Вам добавляющий Вас всегда нужен " extra" (или если я говорю цель), контейнер - быть телом или некоторым другим тегом. Если Вы don' t хотят это, это - циклы для Вас – Michal 15 February 2012 в 18:51
  • 3
    Когда Вам добавляющий Вас всегда нужен " extra" (или если я говорю цель), контейнер - быть телом или некоторым другим тегом. Если Вы don' t хотят это, это - циклы для Вас – Michal 15 February 2012 в 18:51
  • 4
    Когда Вам добавляющий Вас всегда нужен " extra" (или если я говорю цель), контейнер - быть телом или некоторым другим тегом. Если Вы don' t хотят это, это - циклы для Вас – Michal 15 February 2012 в 18:51
  • 5
    Когда Вам добавляющий Вас всегда нужен " extra" (или если я говорю цель), контейнер - быть телом или некоторым другим тегом. Если Вы don' t хотят это, это - циклы для Вас – Michal 15 February 2012 в 18:51

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

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

sudo usermod -aG sudo *username*

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

Примечание:

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

%sudo ALL=NOPASSWD: ALL

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

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

-1
ответ дан Varus Septimus 9 August 2014 в 08:11
поделиться

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

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

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

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

«сделать владельца root .sh» «сделать его доступным только для чтения и выполнить для других» «и поместить его в группу sudo», конечно, под sudo вот и все

1
ответ дан Youssef 9 August 2014 в 08:11
поделиться

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

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

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

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

sudo apt-get update

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

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

1
ответ дан Basilevs 9 August 2014 в 08:11
поделиться