Ruby Session始终生成新会话(sudo)

时间:2013-02-04 15:28:36

标签: ruby shell sudo

我有一些简单的代码可以创建一个Session对象(使用session gem)来运行一些shell命令。我在同一个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 密码提示只出现一次?

1 个答案:

答案 0 :(得分:0)

不是为会话必须以root身份运行的每个命令发出“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"

如果你的脚本必须做一些事情,root和一些用户,那么保持两个会话,其中只有一个是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"