天天看點

linux的自動登入--了解linux的方式

今天在一個郵件清單中有朋友問在linux下如何做到自動登入,就是不用輸入使用者名和密碼,我的回答是在桌面上進行設定,然後那位朋友就學會了并且很高興,我敢肯定他是windows的下的老使用者...

僅僅知道如何設定自動登入實在不夠,自動登入不是linux的風格,我敢肯定如果不是在擁有桌面的linux下,在黑屏的指令行下是很少有人使用自動登入的,linux的一個意義就是網絡,而網絡的環境就是不安全,自動登入就是不安全,是以自動登入和linux的大環境是格格不入的。桌面設定自動登入十分簡單,無非就是和windows一樣的點幾下滑鼠而已,但是在這簡單操作的背後卻再一次揭示了linux的靈活和安全。

以擁有運作級别概念的發行版redhat為例,如果換成在運作級3下設定自動登入,相信會難倒一批英雄好漢的,并不是這些英雄好漢們不會,而是他們實作想不通為何這麼做,一般意義上用指令行的都是高手,用gui的很多都是剛剛入門的新手,偶爾設定一下自動登入懷念一下windows也沒有什麼不可。如果在指令行設定自動登入,并且直接用root登入的話,這是最簡單的了,因為linux啟動時就是以root使用者啟動的,如果不以root啟動,那麼很多守護程序的配置檔案以及一般守護程序本身是沒有權限讀取和執行的,是以這種情況下如果想設定自動登入,直接把/etc/inittab裡面的getty換成 bash即可,不過如果想做的更加像那麼回事,那就要自己寫一個程式,該程式可以為elf檔案也可以是腳本,隻要在程式中設定一下 home,shell,user,logname這幾個環境變量即可,因為這和shell的提示符有關,在程式的最後執行shell就可以了,記着一定執行shell,因為在執行到登入之前,系統是沒有shell的,要想和系統互動必然要有一個shell。有人可能會有疑問,如果可以如此簡單的靠修改一個 inittab啟動配置檔案就可以直接以root自動登入,那系統不是太不安全了嗎?是的,就是這麼回事,不過請問,你如果不是root權限你能修改 inittab嗎?如果你本來就是root,那麼有必要再設定一個自動登入以證明些什麼嗎?如果你真的這麼做了,那麼我可以告訴你,任何事情都證明不了,而隻會自己在你的系統上敲開一個大洞,正如我的前面的幾篇文章所述,linux不會阻止你做任何事情,隻要你有權限,是以linux就比較難以馴服,不過這也是它很強大的原因。

如果你想以非root使用者自動登入,那麼就要費一番工夫了,因為非root使用者意味着安全性提高了,從不安全的系統啟動時預設的root到安全的非 root是需要做功的,這是一個真理。linux提供了一個接口可以得到任何使用者的一些配置,比如uid,gid等等,該配置的結構如下:

struct passwd {

char *pw_name; //使用者名

char *pw_passwd; //密碼

uid_t pw_uid; //使用者id(uid)

gid_t pw_gid; //組id (gid)

char *pw_gecos; //名字

char *pw_dir; //使用者目錄

char *pw_shell; //該使用者的shell程式

};

得到該結構的接口就是:

struct passwd *getpwnam(const char *name); //name就是使用者名

當然這個接口程式誰都有權調用,其實這個接口并沒什麼,它所做的僅僅是一個封裝而已,它其實就是讀取/etc/passwd檔案,然後找到和name對應的那一行,然後把該行的其它資訊取出來,執行完這個接口會發現傳回結果的pw_passwd字段是x,說明真正的密碼在/etc/shadow中加密儲存,你完全可以不用這個接口而是自己去解析/etc/passwd檔案,得到了uid和gid後就可以切換使用者了,其實很簡單,就是在為控制台和終端設定好uid及gid後将目前程序的uid和gid也設定成結果的uid和gid,然後直接exec一個shell,該shell就是你要自動登入的使用者的 shell,在該shell上whoami一下試試看。當然如果想讓shell的提示符看起來像那麼回事,就也和前面一樣設定一下環境變量即可。

看到這裡就會發現,隻有root才可以設定uid和gid進而切換使用者,非root使用者是沒有辦法直接通過設定uid和gid的方式來切換使用者的,必須用系統提供的su等标準接口來切換,在啟動啟動的時候系統就是root,如此一來可以通過這種方式随意切換使用者達到自動登入的目的。root可以不通過密碼驗證直接登入别人的非root使用者,這并不奇怪,誰讓root是至高無上的呢?之是以可以做到這麼随意這麼簡單,還是受到了linux的程序架構的恩惠,子程序可以繼承父程序的uid和gid,實在很不錯。其實所謂的桌面方式啟用自動登入也無非就是用的這一套機制,隻是細節上有所不同罷了。

繼續閱讀