/dev/tty文件在Unix操作系統(tǒng)中的妙用
在Unix系統(tǒng)中,文件是其中最重要的資源。如標(biāo)準(zhǔn)輸出文件、標(biāo)準(zhǔn)輸入文件、標(biāo)準(zhǔn)錯(cuò)誤文件等等。不過(guò)這些文件普通用戶與系統(tǒng)工程師都需要用到。而在實(shí)際工作中,對(duì)于系統(tǒng)工程師來(lái)說(shuō),還需要掌握/dev/tty這個(gè)文件。
這個(gè)文件顧名思義,主要用來(lái)表示用戶的終端,但是它跟普通的終端又有差異。普通的終端是指一些硬件設(shè)備,如顯示器等等。通常情況下,標(biāo)準(zhǔn)輸出或者標(biāo)準(zhǔn)錯(cuò)誤流的文件都會(huì)輸出到終端中。但是,這些標(biāo)準(zhǔn)的輸入輸出往往不能夠輸入到/dev/tty文件中。而是需要通過(guò)重定向功能,把一些命令的輸出重定向到這個(gè)文件中。另外需要說(shuō)明的是,普通終端的話往往是每個(gè)用戶之間相互獨(dú)立的。也就是說(shuō),每個(gè)用戶的輸出彼此之間是互不干涉的。在用戶A的終端中不能夠看到用戶B的終端信息。但是/det/tty這個(gè)文件由其特殊性。這個(gè)終端文件可以由各個(gè)用戶共享。正是因?yàn)檫@個(gè)文件有這方面的特殊性,為此在實(shí)際工作中系統(tǒng)工程師經(jīng)常需要用到這個(gè)文件。
一、系統(tǒng)工程師常見需求描述及實(shí)現(xiàn)方案。
利用這個(gè)特殊文件,可以幫助系統(tǒng)工程師解決很多實(shí)際問(wèn)題。
1、利用這個(gè)文件來(lái)屏蔽不需要的結(jié)果信息。通常情況下,為了提高與用戶溝通界面的友好性,往往會(huì)在腳本程序中,利用echo命令向用戶顯示一些提示信息。如一個(gè)簡(jiǎn)單的計(jì)算器腳本程序,會(huì)提示用戶輸入相關(guān)的參數(shù),如“Put one number等等。有時(shí)候,還會(huì)在程序的開頭顯示一大堆的程序說(shuō)明。這毋庸置疑,可以提高腳本程序的可讀性。即方便了用戶的使用,而且別的系統(tǒng)工程師借助這些說(shuō)明也可以順利對(duì)其進(jìn)行功能上的調(diào)整與擴(kuò)展。不過(guò)這也會(huì)贊成一些工作上的困擾。如當(dāng)系統(tǒng)工程師調(diào)試腳本程序的時(shí)候,這些顯示的提示信息反而會(huì)增加系統(tǒng)工程師的困擾,會(huì)增加他們的閱讀量。因?yàn)榇藭r(shí)用戶終端上顯示的將士全部的信息,即包括對(duì)于應(yīng)用程序沒(méi)有實(shí)際價(jià)值的提示信息,也包括一些應(yīng)用程序執(zhí)行過(guò)程中的錯(cuò)誤信息。這顯然會(huì)給系統(tǒng)工程師閱讀錯(cuò)誤信息帶來(lái)一定的麻煩。另外如筆者談過(guò),系統(tǒng)工程師可以通過(guò)重定向符號(hào)把這個(gè)終端輸出的信息重定向到一個(gè)文件中。可是此時(shí)這個(gè)文件中也會(huì)顯示全部的信息。而這些信息大部分是系統(tǒng)工程師不需要看到的。系統(tǒng)工程師可能只需要一些相關(guān)的參數(shù)以及具體的執(zhí)行結(jié)果。如10*10=100。就這么簡(jiǎn)單,而不需要看到一大堆的提示說(shuō)明。而且如果這個(gè)文件中帶有這么多的無(wú)用信息,對(duì)于其他腳本程序來(lái)調(diào)用這個(gè)文件也不是很方便。遇到這種情況時(shí)該如何處理呢?其實(shí)系統(tǒng)工程師可以輕松的通過(guò)/dev/tty文件來(lái)過(guò)濾這些無(wú)用的提示信息。如只需要把腳本程序的運(yùn)行結(jié)果通過(guò)重定向服務(wù)重定向到/dev/tty文件中。在這個(gè)重定向的過(guò)程中,Unix系統(tǒng)的shell會(huì)采取一定的內(nèi)部處理機(jī)制,會(huì)忽略掉echo等命令。也就是說(shuō),只要把命令的標(biāo)準(zhǔn)輸出重定向到這個(gè)文件中,則利用echo命令設(shè)置的一些提示信息都會(huì)被忽略掉。此時(shí)在這個(gè)文件中,存儲(chǔ)的只有一些必要的運(yùn)行信息,如錯(cuò)誤或者警告信息等等。
2、當(dāng)作其他命令的參數(shù)。/dev/tty文件不僅可以用作終端設(shè)備來(lái)管理,而且這個(gè)文件還可以被用來(lái)當(dāng)作其他命令的參數(shù)。因?yàn)橐粋€(gè)終端就相當(dāng)于一個(gè)文件,為此在一些命令中如tee命令就可以拿這個(gè)文件當(dāng)作參數(shù)。Tee命令是一個(gè)分流命令,其主要用途就是把一個(gè)輸入流的一個(gè)副本保存到另外一個(gè)文件中。有時(shí)候這個(gè)特性非常有用。如現(xiàn)在系統(tǒng)工程師需要利用who命令來(lái)顯示Unix系統(tǒng)的當(dāng)前登錄用戶。同時(shí)希望把這個(gè)顯示結(jié)果保存到一個(gè)特定的文件中。如果沒(méi)有tee這個(gè)命令的話,則需要通過(guò)兩個(gè)步驟才能夠完成。首先需要利用who命令在當(dāng)前終端中顯示相關(guān)的結(jié)果。然后再利用who >重定向符號(hào)把這個(gè)命令的顯示結(jié)果保存到一個(gè)特定的文件中。如果一開始就采用who >進(jìn)行重定向的話,則在用戶終端將不會(huì)顯示任何信息。因?yàn)槠渲苯影呀Y(jié)果保存到了一個(gè)文件中。而現(xiàn)在系統(tǒng)工程師即希望把命令的結(jié)果輸出到終端中,同時(shí)保存到一個(gè)文件中,就需要利用tee命令,如who | tee userinfo.txt。(注意,如果利用了tee命令的話,在可以不再使用重定向符號(hào))。到這里為止沒(méi)有涉及到/dev/tty這個(gè)文件。who | tee userinfo.txt這個(gè)命令的顯示結(jié)果,只會(huì)顯示當(dāng)前登錄的用戶明細(xì),而不會(huì)顯示當(dāng)前有多少個(gè)用戶登錄到系統(tǒng)中。可能或許有人回說(shuō)只要數(shù)一下就可以了呀。確實(shí)數(shù)數(shù)的話可以實(shí)現(xiàn),但是計(jì)算機(jī)不會(huì)自己數(shù)呀。如果其他腳本程序需要用到當(dāng)前登錄用戶的總數(shù)而不需要明細(xì),那么該如何處理呢?此時(shí)就需要利用/dev/tty文件作為參數(shù)了。如可以使用who | tee /dev/tty |wc –l 命令。這個(gè)命令可以把當(dāng)前用戶的明細(xì)以及總共的用戶數(shù)量顯示出來(lái)。以上這個(gè)命令其實(shí)我們可以分為四個(gè)步驟。第一步系統(tǒng)先執(zhí)行who命令;第二步tee命令把who命令執(zhí)行對(duì)結(jié)果保存到/dev/tty文件中;第三步wc命令會(huì)統(tǒng)計(jì)/dev/tty文件中的行數(shù)。由于一個(gè)終端對(duì)相當(dāng)于一個(gè)文件,故利用wc命令可以統(tǒng)計(jì)出當(dāng)前系統(tǒng)登錄用戶的數(shù)量。第四步再把這個(gè)統(tǒng)計(jì)的結(jié)果顯示在終端上。所以說(shuō),把/dev/tty文件當(dāng)作其他命令的一個(gè)參數(shù),一個(gè)一起組合以實(shí)現(xiàn)一些比較復(fù)雜的功能。
二、/dev/tty文件使用的注意點(diǎn)。
在使用這個(gè)文件中,特別需要關(guān)注的是其權(quán)限文件。默認(rèn)情況下,普通用戶也可以實(shí)現(xiàn)這個(gè)文件,從而可能造成一定的安全隱患。如現(xiàn)在系統(tǒng)中有兩個(gè)普通用戶sa01與sa02。而他們兩個(gè)都是通過(guò)遠(yuǎn)程終端連入到Unix操作系統(tǒng)中。此時(shí)假設(shè)用戶sa01知道用戶sa02的用戶名以及登錄密碼。那么就可以假冒用戶sa02的身份,把一些命令的執(zhí)行結(jié)果重定向到/dev/tty文件中。同時(shí)利用tee命令進(jìn)行分流。此時(shí)對(duì)于用戶sa02時(shí),因?yàn)槠鋱?zhí)行相關(guān)的命令在終端上仍然可以正常顯示,不會(huì)產(chǎn)生什么懷疑。但是這個(gè)用戶其可能不知道,自己執(zhí)行命令的結(jié)果已經(jīng)保存到/dev/tty文件中。而其他用戶就可以通過(guò)這個(gè)文件來(lái)顯示在其用戶終端上所顯示的信息。這顯然會(huì)導(dǎo)致用戶SA02信息的泄漏,給其帶來(lái)一定的損失。
/dev/tty這個(gè)文件可以有多個(gè)用戶同時(shí)使用,而且相互之間不會(huì)發(fā)生沖突。這個(gè)特性可以幫助系統(tǒng)工程師實(shí)現(xiàn)很多有用的功能。但是毋庸置疑的是,也造成了一定的安全隱患。為此對(duì)于大部分情況下,Unix系統(tǒng)工程師要對(duì)這個(gè)文件進(jìn)行一定的權(quán)限限制,如只有系統(tǒng)工程師(不一定是特權(quán)用戶)才可以使用這個(gè)文件。從而防止非法攻擊者利用這個(gè)文件來(lái)獲取其攻擊所必要的信息。
另外需要注意的是命令 >/dev/tty與命令> file連個(gè)命令其最終的結(jié)果有可能相同,也有可能不同。前者在把命令的顯示結(jié)果保存到/dev/tty文件中的時(shí)候,會(huì)過(guò)濾掉echo等命令設(shè)置的信息。而后者這個(gè)命令這會(huì)把顯示的結(jié)果一五一十的照搬到file文件中去。也就是說(shuō),如果在命令或者腳本程序中沒(méi)有echo等類似的命令設(shè)置信息的話在,則這兩個(gè)命令重定向文件后所保存文件的內(nèi)容是一致的。但是如果在命令或者腳本程序中有類似的提示命令的話,則兩個(gè)文件的顯示結(jié)果則會(huì)不同。為此系統(tǒng)工程師就需要根據(jù)自己的實(shí)際需要,來(lái)選擇合適的重定向文件,看看有否必要采用/dev/tty文件。筆者的態(tài)度是,只有在確實(shí)有必要的情況下,才能夠使用/dev/tty文件。因?yàn)檫@個(gè)文件是比較稀缺的,只由在缺其不可的情況下,才啟用這個(gè)文件。

網(wǎng)公網(wǎng)安備