說明,此筆記來源於苑老師的Ubuntu Server入門到精通
在企業Linux Server 壞境中,經常是沒有圖形環境,只有一個終端窗口(黑乎乎的命令行和閃動的提示符)。Linux的前身是Unix,保留著很多Unix下的使用習慣,所以大多數命令也適用於其他UNIX系統,比如我比較熟悉的思科路由器底層。
先來認識下Shell(殼),Shell本身就是一個程序,這段程序能夠運行其它程序,硬體的驅動硬體(加載驅動)、進程管理、分配硬體資源(內存管理)都是由內核來完成, 出於權限、安全等問題,不允許直接操控內核,如果有學過編程的朋友,發現shell的功能和命令解釋器非常類似。本質上來說,確實是,解釋用戶輸入的命令到內核,我們還可以使用shell命令寫成shell腳本。
shell有很多種,最常用的是bash(Ubuntu 默認 Shell),還有安全行業的 web shell 、SQL shell 等,bash的前身是貝爾實驗室開發UNIX時使用的Bourne shell ,一般終端(shell)打開的提示符格式是"用戶@主機名:~"," "表示用戶家目錄和非root帳號。如果是這樣"~#"表示用戶叫目錄和root帳號。
基本Shell命令 cat
echo a>a & echo b>b
cat a b
cat a
cat
從上面這個實驗中,可以引出一個概念,輸入和輸出,cat是一段程序,輸入給cat一些內容,得到一些輸出結果。其實計算機本質上就是一個根據用戶的輸入,通過計算、解釋給用戶的一種機器。計算機的程序也是在做類似的事,一個程序調用內存的運行起來後,它要接受一些人為或者其它程序輸入的內容,程序運行起來之後叫做進程,Linux為每一個進程配備了輸入流與輸出流,注意輸入和輸出可以是文件、設備、終端、甚至另一個進程的I/O,Linux為每個進程分配了默認的輸入和輸出稱為stdin/stdout。比如上面使用的cat命令的stdin/stdout就都是終端。除了上面兩個標準流,還有第三個標準流stderr(錯誤輸出),進程出現錯誤時便會使用stderr。兩個快捷鍵:
"Ctrl +D":結束當前輸入
"Ctrl+C":無論當前情況強制結束
ls
-l
-a
-d
-i
-S
-r
-t
-h
drwxr-xr-x 2 xiaowu xiaowu 4.0K Apr 24 20:09 Test
"d"文件類型是目錄 "rwx"屬主權限可讀可寫可執行 "r-x"屬組權限可讀可執行 "r-x"其它用戶可讀可執行 第二列 文件硬連結或子目錄數 屬主於"xiaowu" 屬助與"xiaowu" 4k大小 "Apr 24 20:09"修改時間 "Test"文件名
這裡解釋下inode編號,文件儲存在硬碟上,硬碟的最小單位叫做」扇區「(Sector),每個扇區儲存512位元組(0.5KB),多個扇區助成的」塊「(常見的是4K),是文件存取的最小單位,作業系統讀取硬碟的時,為了提高效率,一次性連續讀取一個塊,文件數據儲存在」塊「中,文件的元信息(文件創建者、創建日期等)儲存在inode中,每個inode都對應一個號碼,作業系統通過識別不同的inode來識別文件,讀取文件時,是先根據inode找到inode信息,通過inode信息,找到」塊「,讀取數據。
cp
cp file1 file2
-R/r
-L
-s
-S
-u
可能你學到這裡已經有點頭暈,當你命令只記得開頭字母時,可是使用」TAB「進行自動補全。
mv
mv file1 file2
mv file1 file2 /dir
"-f"
touch file
rm filename
-rf
-i
-d
介紹下萬惡之源"rm -rf /"
echo
\n
-n 顯示結束不換行
-e 解釋反斜線字符
echo $USER
Linux的目錄結構和windows有很大區別,windows由下至上至盤符(不同分區)結束。Linux下目錄是大於分區。
借用實驗樓它們家的圖,這個圖做的非常簡單明了,也推薦使用他們家的課程學習。
tree /
FHS(文件系統層次結構標準)是一個標準,不同發行版遵守著這個標準,使類Unix系統使用體驗類似。這裡我們需要引入兩個概念相對路徑和絕對路徑
pwd
-P 物理路徑
-L 邏輯路徑
cd ../
cd /home/xiaowu/
mkdir filename
rmdir
echo *
ls a*
grep
-i
-v
-n
-r
-c
grep xiaowu -n /etc/passwd
grep -f a.txt b.txt
grep a[123] a.txt
grep -E '1|2|3' a.txt
more filename
less filename
v
Z/B
g/G
/word
?word
n/N
q
grep root /etc/passwd | less
head -n filename
tail -n filename
前面介紹了很多命令工具,我們說Linux中只有兩種對象,文件和進程。而進程也只是運行中的文件,那其實只有一種對象,那就是文件。而這就是Linux中「萬物皆文件」。
diff filea fileb
diff 1.txt 2.txt
1c1
< aaaaaaa
---
> aaaaaab
"1c1"表示"c-change:內容不同";還有"d-delete 文件一比文件二多";"a-add 文件二文件一多"
下面介紹一個查看文件格式的工具,熟悉Windows的朋友都知道Windows是一文件名後綴來區分文件格式的,一旦更改文件後綴就無法執行原有的功能。Linux使用「file"來識別文件格式,通過識別文件頭部的特殊標識依次匹配測試集,匹配到結果就停止執行並返回結果。測試集依次是:
file filename
-b
-i
stat filename
Linux下有著大量的文件,找到想要的文件就是一個問題。Linux提供了快速查找的工具
locate filename
find filename
sudo find / -type f -user username -mtime +1 -mtime -20 -name 1.txt
sort filename
-r
-n #按數值大小排序
-M #按月份排序
ls -l --sort='size|time|extension' #"ls"命令也可以排序
就和win10一樣,用好快捷鍵能提升你的工作效率,下面介紹一些常用的快捷鍵,這些快捷鍵不僅在命令行下常用,使用SSH終端(例如Xshell)時也經常使用,
Ctrl+P/N/B/F:上下左右
Ctrl+A/E:光標移動至開頭/至結尾
Ctrl+W:刪除光標前一空格分隔段落
Ctrl+U/K :刪除光標到行首/到行尾
Ctrl+Y:黏貼刪除的內容
由於Linux所有對象都是文件,各種服務的配置也基於文件,好用的文本編輯器就非常有必要,常見的vi(vim是它的增強版)、nao、Emacs……,苑老師表示不要有vim和Emac什麼」編輯器之神「透露的優越感,不要執著與工具,工具服務人,按自己使用習慣就好。這裡介紹常用的vim使用方式
vimtutor
vi filename.txt
vi的功能按鍵對新手來說有點複雜,你需要的是不斷的使用它,忘記的命令查手冊,隨著你的使用你會逐漸得心應手。
上面我提到一個操作,查看手冊,你可以記不住命令,但你要知道如何通過文檔找到它,如果整個工作過程都在查手冊就比較尷尬,對幫助手冊有個大概的了解,會讓你更高效率的查找。Linux傳統有完善的文檔體系,Manual是最主要的幫助手冊,使用「man+命令」即可看到對應的命令幫助。
man -k keyword
man {1~8} command
查看man手冊時,左上角有一個索引編號,每一個索引編號(1~8),代表著一類的手冊,注意,有的命令可能只有部分索引編號,下面說明一下索引編號代表的含義
1:用戶命令 2:系統調用 3:高級Unix編程庫文檔(開發人員常用) 4:設備接口和驅動信息(很少使用)
5:文件描述(系統配置文件) 6:Games 7:文件格式,慣例,編碼(ASCII、UTF8等) 8:系統命令和伺服器
LInux內核的研發者GNU(自有軟體基金會)推出另一種幫助手冊"info"
info command
很多軟體沒有官方提供的man手冊,開發者往往在軟體包裡留下README文件給使用者一些指導
前面我們演示很多遍的「-h/--help"也是頻繁使用的幫助命令,最後實在找不到幫助,那麼搜尋引擎是一個好的選擇
Shell輸入與輸出前面在基本Shell命令一章中簡單的介紹下Shell中輸入流、輸出流、輸出錯誤流的概念。大部分進程的默認輸入都是文件或者終端,注意我用了默認這個詞,意思是不是我可以更該呢?答案是可以的,這就是我要介紹的。輸入流、輸出流、錯誤輸出流的文件描述符是0、1、2,文件描述符是LInux內核定義已打開文件所創建的索引,這樣描述你可能依然聽不懂,看下面例子你就明白了。
"|"、">"、">>"、"<"
ifconfig | grep "inet"
ls >file
ls >>file
ls < 1.txt
ls osjdijf >stdout 2>stderr
使用DocKer服務的朋友經常看到這樣的一鍵代碼
"sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://15a26sup.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docke"
這段代碼中使用的EOF是自定義終止符,注意可自定義,結合重定向在腳本中非常好用
使用命令時經常會遇到錯誤,常見的錯誤說明如下
"No such file of directory"(查看不存在的文件目錄)
"File exists"(創建於文件同名的目錄)
"Not a Directory,ls a directory"(把文件當目錄)
「No space left on device"(磁碟空間不足)
"Permission denied"(權限不足,一般加」sudo"解決)
"Operation not permitted"(殺掉不屬於自己的進程)
"Segmentaion fault,Bus error"(程序訪問禁用內存)
前面部分命令中使用了管道符,部分筆記表示的是或的關係,這裡介紹一些在shell命令中常用的有著特殊作用的符號,注意,管道符和管道是不同的概念
」;「:連接符號,可以是命令在同一行內
"&":後臺執行符號
"&&":命令邏輯與
"||":命令邏輯或
…… 還有一些不常用了
進程管理進程就是運行中的文件,使用"ps" 不加參數執行,結果默認會顯示4列信息,為了區分不同的進程,給進程分配了ID,這就是PID。TIme為進程運行的CPU小號的時間。最後顯示名稱 COMMAND.Linux經常有多個終端同時使用,TTY則註明是哪個終端。進程有不同的狀態,常見的有"R「(Runnable)、"S"(Sleeping)等等。
ps
-x
-ax
-u
-w
Linux最初的進程為PID為0,隨後以父進程和母進程的結構關係類似樹形結構,使用"ps fajx"或者"pstree"可查看這個結構
kill pid
kill -STOP pid
kill -CONT pid
kil -l
在windows下經常使用winrar或者7zip(有Linux版本)等好用的打包工具,在Linux下,也有類似的打包程序
Linux標準的壓縮程序為 gzip file(gunzip解壓),只能對單個文件解壓縮,對多個文常用的是"tar"命令
tar zcvf file.tar.gz file1 file2
tar zxvf file.tar.gz
tar tvf file.tat.gz
tar jcvf file.bz2 file1
前面我說遇到權限問題時使用」sudo「,那麼」sudo「的作用是什麼呢,LInux下最高的權限為root,Ubuntu發行版出於安全性的考慮,使用戶創建了普通用戶,需要執行關鍵操作是,使用」sudo"來允許用戶已」root「身份來執行、
cat /etc/group |grep $USER
sudo vim /etc/sudoers
sudo adduser username
sudo usermod -aG sudo username
最後 ,命令純手敲,整個五一假期敲出了這篇筆記,原計劃一天敲出,太高估我自己了,祝各位在學習安全的路上的朋友享受這個過程。
參考連結Ubuntu Server 從入門到精通
流、管道和重定向
Linux的4個主要部分:內核、Shell、文件結構和實用工具
真正理解linux的inode?
理解inode-阮一峰
linux中的通配符與正則表達式