簡介
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 = getssearchpath = searchpath.chompputs ""print "Enter the search pattern : "pattern = getspattern = pattern.chompputs"----------------------------------------------------------------------"puts "Searching in " + searchpath + " for files matching pattern " + patternputs"----------------------------------------------------------------------"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
在這個例子中:
下面是這個腳本的一個示例輸出。
清單 2. 第一個例子的示例輸出
[root@logan]# ruby findexample.rb-----------------------File Search-----------------------------------Enter the search path : /testEnter the search pattern : *.rb----------------------------------------------------------------------Searching in /test for files matching pattern *.rb----------------------------------------------------------------------Filename : s.rbPermissions : 100644Owning uid : 1Owning gid : 1Size (bytes) : 57---------------------------------------------------Filename : test.rbPermissions : 100644Owning uid : 0Owning gid : 0Size (bytes) : 996---------------------------------------------------Filename : s1.rbPermissions : 100644Owning uid : 1Owning gid : 1Size (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 = getssearchpath = searchpath.chompputs ""print "Enter the search pattern : "pattern = getspattern = pattern.chompputs"----------------------------------------------------------------------"puts "Searching in " + searchpath + " for files matching pattern " + patternputs"----------------------------------------------------------------------"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 文件。
這個例子做以下事情:
下面是一個示例輸出:
清單 4. 第二個例子的示例輸出
[root@logan]# ruby zipexample.rb-----------------------File Search-----------------------------------Enter the search path : /testEnter 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.zipArchive: 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 基本上是一個由兩部分組成的包: