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