выполнить команду sudo su в грабли - PullRequest
4 голосов
/ 25 ноября 2011

Я занимаюсь разработкой приложения Rails v2.3.и использование MySQL v5.1 на Ubuntu машине.

У меня есть задача rake , чтобы stop и start mysqlбаза данных выглядит следующим образом:

namespace :db do
  task :some_db_task => :environment do
       ...

       exec 'sudo /etc/init.d/mysql stop'
       ...
       exec 'sudo /etc/init.d/mysql start' 
  end
end

Как вы видите выше в коде, я использовал sudo, чтобы убедиться, что команда выполнена.Однако из-за этого sudo, когда я запускаю задачу rake , будет выдан запрос на ввод пароля root , хотя задача rake будет успешно выполнена.

Я хочу избежать ввода пароля, поэтому я подумал, что мог бы выполнить команду оболочки, чтобы сначала перейти к пользователю root, а затем остановить / запустить MySQL, поэтому я изменил свой код следующим образом:

namespace :db do
  task :some_db_task => :environment do
       ...

       exec 'sudo su'
       exec '/etc/init.d/mysql stop'
       ...
       exec '/etc/init.d/mysql start' 
  end
end

Смотри, я добавил sudo su команду для запуска в первую очередь.Теперь я снова запускаю задачу rake, , но, что удивительно, задача rake запускается до exec 'sudo su' , затем она останавливается , остальной код даже не запускается.Зачем?Как от него избавиться?

(Как правило, я не хочу вводить пароль root во время выполнения задачи rake для запуска и остановки MySQL)

Ответы [ 3 ]

4 голосов
/ 25 ноября 2011

У вас есть несколько проблем.

Во-первых, метод Kernel # exec не вернется.См. Описание API:

Заменяет текущий процесс, выполнив данную внешнюю команду.

Во-вторых, действительно странно выполнять sudo из Ruby.Не могли бы вы просто выполнить sudo rake db:some_db_task?

ОБНОВЛЕНО

В-третьих, Kernel#exec не вернется, но Kernel#system будет.Если вы действительно хотите sudo в своем скрипте rake, вам нужно использовать Kernel#system и выполнять sudo в каждой команде.Пример:

   system 'sudo /etc/init.d/mysql stop'
   system 'sudo /etc/init.d/mysql start'

system 'sudo su' не работает.Он запустит оболочку с пользователем root, и когда вы покинете оболочку, процесс Ruby не получит разрешения root.

1 голос
/ 25 ноября 2011

Я бы рекомендовал вместо этого создавать псевдонимы оболочки для двух команд. Задачи Rake в Rails на самом деле не предназначались для выполнения системных задач.

Добавьте эти строки в ваш .bashrc, чтобы быстрее запускать и останавливать.

alias mysql_start = 'sudo /etc/init.d/mysql start'
alias mysql_stop = 'sudo /etc/init.d/mysql stop'

Если вы хотите сделать это как тип развертывания, capistrano лучше подходит для работы.

0 голосов
/ 25 ноября 2011

Я думаю, вы должны использовать sudo для rake, а не для пользовательской команды (т.е. sudo rake db: some_db_task)?или попробуйте сначала вызвать exec 'sudo su', другой исполняемый файл без 'sudo', но я думаю, что rake может запускать exec каждый раз для нового сеанса, и команда sudo su была закрыта при следующем exec.

Некоторые ссылки на эту темузадача http://www.ruby -forum.com / topic / 69967

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...