【问题标题】:Ruby Session Always Spawns New Session (sudo)Ruby 会话总是产生新会话 (sudo)
【发布时间】:2013-02-04 15:28:35
【问题描述】:

我有一些创建 Session 对象的简单代码(使用 session gem) 运行一些 shell 命令。我在同一个 BEGIN 块中多次使用 sudo,并且在每个命令上都会提示我输入 sudo 密码。我相信只应在创建 Session 后第一次询问,然后重用会话以避免这种情况。

#!/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密码提示只出现一次?

【问题讨论】:

  • 对不起,如果我没有完全理解问题,但是以超级用户身份调用 整个脚本 怎么样,这样就不需要 sudos 在里面了?我的意思是sudo ./your_file.rb 而不是./your_file.rb
  • +1 @NIA,首选使用sudo调用脚本。该脚本可以检查以查看它正在运行的有效用户和实际用户,如果它没有正确的权限,则会中止并报错。
  • 好吧,我从另一个程序员那里接手了一个项目,他警告我不应该这样调用整个脚本,因为他遇到了使文件系统可用于 Web 服务器的问题。我不知道更多,但我想我需要尝试一下,看看会发生什么。谢谢。

标签: ruby shell sudo


【解决方案1】:

不要为 session 必须以 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 2023-04-03
    • 1970-01-01
    • 2020-09-24
    • 2014-12-29
    • 1970-01-01
    • 2017-03-27
    相关资源
    最近更新 更多