亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

標準化您的 UNIX 命令行工具

瀏覽:80日期:2024-06-15 13:23:15

本文介紹用于標準化界面以簡化在不同 Unix® 系統(tǒng)之間移動的方法。如果您管理多種 UNIX 系統(tǒng)(特別是在異構環(huán)境中),則最艱巨的任務可能是在不同環(huán)境之間切換并執(zhí)行不同的任務,同時還必須考慮系統(tǒng)之間的所有差異。本文并不介紹特定的差異,而是研究能夠提供兼容層(或包裝)以支持一致環(huán)境的方法。

關于本系列

典型的 UNIX® 管理員擁有一套經(jīng)常用于輔助管理過程的關鍵實用工具、訣竅和系統(tǒng)。存在各種用于簡化不同過程的關鍵實用工具、命令行鏈和腳本。其中一些工具來自于操作系統(tǒng),而大部分的訣竅則來源于長期的經(jīng)驗積累和減輕系統(tǒng)管理員工作壓力的要求。本系列文章主要專注于最大限度地利用各種 UNIX 環(huán)境中可用的工具,包括簡化異構環(huán)境中的管理任務的方法。

差異和問題

如果您使用多種 UNIX 主機,特別是每種主機都支持不同的 UNIX 風格(Berkeley Software Distribution (BSD)、UNIX System Release 4 (VSVR4) 等)或版本,您也許發(fā)現(xiàn)自己要花大量的時間來檢查和確定自己所在的主機類型,以便能夠適應系統(tǒng)操作方式的變化。

例如,ps 命令在基于 BSD 和基于 SVR4 的 UNIX 主機上,分別需要不同的命令行選項來獲得大致相同的信息(有關更多細節(jié),請參閱 系統(tǒng)管理員工具包: 進程管理技巧)。平臺之間還存在更廣泛的差異。有時,這種差異是命令名稱發(fā)生了更改;Linux® 提供 adduser 命令,而 Solaris 則提供 useradd 命令。

就標準化而言,有多種方法可供您采用。

您可以選擇對主要平臺(例如 Solaris)進行標準化,并在其他平臺上提供等效命令的包裝以匹配 Solaris 標準。 也可以選擇對為所使用的任務提供最佳組合的命令集進行標準化,挑選您喜歡的命令并為特定平臺上不存在的命令構建包裝。 您可以創(chuàng)建自己的一套執(zhí)行特定任務的腳本(包括您自己用于 ls、ps 等常用工具的替代腳本),以便它們生成您想要的信息。這樣做有點危險,原因是它意味著您可能從未使用原始命令,從而可能在您的腳本不可用時導致潛在的問題。

如何具體實現(xiàn)各個命令的包裝以提供一個兼容或唯一的層,這取決于您是嘗試簡單地為功能相同的替代命令提供一個公認名稱,還是需要構建一個或多個命令的包裝以獲得等效的結果??赡艿慕鉀Q方案有三種:

別名——這種解決方案僅在某些外殼中受支持——別名提供了將給定的字符串展開為特定命令的簡單方法。 外殼函數(shù)——大多數(shù)現(xiàn)代外殼都支持這種解決方案——外殼函數(shù)使您能夠創(chuàng)建更復雜的序列,但是由于它們作為內置函數(shù)運行,在差異相當小時可能更為實用。 外殼腳本——當您要構建的包裝特別復雜時,更好的解決方案是使用外殼腳本,您可以代替原始命令調用這些腳本。使用外殼腳本,您可以更創(chuàng)造性地處理替代,甚至為另一個命令提供完全由外殼腳本驅動的替代。

讓我們研究一下每種可能的解決方案和一些可通過此方法來進行模擬的示例命令。

使用別名

別名在 Korn (ksh)、Bourne-Again SHell (bash)、TENEX C shell (tcsh) 和 Z shell (zsh) 外殼中受支持,當您希望設置命令的特定選項,同時仍然支持其他選項時,別名提供了也許是最簡單的方法。顧名思義,您可以將一個命令用作另一個命令的別名,或者為帶有附加選項的同一個命令提供別名。別名從您鍵入的內容展開為其展開形式。

例如,一個常用的別名是 ll,它調用等效的 ls -l(ll 通常稱為長清單 (long listing))。每當用戶鍵入 ll,就會直接將其替換為展開形式,因此:$ ll a* 在執(zhí)行前展開為:$ ls -l a*。

命令行選項也仍然有效,換句話說,$ ll -a 展開為:$ ls -l -a。

還可以為現(xiàn)有命令設置別名;假設將 -F 選項添加到所有 ls 命令,這樣,$ ls 將展開為:$ ls -F。

要設置別名,請使用內置的外殼 alias 語句,并在引號中指定所需的展開形式。例如,要設置前面詳細描述的 ll 的展開形式,可使用:$ alias ll='ls -l'。

別名在以下情況下最為有用:您希望使用 base 命令并容易地指定附加選項,同時仍然允許設置特定于平臺的選項。

一個很好的例子就是 ps 命令,它在基于 SVR4 和基于 BSD 的 Unix 主機上是不同的。在本系列的第一篇文章中,請參閱 系統(tǒng)管理員工具包: 進程管理技巧 ——這篇文章解釋了如何使用 ps 的選項來獲得相似的清單。您可以結合別名使用那些選項,而不會影響您指定附加選項的能力。例如,在 BSD 上,您將如清單 1 所示指定別名。

清單 1. 在 BSD 上指定別名

$ alias ps='ps -o pid,ppid,command'

而在 SVR4 主機上,您將如清單 2 所示創(chuàng)建別名。

清單 2. 在 SVR4 上指定別名

$ alias ps='ps -opid,ppid,cmd

現(xiàn)在,在這兩個系統(tǒng)對 ps 的不同操作方式的限制下,您獲得了 ps 產(chǎn)生的標準輸出。和前面一樣,您可以繼續(xù)添加更多選項;例如,在安裝了該別名的任一個平臺上請求所有進程,添加 -A 選項就是這樣一種情況。這會在 BSD(在此示例中為 Mac OS X)上產(chǎn)生類似于清單 3 的輸出。

清單 3. 在 BSD 上使用 -A 選項

$ ps -A PID PPID COMMAND1 0 /sbin/launchd  23 1 /sbin/dynamic_pager -F /private/var/vm/swapfile  27 1 kextd  32 1 /usr/sbin/KernelEventAgent  33 1 /usr/sbin/mDNSResponder -launchdaemon  34 1 /usr/sbin/netinfod -s local  35 1 /usr/sbin/syslogd  36 1 /usr/sbin/cron  37 1 /usr/sbin/configd  38 1 /usr/sbin/coreaudiod  39 1 /usr/sbin/diskarbitrationd...

SVR4 系統(tǒng)(Gentoo Linux 主機)會顯示同樣的列,如清單 4 所示。

清單 4. 在 SVR4 上使用 -A 選項

$ ps -A PID PPID CMD1 0 init [3]2 1 [migration/0]3 1 [ksoftirqd/0]4 1 [watchdog/0]5 1 [migration/1]6 1 [ksoftirqd/1]7 1 [watchdog/1]8 1 [events/0]9 1 [events/1]  10 1 [khelper]  11 1 [kthread]  1411 [kblockd/0]  1511 [kblockd/1]  1611 [kacpid]...

另一個選項或多或少地鏡像了本文其他地方給出的腳本和函數(shù)解決方案。該選項是為給定命令的特定輸出創(chuàng)建別名,這些別名采用同一方法來提供相同的格式化輸出。同樣以 ps 為例,您可以創(chuàng)建別名 ps-all 來輸出所有進程列表,并根據(jù)需要為每種平臺設置相應的展開形式。

設置這些別名的最佳位置是在登錄期間執(zhí)行的外殼初始化腳本中,例如 .ksh、.profile 或 .bashrc。您可以在這些腳本中執(zhí)行同樣的系統(tǒng)檢查,以驗證要啟用哪些別名。如果希望提供適用于所有用戶的全局解決方案,則應將別名定義放在公開可用的文件中(例如放在 /etc or /usr/local 中),并設置用戶初始化腳本以獲得別名定義來源。

別名機制最適合于您希望設置單個命令的命令行選項的情況,雖然也可以使用它們來將給定的命令展開為一組命令或管道。這樣削弱了為展開形式中除最后一個命令以外的其他任何命令指定附加參數(shù)的能力。對于處理此類包裝,外殼中的內聯(lián)函數(shù)可能更為適合。

使用內聯(lián)外殼函數(shù)

大多數(shù)外殼都支持函數(shù),這些函數(shù)本質上是微型腳本,您可以在其中放置命令和其他外殼腳本元素以執(zhí)行特定的任務。由于它們是主外殼定義中的函數(shù),因此使用起來方便快捷,同時仍然支持許多完整外殼腳本所具有的相同功能,如命令行參數(shù)。

對于支持別名無法在其中工作的某些命令和組合,對命令行參數(shù)的支持非常關鍵。例如,killall 命令最基本的功能是終止所有與特定字符串匹配的命令。該命令并非在所有平臺上都可用,但是一旦您了解了它,就會希望在其他環(huán)境中使用它。

在 Solaris 上,killall 命令存在,但是將其用作關閉過程的一部分以終止所有進程。設想在 Solaris 主機上意外調用 killall 命令以關閉所有 Apache 進程,沒想到卻實際上關閉了系統(tǒng)!

提供替代——在所有主機上使用相同的名稱或使用不同的名稱——可以實現(xiàn)按名稱終止進程的預期結果,并消除不希望的和可能代價高昂的錯誤,同時擴展本身并不支持該選項的系統(tǒng)的功能。

該命令的關鍵部分是能夠識別正在運行的進程,提取與給定字符串匹配的進程,并使用 kill 命令將 KILL 信號發(fā)送到每個匹配進程。在命令行上,您可以通過一系列管道實現(xiàn)等效的功能(使用 KILL 信號),如清單 5 所示。

清單 5. 提供 killall 命令的替代

$ ps -ef|grep gcc|awk '{ print $2; }'|xargs kill -9

該命令的關鍵部分是提供給 grep(在此示例中為 gcc)的字符串和 ps 輸出中包含所需進程 ID 的列。上面的例子對 Solaris 主機和大多數(shù) SVR4 Unix 變種有效。

別名在此示例中無法工作,因為您希望能夠插入命令中的信息不在結尾;別名所實現(xiàn)的是一種展開方法。然而,內聯(lián)外殼函數(shù)正好適合這種情況。

在支持 Bourne 語法(bash 和 zsh)的外殼中,您可以使用清單 6 所示的以下語法來定義函數(shù)。

清單 6. 定義函數(shù)

function NAME(){# do stuff here}

調用函數(shù)時,函數(shù)參數(shù)作為 $1、$2 等形式來提供,就像在典型的外殼腳本中一樣。因此,您可以定義一個函數(shù),使其執(zhí)行與 killall 相同的基于字符串的信號發(fā)送功能(請參見清單 7)。

清單 7. 定義一個執(zhí)行與 killall 相同的信號發(fā)送功能的函數(shù)

function killall(){ps -ef|grep $1|awk '{ print $2; }'|xargs kill -9}

請注意,該函數(shù)的 awk 部分中的 $2 不會展開,因為您已經(jīng)對 awk 腳本定義使用了單引號,這樣阻止了展開,并且在此示例中會挑選第二列。

與別名一樣,指定外殼函數(shù)的最佳位置是在外殼的初始化腳本中。函數(shù)的局限性在于,它們依賴外殼提供支持能力,而這并不總是可能或可用。

雖然可以隨心所欲地使內聯(lián)外殼函數(shù)變得任意長,但在許多情況下,外殼函數(shù)并不理想。例如,在模擬更復雜的命令或提供命令包裝的超長序列中,您需要分析選項并提供本地化的等效命令,此時內聯(lián)函數(shù)就沒有多大用處了。在這種情況下,外殼腳本可能更為適合。

使用腳本

構建一致環(huán)境的最容易和最兼容的方法,是創(chuàng)建可用作實際命令的包裝的外殼腳本,這樣考慮了您希望支持的各種選項和設置。

例如,useradd 和 adduser 命令在設置參數(shù)(如用戶 ID 或組成員資格)時支持同樣的單字母命令行選項,因此 Linux 上的 $ adduser -u 1000 -G sales,marketing mcbrown 等效于 Solaris 上的 $ useradd -u 1000 -G sales,marketing mcbrown。

然而,Linux 版本還支持擴展命令選項,例如,--uid 和 --groups 等效于上面的命令行選項。這些擴展選項在 Solaris 上不受支持,但是,如果創(chuàng)建一個名為 adduser 的外殼腳本,您就可以模擬 Linux 版本,然后用適當?shù)倪x項運行實際的 Solaris useradd 命令。

清單 8 是用作 adduser 或 useradd 命令的包裝的示例外殼腳本。

清單 8. 用作包裝的示例外殼腳本

#!/bin/bash# -*- shell-script -*-for i in $*do case $i in --uid|-u) OPT_UID=$2; shift 2;; --groups|-G) OPT_GROUPS=$2; shift 2;; --gid|-g) OPT_GROUP=$2; shift 2;; --home-dir|-d) OPT_HOMEDIR=$2; shift 2;; --shell|-s) OPT_SHELL=$2;shift 2;; --non-unique|-o) OPT_NONUNIQUE=1;shift 2;; --comment|-c) OPT_COMMENT=$2;shift 2;; esacdoneOPTS=""if [ -n "$OPT_$HOMEDIR" ]thenOPTS="$OPTS -d $OPT_HOMEDIR"fiif [ -n "$GROUP" ]thenOPTS="$OPTS -g $OPT_GROUP"fiif [ -n "$OPT_GROUPS" ]thenOPTS="$OPTS -G $OPT_GROUPS"fiif [ -n "$OPT_SHELL" ]thenOPTS="$OPTS -s $OPT_SHELL"fiif [ -n "$OPT_UID" ]thenOPTS="$OPTS -u $OPT_UID"fiif [ -n "$OPT_COMMENT" ]thenOPTS="$OPTS -c "$OPT_COMMENT""fiif [ -n "$OPT_NOUNIQUE" ]thenOPTS="$OPTS -o"fiCMD=adduserUNAME=`uname`case $UNAME inSolaris) CMD=useradd;break;;esac$CMD $OPTS $*

該腳本的關鍵是 foreach 循環(huán),它遍歷所提供的命令行參數(shù)(在 $* 中提供)。對于每個選項,case 語句會嘗試識別該選項——使用短格式或長格式并設置一個變量。命令行開關為 $1。如果該選項后面正常地跟著一個值(例如,用戶 ID),您可以將 $2 當作該值來進行訪問,并使用它將該值賦于某個變量。

識別出某個選項后,shift 語句從 $* 變量列表中移動一個位置(若指定了數(shù)字,則移動指定數(shù)目的位置),以便已經(jīng)識別出的命令行參數(shù)在循環(huán)的下一次迭代中不再在 $* 變量中。

識別并提取出可能的參數(shù)以后,您所需做的就是構建新的選項來提供給最終要使用的命令。由于 useradd/adduser 都支持短格式的參數(shù),所以可在此基礎上構建新的命令選項字符串。這是通過檢查對應的變量是否已設置并將該選項添加到命令行來實現(xiàn)的。請注意雙引號的使用,它確保了原始命令中引用的參數(shù)被保留并得到正確識別。

將該腳本安裝在支持任一種原始命令的平臺上以后,您現(xiàn)在可以添加用戶并指定所要的選項,包括對參數(shù)進行混合和匹配(請參見清單 9)。

清單 9. 添加用戶

$ adduser.sh --homedir /etc -g wheel --shell /bin/bash -c "New user" mcbrown

同樣的基本原理也可以用于構建其他命令的包裝,甚至更改參數(shù)名稱和選項,或者提供等效的表達式。

如果希望用原始名稱安裝該腳本——例如,adduser——并將其放在某個目錄中(例如,/usr/local/compat),您必須確保該目錄在 PATH 中出現(xiàn)在實際命令的目錄之前。下面是假設將兼容性腳本放在 /usr/local/compat 目錄中的一個例子:$ PATH=/usr/local/compat:$PATH。

使用單個源

無論您是使用多個腳本還是單個配置腳本/別名來支持統(tǒng)一的環(huán)境,您也許都希望使用單獨一組腳本來支持系統(tǒng)。因此,設置新系統(tǒng)以使用標準化腳本(無論它們是獨立腳本還是安裝外殼函數(shù)和別名)非常簡單,只需將它們復制到新系統(tǒng)即可。

通過使用命令行工具和外殼流控制(如 if 或 case)的組合,您可以使用單個源來選擇各種要使用的選項。有兩個工具在這種情況下很有用:一個工具識別主機(如 hostname 或 uname),另一個工具識別平臺 (uname)。

uname 產(chǎn)生的缺省輸出是基本操作系統(tǒng)名稱,如 Linux 或 Solaris。例如,可以按照前一部分中的 ps 示例,將該命令與 case 語句結合使用以選擇正確的別名,如清單 10 所示。

清單 10. uname 的輸出

UNAME='uname'case "$UNAME" inFreeBSD|NetBSD|Darwin)alias ps='ps -o pid,ppid,command'break;;Solaris|Linux)alias ps='ps -o pid,ppid,cmd'break;;esac

也可以在腳本中使用同樣的基本過程來選擇特定的序列。

在使用內聯(lián)外殼函數(shù)時,與在每次使用函數(shù)時才做出決定相比,使用類似如此的包裝來選擇正確的函數(shù)定義通常更容易,因為這樣做會更加高效。

總結

規(guī)范化環(huán)境對于簡化管理大有幫助。它減輕了您的負擔,幫助您確定所在的系統(tǒng)類型,以及哪個命令和/或選項集最適合于獲取所需信息或執(zhí)行所需操作。為每個命令選擇正確的機制完全取決于該命令和您要嘗試達到的目的。

在您希望調用命令行選項的單個命令上,最好使用別名機制。內聯(lián)函數(shù)最適合于您希望容易地將其嵌入當前腳本環(huán)境的更復雜操作和序列,而完整的單獨腳本則最適合于麻煩的多步驟操作,或您希望為命令(或選項)提供支持而不更改外殼環(huán)境的場合。

盡管有這些明顯的優(yōu)點,但是務必要記住,如果將自己過于屏蔽在基礎的系統(tǒng)之外,當發(fā)生故障而您無法訪問腳本時,您可能處于無準備的狀態(tài)——您應該尋求擴展和擴充,而不是替代。

標簽: Unix系統(tǒng)
主站蜘蛛池模板: 极品国产高颜值露脸在线 | 亚洲第一网站 | 久久国产乱子伦精品免费一 | 夜夜草影院 | 国产免费又色又爽又黄在线观看 | 萌白酱粉嫩福利视频在线观看 | 日韩精品一 | 美女zw喷水视频在线观看 | 国产又色又爽在线观看 | 91精品国产人成网站 | 亚洲国产欧美国产第一区 | 国产成人一区 | 最新国产一区二区精品久久 | 国内成人免费视频 | 热久久影院 | www.一级黄色片 | 高清不卡日本v在线二区 | 国产换爱交换乱理伦片的功能 | 麻豆免费在线视频 | 国产视频一区二区在线观看 | 福利精品一区 | 国产午夜不卡在线观看视频666 | 国产精品综合在线 | 99久久综合狠狠综合久久男同 | 国产一级片视频 | 国产成人在线播放 | 亚洲国产色婷婷精品综合在线观看 | 中文字幕在线不卡精品视频99 | 美女黄色一级毛片 | 成人娱乐网 | 黄色片网站日本 | 国产农村精品一级毛片视频 | 2020天堂中文字幕一区在线观 | 亚洲色图图| 成年免费大片黄在线观看岛国 | 免费观看性欧美毛片 | 香蕉依人| 亚洲国产精品一区二区久久hs | 久久视热这只是精品222 | 久久www免费人成看片色多多 | 国产免费资源高清小视频在线观看 |