Linux常用命令
- Linux常用命令
- 軟體安裝的方式
- 1. 使用yum安裝
- 1.1. yum解除安裝軟體
- 2.使用rpm安裝
- 2.1 語法格式
- 2.2 檢視包是否成功安裝
- 1. 使用yum安裝
- path變數
- 1. path變數
- 檔案專題
- 1. 檔案詳細屬性
- 1.1 檢視檔案詳細屬性(訪問時間,修改日期等)
- 2. 檔案許可權
- 3. 硬連結和軟連線
- 3.1 硬連結
- 3.2 軟連結
- 4. 壓縮與接壓縮
- 4.1
tar
- 4.2
zip
- 4.1
- 四劍客專題
- 1. find
- 1.1 基礎語法
- 1.2 find查詢到的檔案交給其他命令去處理
- 1. find
- 2. grep
- 3. sed
- 4. awk
- 4.1 語法結構
- 4.3 awk的內建變數
- 4.2 案例
- 正規表示式
- 1. 特殊符號
- 2. 正規表示式
- 使用者管理
- 1. 使用者分類
- 2. 使用者相關的配置檔案
- 3. 與使用者相關的目錄
- 4. 使用者相關的命令
- 5. MD5指紋校驗
- 6. sudu提權
- 檔案許可權
- 1. 檢視使用者對當前檔案的許可權
- 2. rwx對應的數字
- 3. 改變檔案許可權
- 4. rwx對於檔案含義
- 5. rwx 對於目錄的作用
- 6. linux 系統預設許可權控制命令UMASK
- 7. 檔案的隱藏許可權位
- 定時任務
- 1. 定時任務分類
- 磁碟管理
- 1. 磁碟分類
- 1.1 磁碟介面
- 1.2 機械磁碟轉速
- 2. 磁碟raid
- 3. 磁碟分割槽
- 4. 磁碟相關案例
- 1. 磁碟分類
- 任務管理
- 1. 程序的概述
- 2. 監視程序狀態
- 2.1 案例
- 2.2 使用top命令檢視當前的程序狀態 動態
- 3. 管理程序狀態
- 4. 程序後臺執行
- 軟體安裝的方式
- 方式一
- 方式二
- 網路知識
- 1. OSI7層模型
- 2. 網路抓包
- 2.1 Linux轉包工具
tcpdump
- 2.1 Linux轉包工具
- 網路知識
軟體安裝的方式
1. 使用yum安裝
yum -y install 包的名稱
yum -y install package1 package2
# 檢視某個命令是哪個包的
1. 方式1
yum provides rz
# 檢視rz是屬於哪個包的
方式2
yum search rz
特點:
(1) 自動解決依賴
(2) 安裝的位置是固定的,無法修改
(3) 清空yum倉庫的快取,在嘗試安裝軟體
yum clean all
1.1. yum解除安裝軟體
yum -y remove 包名
# 一次性可解除安裝多個
# 類似覆蓋安裝,已經安裝過,但是有問題,再重新覆蓋安裝
yum -y reinstall 包名
2.使用rpm安裝
- 必須將軟體下載到本地才能安裝
- 不能自動解決依賴
- 在第三方官網上下載的是.rpm包
2.1 語法格式
rpm -ivh 包名
# 注意包名必須是.rpm結尾的
# 大多數依賴都存在與yum倉庫,如果網路正常,可以使用yum安裝的方式先解決依賴,在透過rpm方式安裝
# 引數
-i # install 安裝
-v # 顯示過程 verbose
-h # 顯示進度
-qa # 是否安裝
-ql # 列出安裝的軟體裝了哪些東西
-qc # 列出指定包的配置檔案
-e # 解除安裝
-U # 升級,可以替代-i
# 注意 不管使用rpm安裝還是yum安裝的方式,都能使用yum -y remove進行解除安裝
2.2 檢視包是否成功安裝
--方式一:使用which
which wget
# which 命令名稱
--方式二 檢視包是否安裝
rpm -qa 包名
# 直接回車,列出安裝的所有rpm包
--方式三:列出指定安裝的包裝了哪些東西
rpm -ql 包名
[root@sql ~]#rpm -ql yum
/etc/logrotate.d/yum
/etc/yum
/etc/yum.conf
/etc/yum.repos.d
/etc/yum/fssnap.d
/etc/yum/pluginconf.d
/etc/yum/protected.d
/etc/yum/vars
--只顯示有關的配置吻技安
rpm -qc yum
[root@sql ~]#rpm -qc yum
/etc/logrotate.d/yum
/etc/yum.conf
/etc/yum/version-groups.conf
--rpm解除安裝
rpm -e 包名
--本地安裝所有的rpm檔案,能自動解決依賴(前提是所有依賴都下載到本地了)
yum -y localinstall *.rpm
path變數
作用:儲存著命令的路徑
(1):執行命令的流程
- 使用者輸入命令
- 系統會自動查詢PATH變數中的路徑是否存在這個命令
- 如果存在則呼叫執行此命令
- 如果不存在提示command not Found
- 如果命令的路徑不存在PATH變數裡面,那麼執行該命令要使用絕對路徑或相對路徑
(2):
1. path變數
---1. path變數檢視
[root@sql ~]#echo $PATH
/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
-- 2. 將指定命令路徑新增到PATH變數中,可以是大目錄,也可以是更具體的目錄
# 將/opt目錄新增到PATH變數中
[root@sql ~]#PATH="$PATH:/opt/"
[root@sql ~]#echo $PATH
/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/
# 這樣的方式重啟失效,如果需要永久生效,需要放到vim /etc/profile 中
--在profile檔案中新增下面格式的內容即可
export PATH=/usr/local/mysql/bin:$PATH
# 在 PATH變數前後位置新增的效果是優先值,如果新增在前面需要在PATH變數前+ : 如果新增在後面,需要在PATH變數後+ :
export PATH=/usr/local/mysql/bin:$PATH:/opt
--重新載入 /etc/profile 檔案
# 方式一
source /etc/profile
# 方式2
. /etc/profile
# 方式3
重新連線客戶端或開啟新的客戶端
檔案專題
1. 檔案詳細屬性
--1. 檢視檔案詳細屬性
[root@sql ~]#ll -i 1.txt
33574992 -rw-r--r-- 1 root root 4 9月 25 00:58 1.txt
# 第一列 33574992
索引檔案->先找到檔案的索引才能找出具體裡面存放的內容
索引->內容 存摺目標位置的指向指標
檔案的inode號碼如果相同,說明兩個檔案互為硬連線
--2. 磁碟是否寫入需要檢查inode 和 block
inode: df -i # 檢視是否有inode號
block: df -h # 檢視是否佔用了空間
1.1 檢視檔案詳細屬性(訪問時間,修改日期等)
[root@sql ~]#stat a.txt
檔案:"a.txt"
大小:3 塊:8 IO 塊:4096 普通檔案
裝置:803h/2051d Inode:33574979 硬連結:2
許可權:(0644/-rw-r--r--) Uid:(0/root) Gid:(0/root)
最近訪問:2024-09-28 00:07:41.420421323 +0800
最近更改:2024-09-28 00:07:56.573298870 +0800
最近改動:2024-09-28 00:08:14.084398263 +0800
建立時間:-
[root@sql ~]#ll
總用量 8
-rw-r--r-- 2 root root 3 9月 28 00:07 a.txt
-rw-r--r-- 2 root root 3 9月 28 00:07 head_a.txt
# -rw-r--r-- 2 root root 3 9月 28 00:07 head_a.txt 這些資訊都是檔案屬性,其一變化則change會變化
解釋:
- 訪問時間,修改後會變更一次,修改後的第一次檢視(cat等)會發生改變
- Modefy 修改時間,修改後時間會變化
重要
- change 修改後時間會變化
2. 檔案許可權
--1. 檔案許可權
# rw-r--r--
前三位:屬主位
中三位:屬組位
後三位:其他位
r->可讀->許可權數字 4
w->可寫->許可權數字 2
x->可執行->許可權數字 1
- 表示空,沒許可權
# 使用者組在Linux中沒有任何意義
3. 硬連結和軟連線
3.1 硬連結
[root@sql ~]#touch a.txt
[root@sql ~]#echo aa > a.txt
[root@sql ~]#
[root@sql ~]#ln a.txt head_a.txt
[root@sql ~]#ll
總用量 8
-rw-r--r-- 2 root root 3 9月 28 00:07 a.txt
-rw-r--r-- 2 root root 3 9月 28 00:07 head_a.txt
[root@sql ~]#ll -i
總用量 8
33574979 -rw-r--r-- 2 root root 3 9月 28 00:07 a.txt
33574979 -rw-r--r-- 2 root root 3 9月 28 00:07 head_a.txt
# 第四列r--後面的2 硬連結的個數
# 建立方式
ln 原始檔 目標檔案
# 目錄預設是兩個硬連結
① . 表示當前目錄
② 表示他本身
硬連結的特點:
(1): 具有相同的inode號的檔案互為硬連結(a.txt和head_a.txt具有相同的inode號,因此他們互為硬連結)
(2): 硬連結類似於給超市開了多個門
(3): 相當於多張藏寶圖,但是指向相同的位置
(4): 目錄預設建立的硬連結的個數為兩個
(5):目錄不能建立硬連結
(6): 硬連結不能跨檔案系統
(7):刪除一個硬連結,不影響檔案
(8): 修改一個另外一個也會發生變化
硬連結的作用:
(1): 備份檔案,使用少
3.2 軟連結
特點
- 軟連結inode號不同,類似windows的快捷方式
- 軟連結中存放著原始檔的指標指向和詳細資訊,檔名稱是存在上級目錄的block中
- 軟連結預設的是一個
- 軟連結可以跨檔案系統
- 刪除原始檔會影響連結檔案,變為紅底白字,並一直閃爍
- 建立軟連結使用絕對路徑
-- 建立軟連結
ln -s 原始檔 目標檔案
軟連結和硬連結的區別:筆試題
- 硬連結的inode號相同,軟連結不同
- 建立方式不同
- 硬連結不能跨檔案系統,軟連結可以
- 目錄不能做硬連結,可以做軟連結,檔案兩個都能做
- 刪除硬連結不影響原始檔,刪除軟連線檔案不影響檔案
- inode 號為0,則檔案被刪除(沒有被程序呼叫),刪除原始檔影響軟連結檔案
4. 壓縮與接壓縮
4.1 tar
--tar命令
# 壓縮
tar -zcvf 壓縮包的名稱 檔案或目錄
-z 必須的引數,使用gzip打包
-c 建立檔案 create
-v 顯示過程
-f 指定檔案
-C 解壓到指定目錄
# 案例
--1. 打包當前的1.txt檔案為test.tar.gz
[root@sql ~]#echo aaa> 1.txt
[root@sql ~]#ll
總用量 4
-rw-r--r-- 1 root root 4 9月 28 01:01 1.txt
[root@sql ~]#cat 1.txt
aaa
[root@sql ~]#tar -zcvf test.tar.gz 1.txt
1.txt
# tar zcvf test.tar.gz 1.txt 引數前不加- 也可以
[root@sql ~]#ll
總用量 8
-rw-r--r-- 1 root root 4 9月 28 01:01 1.txt
-rw-r--r-- 1 root root 118 9月 28 01:02 test.tar.gz
-- 檢視壓縮包的內容
tar -tf test.tar.gz
-- 解壓
4.2 zip
--1.壓縮檔案
zip test.zip file
--2. 解壓檔案
unzip test.zip
-d 解壓到指定目錄
# 案例
1. 壓縮檔案
zip test.zip *.txt
2. 解壓
unzip test.zip # 解壓到當前目錄
3. 解壓到指定目錄
unzip test.zip -d /opt/ # 解壓到/opt/目錄下
四劍客專題
1. find
1.1 基礎語法
禁止從/下直接查詢檔案
檔案型別
f 表示普通檔案
d 表示目錄
l 表示軟連結
b 表示塊裝置 硬體
c 表示位元組檔案
--按檔案型別查詢
### 查詢常規檔案
查詢所有的普通檔案:
find /path/to/search -type f
### 查詢目錄
查詢所有的目錄:
find /path/to/search -type d
### 查詢符號連結
查詢所有的符號連結:
find /path/to/search -type l
### 查詢塊裝置檔案
查詢所有的塊裝置檔案:
find /path/to/search -type b
### 查詢字元裝置檔案
查詢所有的字元裝置檔案:
find /path/to/search -type c
### 查詢套接字檔案
查詢所有的套接字檔案:
find /path/to/search -type s
### 查詢命名管道檔案
查詢所有的命名管道(FIFO)檔案:
find /path/to/search -type p
### 如果想在`/var/log`目錄中查詢所有的普通檔案,可以使用:
find /var/log -type f
--按檔名稱查詢
find /oldboy/ -name "1.txt"
find /oldboy/ -name "*.txt"
--不區分大小寫查詢
# + -i引數
find /oldboy/ -iname "*.txt"
--使用深度等級查詢(比如只查詢當前目錄下的一級目錄等)
[root@sql ~]#find ./ -maxdepth 1 -type f
./.bash_logout
./.bash_profile
./.bashrc
./.cshrc
./.tcshrc
./.bash_history
./.mysql_history
./.viminfo
./1.txt
./test.tar.gz
# -maxdepth 1 查詢當前目錄下一級目錄或檔案
-- 按照inode查詢檔案,當我們無法刪除檔案的時候,使用inode查詢輔助刪除
[root@sql ~]#ll -i
總用量 8
33574979 -rw-r--r-- 1 root root 4 9月 28 01:01 1.txt
33574987 -rw-r--r-- 1 root root 118 9月 28 01:02 test.tar.gz
[root@sql ~]#find ./ -inum 33574979
./1.txt
-- 根據檔案大小查詢
[root@sql /]#mkdir oldboy
[root@sql /]#cd oldboy/
[root@sql /oldboy]#dd if=/dev/zero of=1.txt bs=1M count=100
記錄了100+0 的讀入
記錄了100+0 的寫出
104857600位元組(105 MB)已複製,0.629038 秒,167 MB/秒
[root@sql /oldboy]#dd if=/dev/zero of=2.txt bs=1M count=10
記錄了10+0 的讀入
記錄了10+0 的寫出
10485760位元組(10 MB)已複製,0.123881 秒,84.6 MB/秒
[root@sql /oldboy]#dd if=/dev/zero of=3.txt bs=1M count=50
記錄了50+0 的讀入
記錄了50+0 的寫出
52428800位元組(52 MB)已複製,0.548066 秒,95.7 MB/秒
[root@sql /oldboy]#ll
總用量 163840
-rw-r--r-- 1 root root 104857600 9月 28 01:42 1.txt
-rw-r--r-- 1 root root 10485760 9月 28 01:42 2.txt
-rw-r--r-- 1 root root 52428800 9月 28 01:42 3.txt
[root@sql /oldboy]#ll -h
總用量 160M
-rw-r--r-- 1 root root 100M 9月 28 01:42 1.txt
-rw-r--r-- 1 root root 10M 9月 28 01:42 2.txt
-rw-r--r-- 1 root root 50M 9月 28 01:42 3.txt
# 1. 查詢檔案大於1M的檔案
[root@sql /oldboy]#find ./ -size +1M
./1.txt
./2.txt
./3.txt
# 2. 查詢檔案等於100M的檔案
find ./ -size 100M
# 3. 查詢檔案小於100M的檔案
find ./ -size -100M
# 4. 查詢大於1M並且小於100M的檔案
# -a 表示並且關係,可省略
find ./ -size +1M -size -100M
find ./ -size +1M -a -size -100M
# 5. 查詢檔案大於10M或者等於5M的檔案
# -o 表示 或
find ./ -size +10M -o -size 5M
--按照修改時間查詢
atime 訪問時間
mtime 修改時間
ctime 改變時間
# 1.查詢修改時間為10天前的檔案
find ./ -mtime +10
# 2. 查詢修改時間為2天內的
find ./ -mtime -2
1.2 find查詢到的檔案交給其他命令去處理
方法一:xargs
find 查詢檔案和使用xargs去掉換行符等的引數
find 命令中使用 -print0 引數,會在每個檔名的末尾附加一個空字元(null character,\0)而不是換行符來分隔檔名
此方法可以正確處理檔名中包含空格、換行符或其他特殊字元的情況,因為這些字元不會被視為檔名的分隔符。
xargs -0
xargs 的 -0 引數告訴 xargs 以空字元(\0)而非空格或換行符為分隔符讀取輸入。
確保 xargs 能夠正確解析由 find -print0 生成的檔案列表,避免由於檔名中的空格或其他特殊字元導致的解析錯誤。
# 示例
find . -type f -name "*.jpg" -print0 | xargs -0 rm -f
# 刪除當前檔案下所有的jpg檔案 find 預設遞迴搜尋
xargs處理的內容預設會甩到命令的最後面去執行
但是使用 xargs -i {}
可以將xargs處理的內容查到指定位置執行
--1. find查詢到的內容進行刪除 交給rm處理
# xargs 後面的別名無效
find ./ -name "3.txt"|xargs rm
--2. 查詢到的內容交給ls檢視
find ./ -name "3.txt" |xargs ls -l
--3. 查詢到的檔案交給mv移動
find /opt/ -name "*.txt" |xargs -i mv {} /tmp/
find /opt/ -name "*.txt" |xargs -i cp {} /tmp/
方法二: exec
--1. find 查詢到的內容進行刪除,交給rm 處理
find ./ -name "1.txt" -exec rm {} \;
# \ 去掉;的特殊含義
# ;以分號結尾
--2. find結果交給cp
find ./ -name "1.txt" -exec cp {} /opt/ \;
--3. find結果交給mv
find ./ -name "1.txt" -exec mv {} /opt/ \;
--4. find結果交給ll
find ./ -name "1.txt" -exec ls -l {} \;
方法三: 優先執行
--1. 使用反引號優先執行的方式
`` $()
rm -rf `find ./ -name "1.txt"`
rm -rf $(find ./ -name "1.txt")
-- 2.find 交給 cp執行
cp `find ./ -name "1.txt"` /opt/
2. grep
模糊過濾查詢內容
# 語法結構
grep '查詢的內容' 檔案
引數:
-r 遞迴過濾檔案內容
-l 顯示包含匹配內容的檔名而不是具體的檔案內容
-v 取反
-w 精確匹配
-i 不區分大小寫
-n 顯示過濾到內容的行號
-c 統計單詞次數
-o 檢視匹配過程
-E 擴充套件正則
3. sed
作用:
(1)內容查詢
(2)增加內容
(3)替換內容
(4)刪除內容
(5)格式化輸出
# 1. 查詢內容
語法結構:
sed '/找誰/動作' file
動作:
-p: print 輸出查詢到的內容,模糊查詢
-d: delete 刪除查詢到內容的行
選項引數:
-n:取消預設輸出--預設輸出所有內容
# 2. 替換--重點
語法:
sed 's#替換誰#替換成誰#g'
# 3. 刪除,是臨時的不會修改原始檔。如果需要修改原始檔,新增 -i引數
sed '3d' file
案例1:刪除該檔案的第三行
[root@sql ~]#sed '3d' 1.txt 此時相當於預覽
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@sql ~]#sed -i '3d' 1.txt
[root@sql ~]#cat 1.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
案例2:指定區間刪除
sed '2,4' file
# 刪除第二行到第四行
案例3:過濾區間範圍進行統計,過濾時間日誌
比如:統計最近兩個小時的日誌或者過濾昨天一天的日誌
(1)日誌切割
mv 當前日誌並進行今日日期的命名即為日誌的切割,需要重啟服務
(2)取區間範圍統計,統計一個小時的日誌
sed -n '/2024:03:01/,/2024:04:01/p' acces.log
3. sed 增加/追加內容
語法:
sed '3a 內容' file # 在第三行的後面追加內容
sed '3a 內容' file # 在第三行處插入內容
sed '3c 內容' file # 替換整行內容
4. 替換(想要修修改原始檔 。使用-i)
語法:
sed 's#替換的內容#替換成誰#g' file
### 可以是任意的字元
sed 's///g' file
sed 's@@@g' file
引數:
s 替換標誌
g 全域性
案例1:替換內容
sed 's#root##g' file # 將root替換為空格
案例2:替換檔案中的特殊符號,替換: 為空格
sed 's#:# #g' file
案例3:替換多個字元為空格
sed 's#:/# #g' file # 替換:和/為空格
4. awk
4.1 語法結構
awk 語法
awk '找誰' file
查詢指定行:awk 'NR==3' 找出第三行
模糊查詢:awk '/查詢內容/' file
區間模糊查詢:awk '//,//' file
比較表示式查詢:awk '$3==0' file 第三列如果有等於0的行就輸出
awk '$1=="root"' file 第三列如果有root的行就輸出
awk '{動作}' file
# awk 找誰 幹啥
awk '找誰{print $1}' file
awk 的內建變數
(1): NR 儲存著每行的行號
NR==3 第三行
4.3 awk的內建變數
(1): NR 儲存著每行的行號
NR==3
取出第三行NR!=3 ! = 取反
NR>3
找出大於3的行(第三行後面的行)(2) : $0 儲存著每行的內容
,表示空格 awk '{print $0,NR}'
$1 表示第一列
$2 表示第二列
NF 儲存著最後與一列的列號
4.2 案例
案例1:awk按照行查詢
# 取出第三行
[root@sql ~]#cat 1.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@sql ~]#
[root@sql ~]#awk 'NR==3' 1.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
# 案例2 :取出3-5行 並且 &&
[root@sql ~]#awk 'NR>2 && NR < 6' 1.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
# 案例3 取出第一行和大於第三行的內容 或者 ||
[root@sql ~]#awk 'NR==1 || NR>3' 1.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
# 案例4 輸出所有內容
awk '{print $0}' 1.txt # 會輸出1.txt的所有內容
# awk 取列
awk '{print 列號}' file
列號 預設按照 tab 或者空格來分隔列數
$1 表示第一列
$2 表示第二列
案例1: 取出檔案中的第一列
awk '{print $1}'
案例2: 取出第一列和第二列
awk '{print $1"\t"$2}' file
awk '{print $2"\t"$1}' file
awk '{print $2,$1}' file
案例3 : 取出倒數第一列
awk '{print $NF}' file
案例4: 取出倒數第二列
awk '{print $(NF-1)}'
指定分隔符(預設分隔符是空格 和tab)
-F
# 以下愛兩種方式皆可
awk -F: '{print $1}' file -F指定分隔符為:
# 下面這種方式 雙引號之內可以寫正則
awk -F ":" '{print $1}' file -F指定分隔符為:
awk -F "[:/]" '{print $1}' file 以冒號或者/作為分隔符
awk運算
BEGIN 讀取檔案之前的操作
正規表示式
1. 特殊符號
(1) ; 命令的分隔符,不管前面的命令執行失敗或正確都會往後執行
[root@sql ~]#ll ; mkdir sc ;cd sc; pwd
總用量 8
-rw-r--r-- 1 root root 4 9月 28 01:01 1.txt
-rw-r--r-- 1 root root 118 9月 28 01:02 test.tar.gz
/root/sc
[root@sql ~/sc]#llll ; mkd scm ; pwd
-bash: llll: 未找到命令
-bash: mkd: 未找到命令
/root/sc
(2) && 命令分隔符,只有前面的命令執行成功,才會繼續向後執行,否則全部命令執行失敗
# 命令執行失敗 1. 命令錯誤 2. 執行結果錯誤,包括找不到等一切異常情況
mkdir nn && ll /opt
(3) || 前面的命令必須執行失敗,才執行管道後面的命令或內容
案例1:執行成功則不會執行後面的命令
[root@sql ~]#mkdir nn || ll
[root@sql ~]#ll
總用量 0
drwxr-xr-x 2 root root 6 9月 28 11:52 nn
案例2: 執行失敗執行後面的內容
# 如果進入oldboy目錄失敗則建立
[root@sql ~]#cd oldboy || mkdir oldboy
-bash: cd: oldboy: 沒有那個檔案或目錄
[root@sql ~]#ll
總用量 0
drwxr-xr-x 2 root root 6 9月 28 11:52 nn
drwxr-xr-x 2 root root 6 9月 28 11:53 oldboy
2. 正規表示式
- 正規表示式分類:
- 基礎正則
- 擴充套件正則
^word
以...開頭的行
grep '^o' oldboy.txt
# 只顯示以o開頭的行
# 取出以#開頭的所有行
[root@sql ~]#grep '^#' /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
# 取出除了#開頭的所有行 grep -v grep取反
[root@sql ~]#grep -v '^#' /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
$
以....結尾
# 1. 排查所有空行
[root@sql ~]#grep -v '^$' /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
# 2. 取出所有未被註釋的和非空行的行
[root@sql ~]#grep -v '^$' /etc/selinux/config |grep -v '^#'
SELINUX=disabled
SELINUXTYPE=targeted
查詢檔案空行
grep ' ' oldboy.txt
檢視檔案內容行後面是否有空格
cat -A oldboy.txt
[root@sql ~]#cat -A oldboy.txt woshishi$ fndasnfna$ fadshfashf $ # 改行是以空格結尾 fadsnbfjsanhfsjdplkaskas $ # 改行是以空格結尾 ghudasghfuhasdjihfasdjfokajfiq-fkemas$ dsamfasmodasfl]d;safdsa'kfa$ $ # 檢視檔案內容是否存在tab鍵 [root@sql ~]#cat -A oldboy.txt woshishi$ fndasnfna$ fadshfashf $ fadsnbfjsanhfsjdplkaskas $ ghudasghfuhasdjihfasdjfokajfiq-fkemas$ dsamfasmodasfl]d;safdsa'kfa$ $ $ woshiole^Ibiy$ ^I 說明之間有一個tab鍵
-- 1. 如果使用 $ 獲取不到內容,一定要檢視檔案行是不是以空格結尾的
---2. 單引號 所見及所得 不會解析變數和特殊符號
---3. 雙引號 會解析變數和特殊符號
使用者管理
1. 使用者分類
預設的三類使用者
# 可以根據UID進行區別
1. 管理員 root -> UID 0
2. 虛擬使用者 -> UID 1-999 在執行程式的時候必須使用一個使用者來執行,使用者不需要登入作業系統
3. 普通使用者 -> UID 1000+ 包含1000
我們自己建立的使用者可以指定任意的UID,如果不指定 預設從1000開始往後排
2. 使用者相關的配置檔案
(1) /etc/passwd
使用者檔案
[root@sql ~]#head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 以:為分隔 每一列的含義
root 表示使用者名稱稱
x 加密密碼檔案
0 UID
0 組ID
root 使用者的描述符(可以是空的)
/root 使用者的家目錄
/bin/bash 命令直譯器(表示使用者是普通使用者) /sbin/nologin 表示虛擬使用者,禁止登入 作業系統
(2) /etc/shadow
密碼檔案
[root@sql ~]#cat /etc/shadow
root:$6$Qm7zquam$XjcgwIBJ05bu9yefuXZdVc5QMoSSP1N78oxpUcwYKw3N4qqczc1G0bCOuAKkPunODAnJ0Vt2gPpBj15jt5moJ/:19988:0:99999:7:::
root: 使用者
$6$Qm7zquam$XjcgwIBJ05bu9yefuXZdVc5QMoSSP1N78oxpUcwYKw3N4qqczc1G0bCOuAKkPunODAnJ0Vt2gPpBj15jt5moJ: 密碼(加密)
bin:*:18353:0:99999:7:::
# 使用者後面是*的表示虛擬使用者
bin:!!:18353:0:99999:7:::
# 兩個!! 表示普通使用者但沒有設定密碼
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::
lp:*:18353:0:99999:7:::
sync:*:18353:0:99999:7:::
shutdown:*:18353:0:99999:7:::
halt:*:18353:0:99999:7:::
mail:*:18353:0:99999:7:::
(3) /etc/group
組檔案
[root@sql ~]#cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
3. 與使用者相關的目錄
(1) /etc/skel
作用:建立使用者時,他是使用者家目錄的模板
第一步:使用命令建立使用者oldboy
第二步:系統在/home下建立目錄 /home/oldboy
第三步:系統將/etc/skel下的隱藏檔案複製到/home/oldboy目錄下,也設定為隱藏檔案
第四步:複製後將檔案的屬主陣列變更為oldboy
[root@sql ~]#ll /etc/skel/ -a
-rw-r--r--. 1 root root 193 4月 1 2020 .bash_profile
-rw-r--r--. 1 root root 231 4月 1 2020 .bashrc
1. 這兩個隱藏檔案存放的是環境變數
[root@sql ~] -> 此處如果變成-> -bash-4.2$ 這種形式,就意味著使用者家目錄下可能缺失了上面的隱藏檔案
2. [root@sql ~] -> 此處如果變成-> -bash-4.2$
# 解決
(1) 複製/etc/skel/ .bash_profile .bashrc 這兩個檔案到使用者的家目錄下
(2) 或者複製 /etc/skel下的所有隱藏檔案到使用者的家目錄下
(3) 複製後重新連線即可生效
或者:使用 . 或者使用 source 會立刻讓 .bash_profile 執行一次
..bash_profile
source .bash_profile
注意:可讀檔案即可複製->普通使用者只要使用者可讀許可權也能複製root使用者所屬的檔案
4. 使用者相關的命令
(1) 建立使用者
useradd
引數選項:
-u 指定uid
-g 指定gid
-M 不建立家目錄(預設建立家目錄)建立虛擬使用者使用
-s 指定直譯器
/bin/bash 允許登入
/sbin/nologin 不允許登入 建立虛擬使用者使用
1. 預設建立使用者 不新增任何引數
useradd oldboy 建立olboy使用者
案例2:建立虛擬使用者test 不建立家目錄 不允許登入作業系統
[root@sql ~]#useradd -M -s /sbin/nologin test
[root@sql ~]#grep test /etc/passwd
test:x:1004:1004::/home/test:/sbin/nologin
# /home/test 此處只顯示家目錄 但是實際不存在
案例3:建立虛擬使用者test01 UID666 GID666 不建立家目錄 不允許登入作業系統
[root@sql ~]#useradd -u666 -g666 -M -s /sbin/nologin test01
useradd:“666”組不存在
# 如果指定GID,必須先建立,然後再建立指定的使用者的uid
# 如果指定UID 不指定GID 那麼小組會自動建立 GID會自動順延
正確步驟
(1). 建立組
[root@sql ~]#groupadd -g666 test01
(2). 再建立使用者
[root@sql ~]#useradd -u666 -g666 -M -s /sbin/nologin test01
[root@sql ~]#grep test01 /etc/passwd
test01:x:666:666::/home/test01:/sbin/nologin
(2) 修改使用者資訊
usermod
-u UID修改
-g GID修改
-s
-G
(3) 刪除使用者
userdel -r 使用者名稱
-r 刪除使用者及其使用者的家目錄和郵件相關的所有檔案
(4) 建立和修改密碼
1. 互動式
passwd 直接回車修改當前登入使用者的密碼
passwd oldboy 修改/建立oldboy使用者的密碼
2. 非互動式
echo 密碼|passwd --stdin 使用者名稱
# 修改oldboy使用者的密碼為1234
[root@sql ~]#useradd oldboy
[root@sql ~]#passwd oldboy
更改使用者 oldboy 的密碼 。
新的 密碼:
無效的密碼: 密碼是一個迴文
重新輸入新的 密碼:
passwd:所有的身份驗證令牌已經成功更新。
[root@sql ~]#echo 1234|passwd --stdin oldboy
更改使用者 oldboy 的密碼 。
passwd:所有的身份驗證令牌已經成功更新。
5. MD5指紋校驗
作用: 防止檔案被篡改
6. sudu提權
(1) 常用命令補充
1. id 使用者名稱
[root@sql ~]#id oldboy
uid=1005(oldboy) gid=1005(oldboy) 組=1005(oldboy)
2. w 顯示當前登入的使用者 from 列表示公網地址
[root@sql ~]#w
23:23:51 up 0 min, 1 user, load average: 0.21, 0.07, 0.03
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 23:23 7.00s 0.08s 0.00s w
3. 檢視出口的公網地址
[root@sql ~]#curl cip.cc
IP : 116.178.186.47
地址 : 中國 新疆 烏魯木齊
運營商 : 聯通
資料二 : 中國新疆 | 聯通
資料三 : 中國新疆烏魯木齊市 | 聯通
URL : http://www.cip.cc/116.178.186.47
4. last(顯示使用者什麼時候登入什麼時候退出)
[root@sql ~]#last
root pts/0 10.0.0.1 Thu Oct 10 23:23 still logged in
reboot system boot 3.10.0-1160.el7. Thu Oct 10 23:23 - 23:33 (00:10)
root pts/0 10.0.0.1 Wed Oct 9 23:47 - crash (23:35)
reboot system boot 3.10.0-1160.el7. Wed Oct 9 23:47 - 23:33 (23:46)
root pts/0 10.0.0.1 Tue Oct 8 23:28 - down (00:59)
reboot system boot 3.10.0-1160.el7. Tue Oct 8 23:28 - 00:28 (00:59)
root pts/0 10.0.0.1 Tue Oct 1 11:35 - crash (7+11:53)
5.lastlog 顯示使用者最後一次登入的時間
(2) 切換使用者
su
語法:
su - 使用者名稱稱
案例1:root使用者切換成普通使用者 --不需要密碼
su - oldboy
案例2:普通使用者切換root --需要密碼
su -
su - root
su 和 su - 的區別 su切換使用者會不載入環境變數
案例3:普通使用者切換普通使用者 -- 需要密碼
(3) sudu 提權
給普通使用者授權
作用:
- 普通使用者提權
- 軟體的許可權提權,針對啟動軟體的使用者進行提權
1. 檢視當前普通使用者有無sudo許可權
sudo -l # 然後輸入當前使用者的密碼檢視許可權
2. sudo 提權,在root中進行配置
# 如果要授予該使用者單獨的命令讓它有root的許可權執行該命令,則在第三列All下寫命令的絕對路徑
# 使用 which 命令名 檢視命令的絕對路徑
執行:visudo,會開啟檔案,在第100行後新增使用者即sudo許可權即可
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
需要sudo的使用者名稱 不變 寫命令的絕對路徑
101 oldboy ALL=(ALL) /usr/bin/cat
3. 儲存退出即可生效
4. 使用被授權的使用者進行測試
5. 使用被授權的普通使用者登入 sudo cat /var/log/messasges
sudo 授權單個命令
oldboy ALL=(ALL) /usr/bin/cat
sudo 授權多個命令 使用逗號分隔 命令都需要使用絕對路徑
oldboy ALL=(ALL) /usr/bin/cat,/usr/bin/tailf
sudo 授權所有的命令
oldboy ALL=(ALL) All
# 使用sudo的時候不用輸入密碼
oldboy ALL=(ALL) NOPASSWD: All
# 注意 普通使用者擁有sudu所有許可權後,為了避免執行命令每次輸入sudo
可以使用:sudo su - 會變為徹底的root使用者
sudo 授權所有的命令 取反(不能使用的命令)
oldboy ALL=(ALL) All,!/usr/bin/rm, !/usr/bin/vim
檔案許可權
1. 檢視使用者對當前檔案的許可權
使用ll等檢視
2. rwx對應的數字
r 4 讀許可權
w 2 寫許可權
x 1 執行許可權
- 0 無許可權
命令或指令碼才有賦予執行許可權的意義,對於一個普通檔案來說,它的最高許可權應該是rw
3. 改變檔案許可權
每個位置的表示方式:
屬主:u user
陣列:g group
其他:o other
chmod語法格式:
chmod u+w 給屬主增加寫的許可權
chmod u-w 給屬主取消寫的許可權
(1) 直接許可權賦值
案例1:給屬主位增加x許可權
[root@sql ~]#touch 1.txt
[root@sql ~]#ll
總用量 4
-rw-r--r-- 1 root root 345 10月 11 23:49 1.txt
[root@sql ~]#chmod u+x 1.txt
[root@sql ~]#ll
總用量 4
-rwxr--r-- 1 root root 345 10月 11 23:49 1.txt
案例2:給屬主位取消x許可權
chmod u-x 1.txt
案例3:給屬組怎加寫的許可權
chmod g+w 1.txt
案例4: 給其他人增加x的許可權
chmod o+x 1.txt
chmod o+wx 1.txt
chmod o+rwx 1.txt
案例5: 給所有位 u g o全部增加執行許可權
chmod +x 1.txt --方式1
chmod a+x 1.txt --方式2
案例6: 給所有位 u g o全部增加執行許可權
chmod -x 1.txt --方式1
chmod a-x 1.txt --方式2
案例7:先清空,在賦值 u=x
chmod u=x 1.txt 會把屬主的許可權先清空,在進行賦值x許可權
(2) 使用數字進行許可權賦值
chmod 644 file
6 rw
4 r
4 r
案例1:授權檔案 u 讀寫許可權 g 讀寫許可權 o 讀寫許可權
chmod 666 file
案例2:授權檔案的屬主可讀寫,其他位無許可權
chmod 600 file
(3) 遞迴授權
1. 授權目錄下所有的檔案許可權600
chmod -R 600 目錄
# 不建議使用,有可能更改目錄許可權
2. 實際場景中,我們只對檔案進行授權
find oldboy/ -type f |xargs chmod 600
4. rwx對於檔案含義
注意:當一個檔案屬於某個使用者,使用者及時沒有寫許可權,也可以使用強制寫入退出
檔案的rwx 表示檔案可讀 可寫 可執行 但是不能刪除
因為目錄的許可權決定檔案建立 刪除 移動 複製等
r 許可權對於檔案的作用
1): 只讀 可檢視檔案內容
2): 不能正常寫入,但是可以強制寫入:wq!
3): 不能執行,因為沒有x許可權
w 許可權對於檔案的作用
1) 啥都不能幹
2) 只能echo寫入 echo hhh > 1.txt
x 許可權對於檔案的作用
1) 啥都不能幹
許可權組合才能正常使用
1) 許可權位置只有r是沒問題的表示檔案可讀
2) 如果檔案需要讀寫 必須 rw 一起
3) 想要執行檔案 必須 rx 一起
4) rwx 是對於指令碼的最高許可權
5) 對於檔案的最高許可權是rw(6)
5. rwx 對於目錄的作用
r 許可權的作用:啥都不能幹
w 許可權的作用:啥都不能幹
x 許可權的作用: 只能使用cd進入
總結:rwx 單個許可權對目錄的作用,啥都不能幹
1) 檢視目錄下的內容及該目錄下檔案的內容需要 r-x許可權
2) 在目錄下刪除 改名 建立檔案 需要 rwx 許可權 r 能看目錄下的內容,w 建立刪除改名等 x 進入該目錄
總結:
- 目錄預設的許可權是 755
- 檔案預設許可權是 644
- 指令碼的最高許可權 755
6. linux 系統預設許可權控制命令UMASK
作用:決定我們建立目錄和檔案的預設許可權
- 檔案的預設許可權
- 由檔案的做高許可權減去umask的值 就是建立後的檔案預設許可權
- 檔案的最高許可權:rw 666
- 系統預設建立的檔案許可權是: 644
- 目錄的預設許可權
- 由目錄的做高許可權減去umask的值 就是建立後的目錄預設許可權
- 目錄的最高許可權 rwx 777
- 系統預設目錄的檔案許可權是: 755
umask的預設值是:022
1. 檢視umask值
umask
2. 臨時修改
umask 044
7. 檔案的隱藏許可權位
作用:保護重要的系統檔案
i 啥都不能幹
a 只能追加寫入內容
檢視檔案隱藏許可權
lsattr 1.txt
設定隱藏許可權a
定時任務
1. 定時任務分類
(1) 系統定時任務
/etc/crontab 系統定時任務編輯 vim /etc/crontab 系統定時任務書寫方式 * * * * * root command 分 時 日 月 周 使用者 分鐘:0-59 小時:0-23 日: 1-31 月: 1-12 周: 0-6 or 1-7 root 那個使用者執行的 系統定時任務一般使用root # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed * * * * * command_to_execute - - - - - | | | | | | | | | +---- 一週中的星期幾 (0 - 7) (星期天為0或7) | | | +------ 月份 (1 - 12) | | +-------- 一個月中的哪一天 (1 - 31) | +---------- 小時 (0 - 23) +------------ 分鐘 (0 - 59)
(2) 使用者定時任務
定時任務的配置檔案最好進行備份
root 是配置檔案,哪個使用者登入,顯示的就是以哪個使用者名稱命名的檔案
/var/spool/cron/root 使用者定時任務編輯 crontab -e 實際是編輯了(如果是root使用者) vim /var/spool/cron/root 檔案 crontab -e 帶有語法檢測的功能 檢視日誌 tailf /var/log/cron
(3) 案例:
案例1:每5分鐘做一次時間同步
*/5 * * * * root ntpdate ntp1.aliyun.com
(4) 使用者定時任務和系統定時任務的區別
最好養成習慣定義定時任務時新增PATH變數
1. 使用者定時任務預設的PATH變數只識別 <PATH=/usr/bin:/bin> # 在使用者的定時任務中增加PATH變數 [root@sql ~]#echo $PATH /usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt:/root/bin [root@sql ~]#crontab -l PATH=/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt:/root/bin #1. sync time by lidao996 at 20230101 3 * * * * /sbin/ntpdate ntp.aliyun.com &>/dev/null 3 * * * * /sbin/ntpdate ntp.aliyun.com &>/dev/null &>/dev/null
磁碟管理
1. 磁碟分類
1.1 磁碟介面
1. IDE 淘汰
2. SCSI 淘汰
3. STAT 常見(家用)
4. SAS 企業伺服器標配
1.2 機械磁碟轉速
家用:STAT 5400 7200 10000/分鐘
企業:STAT or SAS 7200 10000 儲存或測試
2. 磁碟raid
又叫:磁碟整列 raid卡/陣列卡
為什麼要做raid
: 1. 獲取更大容量: 將多塊磁碟在邏輯上合成一個磁碟
:2. 獲得更高的效能
:3. 獲得更好的安全性
3. 磁碟分割槽
fdisk 對小於2T的磁碟進行分割槽
parted 對大於2T的磁碟進行分割槽
- 小於2T的磁碟格式是MBR,使用fdisk進行分割槽
- 第一步:插入一塊磁碟1T
- 第二步:物理機不需要重啟
- 檢視磁碟列表資訊
- 第三步,磁碟分割槽
- MBR 只能有4個主分割槽(對小於2T的硬碟)
- GPT 無限制(主分割槽)
檢視磁碟列表資訊 fdisk -l # 磁碟分割槽 fdisk 磁碟名稱 第三步:磁碟分割槽(類似給房間打隔斷) [root@oldboy ~]# fdisk /dev/sdb d delete a partition # 刪除一個分割槽 l list known partition types # 列出分割槽型別 m print this menu # 列印幫助 n add a new partition # 建立分割槽 p print the partition table # 輸出分割槽表 q quit without saving changes # 退出不儲存 w write table to disk and exit# 儲存並退出 Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p Partition number (1-4, default 1): 1 直接回車即可 First sector (2048-20971519, default 2048): 2048 直接回車即可 Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): +1G Partition 1 of type Linux and of size 1 GiB is set Command (m for help): p Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0xcf1f945d Device Boot Start End Blocks Id System /dev/sdb1 2048 2099199 1048576 83 Linux 刪除一個分割槽: Command (m for help): d Partition number (1-4, default 4): 4 分完區檢視: Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0xcf1f945d Device Boot Start End Blocks Id System /dev/sdb1 2048 2099199 1048576 83 Linux /dev/sdb2 2099200 4196351 1048576 83 Linux /dev/sdb3 4196352 6293503 1048576 83 Linux /dev/sdb4 6293504 20971519 7339008 5 Extended /dev/sdb5 6295552 10489855 2097152 83 Linux /dev/sdb6 10491904 20971519 5239808 83 Linux 第四步: 格式化分割槽(裝修風格、清理房間) [root@oldboy ~]# mkfs.xfs /dev/sdb1 make file system 製作檔案系統 預設使用xfs即可 第五步: 掛載使用 建立一個入口檔案,空的目錄 [root@oldboy ~]# mount /dev/sdb1 /mnt [root@oldboy ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 980M 0 980M 0% /dev tmpfs 991M 0 991M 0% /dev/shm tmpfs 991M 9.5M 981M 1% /run tmpfs 991M 0 991M 0% /sys/fs/cgroup /dev/sda3 18G 2.3G 16G 13% / /dev/sr0 4.5G 4.5G 0 100% /data /dev/sda1 197M 110M 88M 56% /boot tmpfs 199M 0 199M 0% /run/user/0 /dev/sdb1 1014M 33M 982M 4% /mnt 解除安裝磁碟: [root@oldboy ~]# umount /mnt 第六步: 寫入開機自動掛載 [root@oldboy ~]# tail -1 /etc/fstab /dev/sdb1 /mnt xfs defaults 0 0 [root@oldboy ~]# mount -a 執行一次/etc/fstab中的配置 企業常用磁碟掛載方式: 1.插入新的磁碟900G 2.格式化分割槽 # 直接使用下面的命令相當與windows 硬碟格式化 會自動分割槽 [root@oldboy ~]# mkfs.xfs -f /dev/sdb 3.掛載使用 [root@oldboy ~]# mount /dev/sdb /mnt [root@oldboy ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 980M 0 980M 0% /dev tmpfs 991M 0 991M 0% /dev/shm tmpfs 991M 9.5M 981M 1% /run tmpfs 991M 0 991M 0% /sys/fs/cgroup /dev/sda3 18G 2.3G 16G 13% / /dev/sr0 4.5G 4.5G 0 100% /data /dev/sda1 197M 110M 88M 56% /boot tmpfs 199M 0 199M 0% /run/user/0 /dev/sdb 10G 33M 10G 1% /mnt 大於2T磁碟分割槽: parted 配置好後分割槽直接生效 第一步: 插入3個T磁碟 第二步: 分割槽 help 檢視幫助資訊 mklabel 建立新的磁碟標籤 mkpart 建立分割槽 print 檢視分割槽 quit 退出 rm 刪除分割槽 第一步:parted /dev/sdc # 修改為gpt格式 第二步: (parted) mklabel gpt 第三步: (parted) mkpart # 開始分割槽 第四步: Partition name? []? test1 # 主分割槽的名稱 第五步: File system type? [ext2]? xfs # 檔案系統型別 第六步: Start? 0 # 開始 第七步: End? 500G # 結束大小 第八步 Warning: The resulting partition is not properly aligned for best performance. Ignore/Cancel? I # 輸入I 忽略 第九步: (parted) print # 列印分割槽表 Model: VMware, VMware Virtual S (scsi) Disk /dev/sdc: 3221GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 17.4kB 500GB 500GB test1 (parted) mkpart Partition name? []? test2 File system type? [ext2]? xfs Start? 500G End? 1000G (parted) print Model: VMware, VMware Virtual S (scsi) Disk /dev/sdc: 3221GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 17.4kB 500GB 500GB test1 2 500GB 1000GB 500GB test2 刪除分割槽: (parted) rm Partition number? 2 支援非互動式分割槽: (parted) mkpart test2 xfs 500G 1000G (parted) print Model: VMware, VMware Virtual S (scsi) Disk /dev/sdc: 3221GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 17.4kB 500GB 500GB test1 2 500GB 1000GB 500GB test2 在shell命令列直接分割槽: [root@oldboy ~]# parted /dev/sdc mkpart test3 xfs 1000G 2000G 檢視分割槽: [root@oldboy ~]# parted /dev/sdc print 刪除分割槽: [root@oldboy ~]# parted /dev/sdc rm 3 第三步: 格式化分割槽 [root@oldboy ~]# mkfs.xfs /dev/sdc1 第四步: 掛載使用 [root@oldboy ~]# mount /dev/sdc1 /mnt You have new mail in /var/spool/mail/root [root@oldboy ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 980M 0 980M 0% /dev tmpfs 991M 0 991M 0% /dev/shm tmpfs 991M 9.5M 981M 1% /run tmpfs 991M 0 991M 0% /sys/fs/cgroup /dev/sda3 18G 2.3G 16G 13% / /dev/sda1 197M 110M 88M 56% /boot tmpfs 199M 0 199M 0% /run/user/0 /dev/sdc1 466G 33M 466G 1% /mnt
4. 磁碟相關案例
案例1.伺服器記憶體滿會殺死佔用記憶體最高的程序,oom記憶體溢位
導致記憶體溢位的原因:
1)訪問量大,增加記憶體
2)由於程序程式導致記憶體飆升java,查詢程式的原因
3)由於業務的網路波動原因
4)內部伺服器 記憶體不夠用的時候臨時使用swap解決
swap分割槽: 是磁碟的分割槽不是記憶體 速度非常慢
swap建議分配記憶體的1-1.5倍 如果記憶體大於8G 則swap給8G即可
建立swap方式:
兩種
第一種安裝作業系統進行分割槽
第二種安裝完作業系統建立swap
1)建立一個塊檔案
[root@oldboy ~]# dd if=/dev/zero of=/tmp/1g bs=1M count=1000
2)格式化為swap型別
[root@oldboy ~]# mkswap /tmp/1g
3)掛載swap分割槽
[root@oldboy ~]# swapon /tmp/1g
swapon: /tmp/1g: insecure permissions 0644, 0600 suggested.
You have new mail in /var/spool/mail/root
[root@oldboy ~]# free -h
total used free shared buff/cache available
Mem: 1.9G 120M 734M 9.5M 1.1G 1.7G
Swap: 3.0G 0B 3.0G
4)檢視swap分割槽的組成
[root@oldboy ~]# swapon -s
Filename Type Size Used Priority
/dev/sda2 partition 2097148 0 -2
/tmp/1g file 1023996 0 -3
5)解除安裝swap檔案
[root@oldboy ~]# swapoff /tmp/1g
系統分割槽:
/boot
/
案例2.磁碟無法寫入怎麼解決
1.inode號滿
df -i
2.block滿
df -h
如何查詢小檔案多的目錄
find / -type d -size +1M
如何查詢大檔案
find / -type f -size +1G
檢視整個目錄及下面所有內容的大小
du -sh
案例3.刪除檔案不釋放磁碟空間
因為程序被呼叫的原因導致無法釋放
模擬程序被呼叫:
1.生成1個大檔案
dd if=/dev/zero of=/tmp/1g bs=1M count=1000
2.呼叫檔案
[root@oldboy ~]# tailf /tmp/1g
3.刪除檔案發現磁碟空間沒有釋放
4.檢視檔案被哪個程序所有呼叫lsof
安裝命令
[root@oldboy ~]# yum -y install lsof
[root@oldboy ~]# lsof |grep 1g
vim 2488 root 3r REG 8,3 1048576000 17573898 /tmp/1g (deleted)
vim 2488 root 4u REG 8,3 4096 17573899 /tmp/.1g.swp
You have new mail in /var/spool/mail/root
[root@oldboy ~]# kill -9 2488
****案例4.解決磁碟不夠用
第一塊磁碟不夠用: 由於日誌檔案佔用磁碟空間過大
/var/log/nginx/access.log # 預設第一塊磁碟空間100G
上面路徑不變,解決磁碟不夠用!
第一步: 增加一塊磁碟 2T
第二步: 掛載磁碟
mkdir /data
mount /dev/sdb /data
第三步: 將access.log移動到新的磁碟(禁止使用者上傳或者寫入資料)
第四步: 做軟連結
ln -s /data/access.log /var/log/nginx/access.log
任務管理
1. 程序的概述
1.什麼是程序
當我們執行一個程式,那麼我們將執行的程式叫程序
PS1:當程式執行為程序後,系統會為該程序分配記憶體,以及程序執行的身份和許可權
PS2:在程序執行的過程中,伺服器上會有各種狀態來表示當前程序的指標資訊
2.程式和程序的區別
程式是資料和指令的集合,是一個靜態的概念,比如/bin/ls /bin/cp 等二進位制文 件,同時程式可以長期存在系統中
程序是程式執行的過程,是一個動態的概念,程序是存在生命週期概念的,也就是說程序 隨著程式的終止而銷燬,不會永久存在系統中
3.程式的生命週期
一個物件從無到有、從有到無過程稱為生命週期
2. 監視程序狀態
程式在執行後,我們需要了解程序的執行狀態,檢視程序的狀態分為:靜態和動態兩種方式
1.使用ps命令檢視當前的程序狀態(靜態)
ps –auxf常用組合方式檢視程序、PID、佔用cpu百分比,佔用記憶體百分比,狀態、執行的命令等
-a顯示所有終端機下執行的程序,除了階段作業領導者之外
-u以使用者為主的格式來顯示程序狀況
-x顯示所有程序,不以終端機來區分
-f用ASCII字元顯示樹狀結構,表達程序間的相互關係
2.1 案例
1. 案例1
1)在終端1上執行vim
[root@lzy ~]# vim test
2)在終端2上執行ps命令檢視狀態
[root@lzy ~]# ps axu|grep test #S表示睡眠模式 +表示前臺執行
root 14240 0.1 0.5 151868 5676 pts/1 S+ 10:48 0:00 vim test
root 14271 0.0 0.0 112660 968 pts/2 R+ 10:48 0:00 grep --color=auto test
3)在終端1上掛起vim命令按下: ctrl+z
4) 回到終端2再次執行ps命令檢視狀態
root@lzy ~]# ps axu|grep test # T表示停止狀態
root 14240 0.0 0.5 151868 5676 pts/1 T 10:48 0:00 vim test
root 14279 0.0 0.0 112660 964 pts/2 R+ 10:51 0:00 grep --color=auto test
2. 案例2
PS命令檢視不可中斷狀態程序
使用tar打包檔案時,可以透過中斷不斷檢視狀態,由S+,R+變為D+
[root@lzy ~]# ps axu|grep tar|grep -v grep
root 14289 2.6 0.1 124268 1888 pts/2 S+ 10:56 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var
[root@lzy ~]# ps axu|grep tar|grep -v grep
root 14289 2.7 0.2 124380 2240 pts/2 R+ 10:56 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var
[root@lzy ~]# ps axu|grep tar|grep -v grep
root 14289 2.9 0.2 124916 2724 pts/2 D+ 10:56 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var
2.2 使用top命令檢視當前的程序狀態 動態
3. 管理程序狀態
當程式執行為程序後,如果希望停止程序,怎麼辦呢?那麼此時我們可以使用linux的kill命令對程序傳送關閉訊號,當然除了kill 還有killall pkill
1) 使用kill –l列出當前系統所支援的訊號
雖然Linux訊號很多,但是我們僅僅使用最常用的3個訊號
1) SIGHUP 重新載入配置檔案 1
2) SIGKILL 強制殺死程序 9
3) SIGTERM 平滑終止程序,預設kill使用該訊號(將記憶體中的資料會持續寫入到磁碟) 15
[root@lzy ~]# ps axu|grep nginx root 15688 0.0 0.1 87384 1132 ? Ss 12:19 0:00 nginx: master process /usr/sbin/nginx nginx 15689 0.0 0.3 89096 3176 ? S 12:19 0:00 nginx: worker process root 15691 0.0 0.0 112660 968 pts/3 R+ 12:19 0:00 grep --color=auto nginx # 傳送重新載入訊號 nginx配置檔案發生改變,可用此重新載入 [root@lzy ~]# kill -1 15688 [root@lzy ~]# ps axu|grep nginx nginx 15692 0.0 0.3 89376 3648 ? S 12:19 0:00 nginx: worker process root 15722 0.0 0.0 112660 968 pts/3 R+ 12:20 0:00 grep --color=auto nginx 傳送停止訊號 kill pid root@lzy ~]# kill 15692 強制終止服務 kill -9 15692
- Linux系統中
killall,pkill
命令用於殺死指定名字的程序,我們可以使用kill命令殺死指定程序的PID的程序,killall和pkill直接殺程序而不需要查pid[root@oldboy ~]# yum -y install psmisc # killall需要安裝 [root@lzy ~]# killall nginx [root@lzy ~]# pkill nginx 使用pkill踢出從遠端登入到本機的使用者,終止pts1上所有程序,使用者強制退出 [root@lzy ~]# pkill -9 -t pts/1
4. 程序後臺執行
方式一
nohuo 命令 &
將程式放在後臺執行# 方式一 nohuo 命令 & # 1. 程式在後臺執行 sleep 3000 & # 在命令末尾新增 & # 2. 程式在後臺執行並且 將輸出定義到空 ping -c1 -W1 www.baidu.com &>/dev/null # 3. 為了避免關閉當前視窗,使用`&`後臺執行的程式也會終止,使用nohup nohup sleep 3000 &
注:& 將程式放在後臺執行,當 當前視窗結束時,程序也會隨之結束
使用
nohup
配合&
將程式放到後臺執行
- nohup執行的後臺程式,它如果有輸出的話,會將輸出結果儲存到當前目錄下的
nohup.out
檔案中,容易將磁碟搞滿nohup
配合&
能將程式持續在後臺執行而不退出方式二
screen
將程式放在後臺執行1. 安裝 yum -y install screen 2. 建立一個新的會話 screen -S 會話名稱 3. `ctrl a d` 離開當前會話,但該screen 會話仍在執行 4. 檢視screen會話 screen -ls or screen -list 5. 重新進入該screen會話 screen -r 會話名稱or程序號 6. 在screen 會話中執行 exit or ctrl d 退出(終止)screen 會話
網路知識
1. OSI7層模型
2. 網路抓包
2.1 Linux轉包工具tcpdump
1. yum -y install tcpdump
tcpdump是一個用於擷取網路分組,並輸出分組內容的工具。憑藉強大的功能和靈活的擷取策略,使其成為類UNIX系統下用於網路分析和問題排查的首選工具
tcpdump 支援針對網路層、協議、主機、網路或埠的過濾,並提供and、or、not等邏輯語句來幫助你去掉無用的資訊
#常用選項
[root@oldboyedu ~]#yum -y install tcpdump
-i #監聽哪一個網路卡
-n #不把ip解析成主機名
-nn #不把埠解析成應用層協議
-c #指定抓包的數量
-S #不把隨機序列和確認序列解析成絕對值
-w #將流量儲存到檔案中,檔案中的資訊是無法直接檢視的
-r #讀取檔案中的內容
-v #輸出一個稍微詳細的資訊,例如在ip包中可以包括ttl和服務型別的資訊。
-vv #輸出詳細的報文資訊。
-nnvvi eth0
#例項
1、預設啟動
tcpdump -vv #普通情況下,直接啟動tcpdump將監視第一個網路介面上所有流過的資料包。
2、過濾主機
tcpdump -i eth1 host 192.168.1.1 #抓取所有經過eth1,目的或源地址是192.168.1.1的網路資料
tcpdump -i eth1 src host 192.168.1.1 #指定源地址,192.168.1.1
tcpdump -i eth1 dst host 192.168.1.1 #指定目的地址,192.168.1.1
3、過濾埠
tcpdump -i eth1 port 80 #抓取所有經過eth1,目的或源埠是80的網路資料
tcpdump -i eth1 src port 80 #指定源埠
tcpdump -i eth1 dst port 80 #指定目的埠
4、協議過濾
tcpdump -i eth1 arp
tcpdump -i eth1 ip
tcpdump -i eth1 tcp
tcpdump -i eth1 udp
tcpdump -i eth1 icmp
#抓tcp某埠的資料包
tcpdump -i eth0 tcp port 21 -nn
5、常用表示式
非 : ! or "not" (去掉雙引號)
且 : && or "and"
或 : || or "or"
#抓取所有經過eth1,目的地址是192.168.1.254或192.168.1.200埠是80的TCP數
tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'
#抓取所有經過eth1,目標MAC地址是00:01:02:03:04:05的ICMP資料
tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
#抓取所有經過eth1,目的網路是192.168,但目的主機不是192.168.1.200的TCP資料
tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'