1. 程式人生 > 其它 >極客時間--《LINUX實戰100講》筆記

極客時間--《LINUX實戰100講》筆記

技術標籤:linuxlinuxshell

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)檢視上一個