自從我大微軟終于放下身段,決定給開源社群一個遲來的擁抱,追随多年的擁趸們像是突然得到了女神的垂青,各種茫然失措、痛哭流涕、歡欣鼓舞,紛紛唱了起來:“等了好久終于等到今天,夢了好久終于把夢實作……”唱完之後才想起來好像說的什麼開源、跨平台啥的和自己沒太大關系,最基本的,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