0

我有一些简单的代码创建一个会话对象(使用会话 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密码提示只出现一次?

4

1 回答 1

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"
于 2014-03-10T11:47:23.827 回答