我正在使用ruby脚本来更新我的/ etc / hosts文件,以添加一个条目来欺骗某些主机名到IP地址。
该过程是脚本对主机名(由用户给出)进行挖掘,从dig输出中查找一些信息,对相关主机名进行另一次挖掘并在/ etc / hosts中使用该IP地址文件。
像这样运行脚本:
sudo ruby get_staging.rb www.bestbuy.com
导致在我的主机文件中为www.bestbuy.com添加一个条目。
这是工作脚本:
hostname = ARGV[0]
output = %x(dig #{hostname})
new_hostname = output[/CNAME\s(.*CDN.net)/,1]
new_hostname["CDN"] = "CDN-staging"
staging_dns = %x(dig #{new_hostname})
staging_ip = staging_dns[/(\d*\.\d*\.\d*\.\d*)/,1]
open('/etc/hosts', 'a') { |f|
f.puts "#{staging_ip} #{hostname}"
}
出于某种原因,当我修改它时看起来像这样:
hostname = ARGV[0]
already_spoofed = false
open('/etc/hosts') { |f| already_spoofed = true if f.grep(/#{Regexp.quote(hostname)}/) }
unless already_spoofed
output = %x(dig #{hostname})
new_hostname = output[/CNAME\s(.*CDN.net)/,1]
new_hostname["CDN"] = "CDN-staging"
staging_dns = %x(dig #{new_hostname})
staging_ip = staging_dns[/(\d*\.\d*\.\d*\.\d*)/,1]
open('/etc/hosts', 'a') { |f|
f.puts "#{staging_ip} #{hostname}"
}
end
它不再做任何事情,只是安静地失败。这样做的正确方法是什么?我似乎只能打开一次文件,并在第一次open()
电话中完成所有逻辑,但我不确定如何做到这一点,或者它是否是正确的继续进行方式。< / p>
答案 0 :(得分:1)
像这样设置already_spoofed:
already_spoofed = open('/etc/hosts').read =~ (/#{hostname}/) ? true : false
如下所示:如果already_spoofed
包含/etc/hosts
hostname
设为true
match运算符=~
返回nil
(falsy)或字符串中第一个匹配模式的位置