天天看點

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

Linux/Unix技術叢書 點選檢視第二章 點選檢視第三章

Linux實戰

Linux in Action

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

[美] 戴維·克林頓(David Clinton) 著

張凱龍 王路陽 李鵬 等譯

第1章

歡迎使用Linux

本章内容提要

  • 什麼讓Linux不同
  • 基本的實踐技能
  • 擷取幫助

本書并非是要開展技術教育訓練。盡管其他的書籍、課程及線上資源都圍繞技能(skill)來組織其内容,但我将采用實際的項目(project)作為教學工具。Linux系統的每一個核心技能以及功能都将被包含,而且在項目需要時還會詳細介紹。當完成一個項目時,你将會學到你從傳統資源中所能學到的一切,而且你還将了解如何執行諸多關鍵和複雜的管理任務,并且會輕松地開展更多的工作。

前兩三章将快速引導你進入Linux伺服器的世界。之後,你将親自動手完成并改造一組實踐項目,注意,全部都是要親自動手的實踐項目。通過這些項目,你将學會比一組指令和技能更多的知識。請準備好深入學習并最終為你自己的業務問題建立解決方案。

沒有任何一本書能夠提前預估你在職業生涯中将會面臨的所有挑戰。但是,通過展示如何使用實際的工具來解決實際問題,本書将使你對聯機文檔及網際網路上的豐富資源得心應手。如果之前你的Linux經驗較為有限,本章會介紹一些基本的指令行使用技能,并且在出現問題時為你指明方向。

注意:如你所見,指令行(command line)是作業系統(OS)提供的一個接口,它允許你輸入字元指令控制作業系統或者查詢其所管理的資料。

需要說明的是,在本書的每一章中,我都非常建議你親自對所有内容進行實驗。除了實際開展實踐,沒有更好的方式來真正掌握IT技能的核心,當你意識到它并沒有按照你所期望的方式工作時,要持續嘗試直到将它掌握。祝你在此過程中好運且充滿樂趣!

1.1 是什麼讓Linux與其他作業系統不同

Linux是一款免費的作業系統,這意味着在任何需要的時間和需要的地點它都要比其他作業系統更容易安裝。不用擔心購買網站授權并受到數字版權管理(Digital Rights Management)的制約,這對所有類型的組裝機器以及伺服器配置的測試變得更加直接。

Linux讓開展各種實際有用且具有創造性的事情成為可能。例如,你可以在一個U盤上裝載Linux的自生系統引導映像(live boot image),啟動一台硬碟已經崩潰的計算機,之後查找并解決該問題(你将在第6章學習具體的操作方法)。或者,因為Linux是一個真正的多使用者作業系統,它具有非常好的私密性和穩定性,整個團隊可以同時從本地或遠端登入進行工作。

Linux的建構采用了一些與UNIX作業系統相同的技術,并帶有大多數與深度成熟的UNIX作業系統相一緻的工具。這極大地增加了穩定性與安全性。Linux的發行版還提供了複雜的軟體包管理系統,可以可靠地安裝和維護每一個線上資源庫中成千上萬的免費軟體應用。

Linux不僅是免費的,更是開源的(open source),這意味着任何人都可以獲得其代碼并根據自己的需求進行修改。事實上,這已經孵化出專屬Linux各發行版的巨大生态系統。一個發行版(distribution,有時縮寫為distro)是一個定制的軟體包,它将Linux核心以及使用者計算機Linux運作版的安裝工具一起釋出。表1-1給出了一個不完整的發行版清單,以對可用的Linux類型進行說明。

帶你讀《Linux實戰》之一:歡迎使用Linux第1章
帶你讀《Linux實戰》之一:歡迎使用Linux第1章

找不到你想要的版本嗎?你可以自己建立一個。需要幫助嗎?線上有大量活躍的社群,在那裡如果沒有人能幫助你直接解決問題,他們也會知道去哪裡解決。更為重要的是,我想說正是基于社群的資源真正地讓Linux變得如此強大。

1.2 基本的實踐技能

在開始本書後續部分中那些企業級的項目之前,一件值得做的事情就是确認我們的基礎處于同一起跑線。本章包括了Linux基礎:UNIX檔案系統層次結構标準(包括僞檔案系統)、導航指令(ls、pwd和cd)、檔案管理工具(cat、less、touch、mkdir、rmdir、rm、cp和mv)、一些技巧(如tab補齊以及檔案通配符)、sudo以及在哪裡查閱幫助(man、info和journalctl)。

你可能已經擁有了足夠多的經驗,這樣的話就無須學習這些内容。那麼,請輕松地跳過本章即可。不要擔心其他人,我們會跟上來。

安裝Linux

我不打算花時間來讨論如何把Linux安裝到計算機上。這并不是因為安裝工作非常簡單,相反安裝有時也可能相當複雜。這是因為你選擇的具體方法與具體環境密切相關。描述一種或者甚至六種可能性隻會惹惱75%的人,因為這些情景對他們而言是無用的。

需要關于安裝的幫助嗎?請查閱Manning 2016年出版的《Learn Linux in a Month of Lunches》一書。遇到具體的安裝問題了嗎?花一點時間寫一個簡潔而又詳細的描述,然後在網際網路上搜尋以尋求幫助。正在尋找一款預裝了Linux的筆記本或桌上型電腦嗎?請在網際網路上搜尋“預裝了Linux的計算機”。手上有一些無用的硬體和U盤嗎?請搜尋“從USB安裝Linux”。更想将Linux安裝為一個虛拟機嗎?明智的行為。請前往第2章。

1.2.1 Linux檔案系統

人們常說Linux中的一切都是通過純文字檔案工作的,是以,從了解Linux檔案系統開始可能是最有意義的事情。但在開始學習Linux之前,首先需要弄明白檔案系統(file system)是什麼?你可以将檔案系統看作在具有确定硬碟位置的單個檔案和檔案組之間建立了顯式連接配接的一個資料表(或者一個索引,index)。圖1-1能夠幫助你形象地檢視分布在硬碟中的資料如何以目錄結構的方式呈現給系統使用者。

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

為什麼需要索引?因為像硬碟或USB裝置這樣的數字儲存設備并不能被劃分為用于組織檔案夾(folder,或目錄,directory)的實體分區。一個特定的檔案可能駐留在實際實體媒體的某個位置,其距離另一個大約在幾分鐘或幾秒鐘之前建立的相同檔案很遠,而且,一個檔案的所有塊可能不是連續的。不僅如此,一個檔案在硬碟上的實體位置也無須一直固定。

如果希望資料是可靠擷取的,你将需要某種類型的索引始終指向所需要的資源。檔案系統使用這樣的索引來呈現單個硬碟分塊(即分區,partition)中的一組被組織起來的目錄和檔案。

注意:如果有時你需要更加深入地了解該主題,了解目前最為常用的Linux檔案系統—ext4将很有用。當然,Linux也可以在使用如FAT32和NTFS等其他檔案系統格式化過的存儲驅動器上運作。

硬碟分區中的所有檔案都被儲存在根目錄(root directory,用正斜杠符号“/”表示)下的目錄中。這些目錄的組織方式主要由UNIX檔案系統層次結構标準(Filesystem Hierarchy Standard,FHS)決定。無論是使用Linux發行版、UNIX或者甚至是macOS,你都将看到非常多相同的基礎結構。圖1-2給出了一些最為常用的、頂層的目錄。

頂層目錄,即直接位于根目錄下的那些目錄—包括目錄/etc/,其中包含定義個體程式和服務功能的配置檔案,以及目錄/var/,其中包含屬于系統或各個應用的、在系統運作過程中内容頻繁改變的可變(variable)檔案。你應該還想了解配置設定給每個使用者的/home目錄,它為各使用者存放其私有檔案。

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

1.2.2 探索:Linux導航工具

本節将學習五個最為基礎和必備的Linux導航指令(ls、pwd、cd、cat和less)。由于指令行并非是一個特别可視化的環境,無論你嘗試做什麼,你都将在很大程度上依賴這五個工具來确定自己的方向。

注意:我認為,你應該在自己的計算機上嘗試使用這些工具。這将是你學習的唯一方式。

本書的後續部分需要這樣那樣的指令行終端。不幸的是,并沒有一個可以打開在所有Linux發行版中都能運作的終端視窗的通用方式。例如,Ubuntu菜單系統中終端的位置無須和Fedora或Mint中的比對。那Ubuntu本身呢?我想,這取決于你運作的是哪個版本。

至少,在大多數環境中組合鍵Ctrl-Alt-t應該是可以使用的,如同在應用菜單中使用名稱terminal進行搜尋一樣。一旦打開終端,将會預設進入使用者的home目錄(/home/使用者名/)。

ls(LIST,列舉)

如果你在終端上沒有看到任何内容,那麼在它周圍徘徊就沒有意義。在目前目錄下,你可以用ls列出檔案及子目錄的名字。帶有l标志(l表示long,即長格式)的ls指令不僅會列出對象的名字,還會列出檔案的權限、所有者、組檔案大小以及時間戳等資訊。為指令添加諸如/var/的目錄名稱則會顯示該目錄下的内容,如下所示:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

當給ls -l指令添加h參數時,會以使用者可讀的格式—KB(千位元組)、MB(兆位元組)以及GB(千兆位元組)來顯示檔案的大小,而不是位元組形式,後者包含很多難以計數的數位:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

注意:通常可以用以下兩種方式之一為Linux指令添加參數:一個破折号後跟一個字母(就像修飾ls指令的參數h),或者兩個破折号來引用該參數更為冗長的形式。本例中,ls --human-readable會得出與ls -h完全相同的輸出。幾乎所有的Linux指令都帶有完整的文檔,我們将在本章的後續部分進行闡述。

想知道在目前目錄下有什麼内容嗎?為ls指令添加一個大寫的R參數會顯示子目錄及它們包含的檔案與子目錄,無論這些目錄的嵌套層數有多少。為了恰當地呈現結果會是多麼有關以及多麼有用,隻需對/etc/目錄樹再次運作ls -h指令:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

pwd(顯示工作目錄)

很多情況下,在檔案系統中所處的目前位置會顯示在指令提示符的左側。本例中,目前使用者位于/etc/目錄下的network目錄中:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

由于你可能發現自己工作的系統上沒有提示符,而有時又可能需要快速地了解目前的位置。此時,輸入pwd指令将列印出使用者目前所處的工作目錄:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

cd(改變目錄)

一旦你知道了目前所處的位置以及在目前目錄下能夠立即通路的内容,你将需要知道如何改變位置。在指令行解釋器(通常為Bash)中輸入cd指令可以切換到指定目錄。當使用者第一次打開一個終端會話(常被稱為shell)時,使用者将發現其已預設地進入自己賬戶的home目錄。如果運作pwd指令,将可能看到類似下面的資訊:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

何為Bash

Bash可能是最流行的UNIX shell。非常好!但shell是什麼?shell是唯一通過指令行接口(CLI)或圖形使用者接口(GUI)解釋使用者指令的使用者接口。你可以将shell(如圖中所示)看作是使用下層核心與硬體系統資源來執行所有适當格式化指令的軟體層。換句話說,它是使用者與計算機交流的方式。

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

shell解釋使用者輸入指令的執行

現在,讓我們通過輸入指令cd和正斜杠傳回根目錄:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

再次運作ls指令,看看會顯示什麼(你将看到圖1-2中呈現的目錄)。請注意你可以從home目錄通路你的yourname目錄。要想切換到這裡列出的子目錄中的任何一個,請輸入cd及想要通路的目錄名。由于這裡給定的路徑是目前位置的相對(relative)位置,就無須在該目錄名前增加一個正斜杠字元。cd..指令将會回退上一級目錄,例如,從/home/yourname/目錄回退到/home/。

然而,如果你已經擁有更加雄心勃勃的行程安排,而且想檢視遠離目前目錄的内容,你将需要使用絕對(absolute)路徑。這意味着你将一直使用一個以根目錄(用正斜杠表示)開始的路徑。要想從系統的其他某處傳回使用者的home目錄,請依次輸入正斜杠、home(請記住,其在根目錄中)及使用者名。可以嘗試如下指令:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

也就是說,輸入不帶參數的cd指令将把你帶回目前登入使用者的home目錄。

cat(将檔案内容列印到輸出)

在一個終端中通路文本檔案的内容有時可能會有些棘手。cat工具會把檔案内容列印到螢幕,允許閱讀但不能編輯。對于諸如/etc/目錄下的fstab等較短的文檔而言,這種方式會運作得非常好。下面的示例中使用了一個絕對路徑,進而,無論當時你處于檔案系統中的什麼位置,該檔案都能被找到:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

注意:指令名cat實際上是concatenate的縮寫,它反映出該工具的用途是将多個字元串或檔案連接配接到單個文本流中。

假設想要讀取的檔案所包含的行數超過了單屏可以顯示的行數。例如嘗試檢視/etc/group檔案:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

可能的情形是,前面的行向螢幕上方滾動和消失的速度太快,以緻你無法閱讀。如果你不能閱讀純文字檔案,那它能有什麼用處呢?當然,如你即将看到的,Linux提供了大量的文本編輯器來管理内容,但是,能夠每次一屏地閱讀一個長檔案會是非常好的。

less(顯示檔案内容)

歡迎使用less指令—推測一下,這樣命名應該是由于它能快速地讀取和顯示少于(less)整個檔案的内容(或者,可能是為了将其與早期的more指令進行對應區分)。通過對一個現有檔案運作less指令即可啟動該指令:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

使用less指令,你可以使用箭頭、PgUp(上翻頁)、PgDn(下翻頁)以及空格鍵來上翻、下翻整個檔案。工作完成後,按下q鍵退出。

1.2.3 完成任務:Linux檔案管理工具

如果你已經獲得了檔案和目錄,你将需要了解如何建立、銷毀、移動和拷貝它們。檔案通常是由軟體安裝或自動的日志生成等外部過程自動建立的,或者說,是将你的工作儲存在像LibreOffice這樣的辦公工具包中時建立的。在這裡讨論所有這些建立方式沒有太多必要。然而,我想說的是你可以使用touch指令來快速地建立一個空檔案,指令後面是你想起的檔案名:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

然後使用ls指令就可以看到,該檔案已經存在于目前目錄中。使用cat指令來顯示檔案的内容,當然,因為之前隻是建立了檔案,是以該指令執行後根本不會顯示任何内容:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

使用touch指令來“觸及”一個已存在的檔案會更新該檔案的時間戳,而不會對其内容做任何更改。如果你因為某種原因想更改如ls等不同指令列舉或顯示檔案的順序,那麼這就很有用。

當然,僅通過建立裝滿空檔案的目錄并不能讓你在這個快節奏、競争激烈的世界中走得太遠。最終,你将需要用内容填充這些檔案,然後編輯已經存在的那些内容。為此,你一定想為自己找到一個可靠的文本編輯器。

在我把自己一頭紮進非常危險的境地之前,我應該說明的是很多人對他們的文本編輯器産生了強烈的感情。你可曾禮貌地向Vim使用者暗示過他們珍貴的編輯器可能并不像以前那樣有用和重要了?你當然沒有。如果你做了類似的事情,你将無須親自閱讀本書。

我不會清楚地告訴你必須使用什麼文本編輯器。然而,我将會告訴你全功能的文字處理器工具,如LibreOffice和MS Word永遠不(never)應該用于Linux的管理工作。那些應用将對文檔添加各種類型的隐藏格式,這會破壞系統級的檔案。粗略地講,這裡有三類編輯器适合你的工作:

  • 如果你更喜歡處理GUI環境中的文檔,那麼一個簡單的純文字編輯器(plain-text editor,Ubuntu中稱為Text Editor),如gedit,就非常好了。不同的文法高亮工具也可以讓編碼和腳本編寫更為高效,而且你可以非常确信這類工具隻會儲存你所見的文本内容。
  • 當需要從終端會話中編輯一個檔案時,具有直覺接口的nano(或Pico)等指令行編輯器(command-line editor)就可以勝任。
  • 最後是Vim(或者其原始版本:vi)。如果你願意用幾個月的時間來學習一個令人費解的接口主要是什麼,那麼,你将獲得大大提高工作效率的終生回報。就這麼簡單。

注意:我的所有書籍、文章以及與課程相關的文檔都是用gedit編寫的。為什麼?我個人喜歡gedit。

為什麼不立即花一兩分鐘用上述的三個文本編輯器對所建立的myfile檔案做一些編輯呢?示例如下:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

對于Vim編輯器,用i鍵可以進入插入模式(Insert Mode),然後輸入文本。如果你不想将餘生都陷入Vim中,可以先按下Esc鍵,再輸入:w,即可儲存所做的編輯工作,之後輸入:q退出。

建立和删除目錄

Linux檔案系統中的每一個對象都是由稱為i結點(inode)的中繼資料的唯一集合來表示的。我猜你可能會說,之前讨論的檔案系統索引是從驅動器上與所有這些i結點相關的中繼資料得來的。要想顯示之前用touch指令建立的檔案的更多資訊,包括i結點資訊,你可以使用stat指令,操作及結果如下:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

如你所見,輸出資料包括檔案名、檔案屬性和時間戳。但是,它也給出了i結點的ID号。重要的是要意識到,當你移動、拷貝或删除一個檔案或目錄時,你真正進行的操作是編輯它的i結點屬性,而非它的ID。順便說一下,i結點是UNIX系統采用的對象,用以确定實體存儲位置及其在檔案系統中的檔案屬性(如圖1-2所示)。通常,每個檔案或目錄将隻對應一個i結點。

假設你正位于自己的home目錄,為什麼不建立一個用于實驗的新目錄呢?為此,你需要使用mkdir指令:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

現在,轉到新的目錄并在該目錄下建立一個檔案:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

接下來,你可以看到如何删除對象,回退到父目錄(使用cd..)并删除剛剛建立的目錄。奇怪的是,預先定義的目錄删除指令rmdir在這種情況下并不工作。請自己試試:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

“目錄不能為空?”什麼意思?這是一個内置的檢查,以防止意外删除你可能已經忘記仍存放有重要檔案或子目錄的目錄。要解決這個問題,你可以做一些處理。

一種方法是為rmdir指令增加--ignore-fail-on-non-empty參數,但是該參數需要令人厭煩的大量輸入。另一種方法是手動通路每個子目錄,并逐個删除所能發現的每個對象。但某些時候這可能會相當糟糕。當你百分之百确定目錄下絕對沒有所需要的内容時,最快的方法是為rm指令添加-r标志(表示遞歸,recursive):

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

現在應該是一個告訴你在基于GUI桌面接口和使用指令行進行工作的一個重要差別的好時機:指令行沒有資源回收筒。如果你用rm(或rmdir)删除了某些内容,之後又後悔了,總的來說,你是沒有辦法進行恢複的。畢竟,考慮一下即将釋放的存儲空間。

拷貝并移動檔案

接下來,建立一些檔案及一個新目錄:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

使用cp指令可以建立一個與對象完全相同的副本。這個示例中,在newdir目錄中建立file1檔案的一個副本:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

順便說一下,cp指令知道該指令行應該做什麼,因為它足夠聰明,可以識别newdir是一個檔案夾而不是一個檔案。如果目前位置中沒有名為newdir的目錄,cp指令反而會建立一個新的名為newdir的file1檔案副本。如果你和我一樣,有時可能會意外地拼錯指令,那麼最終你會得到一個奇怪的新檔案而不是你所希望的目錄。無論如何,要檢查并确認每件事都在按照預期進行工作。

與cp指令不同,mv指令會永久地把檔案從一個位置移動到另一個位置。是以,如果你要把一個檔案從你的home目錄移動到newdir子目錄,原始檔案将不複存在:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

請再一次親自檢查結果。你可以使用與檔案操作相同的指令來拷貝、移動或删除目錄,在有必要的地方也可以添加-r标志。請記住,你正在移動的可能不僅僅是你看到的目錄:任何已存在的不可見的嵌套層也會被移動。

檔案名通配符

如果在那些人提出通配符(globbing)這一名詞時我就在現場,我肯定會敦促他們重新考慮。它可能是在說一個熱氣騰騰的沼澤怪物?或者是高速公路上化工廠的意外排放?實際上,自globbing(源自global一詞)産生以來就是指将通配符應用到指令所用的檔案名。

如果要移動或複制多個檔案,并且想要避免逐個輸入所有的檔案名,通常你可以使用通配符(*)來進行全局操作。為了将目前目錄下的所有内容移動到某個其他位置,你可以進行如下操作:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

僅要移動檔案名中包含特定字元串的檔案時,你可以嘗試如下指令:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

該指令會移動檔案名以file開始的檔案,同時不會影響其他檔案。如果檔案名有file1、file2……file15且隻想移動從file1到file9的檔案,應該使用問号(?)而不是星号(*):

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

這個問号表示,僅對檔案名中包含file及一個其他字元的檔案進行操作。這會将檔案file10到file15保留在目前目錄中。

删除檔案

如較早前所學習的,可以用rm删除對象。但請記住,這些操作實際上是不可逆的。如果你想删除檔案file1,可以輸入如下指令:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

檔案名通配符也可以采用與cp或mv相同的方式在rm指令中使用,而且效果相同。是以,如下指令将會删除目前目錄下以file開頭的所有檔案:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

為删除操作添加-r參數将執行遞歸删除,并且删除指定路徑下所有子目錄中的内容:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

實際上,這種組合是非常危險的,以root權限工作時更是如此,因為此時你也可以操作所有的系統檔案。是以,在廣泛使用rm指令之前,的确應該非常謹慎。

1.2.4 鍵盤技巧

我懷疑有人純粹是因為樂趣而打字。我猜測,如果告訴人們用40%以下的輸入量就能完成他們的工作,大多數人都會非常欣喜。好了,我将為你節省大量的輸入時間。

剪切與粘貼

首先,盡管你已經看到了相反的情況,但你可以向終端中拷貝或粘貼文本。的确,大家所熟悉的組合鍵Ctrl-c(拷貝)和Ctrl-v(粘貼)在Bash shell會話中并不能使用,但是Shift-Ctrl-c和Shift-Ctrl-v則是可以的。你也可以點選滑鼠右鍵并選擇菜單中的操作來進行剪貼和粘貼。相信我,這将很不相同。隻要想象一下,你從可靠的線上資源中偶然得到了一個确實很長的指令序列,就像下面的指令序列:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

你想輸入所有内容嗎?我不會。在這裡,剪切和粘貼就非常有用。

TAB鍵補齊

你會真心希望了解這個方法的。Bash會跟蹤你的位置及環境,并在你輸入新的指令時進行監視。基于目前環境中的檔案和目錄,如果你輸入的字元包含任何關于你的最終目标的線索,按下Tab鍵讓Bash在指令行上顯示出最佳的推薦結果。如果這就是你要的結果,按下Enter鍵并開始執行就好了。

這裡給出一個示例。假設你已經下載下傳了一個全名為foo-matic-plus_0.9.1-3_amd64.deb的軟體歸檔檔案。你想将該檔案拷貝到可以将其解壓的工作目錄中。通常情況下,你需要輸入如下指令:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

但是,如果該檔案就在目前目錄下且假設它是目錄中以foo開始的唯一檔案,那麼你要做的隻是敲入cp foo并按下Tab鍵。Bash會為你補齊檔案名的剩餘部分。當然,由于Bash沒有讀心術,你至少還得敲入足夠的目的位置資訊以便用Tab鍵補齊剩餘内容。

自己嘗試一下。使用touch建立一個檔案名奇長的檔案,然後嘗試用Tab鍵補齊的方法來删除或拷貝該檔案。以下就是我給出的例子:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

1.2.5 僞檔案系統

一個标準檔案是可以被重複通路的資料的集合。相反,Linux僞檔案(就像那些存在于/sys/和/proc/目錄中的檔案)中的内容并不以通常形式存在。僞檔案中的内容由作業系統動态生成,用于表示某些特定的值。

例如,你可能想知道某個硬碟的總空間有多少。我向你保證,Linux會很樂意告訴你。讓我們使用名為cat的指令行程式來讀取系統的一個檔案,該檔案包含sda硬碟上的位元組數量:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

注意:如果系統中的第一個儲存設備被稱為/dev/sda,那麼,如你所能想到的,第二個就是/dev/sdb,第三個會是/dev/sdc。最初,sda可能表示SCSI Device A(SCSI裝置A),但我發現将其了解為Storage Device A(儲存設備A)更有意義。也許你還會遇到裝置名如/dev/hda(硬碟驅動器)、/dev/sr0(DVD驅動器)、/dev/cdrom(是的,一個CD-ROM驅動器),或者,甚至是/dev/fd0(軟碟驅動器)。

還有相當簡單的方法來擷取該類資訊。例如,在圖形使用者界面檔案管理器中,在驅動器上可以點選滑鼠右鍵,但是,/sys/目錄中的僞檔案是所有系統程序所依賴的公共資源。

不知道你的驅動器名稱嗎?沒關系。我們知道Linux以塊裝置(block device)的模式來組織連接配接的存儲器,切換到/sys/block/目錄并列出其内容即可。在這些内容中有一個名為sda/的目錄(請記住sda代表儲存設備A)。這是系統啟動時使用的第一個驅動器:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

請移動至sda/目錄并運作ls指令。在目錄中,你可能會看到名如sda1、sda2及sda5的一些檔案。每一個檔案都表示Linux建立的一個分區,這可以更好地組織驅動器上的資料:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

1.2.6 向他們展示誰才是老大:sudo

出于實際考慮,使用具有全部管理權限的作業系統賬戶來日複一日地進行計算是沒有必要且是非常危險的。另一方面,将你完全限制為沒有管理權限,也極有可能會讓你無法完成任何工作。

許多Linux版本都通過提供具有管理者權限的標明賬戶來解決這一問題,該授權在大多數場合下隻是純理論的,但在需要時可以通過在指令前加上sudo來進行調用。一旦你用密碼驗證了身份,你的指令就會被當作root使用者的指令來處理:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

注意:在安裝Linux時預設建立的使用者将具有sudo權限。

在本書的全部内容中,說明指令行示例時,對于不需要管理者權限的指令使用指令提示符$表示,對于需要管理者權限的指令則使用#表示,而非$ sudo。由此,一個非管理者的指令具有如下形式:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

一個sudo指令則具有如下形式:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

1.3 擷取幫助

無論如何,IT項目常常會帶來麻煩。解決首次遇到的問題,或是面對一個很久都沒有遇到的任務以緻你忘記了精确的文法,這些情況都可能會很複雜。你将需要尋求幫助。以下是一些值得關注的内容。

1.3.1 man檔案

依照慣例,建立和維護支援Linux指令的軟體開發人員也會編寫一個高度結構化的文檔手冊,稱為man檔案。當安裝了一個Linux程式,其man檔案通常會被随之安裝,進而可以在指令行輸入man及指令名來檢視這些幫助檔案。不論你相信與否,man系統本身也有一個man檔案,是以,我們可以如下形式來通路:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

當你在自己的計算機上運作該指令時,你将看到第一個字段NAME,它包括指令的簡介,SYNOPSIS提供了詳細的文法資訊,DESCRIPTION提供了該程式的更多描述,它通常包括一個指令行及參數清單。如果幸運的話,EXAMPLES中會有一些有用的示例。

有時,man檔案可能會非常大,是以,浏覽整個文檔來查找一個特定的細節是不切實際的。鑒于各種曆史原因,在浏覽器及文字處理工具等現代應用中可用的本地搜尋操作組合鍵Ctrl-f在這裡并不可用。為頂替它,按下/鍵可以切換至螢幕底部的文字輸入區,在這裡可以輸入要搜尋的内容。如果第一個高亮顯示的内容并非要查找的,按下n鍵(如果需要的話,按很多次)對文檔進行前向搜尋以查找相同的串,直至找到所需的内容。

1.3.2 info指令

如果你碰巧知道所要查詢的指令或程式的名字,man系統就非常适用。但假設你忘了指令的名稱。在指令提示符後輸入info,根據Bash标準你将被帶入一個完全互動式的環境中:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

如圖1-3所示,其内容按照主題首詞(如Basics和Compression)字母順序組織。你可以用上、下箭頭按鍵來滾動行;當你找到了感興趣的主題,即可按下Enter鍵切換到該主題的頁面。

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

假如你想學習更多關于檔案權限的内容。從Basics區域向下滾動,直到到達File permission(檔案權限),按下Enter鍵。該頁的Menu section(菜單區域)說明其後的行是切換到更多下一級頁面的連結。按下u鍵傳回到上一級頁面,按下q鍵将完全退出Info工具。

我感覺,Info在社群中并沒有像預期的那樣得到廣泛應用。實際上,我有一個關于Info的暗黑秘密想分享—在我注意到它之前的10年間,我已經在使用Linux了。

預設情況下Info系統可能不會安裝在一些Linux伺服器的發行版中。如果在指令提示符後輸入info不能給你想要的結果,你可以使用指令sudo apt install info來進行安裝(在Ubuntu/Debian系統中)。

1.3.3 網際網路

無論你認為自己有多麼無助,我可以向你保證,擁有不同經驗的成千上萬的Linux管理者已經遇到了相同類型的問題并已經解決了。很多解決方案正是從連結serverfault.com或linuxquestions.org/questions等線上社群論壇中搜尋得來的。

當然,通常你可以在這些站點上釋出問題,但為什麼要如此麻煩呢?因為網際網路搜尋引擎可以很好地将已經被問過和回答過的問題羅列出來。一個形式良好的搜尋查詢常常能比從頭開始整個過程更快地獲得所需的内容。

關鍵在于要知道如何進行智能搜尋。在搜尋欄中輸入my server crashed(我的伺服器崩潰了)并希望得到最佳答案可能沒什麼用。顯然,這需要更多的細節。好吧。伺服器的類型是什麼,Apache Web伺服器?浏覽器中是否出現了某些錯誤資訊?伺服器崩潰時是否生成了任何的日志條目?找出這些資訊會是一個好想法。

從系統日志中擷取錯誤資訊

在幾乎所有的現代Linux發行版中(Ubuntu 14.04除外),你可以用journalctl指令來通路所有的系統日志:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

正如你即将看到的,無參數運作journalctl将讓你陷入大量的資料流中。你要用某種方法将需要的資訊過濾出來。這裡,請允許我介紹grep指令:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

在該示例中,我使用了豎杠(|),在美式鍵盤布局中可以用Shift-按鍵組合将其輸入。它将journalctl指令的輸出輸送給grep過濾器,過濾器僅會将包含filename.php字元串的那些行輸出到螢幕上。當然,我假設你的Web伺服器正在運作PHP内容,而且,有一個檔案的名字是filename.php。我從未這樣做過。通常我會采用更具描述性和更有用的名字,如stuff.php。

你可以進一步通過使用多個grep組成的指令序列來限定要搜尋的結果。假設通過filename.php可以找到多個日志條目,而且你僅需要包含error一詞的那些條目。你可以将第一個操作的結果以管道輸送到第二個grep指令,用error過濾:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

如果你隻想擷取那些不包含error一詞的條目,可以添加-v(查找相反的結果)參數:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

在網際網路上搜尋

現在,想象一下從journalctl得到的輸出包含如下内容:

帶你讀《Linux實戰》之一:歡迎使用Linux第1章

這可能是有用的。在網際網路上搜尋時間戳或特定的IP位址毫無意義,但我打賭有人已經遇到過Client sent malformed Host header(用戶端發送了格式錯誤的主機頭)。

要減少誤報,你可能會希望将單詞括在引号中,以便搜尋引擎僅傳回與該完整短語比對的結果。最小化誤報的另一種方法是告訴搜尋引擎忽略包含特定字元串的頁面。

在這個相當愚蠢的示例中,你正在網際網路上搜尋關于編寫Linux腳本的良好介紹。你會發現,基于搜尋引擎得出的大多數是編寫劇本的結果,會讓有些人更加相信你生活在好萊塢。你可以通過排除包括movie一詞的頁面來解決這個問題。

writing scripts -movie

1.4 小結

  • 幾乎所有的Linux指令行操作都将使用ls、pwd、cd、cat及less指令中的幾個或全部。
  • Linux使用僞檔案系統将硬體環境中的資料呈現給程序和使用者。
  • 得到授權的使用者可以調用sudo為每個單獨的指令擷取管理權限。
  • 通過man系統、Info以及線上資源可以獲得大量文檔及其他有效的幫助。

主要名詞

  • 檔案系統(file system)由基于目錄組織的方式索引的資料檔案組織形式。
  • 程序(process)是一個正在運作的軟體程式的活動執行個體。
  • 硬碟分區(disk partition)是實體儲存設備的一個邏輯分區,它可以像獨立裝置一樣工作。對于現代作業系統而言,分區是常見的組織工具。
  • Bash是用于執行系統操作的指令行使用者接口。
  • 純文字(plain text)可用于管理目的,它是由有限字元集構成的文本,不包括額外的格式化資訊。
  • 檔案通配符(file globbing)包括使用通配符字元讓單個指令引用多個檔案。
  • Tab鍵補齊(Tab completion)使用Tab鍵對輸入的不完整指令給出可能的補齊建議。
  • 僞檔案系統(pseudo file systems)包含系統啟動時或啟動後自動生成的動态資料檔案的一組目錄。

安全最佳實踐

避免以root使用者在Linux機器上工作。相反,要使用一個普通使用者賬号,而且,在需要執行管理任務的時候使用sudo指令。

指令行回顧

  • ls -lh /var/log指令列出了/var/log/目錄下的内容以及完整且使用者友好的細節資訊。
  • cd指令本身将傳回到你的home目錄。
  • cp file1 newdir指令将名為file1的檔案拷貝到newdir目錄。
  • mv file? /some/other/directory/ 指令将包含字元串file及一個字元的所有檔案移動到目标目錄。
  • rm -r *指令删除目前位置下的所有檔案和目錄。使用時要格外小心。
  • man sudo指令打開關于使用sudo指令的man文檔。

自測題

1.如下的Linux發行版中,哪一個最适合于安全操作?

a. OpenSUSE
b. CentOS
c. Kali Linux
d. LXLE
           

2.哪一個工具允許你在終端會話中編輯文本?

a. nano
b. gedit
c. touch
d. LibreOffice
           

3.給ls指令添加-l參數會實作什麼操作?

a.列出檔案細節
b.以使用者可讀的格式列出資訊
c.僅顯示檔案名
d.遞歸顯示子目錄
           

4.如下指令中,哪一個顯示在檔案系統中目前所處的位置?

a. touch
b. pwd
c. ls -c
d. cd
           

5.cat /etc/group指令的功能是什麼?

a.在一個導航接口中顯示/etc/group檔案的内容
b.複制/etc/group檔案到一個新的特定位置
c.更新最近通路的/etc/group檔案值
d.将/etc/group檔案的内容列印輸出到輸出裝置(在螢幕上滾動内容)
           

6.如下哪個指令删除包含檔案和子目錄的目錄?

a. rmdir myfulldirectory
b. sudo rmdir myfulldirectory
c. rm -r myfulldirectory
d. rm myfulldirectory
           

7.假設不存在名為mynewfile的目錄,mv myfile mynewfile指令将會如何?

a.建立myfile檔案的一個拷貝并命名為mynewfile
b.建立一個名為mynewfile的空目錄
c.建立一個名為mynewfile的空目錄并将檔案myfile移動到該目錄
d.将檔案myfile的名字改為mynewfile
           

8.以下指令中,哪一個會删除名字中包含file及任意數量字元的所有檔案?

a. rm file*
b. rm file?
c. rm file.
d. rm file??           

答案

1.c 2.a 3.a 4.b 5.d 6.c 7.d 8.a

繼續閱讀