2012-12-04 30 views
6

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

私の現在のコードは、send_data "#{password}\n"の後であっても、sudo suコマンドでハングアップします。

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

助けていただけたら幸いです!


+0

あなたは 'sudo'コマンドの後にそのようなチェーンのコマンドではないことを認識していますか?最後の 'pwd; whoamiはsudoコマンドシェルが復帰するまで実行されません。あなたはこれを考慮に入れましたか? – Casper

答えて

3
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 

sudoサブシェルにコマンドを渡す-cオプションをサポートしています。

-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'のようなものを使用して、あなたはコマンドlssomeuserとしてdateを実行します:ここではあなたに役に立つかもしれないsudoフラグの一部です。そのホスト上のコマンドラインで試してみて、あなたができることを感じてから、あなたのSSHセッションにそれを適用してください。

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

また、単にコーディングのヒントとして、あなたは減らすことができます。

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

をする:

if (data[/\[sudo\]|Password/i]) 
+0

返信ありがとう、私はTin Manが推奨するように-cオプションを含むようにコードの行を修正しました。ありがとう。
channel.exec "pwd; whoami; sudo -u#{su_user} sh -c 'whoami; cd/tmp; pwd; ls'" –

+0

これはsudo su someuserの下で-c 'コマンド'よくそれは素晴らしいヒントでした。 – wallerjake

関連する問題