Net::SSH sudo command hangs after entering password

前端 未结 6 1504
囚心锁ツ
囚心锁ツ 2020-12-09 13:53

I\'ve been trying to write a small library using Thor to help assist me in quick creating new projects and sites. I wrote this small method:

def ssh(cmd)
           


        
6条回答
  •  悲哀的现实
    2020-12-09 14:17

    I hope this will help someone searching. I also needed to sudo during deployment (restarting thin instances)

    # deploy.rake
    require 'net/ssh'
    
    # INITIALIZE CONSTANTS HERE
    HOST = 'yourwebsite.com'
    USER = 'admin'
    PASSWORD = 'your server password' # or use ENV variables?
    # etc.
    
    namespace :deploy do 
      namespace :staging do  
        task :restart do
          commands = [
            "cd #{PATH_TO_STAGING_APP} && git checkout master",
            "git reset --hard HEAD",
            "git pull origin master",
            "bundle install --without test development",
            "sudo thin restart -C /etc/thin/#{STAGING_APP}.yml"
          ]
    
          Net::SSH.start(HOST, USER, :password => PASSWORD) do |ssh|
            ssh.open_channel do |channel|
              channel.request_pty do |ch, success|
                if success
                  puts "Successfully obtained pty"
                else
                  puts "Could not obtain pty"
                end
              end
    
              channel.exec(commands.join(';')) do |ch, success|
                abort "Could not execute commands!" unless success
    
                channel.on_data do |ch, data|
                  puts "#{data}"
                  channel.send_data "#{PASSWORD}\n" if data =~ /password/
                end
    
                channel.on_extended_data do |ch, type, data|
                  puts "stderr: #{data}"
                end
    
                channel.on_close do |ch|
                  puts "Channel is closing!"
                end
              end
            end
            ssh.loop
          end
        end
      end
    end
    

    Note that one channel can only execute one command. Hence I chained the commands together with commands.join(';')

    Reference: Net::SSH::Connection::Channel

提交回复
热议问题