使用Ruby编写脚本进行系统管理的教程_ruby专题

简介

Ruby 是一种功能极其丰富的、免费的、简单的、可扩展的、可移植的、面向对象的脚本编程语言。最近,它在 Web 领域广受欢迎。这在一定程度上要归因于非常强大的 Web 应用程序开发框架 Rails,Rails 正是用 Ruby 编写的。Rails,也称 Ruby on Rails(ROR),顾名思义,它为快速、有效地开发 Web 应用程序提供一个非常强大的平台。它是高度可伸缩的,Web 上有很多站点就是用 Ruby on Rails 构建的。

除了与 Rails 一起用作 Web 应用程序开发平台外,Ruby 还具有较少被提及的另一面,那就是作为一种强大的脚本编程语言,就像 Python 或 Perl 那样。它拥有非常强大的功能,由于可以使用很多内建的和外部的库,因此可利用它的威力来解决通常系统管理工作环境中出现的很多脚本编程需求。

系统管理需要大量编写脚本以使事情更简单、更有效。编写脚本比单调的手动工作能更好地解决用户管理、进程管理、文件管理、软件包管理和其他基本的自动化需求。在这个场景中,Ruby 非常有用。它有一套很好的库可满足这一点。

对于本文,我假设读者具有 Ruby 的应用知识。这里提供的基本例子使用纯 Ruby,因此可以在 Ruby 支持的任何类 UNIX? 系统以及 Windows? 上运行。对于更高级的 Cfruby 例子,需要能够使用一个 UNIX 系统。下面所有的例子已经在一台 Linux? 机器上使用 Ruby v1.8.4 进行了测试。它们应该也能用于最新版本的 Ruby。

实践中的 Ruby

第一个例子在指定路径中搜索符合给定模式的文件,并以用户友好的方式给出关于这些文件的详细信息。实现这一目标不必依赖于任何命令行实用程序,只需使用 Ruby 内建的 API。因此,这个例子在有 Ruby 运行的任何平台上都能运行。

而且,这个例子展示了 Ruby 在简化脚本编写需求方面有多强大。它不是简单地模拟 *nix "find" 命令,而是构建在该命令之上,因而在使用 Ruby 时具有很强的定制能力。
清单 1. 在给定路径中搜索符合给定模式的模式的文件,并显示它们的详细信息

require 'find'
puts ""
puts "-----------------------File Search-----------------------------------"
puts ""
print "Enter the search path  : "
searchpath = gets
searchpath = searchpath.chomp
puts ""
print "Enter the search pattern : "
pattern = gets
pattern = pattern.chomp
puts"----------------------------------------------------------------------"
puts "Searching in " + searchpath + " for files matching pattern " + pattern
puts"----------------------------------------------------------------------"
puts ""
 Find.find(searchpath) do |path|
  if FileTest.directory?(path)
   if File.basename(path)[0] == ?.
    Find.prune    # Don't look any further into this directory.
   else
    next
   end
  else
   if File.fnmatch(pattern,File.basename(path))
    puts "Filename   : " + File.basename(path)
    s = sprintf("%o",File.stat(path).mode)
    print "Permissions : "
    puts s
    print "Owning uid  : "
    puts File.stat(path).uid
    print "Owning gid  : "
    puts File.stat(path).uid
    print "Size (bytes) : "
    puts File.stat(path).size
    puts "---------------------------------------------------"
   end
  end
 end

在这个例子中:

  •     第 5-11 行 - 请求用户提供搜索路径和搜索模式。
  •     第 16 行 - 使用 Ruby 中 “Find” 类中的 “find” 方法遍历指定的搜索路径。
  •     第 17 行 - 检查发现的文件是否为一个目录。如果是目录,并且不是 “.”,则递归地遍历该目录。
  •     第 24 行 - 使用 “File” 类中的 “fnmatch” 方法检查发现的文件是否符合给定的模式。
  •     第 25-34 行 - 如果文件符合模式,则打印文件的详细信息。

下面是这个脚本的一个示例输出。
清单 2. 第一个例子的示例输出

[root@logan]# ruby findexample.rb

-----------------------File Search-----------------------------------

Enter the search path  : /test

Enter the search pattern : *.rb
----------------------------------------------------------------------
Searching in /test for files matching pattern *.rb
----------------------------------------------------------------------

Filename   : s.rb
Permissions : 100644
Owning uid  : 1
Owning gid  : 1
Size (bytes) : 57
---------------------------------------------------
Filename   : test.rb
Permissions : 100644
Owning uid  : 0
Owning gid  : 0
Size (bytes) : 996
---------------------------------------------------
Filename   : s1.rb
Permissions : 100644
Owning uid  : 1
Owning gid  : 1
Size (bytes) : 39
---------------------------------------------------

在系统管理期间,最常见的一个需求是有效地使用 zip 文件来管理备份,或者将一组文件从一台计算机转移到另一台计算机。在这个方面,Ruby 很有优势。这里的第二个例子构建在第一个例子的基础上,但是包含了一个场景,在此场景中,需要将搜索到的文件打包到 zip 文件中。

内建的 zlib 模块可帮助处理 gzip 文件,对于大多数情况它都够好。但是,在这里我将使用另一个很好的 Ruby 库,即 “rubyzip”,来创建和处理 zip 归档文件。请查看 参考资料 小节,找到下载它的链接。而且要注意,这个例子使用纯 Ruby,它不依赖于计算机上当前提供的任何命令行实用程序。

安装 rubyzip

    通过提供的链接下载 “rubyzip” gem,并将它复制到系统中。(在撰写本文之际,它的文件名是 “rubyzip-0.9.1.gem”)。
    运行 gem 安装 rubyzip-0.9.1.gem

清单 3. 使用 zip 文件

require 'rubygems'
require_gem 'rubyzip'
require 'find'
require 'zip/zip'

puts ""
puts "------------------File Search and Zip-----------------------------"
puts ""
print "Enter the search path  : "
searchpath = gets
searchpath = searchpath.chomp
puts ""
print "Enter the search pattern : "
pattern = gets
pattern = pattern.chomp
puts"----------------------------------------------------------------------"
puts "Searching in " + searchpath + " for files matching pattern " + pattern
puts"----------------------------------------------------------------------"
puts ""
puts"----------------------------------------------------------------------"
puts "Zipping up the found files..."
puts"----------------------------------------------------------------------"
 Zip::ZipFile.open("test.zip", Zip::ZipFile::CREATE) {
 |zipfile|
 Find.find(searchpath) do |path|
 if FileTest.directory?(path)
   if File.basename(path)[0] == ?.
    Find.prune    # Don't look any further into this directory.
   else
    next
   end
  else
    if File.fnmatch(pattern,File.basename(path))
        p File.basename(path)
        zipfile.add(File.basename(path),path)
    end
  end
 end
 }

这个脚本为根据提供的搜索路径和搜索模式搜索到的文件创建一个名为 “test.zip” 的 zip 文件。

这个例子做以下事情:

  •     第 9-15 行 - 请求用户提供搜索路径和搜索模式。
  •     第 23 行 - 创建一个新的名为 “test.zip” 的 ZipFile。
  •     第 25 行 - 使用 Ruby 中 “Find” 类中的 “find” 方法遍历指定的搜索路径。
  •     第 26 行 - 检查发现的文件是否为一个目录。如果是目录,并且不是 “.”,则递归地遍历该目录。
  •     第 33 行 - 使用 “File” 类中的 “fnmatch” 方法检查发现的文件是否符合给定的模式。
  •     第 35 行 - 将符合的文件添加到 zip 归档中。

下面是一个示例输出:
清单 4. 第二个例子的示例输出

[root@logan]# ruby zipexample.rb

-----------------------File Search-----------------------------------

Enter the search path  : /test

Enter the search pattern : *.rb
----------------------------------------------------------------------
Searching in /test for files matching pattern *.rb
----------------------------------------------------------------------

----------------------------------------------------------------------
Zipping up the found files...
----------------------------------------------------------------------
"s.rb"
"test.rb"
"s1.rb"

[root@logan]# unzip -l test.zip
Archive: test.zip
 Length   Date  Time  Name
 --------  ----  ----  ----
   996 09-25-08 21:01  test.rb
   57 09-25-08 21:01  s.rb
   39 09-25-08 21:01  s1.rb
 --------          -------
  1092          3 files

Cfruby - 高级的系统管理

根据 Cfruby 站点的定义,“Cfruby 允许使用 Ruby 进行系统管理。它既是一个用于系统管理的 Ruby 函数库,又是一个类 Cfengine 的克隆品(实际上是用于系统管理的一种特定领域语言,即 DSL)”。

Cfruby 基本上是一个由两部分组成的包:

  1.     Cfrubylib – 一个纯 Ruby 库,其中包含用于系统管理的类和方法。这包括文件复制、查找、校验和检查、包管理、用户管理等。
  2.     Cfenjin – 一种简单的脚本编程语言,可帮助为系统管理任务编写脚本(不必知道 Ruby)。

Cfruby 可以作为一个 Ruby gem 或 tar 压缩文件下载。gem 是最简单、最容易的方式。获取 gem,并使用 “gem install” 命令安装它。

安装 Cfruby:

  •     将下载的 Cfruby gem 文件复制到系统中。(在撰写本文之际,它的文件名是 “cfruby-1.01.gem”)。
  •     运行 gem 安装 cfruby-1.01.gem。

Cfruby 现在应该被安装到系统上。
使用 Cfruby

现在,我将展示 Cfruby 的功能,以及它如何大大简化系统管理。

有两种基本的方式可访问 Cfruby 库提供的功能:

  1.     直接使用 libcfgruby 中的 Ruby 类。
  2.     使用 cfrubyscript 包装器,它为 libcfruby 提供了一个更简洁的接口。

直接使用 libcfruby 中的 Ruby 类

Libcfruby 是 Cfruby 的核心,它包含一组模块,这些模块提供了各种用于简化系统维护和设置的功能。为了使用 libcfruby,需要在安装 Cfruby gem 之后,将 “require_gem 'cfruby'” 添加到脚本的顶端。这样便可以直接访问 libcfruby 中的所有核心模块,在脚本中可以根据需要按任意方式使用它们。这种方法惟一的缺点是 libcfruby 比较大,它将所有的类和方法都放入到它们各自的名称空间中。所以,为了访问任何一个类,都需要以名称空间加以限定。例如,libcfruby 提供了一个用于获得系统类型的方法。要获取操作系统的类型,需要做以下事情:
清单 5. 使用 libcfruby 获取操作系统类型

require 'rubygems'

require_gem 'cfruby'

os = Cfruby::OS::OSFactory.new.get_os()

puts(os.name)

这只是获得操作系统的名称。随着您用 libcfruby 做更多的事情,您的脚本中将充斥着更多指定名称空间的语句。正是由于这一点,另一种使用 Cfruby 的方法就显得很方便。
使用 cfrubyscript 包装器,这个包装器为 libcfruby 提供了一个更简洁的接口

为了使用 cfrubyscript 包装器,需要添加:
清单 6. 使用 cfrubyscript

require 'rubygems'

require_gem 'cfruby'

require 'libcfruby/cfrubyscript'

这样会将 cfrubyscript 包括到脚本中,然后就可以通过一个更简单的接口来访问 libcfruby 的功能。

cfrubyscript 做到了以下几点:

  •     它将一组变量导出到全局名称空间,例如 $os、$pkg、$user、$proc 和 $sched。
  •     它将大多数主要模块放到主名称空间中,所以可以调用 FileEdit.set 而不是 Cfruby::FileEdit.set。
  •     它为 String 和 Array 添加了很多助手方法,这些方法可以做一些 Cfruby 事情(安装程序、编辑文件等)。
  •     它还提供了一个很好的日志记录器。

所以,不再需要在脚本中指定一大堆的名称空间。上面用于获取操作系统类型的例子现在变成这样:
清单 7. 使用 cfrubyscript 获取操作系统的类型

require 'rubygems'

require_gem 'cfruby'

require 'libcfruby/cfrubyscript'

puts($os.name)

这可以翻译成一个单独的调用,该调用使用全局变量 $os。Cfruby 的确强大,它为管理类 *nix 系统提供了很多功能。

现在来看看其中一些功能,以及使用它们的一些基本例子。
用户管理

在系统管理中,最常见、最重要的任务之一就是用户和组的管理。Cfruby 以一种可移植的、简单的方式提供了一套强大的方法来实现该任务。

该任务是使用 UserManager 对象实现的,这个对象可以像下面这样从 OS 模块获得。
清单 8. 使用 libcfruby 获得 UserManager 对象

require 'rubygems'

require_gem 'cfruby'

osfactory = Cfruby::OS::OSFactory.new()

os = osfactory.get_os()

usermgr = os.get_user_manager()

如果使用 cfrubyscript 方式,那么已经有一个全局用户管理对象,即 $user,它可以直接用于调用方法。我将使用这种方法,因为这样更简单,更易于阅读。

下面展示如何使用它来创建和删除一个用户。
清单 9. 使用 cfgrubyscript 进行用户管理

require 'rubygems'

require_gem 'cfruby'

require 'libcfruby/cfrubyscript'

$user.adduser('newusername','password')

$user.deleteuser('usernametodelete',true)

上述代码做什么事情?

  •     第 1、2 行 – 和通常一样,将 libcfruby 和 cfrubyscript 包括到脚本中。
  •     第 3 行 – 以用户名 “newusername” 和第二个参数指定的密码创建一个新用户。
  •     第 4 行 – 删除用户名为 “usernametodelete” 的用户。第二个参数的值可以是 true 或 false,用于指定是否删除被删除用户的主目录。

类似地,组操作也可以使用 UserManager 对象中的 addgroup() 和 deletegroup() 方法来完成。
进程管理

管理员的另一项重要的任务是跟踪系统上运行的进程,并管理它们。Cfruby 在这方面也很有用,它为有效地处理进程提供了方法。

您可以使用 Cfruby 实现它。
清单 10. 使用 cfgrubyscript 进行进程管理

require 'rubygems'

require_gem 'cfruby'

require 'libcfruby/cfrubyscript'

$proc.kill($proc.vim)

'ps –aef'.exec()

上述代码做什么事情?

  •     第 3 行 – 使用全局 ProcessManager 对象 $proc 关闭由参数指定的 “vim” 进程。$proc.vim 是在系统上运行的 “vim” 进程的一个 ProcessInfo 类型的对象。它们是由 cfrubyscript 自动创建的。
  •     第 4 行 – 用指定的命令 “ps –aef” 启动一个新进程。可以从命令字符串中直接调用 exec 方法。

包管理

系统管理员必须负责的另一项任务是管理系统上的包。Cfruby 提供了一些方法用于方便地在系统上安装和删除软件。
清单 11. 使用 cfgrubyscript 进行包管理

require 'rubygems'

require_gem 'cfruby'

require 'libcfruby/cfrubyscript'

all = $pkg.packages()

installed = $pkg.installed_packages()

ruby.install()

上述代码做什么事情?

  •     第 3 行 – 使用 cfrubyscript 创建的全局 $pkg PackageManager 对象,通过调用 packages() 方法获得系统上所有可用的包。
  •     第 4 行 – 获得所有已安装的包的列表。
  •     第 5 行 – 通过调用 install 方法安装 Ruby 包。可以通过包名本身直接调用 install 助手方法。

事情就是这么简单。
文件管理

Cfruby 还可以帮助管理系统上的文件。通过使用 Cfruby 提供的方法,可以轻松地创建、编辑、删除、更改所有权和更改许可等等。
清单 12. 使用 cfgrubyscript 进行文件管理

require 'rubygems'

require_gem 'cfruby'

require 'libcfruby/cfrubyscript'

'/etc/ssh'.chown_mod('root', 'wheel', 'u=rw,g=r,o-rwx', `:recursive` => true)

上述代码做什么事情?

    第 3 行 – 更改文件 “/etc/ssh” 的所有者和组以及许可。直接从文件本身调用 chown_mod() 方法。这样,这是通过 cfrubyscript 的助手对象和方法实现的。注意,这里只用一行就实现了该功能。

所以,上述例子应该已经让您了解到 Cfruby 有多强大,使用它来管理系统有多容易。而且,由于提供了一套非常直观的类和方法,它使得系统管理的整个任务变得更加容易,也更加有趣。

关于 Cfruby 和它的那一整套功能还有很多需要知道的。它附带有一套很好的文档。建议您看一看这些文档,这样才能将这个 Ruby 库的全部威力释放出来。请查看参考资料小节,获取相关链接。

结束语

Ruby 不仅可以与 Rails 框架一起用于 Web 应用程序开发。它还可以像脚本编程语言一样强大,作为通常的 shell 脚本编程的一个很好的替代品,常用于实现系统管理中的脚本编程需求。

通过使用 Ruby 的一套内建模块和一些外部的库,系统管理员可以变得更加高效,工作更加有趣。Ruby 是一个非常有用、非常强大的工具,是每个系统管理员工具箱中必备的工具。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索ruby
ruby脚本编写、ruby脚本、运行ruby脚本、ruby脚本语言、appium运行ruby脚本,以便于您获取更多的相关知识。

时间: 2024-09-30 13:39:52

使用Ruby编写脚本进行系统管理的教程_ruby专题的相关文章

在Ruby程序中连接数据库的详细教程_ruby专题

本章节将向您讲解如何使用 Ruby 访问数据库.Ruby DBI 模块为 Ruby 脚本提供了类似于 Perl DBI 模块的独立于数据库的接口. DBI 即 Database independent interface,代表了 Ruby 独立于数据库的接口.DBI 在 Ruby 代码与底层数据库之间提供了一个抽象层,允许您简单地实现数据库切换.它定义了一系列方法.变量和规范,提供了一个独立于数据库的一致的数据库接口. DBI 可与下列进行交互:     ADO (ActiveX Data Ob

Ruby的面向对象编程的基础教程_ruby专题

Ruby 是纯面向对象的语言,Ruby 中的一切都是以对象的形式出现.Ruby 中的每个值都是一个对象,即使是最原始的东西:字符串.数字,甚至连 true 和 false 都是对象.类本身也是一个对象,是 Class 类的一个实例.本章将向您讲解所有与 Ruby 面向对象相关的主要功能. 类用于指定对象的形式,它结合了数据表示法和方法,把数据整理成一个整齐的包.类中的数据和方法被称为类的成员.Ruby 类定义 当您定义一个类时,您实际是定义了一个数据类型的蓝图.这实际上并没有定义任何的数据,而是

用Ruby实现一个单元测试框架的教程_ruby专题

在去年的YOW Melbourne开发者大会上,我参加了一些研习班.这些研习班由@coreyhaines和 @rains负责,因此TDD(测试驱动开发)成为了主要讨论的内容.通常这不是一个问题,但是令人沮丧的是(考虑到这是2010年举办的开发者大会),那时上网还不是很方便,我刚装上linux的笔记本无法下载Rspec.幸运的是几周前,我决定自己写一个单元测试框架(因为我有这个能力:)),接着我就有了一个可用的测试框架,问题解决了.但是,这让我想到一个问题,最少可以用多少代码写成一个可用的单元测试

Ruby的基础语法入门学习教程_ruby专题

让我们编写一个简单的 Ruby 程序.所有的 Ruby 文件扩展名都是 .rb.所以,把下面的源代码放在 test.rb 文件中. 实例 #!/usr/bin/ruby -w puts "Hello, Ruby!"; 在这里,假设您的 /usr/bin 目录下已经有可用的 Ruby 解释器.现在,尝试运行这个程序,如下所示: $ ruby test.rb 这将会产生下面的结果: Hello, Ruby! 您已经看到了一个简单的 Ruby 程序,现在让我们看看一些 Ruby 语法相关的基

ruby环境中自动编译sass教程_ruby专题

sass为CSS的赋予了动态语言的特性,如变量.继承.运算.函数等,更方便CSS的编写和维护! sass安装 因为sass依赖于ruby环境,所以装sass之前先确认装了ruby.安装ruby http://www.jb51.net/article/61501.htm 安装完ruby之后,在开始菜单中,找到刚才我们安装的ruby,打开Start Command Prompt with Ruby 然后直接在命令行中输入 复制代码 代码如下: gem install sass 按回车键确认,等待一段

使用Ruby来处理JSON的简单教程_ruby专题

环境配置 在使用 Ruby 编码或解码 JSON 数据前,我们需要先安装 Ruby JSON 模块.在安装该模块前你需要先安装 Ruby gem,我们使用 Ruby gem 安装 JSON 模块. 但是,如果你使用的是最新版本的 Ruby,可能已经安装了 gem,解析来我们就可以使用以下命令来安装Ruby JSON 模块: $gem install json 使用 Ruby 解析 JSON 以下为JSON数据,将该数据存储在 input.json 文件中: { "President":

Ruby中的Mechanize的使用教程_ruby专题

Ruby中实现网页抓取,一般用的是mechanize,使用非常简单. 安装 复制代码 代码如下: sudo gem install mechanize 抓取网页 复制代码 代码如下: require 'rubygems' require 'mechanize' agent = Mechanize.new page = agent.get('http://google.com/') 模拟点击事件 复制代码 代码如下: page = agent.page.link_with(:text => 'Ne

使用Ruby编写发送邮件的程序的简单教程_ruby专题

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. Ruby提供了 Net::SMTP 来发送邮件,并提供了两个方法 new 和 start:     new 方法有两个参数:         server name 默认为 localhost         port number 默认为 25     start 方法有以下参数:         server - SMTP 服务器

使用C++来编写Ruby程序扩展的教程_ruby专题

Ruby 最酷的功能之一就是使用 C/C++ 定义的应用程序编程接口 (API) 扩展它.Ruby 提供了 C 头文件 ruby.h,它随附提供了许多功能,可使用这些功能创建 Ruby 类.模块和更多内容.除了头文件,Ruby 还提供了其他几个高层抽象来扩展基于本地 ruby.h 构建的 Ruby,本文要介绍的是 Ruby Interface for C++ Extensions 或 Rice.创建 Ruby 扩展 在进行任何 Ruby 的 C API 或 Rice 扩展前,我想明确地介绍一下创