0

いくつかのシェル コマンドを実行するために、Session オブジェクトを ( session gem を使用して)作成する単純なコードがいくつかあります。同じ BEGIN ブロック内で sudo を複数回使用していますが、すべてのコマンドで sudo パスワードの入力を求められます。セッションが作成された後に初めて要求され、セッションを再利用してこれを回避する必要があると思います。

#!/usr/bin/env ruby

require 'rubygems'
require 'date'
require 'mysql2'
require 'session'


begin
  sh = Session::Shell.new
  puts "Starting file system copy."
  $WWW_ROOT = "~/Downloads/"
  $MASTER='/git/library/dev/.git'
  $DOMAIN = ARGV[1].to_s
  $DOC_ROOT = [$WWW_ROOT, $DOMAIN].join

  stdout, stderr = sh.execute ("cd #{$WWW_ROOT} && ls && sudo git clone -q #{$MASTER} #{$DOMAIN}")
  if stderr.length > 0
    puts stderr
    puts 'Error on git cloning.'
  else
    puts stdout, stderr
puts "Git cloning finished."    
  end

  stdout, stderr = sh.execute ("cd #{$DOC_ROOT} && sudo git checkout lib_dev")
  if stderr.length > 0
    puts stderr
    puts 'Error on Git lib_dev checkout.'
  else
    puts stdout, stderr
puts "Git lib_dev checkout finished."   
  end

end

sudoパスワードプロンプトを一度だけ発生させるにはどうすればよいですか?

4

1 に答える 1

0

セッションがルートとして実行する必要があるすべてのコマンドに対して「sudo」を発行する代わりに、セッションを一度だけrootに切り替えます。

sh.execute "sudo su"

セッションのそのインスタンスを維持するようにしてください。セッションで実行するコマンドの「sudo」接頭辞はそのままにしておきます。

sh.execute "cd #{$WWW_ROOT} && ls && git clone -q #{$MASTER} #{$DOMAIN}"
...
sh.execute "cd #{$DOC_ROOT} && git checkout lib_dev"

スクリプトがいくつかのことを実行し、いくつかをユーザーとして実行する必要がある場合は、約2 つのセッションを維持し、そのうちの 1 つだけが root です。

user_sh = Session.new
root_sh = Session.new
root_sh.execute "sudo su"
user_sh.execute "some_ordinary_command"
root_sh.execute "some_command_needing_root_privileges"
于 2014-03-10T11:47:23.827 に答える