Могу ли я запретить ткани запрашивать у меня пароль sudo?

Я использую Fabric для запуска команд на удаленном сервере. Пользователь, с которым я подключаюсь на этом сервере, имеет некоторые привилегии sudo и не требует пароля для использования этих привилегий. Когда SSH'ing на сервере, я могу запустить sudo blah, и команда выполняется без запроса пароля. Когда я пытаюсь запустить ту же команду с помощью функции Fabric sudo, мне будет предложено ввести пароль. Это связано с тем, что при использовании sudo:

Fabric создает команду следующим образом:
sudo -S -p <sudo_prompt> /bin/bash -l -c "<command>"

Очевидно, что у моего пользователя нет разрешения на выполнение /bin/bash без пароля.

Я работал над проблемой, используя run("sudo blah") вместо sudo("blah"), но я задавался вопросом, есть ли лучшее решение. Есть ли способ обхода проблемы?

Ответ 1

Попробуйте передать shell=False в sudo. Этот способ /bin/ bash не будет добавлен в команду sudo. sudo('some_command', shell=False)

Из строки 503 fabric/operations.py:

if (not env.use_shell) or (not shell):
    real_command = "%s %s" % (sudo_prefix, _shell_escape(command))

блок else выглядит следующим образом:

                                             # V-- here where /bin/bash is added
real_command = '%s %s "%s"' % (sudo_prefix, env.shell,
    _shell_escape(cwd + command))

Ответ 2

Вы можете использовать:

fabric.api import env
# [...]
env.password = 'yourpassword'

Ответ 3

Это самый прямой ответ на ваш вопрос: У вас действительно нет проблемы; вы неправильно понимаете, как работают функции Fabric run() и sudo().

Ваш "обходной путь" НЕ является обходным решением, это 100% действительный ответ на проблему.

Вот простой набор правил: 1) Используйте "run()", когда вы не ожидаете подсказки. 2) используйте "sudo()", когда вы ожидаете подсказки. (это должно быть верно для всех или большинства команд, требующих подсказки, даже если исполняемый файл не является Bash или Sudo).

Этот же ответ применяется к людям, которые пытаются запускать команды под "sudo". Даже если sudoers имеет конфигурацию без пароля для текущего пользователя в какой-либо системе, если вы используете sudo() вместо run(), тогда вы будете вынуждать приглашение (если только код Fabric уже содержит пароль или ключ ENV).

Кстати, автор Fabric ответил на мой вопрос - очень похожий на ваш вопрос - в #IRC. Хороший парень, один из невоспетых героев с открытым исходным кодом для того, чтобы упорствовать в его работе Ткань и Парамико.

... В моей тестовой среде всегда есть одно имя пользователя, которое имеет полный доступ без пароля к sudo. Ввод sudo echo hello не подскажет. Кроме того, этот пользователь sudo настроен на "! Requiretty", поэтому все команды могут работать через SSH (например, переключение SSH между хостами). Это означает, что я могу просто использовать "run()" для выполнения "sudo something", но это просто другая команда, которая выполняется без подсказки. Что касается безопасности, то это некоторая задача заблокировать производственный узел, но не тестовый узел. (Если вы вынуждены проверять вещи и не можете автоматизировать, это огромная проблема).

Ответ 4

В файле /etc/sudoers добавьте

user ALL=NOPASSWD: some_command

где пользователь - ваш пользователь sudo, а some_command - команда, которую вы хотите запустить с помощью тканья, а затем на ткани script запустите sudo с помощью shell = False:

sudo('some_command', shell=False)

это работает для меня

Ответ 5

В вашем файле /etc/sudoers вы можете добавить

user ALL=NOPASSWD: /bin/bash

... где user - ваше имя пользователя Fabric.

Очевидно, вы можете сделать это, только если у вас есть root-доступ, поскольку /etc/sudoers доступен только для записи root.

Кроме того, очевидно, что это не очень безопасно, поскольку возможность выполнения /bin/bash оставляет вас в основном по существу, поэтому, если у вас нет доступа root, и вам нужно попросить sysadmin сделать это за вас, они вероятно, не будет.

Ответ 6

Linux noob здесь, но я нашел этот вопрос, пытаясь установить графит-ткань на ECI AMI. Ткань продолжает запрашивать пароль root.

Предполагаемый трюк состоял в том, чтобы передать файл ssh private key в файл.

fab -i key.pem graphite_install -H [email protected]

Ответ 8

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

Поддерживаемый способ достижения этого - использовать env.sudo_prefix, как описано этот github commit (от этот PR)

Мой пример использования:

env.sudo_prefix = 'sudo '