Linux之用戶和權限


自從我大微軟終於放下身段,決定給開源社區一個遲來的擁抱,追隨多年的擁躉們像是突然得到了女神的垂青,各種茫然失措、痛哭流涕、歡欣鼓舞,紛紛唱了起來:“等了好久終於等到今天,夢了好久終於把夢實現……”唱完之后才想起來好像說的什么開源、跨平台啥的和自己沒太大關系,最基本的,Linux、IOS會么?被.NET細心呵護了這許多年,現在跟我說開源跨平台,你是玩我呢?不說了,拖了幾個月的項目,老板還等着今天上線呢!

呵呵,開個玩笑,其實微軟的開放姿態是受多數方肯定和歡迎的,IT行業各方面也多少有點影響,對於我來說,最大的影響莫過於打算好好研究下Linux,這玩意一直都想系統學習,奈何沒有充足的動力,如今沒有借口了,希望能盡快入門。

按照本人博客一貫的風格,本文並非系統的講解,而是側重於方便以后的復習回顧做筆記。本文綠字為個人見解,需驗證。本系列參考書籍是《Linux就是這個范兒》,趙鑫磊和張潔著。

學習Linux第一個要面對的問題是版本選擇,尼瑪當時我一看就傻眼了,瞬間就有打道回府的沖動。大伙來瞅瞅,下面這還是07年時候的分支圖(摘自網絡),想想現在Android的景象,嘖嘖,這圖還能裝下么。

要從中選一個合適的,對門外漢來說確實不是件容易的事。開源就是這點不好,大家各行其是,說好聽點百花齊放,卻分流了本就不多的用戶群,若如此眾多的版本開發可以合力一處,windows還有笑傲江湖的資格么。雖說在服務器端因為開源的原因闖出了一片天地,但仍然無法回避占市場大頭的桌面客戶端的失利。博主認為凡事都不可走極端,純開放和純封閉都不可取,兩者相互借鑒,給予自由,但又有機構按規則統一版本控制,才是軟件發展的正確方式(maybe有某類開源協議支持博主的觀點,除了GPL,博主對其它開源協議不甚清楚)。

所幸對於我們這群碼農來說,各發行版都大同小異,一通百通。目前服務端用的比較多的免費版本非CentOS莫屬,很多書籍也采用CentOS講解,如今已到了7.1版本。

作為.NETer,雖然勾搭上了Linux,但是正房還是Windows,不可拋棄。那么如何在同台電腦上另外安裝Linux呢,要知道Linux和Windows的文件系統都不一樣,網上有此雙系統的教程,但是為了安全計,我還是選擇了虛擬機的方式。虛擬機的缺點是軟件環境是模擬出來的,比如剛說的文件系統,虛擬機里Linux的文件系統都是由windows文件系統經虛擬機轉換而來,效率上絕壁比原生安裝的低下很多。

虛擬機我選擇的是VMware Workstation,最新版11.1,注冊碼網上搜便是。在VMware界面上選擇CentOS鏡像文件,然后靜靜等待安裝完畢即可,在此期間會讓你輸入用戶名密碼作為安裝后的登錄用戶,然后是語言和輸入法選擇,完了就進入桌面了,如下:

也沒什么特別的感覺,完全沒有各類書籍里說的驚艷,maybe CentOS偏向於服務性能,對圖形界面不care,maybe Ubuntu就不一樣了。不管怎么說,我終於向前邁出了歷史性的一步!


用戶和用戶組

Linux用戶中除了root天生就很牛逼,其他用戶都是屌絲。一個用戶至少屬於一個用戶組,/etc/passwd文件中每行即表示一個用戶,其中第4列即GID表示用戶的“初始用戶組”,用戶所屬的所有用戶組稱為“支持用戶組”。還有個概念是“有效用戶組”,所謂有效用戶組表示用戶當前所在的用戶組,即用戶在同一時刻只能以一個用戶組成員的身份參與系統交互,至於為什么這么設計,目前未知。

前者說了,root很牛逼,幾乎無所不能,很極端的對立,廣大屌絲一般除了自己的一畝三分地,幾乎不能干任何“有技術含量的”事(比如添加用戶),所以有點什么事都要麻煩root。root為了不累死,決定傳授一句咒語給屌絲們,讓他們能在一段時間內具備自己(root)的能力,或者說“變身”為root,這個咒語就是sudo。比如/etc/shadow 這個文件是保存密碼的,普通用戶沒有權限查看,一定要看的話可以執行“$ sudo cat /etc/shadow”,這時系統會要求輸入當前用戶密碼,輸密碼雖然麻煩,但安全性高了,至少各類后台程序不能偷偷地搞小動作了(后來微軟也學了這招,windows vista開始,右鍵就加入了新的菜單項——“以管理員身份運行”)。要給某個用戶賦予sudo特權,就需要更改/etc/sudoers 文件中的內容,該文件能設置用戶或用戶組行使sudo權利的命令范圍,甚至可以設置sudo時不用輸入密碼,不過這自然是不安全的,不推薦。

su命令,用來切換當前用戶。所以如果嫌sudo太麻煩,就可以使用su臨時切換到root用戶,切換用戶時須輸入目標用戶的密碼。root用戶使用su命令切換到任何用戶都不需要輸入密碼,所以我們要在/etc/sudoers中明確禁止su被sudo特權執行。

和用戶組類似,用戶也有實際用戶和有效用戶(即上文說的當前用戶)的概念,分別可用who am i 和 whoami 查看。

文件[屬性和權限]

Linux環境大小寫敏感,文件名也是,在文件名前加上“.”則該文件[夾]將隱藏。和windows不同,文件基本上沒有擴展名,因為Linux不根據擴展名判斷文件類型,而是根據文件的內容來判斷。

文件連接,也是一種文件類型,基於inode,inode包含文件的元信息。我們可以將inode簡單理解成一個指針,指向文件所在磁盤中的物理位置,多個文件名可以指向同個inode,這意味着,可以用不同的文件名訪問同樣的內容;對文件內容進行修改,會影響到所有文件名;但是,刪除一個文件名,不影響另一個文件名的訪問,這種情況就被稱為"硬鏈接"(hard link)。除了硬鏈接以外,還有一種特殊情況。文件A和文件B的inode號碼雖然不一樣,但是文件A的內容是文件B的路徑。讀取文件A時,系統會自動將訪問者導向 文件B。因此,無論打開哪一個文件,最終讀取的都是文件B。這時,文件A就稱為文件B的"軟鏈接"(soft link)或者"符號鏈接(symbolic link)。軟連接和硬鏈接最大的不同是:軟連接指向的是目標文件的文件名,而硬鏈接指向的是目標文件的inode,軟連接兩個文件的inode是不一樣的,不會影響目標文件inode的連接數。更多內容可參看Linux的inode的理解

創建連接用ln,如果是復制cp命令,那么產生的是一個內容一樣的新文件。

文件權限:r、w、x、s、t。前三者分表表示讀、寫、執行。由於權限可自由組合,所以以標志位的形式設計是最合理的。用數字表示,r為4,w為2,x為1,那么5就是r-x,rwx就是7。文件按順序規定了擁有者、所屬組和其他無關者的權限權限,如777即表示所有用戶都對文件有讀寫執行權限,600表示只有擁有者有對該文件的權限,且該權限為讀寫權限即rw-。

我們可以使用chmod命令改變文件權限,如 chmod 700 testtext,這是數字權限法,還可以使用文字表示權限更改,如 chmod u+w testtext,表示給擁有者加上寫權限。u、g、o、a分別表示擁有者、所屬組、其他無關者和全部,+、-、=分別表示增加、減去、設定。

還有s、t,這兩個權限代表什么呢?先說s,將文件的擁有者和用戶組權限的執行位設置成s,分別稱之為SUID和SGID,對二進制程序有效,SGID還能用在目錄上。一個文件本身具有uid和gid的屬性,表示擁有者和所屬組,在文件被執行時,還會多出兩個屬性——euid和egid——分別表示執行文件的有效(當前)用戶ID和有效(當前)用戶組ID,Linux內核主要是根據euid和egid來確定進程對資源的訪問權限。下面舉個例子就清楚了:

假設文件myfile是屬於foo用戶的,是可執行的,現在沒設SUID位,權限位是rwxr-xr-x,foo用戶的uid和gid分別為200和201。另有一用戶kevin,他的uid和gid分別為204和202。那么kevin運行myfile程序形成的進程的 euid=uid=204,egid=gid=202,內核根據這些值來判斷進程對資源訪問的限制,其實就是kevin用戶對資源訪問的權限,和foo沒關系。然后我們將myfile設為SUID,則euid和egid變成被運行的程序的所有者的uid和gid,即現在kevin用戶運行myfile,euid=200,egid=201,則這個進程具有它的屬主foo的資源訪問權限。http://i.cnblogs.com/EditPosts.aspx?postid=4678311

不知道執行SUID文件過程中,之前提到的系統的有效用戶和有效用戶組是否也對應於執行文件時的euid和egid, 即上例后半部,kevin運行myfile時,此時的系統有效用戶是kevin還是foo呢?這個問題留待日后驗證。

SUID的作用就是這樣:讓本來沒有相應權限的用戶運行這個程序時,可以訪問他沒有權限訪問的資源。

SGID在二進制程序上的功效和SUID類似,在目錄上能產生如下效果:假設該目錄的所屬組為gA,那么有效用戶組為gB的用戶進入此目錄后,該用戶的有效用戶組就變成gA了,那么創建新文件,新文件的用戶組就是gA。SGID如此,那么是否上述紅字描述的問題也是一般答案呢?

更多內容可參看linux:SUID、SGID詳解

t,將文件的其他無關者權限執行位設為t,稱為SBIT,僅對目錄有效。功效:用戶在設置了SBIT目錄下創建的文件,只有自己和root才有權利刪除此文件。


其它

$PATH環境變量,決定了shell將到哪些目錄中尋找命令或程序,PATH的值是一系列目錄,當您運行一個程序時,Linux在這些目錄下進行搜尋編譯鏈接。

cpio命令:顧名思義,即輸入輸出的copy,現代電腦的標准輸入就是鍵盤,標准輸出是屏幕,我們可以通過重定向(|、>、<)輸入輸出,用它進行文件拷貝、打包解包等,和find等命令一起能發揮很大功效。關於cpio命令的中文man,可參看cpio命令詳解

fork:拷貝一個子進程。如果一個進程fork之后,此時連同該進程是3個進程(該進程、fork后的父進程、fork后的子進程)呢,還是2個進程(該進程即fork后的父進程、fork后的子進程)呢?日后再解。

小結

接觸到現在,概念倒還罷了,Linux的命令也忒多了,目前簡單了解的有:man、cd、cp、kill、mkdir、mv、rm、nohup、cpio、ls、ln、jobs、find、whereis、which、type、tar、chmod、chown、su、sudo、gzip、cat、tail、bg、fg、at、crontab、echo、fork、ps、top……且不說每個命令各自的命令參數,尼瑪,只能說用多如牛毛來形容了。

 

相關資料:

Shell腳本:Linux Shell腳本學習指南(超詳細)

 

轉載本文請注明出處:http://www.cnblogs.com/newton/p/4678311.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM