3

所以,我一直在研究一个 Ruby 脚本,它在我上学的时候会阻止 reddit(有用的东西)。这是代码:

require 'fileutils'

puts "-----------------------------------"
puts "Welcome to the hosts file modifier!"
puts "-----------------------------------"
puts "Option A: Use modified hosts"
puts "Option B: Use original hosts"
puts "Option C: Do nothing"
puts "Please enter your choice: "
input = gets.chomp.downcase

t = Time.now
# Time.now is used is conjunction with function 'original', in option 'b'

def modified
  # This function copies the modified (redditblocking) hosts file from Documents to /etc
  puts "Moving original hosts file out of /etc"
  FileUtils.mv('/etc/hosts', '/Users/(usernameobscured)/Documents/OriginalHosts/hosts')
  puts "Done. Now copying modified hosts to /etc"
  FileUtils.cp('/Users/(usernameobscured)/Documents/ModifiedHosts/hosts', '/etc/hosts')
  puts "Done"
end

def original
# This function deletes the modified hosts file from /etc (since we have a copy in Documents)
# and then moves the original hosts file back to /etc
  puts "Deleting modified hosts file from /etc"
  FileUtils.rm_rf('etc/hosts')
  puts "Done. Now copying original hosts to /etc"
  FileUtils.mv('/Users/(usernameobscured)/Documents/OriginalHosts/hosts', '/etc/hosts')
  puts "Done"
end

def nothing
  # This does... nothing. Literally.
  puts "Doing nothing"
end

if input == 'a'
  modified
end

if input == 'b'
  # Here's when using Time.now becomes helpful: if the hour of the day is less than 5PM,
  # then the original hosts file can't be moved back (don't wanna be on reddit during school hours!)
  if t.hour > 17
    original
  elsif t.hour < 17
    puts "Too early to use original hosts file. Come back at 5PM"
  end
end

if input == 'c'
  # Nothing...
  nothing
end

如您所见,它将修改后的主机文件从我的 Documents 文件夹移动到 /etc。不过,根据 OS X/Unix 安全措施,我遇到的问题是我必须通过 sudo 运行脚本或以 root 身份登录。这是一个小麻烦,但是,我相信它可以在代码中修复。如何通过我的 ruby​​ 脚本获得超级用户权限,或临时写入 /etc 权限,以便我可以在没有 sudo/root 的情况下简单地运行脚本?

4

2 回答 2

0

根据 Unix 安全模型,如果没有某种外部干预(setuid 设置为可执行文件,以 root 用户身份运行),就不可能获得 root 访问权限。否则我们会有一个巨大的安全漏洞。

我不清楚您使用或反对设置脚本 setuid 到底是什么问题sudorvmsudo可以配置sudo为不需要密码来定义狭义的命令集)。

我只是建议使您所属的组可以写入各种版本的主机文件组。

于 2013-10-30T03:39:26.517 回答
-1

根据这个网站:http ://ruby.about.com/od/rubyversionmanager/qt/Rvm-And-Sudo.htm

rvmsudo 您可以使用命令开始执行脚本。在您的终端窗口或 shell 脚本中:

rvmsudo ruby blockreddit.rb
于 2013-07-28T01:51:19.177 回答