通過(guò)串行終端登錄至系統(tǒng)和經(jīng)由網(wǎng)絡(luò)登錄至系統(tǒng)兩者之間的主要(物理上的)區(qū)別是:通過(guò)網(wǎng)絡(luò)登錄時(shí),終端和計(jì)算機(jī)之間的連接不是點(diǎn)對(duì)點(diǎn)連接。在這種情況下,login只是一種可用的服務(wù),這與其他網(wǎng)絡(luò)服務(wù)(例如FTP或SMTP)的性質(zhì)相同。
在終端登錄中,init知道哪些終端設(shè)備可用來(lái)進(jìn)行登錄,并為每個(gè)設(shè)備生成一個(gè)getty進(jìn)程。但是在網(wǎng)絡(luò)登錄情況下,所有登錄都經(jīng)由內(nèi)核的網(wǎng)絡(luò)接口驅(qū)動(dòng)程序(如以太網(wǎng)驅(qū)動(dòng)程序),事先并不知道將會(huì)有多少這樣的登錄。我們不是使一個(gè)進(jìn)程等待每個(gè)可能的登錄,而是必須等待一個(gè)網(wǎng)絡(luò)連接請(qǐng)求的到達(dá)。
為使同一軟件即能處理終端login,又能處理網(wǎng)絡(luò)login,系統(tǒng)使用了一種稱為偽終端(pseudo terminal)的軟件驅(qū)動(dòng)程序,它仿真串行終端的運(yùn)行行為,并將終端操作映射為網(wǎng)絡(luò)操作,反之亦然。
1、BSD網(wǎng)絡(luò)登錄在BSD中,有一個(gè)稱為inetd的進(jìn)程(有時(shí)稱之為因特網(wǎng)超級(jí)服務(wù)器),它等待大多數(shù)網(wǎng)絡(luò)連接。
作為系統(tǒng)啟動(dòng)的一部分,init調(diào)用一個(gè)shell,使其執(zhí)行shell腳本/etc/rc。由此shell腳本啟動(dòng)一個(gè)守護(hù)進(jìn)程inetd。一旦此shell腳本終止,inetd的父進(jìn)程就變成init。inetd等待TCP/ip連接請(qǐng)求到達(dá)主機(jī),而當(dāng)一個(gè)連接請(qǐng)求到達(dá)時(shí),它執(zhí)行一次fork,然后生成的子進(jìn)程執(zhí)行適當(dāng)?shù)某绦?/strong>。
我們假定到達(dá)了一個(gè)針對(duì)TELNET服務(wù)進(jìn)程的TCP連接請(qǐng)求。TLENET是使用TCP協(xié)議的遠(yuǎn)程登錄應(yīng)用程序。在另一臺(tái)主機(jī)(它通過(guò)某種形式的網(wǎng)絡(luò)與服務(wù)進(jìn)程的主機(jī)相連接)上的用戶,或在同一臺(tái)主機(jī)上的用戶啟動(dòng)TELNET客戶端進(jìn)程,由此啟動(dòng)登錄過(guò)程:
telnet hostname
該客戶進(jìn)程打開一個(gè)到hostname主機(jī)的TCP連接,在hostname主機(jī)上啟動(dòng)的程序被稱為TELNET服務(wù)進(jìn)程。然后,客戶進(jìn)程和服務(wù)進(jìn)程之間使用TELNET應(yīng)用協(xié)議通過(guò)TCP連接交換數(shù)據(jù)。所發(fā)生的是啟動(dòng)客戶進(jìn)程的用戶現(xiàn)在登錄到了服務(wù)進(jìn)程所在的主機(jī)。(自然,用戶需要在服務(wù)進(jìn)程主機(jī)上有一個(gè)有效的賬號(hào))。
然后,telnetd進(jìn)程(TELNET服務(wù)進(jìn)程)打開一個(gè)偽終端設(shè)備,并用fork分成兩個(gè)進(jìn)程。父進(jìn)程處理通信網(wǎng)絡(luò)連接的通信,子進(jìn)程則執(zhí)行l(wèi)ogin程序。父、子進(jìn)程通過(guò)偽終端相連接。在調(diào)用exec之前,子進(jìn)程使其文件描述符0、1、2與偽終端相連。如果登錄正確,login就執(zhí)行與終端登錄中同樣的步驟:更改當(dāng)前工作目錄為起始目錄,設(shè)置登錄用戶的組ID和用戶ID,以及登錄用戶的初始環(huán)境。然后login調(diào)用exec將其自身替換為登錄用戶的登錄shell。
需要理解的重點(diǎn)是:當(dāng)通過(guò)終端或網(wǎng)絡(luò)登錄時(shí),我們得到一個(gè)登錄shell,其標(biāo)準(zhǔn)輸入、輸出和標(biāo)準(zhǔn)出錯(cuò)連接到一個(gè)終端設(shè)備或者偽終端設(shè)備上。這一登錄shell是POSIX.1會(huì)話的開始,而此終端或偽終端則是會(huì)話的控制終端。
2、linux網(wǎng)絡(luò)登錄除了使用擴(kuò)展的因特網(wǎng)服務(wù)守護(hù)進(jìn)程xinetd替代inetd進(jìn)程外,Linux網(wǎng)絡(luò)登錄的其他方面與BSD相同。xinetd進(jìn)程對(duì)它所啟動(dòng)的各種服務(wù)的控制比inetd提供的更加精細(xì)。
本篇博文內(nèi)容摘自《UNIX環(huán)境高級(jí)編程》(第二版),僅作個(gè)人學(xué)習(xí)記錄所用。關(guān)于本書可參考:http://www.apuebook.com/。
新聞熱點(diǎn)
疑難解答
圖片精選