亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Ruby > 正文

使用Ruby編寫腳本進行系統管理的教程

2020-02-24 15:37:29
字體:
來源:轉載
供稿:網友

Ruby具有非常強大的功能,因為它可以使用許多內置和外部庫,因此它可以利用自己的能力在正常的系統管理工作環境中解決許多腳本需求,其實使用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 = 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

在這個例子中:

  • ??? 第 5-11 行 - 請求用戶提供搜索路徑和搜索模式。
  • ??? 第 16 行 - 使用 Ruby 中 “Find” 類中的 “find” 方法遍歷指定的搜索路徑。
  • ??? 第 17 行 - 檢查發現的文件是否為一個目錄。如果是目錄,并且不是 “.”,則遞歸地遍歷該目錄。
  • ??? 第 24 行 - 使用 “File” 類中的 “fnmatch” 方法檢查發現的文件是否符合給定的模式。
  • ??? 第 25-34 行 - 如果文件符合模式,則打印文件的詳細信息。

下面是這個腳本的一個示例輸出。
清單 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 文件。

這個例子做以下事情:

  • ??? 第 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  : /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 基本上是一個由兩部分組成的包:

  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不僅可以與用于Web應用程序開發的Rails框架一起使用。它也可以像腳本編程語言一樣強大。作為shell腳本的一個很好的替代品,它經常被用來實現系統管理中的腳本需求。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本欧美黄网站| 国产69精品久久久久久| 亚洲成色999久久网站| 国产福利视频一区| www高清在线视频日韩欧美| 亚洲人高潮女人毛茸茸| 欧美精品videos性欧美| 国产亚洲欧美另类中文| 国产精品美腿一区在线看| 91成品人片a无限观看| 亚洲欧美一区二区三区情侣bbw| 日韩成人av网| 51精品国产黑色丝袜高跟鞋| 欧美性极品xxxx做受| 欧美日韩另类视频| 精品亚洲夜色av98在线观看| 亚洲欧美精品伊人久久| 免费不卡欧美自拍视频| 永久免费毛片在线播放不卡| 日韩av电影在线免费播放| 国产精品久久久久久网站| 久久精品影视伊人网| 亚洲欧美国产一本综合首页| 热re91久久精品国99热蜜臀| 91麻豆国产精品| 国产日韩在线看片| 亚洲免费视频观看| 91精品国产91久久久久| 91免费看片在线| 欧美猛男性生活免费| 三级精品视频久久久久| 久久免费观看视频| 久久精品在线播放| 日本韩国在线不卡| 热久久这里只有| 成人在线视频网站| 国产99视频在线观看| 国产精品18久久久久久麻辣| 欧美日韩一区二区免费视频| 国产在线视频2019最新视频| 91沈先生作品| 日韩电影中文字幕一区| 亚洲一区二区三区四区视频| 久久色精品视频| 久久99久久亚洲国产| 国产精品福利在线| 久久久之久亚州精品露出| 欧美大奶子在线| 亚洲free性xxxx护士hd| 欧美日韩福利电影| 久久视频免费在线播放| 91精品视频免费观看| 97在线看福利| 国产精品久久久久久中文字| 久久久久久久久爱| 日韩av资源在线播放| 国产男人精品视频| 国产美女久久精品| 91人人爽人人爽人人精88v| 国产精品视频一区二区三区四| 国产视频福利一区| 88国产精品欧美一区二区三区| 亚洲高清色综合| 欧美日韩国产限制| 国产精品美女久久久久av超清| 亚洲色图17p| 国产精品对白刺激| 中文字幕久热精品视频在线| 成人国产精品久久久久久亚洲| 日本欧美在线视频| 国自产精品手机在线观看视频| 日韩电影在线观看免费| 18久久久久久| 欧美成人高清视频| 色在人av网站天堂精品| 久久影院资源网| 精品久久久久久久久久国产| 另类少妇人与禽zozz0性伦| 57pao成人永久免费视频| 欧美老妇交乱视频| 九九九久久久久久| 国产成人精品日本亚洲专区61| 色综合导航网站| 国产精品视频资源| 成年人精品视频| 精品视频—区二区三区免费| 国产精品日日摸夜夜添夜夜av| 亚洲人成自拍网站| 最近中文字幕mv在线一区二区三区四区| 中文字幕欧美日韩| 欧美激情在线观看视频| 欧美孕妇与黑人孕交| 久久99亚洲精品| 国产中文字幕日韩| 亚洲精品成人久久| 亚洲精品女av网站| zzijzzij亚洲日本成熟少妇| 欧美wwwwww| 日韩av快播网址| www.99久久热国产日韩欧美.com| 97视频在线观看视频免费视频| 一区二区三区四区视频| 91视频国产高清| 欧美在线视频播放| 91综合免费在线| 亚洲欧美另类在线观看| 亚洲一区制服诱惑| www.国产一区| 日韩福利伦理影院免费| 国产欧美日韩中文字幕| 色久欧美在线视频观看| 亚洲 日韩 国产第一| 亚洲精品999| 日韩精品在线观看网站| www亚洲欧美| 午夜精品久久久久久久99黑人| 久久亚洲欧美日韩精品专区| 美日韩精品免费观看视频| 国产精品免费在线免费| 亚洲精品videossex少妇| 亚洲国产精品成人精品| 在线观看精品自拍私拍| 亚洲最大福利网| 亚洲成成品网站| 91九色单男在线观看| 亚洲欧美日韩第一区| 亚洲一区亚洲二区亚洲三区| 91成人性视频| 欧美日韩亚洲一区二区三区| 国产精品成久久久久三级| 欧美另类暴力丝袜| 日韩一区在线视频| 午夜精品福利电影| 日韩精品有码在线观看| 在线看国产精品| 久久色免费在线视频| 国产免费久久av| 国产亚洲视频中文字幕视频| 98精品国产自产在线观看| 亚洲精品av在线| 亚洲国产91色在线| 俺去了亚洲欧美日韩| 性色av一区二区咪爱| 亚洲国产精品福利| 久久免费视频在线观看| 久久久久久国产免费| 久久久99久久精品女同性| 亚洲精品成人免费| 亚洲欧美日韩一区在线| 日韩综合视频在线观看| 欧美性xxxxxxx| 欧美久久精品一级黑人c片| 欧美视频裸体精品| 在线视频国产日韩| 欧美国产日本高清在线| 亚洲欧美精品中文字幕在线| 97香蕉超级碰碰久久免费的优势| 日韩av电影手机在线| 日韩福利在线播放| 日韩美女免费观看| 精品视频中文字幕| 日韩欧美成人区| 亚洲欧洲一区二区三区在线观看| 亚洲日本成人网|