6

sudo su - #{su_user}Rubyの後に複数の net-ssh コマンドのチェーンを送信する方法を理解しようとしています。

私の現在のコードは以下にありsudo susend_data "#{password}\n".

一方、システム上では、 を手動で実行sudo su - admin2する場合、パスワードを入力する必要はありません。

どんな助けでも大歓迎です!


require 'rubygems'  
require 'net/ssh'
host = 'hostA'

user = 'admin'
password = 'hostA_pwd'
su_user = 'Admin2'

Net::SSH.start(host, user, :password => password) do |ssh|

     ssh.open_channel do |channel|  
       channel.request_pty do |c, success|
         raise "could not request pty" unless success

         channel.exec "pwd; whoami; sudo su - #{su_user} ; pwd ; whoami"
         channel.on_data do |c_, data|
           if data =~ /\[sudo\]/ || data =~ /Password/i
             channel.send_data "#{password}\n"
           else       
             result << data
           end
         end
         puts result
       end
     end
     ssh.loop
  end
4

1 に答える 1

3

sudo-cサブシェルにコマンドを渡すオプションをサポートします。sudoこれがあなたに役立つかもしれないフラグのいくつかです:

-c, --command=COMMAND
      pass a single COMMAND to the shell with -c

--session-command=COMMAND
      pass a single COMMAND to the shell with -c and do not create a new session

-m, --preserve-environment
      do not reset environment variables

-s, --shell=SHELL
      run SHELL if /etc/shells allows it

したがって、のようなものを使用して、コマンドをsudo su someuser -c 'ls;date'実行します。そのホストのコマンドラインで試してみて、何ができるかを感じてから、SSHセッションに適用してください。lsdatesomeuser

詳細については、を参照man sudoしてください。

また、コーディングのヒントと同じように、次のことを減らすことができます。

if data =~ /\[sudo\]/ || data =~ /Password/i

に:

if (data[/\[sudo\]|Password/i])
于 2012-12-04T14:58:54.677 に答える