極客時間--《LINUX實戰100講》筆記
LINUX的使用者及使用者組
su 切換使用者,如果帶-則是完全切換,被把目錄進入到使用者家目錄。
sudo 用自己的使用者以其他使用者身份執行命令
usermod用於修改使用者的屬性
usermod -d /home/w1 user3 可以用於使用者的家目錄
建立使用者組
groupadd group1
usermod -g group1 user1 將user1的使用者組改為group1
useradd -g group1 user2 新建使用者並將它設定為group1
/etc/passwd 用來儲存使用者資訊
/etc/shadow 儲存使用者密碼
/etc/group 儲存使用者組相關資訊 ,用來設定一個使用者兩個組
系統執行級別
checkconfig list檢視各服務在什麼init級別下執行
systemd的是在wanted裡面的target有
和init級別對應的target,達到init的效
如,runlevel.target。
init各級別與systemd對應關係
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-azIR6TYW-1611407403954)(C:\Users\Jazon\Desktop\linux\對應關係.png)]
linux後臺執行
加&,後臺執行
jobs列出後臺執行的任務
fg jobid彈出到前臺
ctrl+z收回到後臺,掛起了。
bg1 重新後臺執行
訊號
管道和訊號是兩種程序通訊的方式
ctrl+c其實是一種訊號
kill -l檢視所有訊號
screen保持後臺執行
screen: 即使網路斷開了(關閉終端),也可以繼續執行 程式。
screen 進入screen
ctrl + a + d退出screen
screen -ls檢視當前screen的列表
screen -r screenid切入到screen
SELINUX
SELINUX防止許可權控制不當
原理:給使用者 程序 檔案打上標籤 ,標籤一致才能修改檔案。
vim /etc/selinux/config編輯是否開啟selinux,重啟生效。
檢視磁碟及分割槽
如果swap不開啟,記憶體不足會隨機殺掉。
fdisk檢視磁碟及它的分割槽
parted -l也可以檢視 和上面的差不多
df -h看分割槽和掛載目錄及容量
ls -l /etc/passwd,檢視含有空洞檔案
du /etc/passwd,檢視實際佔用的檔案
dd建立空洞檔案
linux檔案的構成
ls -li /etc/passwd
檢視passwd檔案的i節點編號
i節點上儲存了許可權,所屬組之類的資訊,i節點鏈式掛載了datablock資料塊
i節點,檔名記錄到父目錄的i節點中
ls 檢視的資料塊的整體大小
du是檢視資料塊實際使用大小
個體比較小的檔案,在linux中也是用4K
這是各類檔案伺服器出現的原因
- mv改名會改變i節點嗎?
不會,他只會改變目錄裡i節點的檔名
- mv移動會改變i節點嗎?
離開分割槽時會,不離開分割槽不會,離開分割槽時很長。
- 正常vim修改檔案會改變i節點嗎?
會,原理是vim有個swp檔案存在,這是vim對檔案一致性的考慮,相當於改變了檔案。
- rm是什麼原理?
父目錄的檔名和檔案的i節點斷開
- ln的原理(硬連結)?
讓檔名指向i節點,就實現了多個檔名指向同一個i節點。
- 跨越分割槽,如何連結?
使用軟連線,ln -s afile aafile,兩者的i節點就不一樣了, 它儲存了其代表的檔案的
絕對路徑,是另外一種檔案(連結檔案),在硬碟上,有獨立的區塊,訪問時會替換自己的路徑。
所以,如果刪除掉被連結的檔案,再去開啟軟連結,被連結檔案,自然打不開。(和win快捷方式一樣),但是硬連結能開啟,因為他不是替換。而是有相同的i節點引用。軟連線的一切操作都是會替換到被連結的檔案,雖然他們的i節點不同,但是修改軟連線的許可權,也是修改的被連結的檔案。
普通許可權的補充
普通的許可權不滿足,要使用facl
getfacl afile
setfacl -m :user1:r afile
給硬碟分割槽
fdisk檢視硬碟
fdisk /dev/sdc 對sdc硬碟裝置分割槽
n 新建分割槽
p 主分割槽
設定分割槽號 1
起始值回車用預設
last扇區:+50G 給分割槽1分配50G
fdisk -l檢視分配的分割槽
mkfs.ext4 /dev/sdc1對分割槽做檔案系統
mkdir /mnt/sdc1
mount /dev/sdc1/ /mnt/sdc1
大於2T的,用parted命令進行掛載
mount掛載是臨時的,需要修改etc/fstab才能永久儲存
這個檔案
/dev/sdc1 /mnt/sdc1 ext4 defaults 0 0
給swap擴容
swap分割槽擴容
用分割槽的方式給swap擴容
mkswap /dev/sdd1
swapon /dev/sdd1
swapoff /dev/sdd1
用檔案的方式給swap擴容
dd if=/dev/zero bs=4M count=1024 of=/swapfile
mkswap /swapfile
chmod 600 /swapfile
swapon /swapfile
永久儲存需要修改fstab
vim /etc/fstab
/swapfile swap swap defaults 0 0
第一個0代表是否備份 第二個0代表自檢
linux組RAID
RAID
多塊硬碟組合
RAID 0 把一份資料拆成兩份,單盤只存50%
RAID 1 映象,兩個硬碟存的一樣
RAID 5 有奇偶校驗
RAID 10
要使用RAID卡比較好
邏輯卷
LVM
卷:一個物理裝置就是一個卷
物理卷分割槽擴容需要先拷走檔案
邏輯卷: 疊在物理上面,邏輯上的一個裝置
檢視系統綜合狀態
系統綜合狀態
sar -u 1 10
sar -r 1 10
linux檢視十六進位制檔案
hexdump可以看十六進位制檔案
各種方式執行shell指令碼
bash ./filename.sh 子程序
./filename.sh 子程序,用#!後面的東西去解釋這個指令碼
source ./filename.sh 當前程序
. ./ filename.sh 當前程序
cat命令輸入檔案
cat > /tmp/a.sh < EOF
echo ‘hello’
EOF
let命令
使用let計算
let a=10+20
shell中最好不要計算
將命令結果給到變數
命令結果賦值給變數,也可以使用``
letc=$(ls -l /etc)
變數中如果有空格
name="xu jz "
檢視環境變數
env 檢視環境變數
set 檢視環境變數及預變數
$號的作用
$$ 程序號
$0 程序名 不同執行方式 結果不一樣 bash執行時,是shell檔名稱
$? 上一個命令執行結果
$1 $2 ${10}讀取位置引數
${2-k} 如果$2沒值 那就用 'k’替換
預設環境變數載入
/etc/profile
/etc/profile.d
~/.bash_profile
~/.bashrc
/etc/bashrc
source 可以匯入環境變數,如果修改了環境變數檔案,則source則可以匯入環境變數
原理:根據各種情況進入bash,呼叫不同的配置檔案,則變數開始生效,比較nologin shell 和login shell是載入
不同配置。su - root 獲取一個 login shell。
陣列
IPTS=(10.0.0.1 10.0.0.2 10.0.0.3)
列印陣列 echo ${IPTS[@]}
列印陣列數量 echo ${#IPTS[@]}
完全引號和非完全引號
“”不完全引號,會去解析$
''是完全引用
``是命令
算數運算
expr 用於算數運算子 a=expr 4 + 5 記得 要空格
let a=4+5 讓變數a為9
(( a=4+5 )) 雙括號其實是let的簡寫, 讓變數等於9
只支援整數運算
特殊符號總結
圓括號可以產生子shell (a=123),這個產生了一個子shell
陣列pts=(10 23 30)
運算echo $(( 10+20))
( ) 用 於 在 裡 面 加 入 一 個 命 令 , c m d 1 = () 用於在裡面加入一個命令, cmd1= ()用於在裡面加入一個命令,cmd1=(ls),則cmd1是ls的執行結果
echo {0…9} // 列印0 到 9,花括號與數字沒有空格
cp /etc/passwd{,.bak} // 利用花括號複製省略
test命令 test 7 -gt 6 ,測試7是否大於6 是的話,是的話返回0,不是的話返回1,返回用$?檢視
test等價於[ 7 -gt 6 ]是的話,打印出$?
測試的擴充套件 [[ 5 > 4 ]] 如果不用此擴充套件 則 []裡面只能用gt這樣的命令,[[]]能用數字運算比較
test akc = akc // 等號兩側記得加上空格
[ akc = akc ] // []和test等價,[]與test 只支援 =和 !=,不支援>這樣的符號,要這樣的邏輯只能用-gt, test 6 -gt 3
(( 5 > 3 && 6 > 5 ))
(( ! 5 > 4 ))
[ -e /tmp/xujz/test.json ] //判斷是否存在
[ -d /tmp/xujz/test.json ] //判斷是否是普通檔案
[ -f /tmp/xujz/test.json ] //判斷是否是普通檔案
[[]] 裡面可以加判斷表示式,比如字串的和數字的
(())裡面只能用於數字運算的表示式
if 語句
if [ $UID = 0 ];
then
echo " i am root";
fi
if pwd;
then
echo "run pwd success"
fi
if [ $USER = root ]; then
echo 'you are root'
elif [ $USER = user1 ]; then
echo 'you are user1'
else
echo 'other user'
fi
case語句
#!/bin/bash
cmd=$1
echo $cmd
case "${cmd}" in
"START"|"start")
echo $0 start
;;
"STOP")
echo $0 stop
;;
*)
echo "usage: $0 start | stop"
;;
esac
shell的迴圈
- for迴圈
for filename in `ls *.mp3`
do
mv $filename $(basename $filename .mp3).mp4
done
- C語言風格的for
for (( i=1; i<=10; i++ ))
do
echo $i
done
- while迴圈
while [ $a -lt 10 ];
do
(( a++ ))
echo $a
done
# 寫一個不斷迴圈
while :;
do
echo "run"
done
- until迴圈
// 直到條件為真才結束迴圈
until [ 5 -lt 4 ];
do
echo always
done
break和continue
各種$引數的含義
$0 代表指令碼的名字
∗ 和 *和 ∗和@ 獲取所有引數
$# 代表引數個數,shitf是引數左移,即刪掉第一個引數
while [ $# -ge 1 ]
do
echo $1
shitf
done
shell函式
function cdls() {
cd /var
ls
}
# 還可以將function省略掉
cdls() {
cd /var
ls
}
# 函式接引數,也是用$接收
cdls() {
cd /$1
ls
}
# 使用
cdls /tmp
# 使用local定義變數,防止變數影響到外部變數
checkpid() {
local i
for i in $*;do
[ -d "/proc/$i" ] && return 1
done
return 0
}
# 使用source或者. checkpid.sh方式匯入函式,不能使用bash checkpid.sh方式匯入,否則函式存在子程序中
source checkpid.sh
系統函式庫
source /etc/init.d/functions
echo_succes
# pathmunge函式 用於加配置到PATH中
source /etc/profile
指令碼資源控制
nice renice控制指令碼優先順序
# 檢視資源限制
ulimit -a
shell 指令碼訊號捕獲
有些時候,我們希望我們的指令碼不被ctrl+c停止,就要捕獲這個訊號,ctrl+c是訊號2,所以我們可以捕獲他,9訊號是不可捕獲的。
# 捕獲2訊號,即ctrl+c
trap "can't no stop" 2
crontab定時任務
計劃任務
at 18:01
echo hello > /tmp/hello.txt
# 配置crontab
crontab -e
# 檢視crontab
crontab -l
# 儲存cron任務的目錄
cd /var/spool/cron
延時計劃任務
# 檢視延時計劃任務
vim /etc/anacrontab
指令碼單例執行
# flock -xn即排他,利用檔案鎖進行的
flock -xn "/tmp/f.lock" -c "/root/a.sh"
文字查詢元字元
# 查詢檔案裡的password
grep password /root/anaconda-ks.cfg
# 匹配換行符以外的任意單個字元,一個.代表一個字元
grep pass.... /root/anaconda-ks.cfg
# $是結尾,查詢pass開頭,接著四個字元,結尾的
grep pass....$ /root/anaconda-ks.cfg
# *匹配前一個字元的任意個,下面的能匹配 0個s(pas) 一個s(pass) 兩個 s(passs)
grep pass* /root/anaconda-ks.cfg
# *與.搭配使用,可以匹配 passsdfdfe,即匹配pass開頭
grep pass.* /root/anaconda-ks.cfg
# []匹配方括號任意字元,匹配Hello或者hello
grep [Hh]ello /root/anconda-ks.cfg
# 以開頭 ^# 以#開頭
grep ^# /root/anconda-ks.cfg
# 轉義,查詢帶.號,記得帶""
grep "\." anaconda-ks.cfg
擴充套件元字元
# + 匹配一次到多次
# ? 匹配零次或一次
# | 匹配它前面或後面的正則表示式
示例
# 這種只能使用萬用字元
find /etc/ -name passwd
find /etc/ -name passwd*
# 加上-regex就能使用元字元
find /etc/ -regex .*wd$
# 精確找到/etc/passwd
find /etc/ -regex .etc.*wd$
# 查詢8小時內未訪問的,ctime是改了i節點
find /etc/ -atime 8
cut命令
# 將每行用空格分開,然後取第一個
grep pass /root/anaconda-ks.cfg | cut -d " " -f 1
# 用空格分開,然後排序,然後統計每個出現次數,然後再排序。uniq只會對相鄰的行做統計,所以第一次sort是為了這個
cut -d " " -f 7 /etc/passwd | sort | uniq -c | sort
Sed命令
sed命令,也是可以使用元字元的
將檔案以行為單位讀入記憶體(模式空間)
使用sed的每個指令碼對改行進行操作
sed命令使用
// \1即捕獲組的第一個,這裡就是空格,所以程式碼的意思
// 將每一行以至少一個空格開頭的行在行首加#
sed -i 's/\(^[[:space:]]\)/#\1/g' /tmp/rc.sysinit
sed 's/old/new/' filename
# 多個處理,也可以將-e去掉,然後用分號;隔開, sed 's/old/new/;s/old/new/'
sed -e 's/old/new/' -e 's/old/new/' filename
# 替換完成寫到檔案裡
sed -i 's/old/new' 's/old/new' filename
# 支援擴充套件表示式,即支援+ ? |
sed -r 's/擴充套件正則表示式/new' filename
# sed的分組功能,用括號括起來,然後\1取得分組
sed -r 's/(a.*b)/\1:\1/'
# 全域性替換/g ,第二個匹配則使用 /2
head -5 /etc/passwd | sed 's/root/!!!!/g'
sed命令加強版
# p列印模式空間,在行末列印模式空間
head -5 /etc/passwd | sed 's/root/!!!!/p'
# 只輸出替換成功的行 -n,
head -5 /etc/passwd | sed -n 's/root/!!!!/p'
# 將替換成功的輸出到檔案中
head -5 /etc/passwd | sed -n 's/root/!!!!/w' /tmp/a.txt
sed定址
# 使用正則表示式定址
head -t /etc/passwd | sed '/^bin/s/adm/!/'
# 使用行號限制 n,ms,第n到m行,ns即第n行
head -t /etc/passwd | sed '1,3s/adm/!/'
# 混合使用,正則表示式混合行號 以bin開頭直到結尾
head -t /etc/passwd | sed '/^bin/,$s/adm/!/'
# 定址匹配多條命令
head -t /etc/passwd | sed '/^bin/{s/adm/!/;s/rdm/!/}'
其他sed指令
# d,刪除匹配的模式空間,因為刪除了,所以此模式空間的相關命令不會再執行
sed 'ab/d' bfile
# i,追加命令,在匹配ab的上一行插入Hello
sed 'ab/i Hello'
# a,追加命令,在匹配ab的下一行插入Hello
# c,將匹配的模式空間替換
sed 'ab/c Hello'
# 輸出匹配book的行
sed -n '/book/p'
AWK的使用
sed將不規範的文字格式化為規範的文字,awk再將規範文字輸出
// 讀取以menu開頭的行,以單引號分隔
awk -F "'" '/^menu/{print $2}' /boot/grubs/grub.cfg
// x++用於,可以用於顯示得到的行號
awk -F "'" '/^menu/{print x++,$2}' /boot/grubs/grub.cfg
使用FS,及OF控制切割符及結果分割符
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-UHgwc5Cf-1611407403958)(C:\Users\Jazon\Desktop\linux\FS和OFS修改.png)]
使用RS作為行分割符號, 預設是\n。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-t2nCiKDg-1611407403966)(C:\Users\Jazon\Desktop\linux\RS作為行分隔符.png)]
使用 NR和FNR顯示行號
# 顯示行號及該行內容
head -5 /etc/passwd | awk '{print NR, $0}'
# FNR會將檔案各自的行號列出來,而FNR會將檔案的行號遞增
awk '{print FNR,$0}' /etc/hosts /etc/hosts
使用NF看欄位數量
# 以:為分隔符,檢視每行的欄位數量
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print NF}'
# 以:為分隔符,檢視每行的最後一個欄位內容
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $NF}'
awk還能支援關係操作符
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-L8fUFQ5W-1611407403969)(C:\Users\Jazon\Desktop\linux\kpi.png)]
# 第二個欄位大於等於80,列印第一個欄位
awk '{if($2>=80) print $1}' /etc/kpi.txt
# 使用迴圈遍歷每一個值
awk '{sum=0;for(c=2;c<=NF;c++) sum+=$c;print sum/(NF-1)}' kpi.txt
# END代表整個檔案讀取完成之後才會去做的操作
awk '{sum=0;for(column=2;column<=NF;column++) sum+=$column;average[$1]=sum/(NF-1)}END{for(user in average) sum2+=average[user];print sum2/NR}' kpi.txt
# 將awk(上面單引號那段)儲存成文字檔案avg.awk,後續直接用文字檔案可以使用awk
awk -f avg.awk kpi.txt
# 命令列引數陣列ARGC及ARGV
BEGIN{
for(x=0;x<ARGC;x++)
print ARGV[X]
PRINT ARGC
}
# awk還能自定義函式,下面的語句定義了一個函式double,結果將列印hello awkhello awk
awk 'function double(str) {return str str} BEGIN {print double("hello awk")}'
vim
shift+i ,游標停留行首
小寫的a,游標進入之前游標的下一位
大寫的a,游標進入到之前游標的行尾
小寫的o進入當前的行的下一行,並且將下一行往下移,得到一個空行。
大寫的o進入當前的上一行,並且把上面的內容都網上移一行
HJKL,左下上右
yy複製整行,3yy複製當前包含當前行的三行,y$複製當前游標到行尾
p進行黏貼
dd 剪切當行,d$當前游標到行尾剪下
ctrl+r將撤銷的重做
x將單個字元的刪除
r將當前字元進行替換
數字 加 shift+G移動到數字行
shift+G到最後一行
g到第一行
^字元到行首
$到行尾
:!可以用於執行其他linux 例如:!ifconfig
查詢之後按n可以檢視下一個,大寫N(shift+n)檢視上一個