كيف يمكنني منع متغيرات البيئة default_environment من تحديد عمل Sudo الخاص بـ Capistrano؟

StackOverflow https://stackoverflow.com/questions/2458513

سؤال

يقوم Deploy.rb بتعيين بعض متغيرات البيئة لاستخدام الياقوت المحلي للمستخدم العادي بدلاً من العرض على مستوى النظام.

set :default_environment, {
  :PATH => '/home/myapp/.rvm/bin:/home/myapp/.rvm/bin:/home/myapp/.rvm/rubies/ruby-1.9.1-p378/bin:/home/myapp/.rvm/gems/ruby-1.9.1-p378/bin:/home/myapp/.rvm/gems/ruby-1.9.1-p378%global/bin:/home/myapp/bin:/usr/bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/sbin:/bin:/usr/games',
  :RUBY_VERSION => 'ruby-1.9.1-p378',
  :GEM_HOME => '/home/myapp/.rvm/gems/ruby-1.9.1-p378',
  :GEM_PATH => '/home/myapp/.rvm/gems/ruby-1.9.1-p378:/home/myapp/.rvm/gems/ruby-1.9.1-p378%global'
}

بطبيعة الحال ، عندما تستخدم المهمة Sudo ، أتوقع استخدام Ruby على مستوى النظام بدلاً من ذلك. ولكن يبدو أن متغيرات البيئة يتم تعيينها على أي حال ، وهو أمر غير صالح للمستخدم الجذر ويعيد خطأ:

executing "sudo -p 'sudo password: ' /etc/init.d/god stop"
    servers: ["myapp.com"]
    [myapp.com] executing command
    command finished
failed: "env PATH=/home/myapp/.rvm/bin:/home/myapp/.rvm/bin:/home/myapp/.rvm/rubies/ruby-1.9.1-p378/bin:/home/myapp/.rvm/gems/ruby-1.9.1-p378/bin:/home/myapp/.rvm/gems/ruby-1.9.1-p378%global/bin:/home/myapp/bin:/usr/bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/sbin:/bin:/usr/games RUBY_VERSION=ruby-1.9.1-p378 GEM_HOME=/home/myapp/.rvm/gems/ruby-1.9.1-p378 GEM_PATH=/home/myapp/.rvm/gems/ruby-1.9.1-p378:/home/myapp/.rvm/gems/ruby-1.9.1-p378%global sh -c 'sudo -p '\\''sudo password: '\\'' /etc/init.d/god stop'" on myapp.com

لا يوجد فرق عما إذا كنت أستخدم Capistrano's سودو "استدعاء نظام" أو العادية قم بتشغيل "Sudo System Call".

كيف يمكنني تجنب ذلك؟

هل كانت مفيدة؟

المحلول

قد تكون إحدى الطرق السهلة هي أخذ هذا خارج النطاق ، نظرًا للطريقة التي يتم بها إعادة تدوير الاتصالات (ليست) في Capistrano ، لا تقتصر المتغيرات البيئية مثل هذه على مكالمة واحدة (كما يتوقع المرء!)

أقترح إجراء اتصال خارج النطاق باستخدام Vanilla Net :: SSH (http://net-ssh.rubyforge.org/ssh/v2/api/index.html) ، يمكن أن يكون هذا بسيطًا مثل:

Net::SSH.start('host', 'user', :password => "password") do |ssh| 
  ssh.exec!("my-task-here")
end

مجرد فكرة!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top