5

以前の質問で、 パスワード認証された ssh セッションを複数のサーバーで開始して、単一のコマンドを実行する方法を見つけました。次に、「sudo」コマンドを実行できるようにする必要があります。問題は、net-ssh-multi が、sudo を実行する必要がある疑似端末 (pty) を割り当てないため、次のエラーが発生することです。

[127.0.0.1 : stderr] sudo: 申し訳ありませんが、sudo を実行するには tty が必要です

ドキュメントによると、チャネル オブジェクトへのメソッド呼び出しで疑似端末を割り当てることができますが、次のコードは機能しません。上記の「no tty」エラーが生成されます。

require 'net/ssh'
require 'net/ssh/multi'

Net::SSH::Multi.start do |session|


  # define the servers we want to use
  my_ticket.servers.each do |session_server|
    session.use session_server , :user =>  user_name ,  \
                              :password => user_pass
  end


 # execute commands on all servers
  session.exec 'sudo ls /root' do |channel, stream, data|
   if data =~ /^\[sudo\] password for user:/
     channel.request_pty # <- problem must be here.
     channel.send_data user_pass
   end

  end

 # run the aggregated event loop
 session.loop
end

$ ruby​​ --バージョン

ruby 1.8.7 (2008-08-11 パッチレベル 72) [i386-cygwin]

4

3 に答える 3

8

次のようなことを試してみてください:

  channel.request_pty do |c, success|
    if success
      command = "sudo YOUR_COMMAND"
      c.exec(command) do |c, success|
        # Some processing
      end
    end
  end

この場合、「sudo」が内部にあります。

于 2011-05-31T22:35:29.377 に答える
3

コマンドを実行する前に、pty を要求する必要があります。

session.open_channel do |ch|
  ch.request_pty
  ch.exec "sudo ls /root"
end

また、/etc/sudoers から tty 要求を削除することもできます。それを行うには、実行visudoしてコメントしますDefaults requiretty

于 2011-05-31T22:34:09.597 に答える
1

@Christian とこの素晴らしい Pastieのおかげで、これは私がやったことです:

Net::SSH::Multi.start do |session|

# define the servers we want to use
my_ticket.servers.each do |session_server|
  session.use session_server , :user =>  my_ticket.user_name ,  \
  :password => my_ticket.user_pass
end



session.open_channel do |channel|
channel.request_pty do |c, success|
  raise "could not request pty" unless success
  channel.exec   "sudo YOUR_COMMAND"
  channel.on_data do |c_, data|
  if data = /\[sudo\]/
  channel.send_data(@password + "\n")
  end  
   puts data

    end
   end
  end

# run the aggregated event loop
  session.loop
end
于 2011-06-01T22:00:46.663 に答える