除非已存在类似的行,否则将行添加到文件的最佳方法是什么?

时间:2017-04-20 20:04:54

标签: ruby

我正在使用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>

1 个答案:

答案 0 :(得分:1)

像这样设置already_spoofed:

already_spoofed = open('/etc/hosts').read =~ (/#{hostname}/) ? true : false

如下所示:如果already_spoofed包含/etc/hosts

,请将hostname设为true

match运算符=~返回nil(falsy)或字符串中第一个匹配模式的位置