實驗一 Linux系統簡介
Linux和windows、Mac OS一樣是一種操作系統。最早流行起來的操作系統是UNIX,但由於其過度商業化,價格昂貴,因此在校園里人們大多選擇MINIX。1991年,Linux之父Linus Torvalds從MINIX入手,計划開發一個性能更好的操作系統。他第一次發行的版本吸引了很多黑客,這使它很快具有了一些吸引人的特性。 Linux本身只是操作系統的內核,它沒有自己去開發應用程序,而是使用已有的自由軟件,這減少了搭建開發環境花費的工作量,Linux中許多重要的軟件都來自於自由軟件基金GNU項目。
Linux發展到今天已經成為了具有免費、穩定、安全、資源占用少、定制性高、具有多種可選擇圖形用戶界面的優秀系統。因此盡管Linux沒有特定的支持廠商,缺少對游戲娛樂和專業軟件的支持,但仍然在世界范圍內受到開發人員的廣泛歡迎。Linux現在擁有Debian、Ubuntu、CentOS等多個發行版。
實驗二 基本概念及操作
Linux桌面環境
Linux本身是沒有圖形界面的,我們看到的圖形界面實際上是運行在 Linux上的一套軟件,這些實現了客戶端功能的桌面環境有KDE,GNOME,XFCE,LXDE,用戶可以根據自己的喜好選擇不同的桌面環境,定制自己的桌面。實驗樓目前使用XFCE桌面環境。
Linux終端
概念
我們與Linux系統的交互通過一個叫Shell的中間程序完成,在圖形界面下Linux系統還為我們提供了一個叫終端模擬器的程序----Terminal。終端本質上對應着Linux上的/dev/tty設備,Linux的多用戶登錄實際上就是通過不同的/dev/tty設備完成。Linux默認提供6個Terminal。
Shell
對應於Linux內核,shell是linux系統提供給我們的“殼”,它之所以被稱作shell是因為它隱藏了操作系統的底層細節。Shell既是用戶交互的界面,也是控制系統的腳本語言,在Linux中常見的shell有bash、zsh、ksh、csh等,Ubuntu終端默認使用的是bash,實驗樓中的終端則使用zsh。
命令行操作初體驗
創建空文件、查看目錄
運用通配符批量操作
在使用終端進行交互的過程中,會有命令打起來麻煩,容易打錯,終端用起來很累的感覺,熟練使用快捷鍵可以大大提高終端的使用效率,linux下的快捷鍵如tab
補全命令、目錄、文件名等都很好用,詳細可以參考Linux快捷鍵大全。
作業##
實驗三 用戶及文件權限管理
Linux用戶管理
Linux是可以多用戶登錄的,他們共享一部分主機資源,也有自己的用戶空間。盡管他們的文件都是放在同一個物理磁盤上,但由於Linux的用戶管理和權限控制讓用戶看起來有屬於自己的空間。
查看用戶
輸出的第一列表示當前偽終端用戶的用戶名,第二列pts/0
中的pts
表示偽終端,0
表示偽終端序號。
創建用戶
在Linux系統中,root賬戶擁有着最高的權利,可以新建/添加用戶。我們一般登錄都是以普通用戶的身份登錄,要創建用戶需要root權限,這需要用到sudo
命令。要使用這個命令需要兩個條件:
- 知道當前用戶的登錄密碼
- 當前用戶在sudo組中
su <user>
可以切換到用戶user;sudo <cmd>
可以以root權限運行命令cmd,這需要當前用戶屬於sudo組,且需要當前用戶的密碼;su -<user>
也可以切換用戶,並且會把環境變量改為目標用戶的環境變量。
新建用戶、查看用戶目錄、切換用戶
用戶組
Linux中每個用戶都屬於一個用戶組,一個用戶可以屬於多個用戶組,同一用戶組中的用戶可以共享一部分特定的資源,當創建一個新用戶時會同時創建一個同名的用戶組,查看用戶屬於那個用戶組可以用groups
命令或者查看/etc/group
文件。
查看用戶組
刪除用戶
文件權限
文件權限就是文件的訪問控制權限,即哪些用戶和組群可以訪問文件及可執行什么樣的操作。
查看文件權限
使用長格式列出文件ls -l
可以看到文件的權限。其中r
表示讀權限,w
表示寫權限,x
表示執行權限。
命令ls
還可以添加其他的參數實現更多的功能,如下
變更文件所有者
chown
命令可以變更文件的所有者,如下
修改文件權限
文件權限修改使用chmod
命令。文件權限可以用二進制多項式表示,也可以用加減賦值的方法表示。對於二進制表示法,按照rwx的順序,對應的值分別為4、2、1,即如果一個文件對某用戶有rw權限,則值就是6。如下所示:
作業
添加一個用戶loutest
,使用sudo
創建文件/opt/forloutest
,設置用戶loutest
可以讀寫。
思考
命令chmod
后接一組數字——一般是三位——表示對應用戶的權限,那么哪一位數字對應哪些用戶呢?經查證和實驗,第一位數字表示文件所有者權限,第二位表示與文件所有者同組的用戶的權限,第三個數字表示其他用戶組的權限。對於四位數字的情況,相當於在原來三位之前再加一位,這一位的用法詳見詳解。
實驗四 Linux目錄結構及文件基本操作
Linux目錄結構
Linux目錄看起來和windows相似,但實際上實現機制完全不同。Windows以存儲介質為基礎實現文件管理,Linux則是以樹形目錄的形式來構建整個系統。
FHS標准
Linux的目錄結構是規定好的,FHS(Filesystem Hierarchy Standard)定義了兩層規范:
/
目錄下應該存放什么文件數據。/usr
和/var
這兩個目錄的子目錄應該放什么文件數據。詳見FHS2.3標准文檔
目錄路徑
使用cd
命令可以切換目錄,在linux里用.
表示當前目錄,用..
表示上一級目錄,用-
表示上一次所在目錄,用~
表示當前用戶home目錄。
路徑分為相對路徑和絕對路徑,絕對路徑可以理解為完整路徑,相對路徑則是相對於當前目錄的路徑。使用pwd
命令可以獲得當前目錄的絕對路徑。
Linux文件的基本操作
新建文件、目錄
復制文件、目錄
刪除文件、目錄
移動、重命名、查看等
查看、編輯文件
vim
是一個強大的文件編輯器,Linux下還有一些其他的文件編輯器都很好用。
作業
批量建立並刪除文件
環境變量與文件查找
變量
變量准確的說是Shell變量,變量的作用域即變量的有效范圍(比如一個函數中、一個源文件中或者全局范圍),在該范圍內只能有一個同名變量。一旦離開則該變量無效,如同不存在這個變量一般。
Shell中創建變量
環境變量
通常我們會涉及到的變量類型有三種:
- 當前 Shell 進程私有用戶自定義變量,如上面我們創建的 tmp 變量,只在當前 Shell 中有效。
- Shell 本身內建的變量。
- 從自定義變量導出的環境變量。
可以簡單地理解為在當前進程的子進程有效則為環境變量,否則不是。
也有三個與上述三種環境變量相關的命令:set
,env
,export
。這三個命令很相似,都是用於打印環境變量信息,卻別在於打印的變量類型不同。
可以直觀的使用vimdiff
工具比較他們的差別:
命令的查找路徑與順序
Shell執行用戶輸入的命令是通過環境變量PATH
來搜索的,將自己的程序路徑加入到PATH
中,再運行自己的程序使就不需要輸入完整路徑了。
通過source
命令可以讓自己的環境變量立即生效
搜索文件
與搜索相關的常用命令有whereis
、which
、find
、locate
。whereis
搜索簡單快速,locate
搜索快而全,which
小而精,find
精而細。如圖。
作業
找出/etc
目錄下所有以.list
結尾的文件。
挑戰一 尋找文件
尋找在/etc
目錄下的sources.list
文件並修改文件權限為只有自己可以訪問。
思考
可以看到本次挑戰中修改權限時犯過不少次錯誤,因為對命令中的參數對應哪些用戶還不夠熟悉,可見要想高效的的使用Linux需要很多的練習。
文件打包與解壓縮
概念
文件壓縮的格式有很多,但在Linux下掌握zip
,tar
即可。
實戰
zip
壓縮和unzip
解壓縮
廢話不多說直接看操作。
tar
打包工具
tar
原本是一個打包工具,但在Linux上同時還實現了對7z、 bzip2等壓縮工具的支持,只是需要多加幾個參數,非常方便。
作業
創建test
文件,分別用zip和tar壓縮並解壓到用戶根目錄
實驗七 文件系統操作與磁盤管理
基本操作
查看磁盤和目錄的容量
因為在實驗樓的字符界面對漢字支持有問題,所以文中出現一些“印章”請諒解。
df
命令
du
命令
簡單磁盤管理
Linux下一切即文件,首先嘗試使用dd
命令從標准輸入讀入並輸出到標准輸出或文件。
使用dd
命令創建虛擬鏡像文件
其他磁盤操作
mkfs
命令可以格式化磁盤;mount
命令可以掛載磁盤到目錄樹;unmount
可以卸載已掛載磁盤;fdisk
命令可以為磁盤分區。losetup
命令可以建立鏡像與回環設備的關聯。
作業
找出當前目錄下占用最大的前十的文件。
如圖,首先du
命令得到文件的大小,sort
命令按文件大小排序,用head
命令取前十。
實驗八 Linux下的幫助命令
內建命令與外部命令
內建命令實際上是 shell 程序的一部分,其中包含的是一些比較簡單的 Linux 系統命令,這些命令是寫在bash源碼的builtins里面的,由 shell 程序識別並在 shell 程序內部完成運行,通常在 Linux 系統加載運行時 shell 就被加載並駐留在系統內存中。而且解析內部命令 shell 不需要創建子進程,因此其執行速度比外部命令快。比如:history、cd、exit 等等。
外部命令是 Linux 系統中的實用程序部分,因為實用程序的功能通常都比較強大,所以其包含的程序量也會很大,在系統加載時並不隨系統一起被加載到內存中,而是在需要時才將其調入內存。雖然其不包含在 shell 中,但是其命令執行過程是由 shell 程序控制的。外部命令是在 Bash 之外額外安裝的,通常放在/bin,/usr/bin,/sbin,/usr/sbin等等。比如:ls、vi等。
在系統中我們可以使用type
命令來了解一個命令的類型。
幫助命令的使用
help
、man
和info
以上三個命令都可以獲得幫助信息,不同的是,help
命令用於顯示Shell內建命令的簡要幫助信息;man
命令沒有內建和外部之分,它顯示系統手冊頁中的內容,更加詳細;info
是GNU的超文本幫助系統,顯示的信息更多。
實驗九 Linux任務計划crontab
crontab的使用
crontab簡介
crontab
命令從輸入設備讀取指令,並將其存放於crontab文件中,以供之后讀取和執行。通常,crontab
儲存的指令被守護進程激活,crond
為其守護進程,crond常常在后台運行,每一分鍾會檢查一次是否有預定的作業需要執行。
crontab准備和使用
在實驗樓需要先啟動rsyslog
,以便通過日志中的信息了解任務是否真的被執行了。其次手動啟動crontab
,通過crontab -e
添加任務。添加每分鍾01秒時新建文件的任務如下:
在文件中首先用五個參數表示任務執行的時間,后面接具體的任務。五個時間參數分別為分、時、天、月份、周幾。
挑戰二 備份日志
為shiyanlou用戶添加計划任務,每天三點備份alternative.log到/home/shiyanlou/tmp目錄下,命名為時間,如2018年-10月-08日,並刪除前一天備份的文件。
實際上圖中的句子有一個錯誤,那就是&&
應該為||
,這在后面才會學到。然而即便有錯在實驗樓提交依然通過了,可見實驗樓的在檢測結果時並沒有判斷之前的文件是否被刪除了。
實驗十 命令執行順序控制與管道
命令執行的順序控制
通常情況下我們都是一條一條命令輸入,系統自然也就一條一條的執行,如果我們一次輸入多條呢?
順序執行多條命令
多條命令間可以用;
隔開,這樣系統就會順序執行這些命令,這在更新並安裝軟件時十分方便。
有選擇的執行命令
實際上命令順序執行很可能遇到問題,那就是如果下一條命令的執行需要用到前一條命令的結果,那么順序執行就會出錯。所以我們可以用&&
或||
來連接多條命令進行有選擇的執行。當&&
命令返回值是0的時候,&&
后的命令會繼續執行;||
則在前面的命令返回值不為零時才會執行后面的命令。要知道前一條命令的返回值,使用echo $?
。
思考
||
和&&
任意順序連接命令都可以嗎?當然是可以的,其實只要記住一條標准,那就是||
或&&
后面的命令是否執行之和他們前面一條命令的返回值有關就行了。
管道
我們在使用一些過濾程序時經常會用到的就是匿名管道,在命令行中用分隔符|
表示。管道連接兩條命令,將前一條命令的輸出直接作為下一條命令的輸入。如圖
一些搭配管道食用更佳的命令
wc
命令。這個命令用於統計並輸出一個文件中行、單詞和字節的數目。比如統統計/etc下所有的目錄數ls -dl /etc/*/ | wc -l
。sort
命令。排序命令,前面已經用過很多次了,這里不再舉例。uniq
去重命令。可用於過濾或者輸出重復行,注意這里的重復指連續重復,所以經常搭配sort
一起使用。如輸出重復過的行及重復次數history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc
.
實驗十一 簡單的文本處理
文本處理命令
tr
命令。此命令可以用來刪除或修改一段文本信息中的某些文字。如圖78col
命令。將tab
轉為一定數量的空格或者反之。圖 79jion
命令。將兩個文件中包含相同內容的一行合並到一起。paste
命令。在不對比數據的情況下,直接將多個文件合並到一起。
作業
不使用轉換工具的情況下,使用學過的命令手動完成dos文本到UNIX格式的轉換。
很簡單就可以完成轉換,但dos文本格式和UNIX文本格式的差別真的只有這么點嗎?
實驗十二 數據流重定向
數據流重定向簡單的理解就是將原本輸出到一個地方的數據轉到另一個輸出位置,如輸出到標准輸出中的數據轉而輸出到文件中。需要注意的是,標准輸出和標准錯誤輸出是兩種不同的輸出,要對這兩種信息同時進行重定向需要特殊的操作,即使用&>
。對比以下兩圖。
使用tee
命令可以實現數據的多重重定向,使用exec
可以實現“永久”重定向。
挑戰三 歷史命令
從命令記錄中找出頻次前三的命令並存儲。對這個實驗我是有一些疑問的。下面是提交通過的命令。
下面是兩種輸出。
顯然我理解的命令是下面那種輸出,但這種提交是錯誤的,正確的反而是上面那種,感覺實驗樓把文件行數減掉后的第一個字段直接當成命令了,似乎是實驗樓錯了?
實驗十三 正則表達式基礎
正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫為 regex、regexp 或 RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些符合某個模式的文本。
正則表達式不論是在什么操作系統下,都是字符流處理的一種很常用也很重要的方式。在Linux下要注意正則表達式和通配符的區分。正則表達式中的基本語法和特殊符號如下。
挑戰四 數據提取
在文件中匹配出數字開頭的行,匹配出正確的郵箱格式。
郵箱匹配實際上取巧了,因為該文件中的數據很少這樣做不會出問題。
實驗十四 Linux下軟件安裝
- 聯網安裝
apt-get install <軟件包名>
。 - 修復安裝
apt-get --reinstall install <軟件包名>
- 卸載
apt-get remove <軟件包名>
- 本地安裝
dpkg
實驗十五、十六 進程相關
程序(procedure):不太精確地說,程序就是執行一系列有邏輯、有順序結構的指令,幫我們達成某個結果。就如我們去餐館,給服務員說我要牛肉蓋澆飯,她執行了做牛肉蓋澆飯這么一個程序,最后我們得到了這么一盤牛肉蓋澆飯。它需要去執行,不然它就像一本武功秘籍,放在那里等人翻看。
進程(process):進程是程序在一個數據集合上的一次執行過程,在早期的UNIX、Linux 2.4及更早的版本中,它是系統進行資源分配和調度的獨立基本單位。同上一個例子,就如我們去了餐館,給服務員說我要牛肉蓋澆飯,她執行了做牛肉蓋澆飯這么一個程序,而里面做飯的是一個進程,做牛肉湯汁的是一個進程,把牛肉湯汁與飯混合在一起的是一個進程,把飯端上桌的是一個進程。它就像是我們在看武功秘籍這么一個過程,然后一個篇章一個篇章地去練。
通過本實驗我們初步的了解進程在系統中存在的概念,以及進程如何在系統中衍生,發展,以及進程之間存在的相互關系,學會了進程的查看命令 ps,pstree,top,以及使用這些命令時所得到的信息的含義,從而獲取我們需要的信息,同時我們學會了進程的管理命令 kill,nice,renice可以為我們在后續學習進程管理打下基礎,同時了解了工作與進程,以及工作管理的一些使用性的操作。
實驗十七 日志系統
日志數據可以是有價值的信息寶庫,也可以是毫無價值的數據泥潭。它可以記錄下系統產生的所有行為,並按照某種規范表達出來。我們可以使用日志系統所記錄的信息為系統進行排錯,優化系統的性能,或者根據這些信息調整系統的行為。收集你想要的數據,分析出有價值的信息,可以提高系統、產品的安全性,還可以幫助開發完善代碼,優化產品。日志會成為在事故發生后查明“發生了什么”的一個很好的“取證”信息來源。日志可以為審計進行審計跟蹤。
系統日志主要是存放系統內置程序或系統內核之類的日志信息如 alternatives.log 、btmp 等等,應用日志主要是我們裝的第三方應用所產生的日志如 tomcat7 、apache2 等等。
配置的日志可以使用syslog
方便操作,日志轉儲使用logrotate
十分方便。
通過本實驗我們了解系統日志結構,以及我們可以從中獲取什么樣的信息,給我們帶來什么樣的價值。還有日志工具的配置,以及省心省力的 logrotate。
實驗感想#
Linux表面死板,實則是一個自由度很高的系統。在終端中進行操作看似困難,但熟悉之后很多事情的效率卻遠高於圖形界面。本次實驗之前我其實用過一些Linux,那時對它的感覺就是雖然難用但是干凈,它只做用戶讓它做的事。經過這兩天連續使用Linux,感覺Linux其實沒那么難用,相反在應用安裝,環境配置時感覺比windows要方便好多,而且真的是能做到“我輸入了什么,就產生什么結果”。這和windows等圖形界面的操作系統有很大不同,圖形界面經常鼠標不小心點一下哪里就完全偏離了預想的方向。繼續練習,相信Linux的使用會更加得心應手。