我有一些简单的代码可以创建一个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 密码提示只出现一次?
答案 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"