在 ruby 脚本中调用命令
Calling a command inside a ruby script
有没有办法在 ruby 脚本中调用像 last
这样的命令?我可以使用 %x
在脚本中调用 ls
和 ls -l
之类的命令,但是对于最后一个命令提供的复杂且不断扩展的日志信息来说,这是否可以接受?
这是一个示例,用于检索用户名、IP、启动和持续时间:
%x(last -i).each_line do |line|
line.chomp! # Removes newline
break if line.empty? # last is done
# 3 possibilities to extract information :
user, *other_columns = line.split(' ') # 1. Use split
start = Time.parse(line[39,16]) # 2. Use known position of a column
ip = line[22,17].strip
if line =~/\((\d+):(\d+)\)/ # 3. Use a regex
duration = .to_i*60+.to_i
else
duration = nil
end
info={user: user, ip: ip, start: start, duration: duration}
#TODO: Check that user isn't "reboot"
puts info
end
# {:user=>"ricou", :ip=>"0.0.0.0", :start=>2016-11-01 21:29:00 +0100, :duration=>141}
# {:user=>"ricou", :ip=>"0.0.0.0", :start=>2016-11-01 15:21:00 +0100, :duration=>57}
您具体需要哪些信息?
有没有办法在 ruby 脚本中调用像 last
这样的命令?我可以使用 %x
在脚本中调用 ls
和 ls -l
之类的命令,但是对于最后一个命令提供的复杂且不断扩展的日志信息来说,这是否可以接受?
这是一个示例,用于检索用户名、IP、启动和持续时间:
%x(last -i).each_line do |line|
line.chomp! # Removes newline
break if line.empty? # last is done
# 3 possibilities to extract information :
user, *other_columns = line.split(' ') # 1. Use split
start = Time.parse(line[39,16]) # 2. Use known position of a column
ip = line[22,17].strip
if line =~/\((\d+):(\d+)\)/ # 3. Use a regex
duration = .to_i*60+.to_i
else
duration = nil
end
info={user: user, ip: ip, start: start, duration: duration}
#TODO: Check that user isn't "reboot"
puts info
end
# {:user=>"ricou", :ip=>"0.0.0.0", :start=>2016-11-01 21:29:00 +0100, :duration=>141}
# {:user=>"ricou", :ip=>"0.0.0.0", :start=>2016-11-01 15:21:00 +0100, :duration=>57}
您具体需要哪些信息?