自動化運維

shell:命令解釋器

shell位於操作系統和應用程序之間,解釋對應命令至對應位置

分類:

  • 圖形化界面:桌面
  • 命令行

編寫與執行

#! /bin/bash

/bin/bash filename.sh

# 不需要有可執行權限,建議文件路徑寫完整
bash /bin/bash script_name 或 /bin/bash /root/script_name
# 腳本需要有可執行權限
/bin/bash script_name 或 ./script_name
# 當前環境下執行
source script_name 或 . script_name

註釋

除第一行外,其他使用#

多行註釋:

:<<!
多行註釋
!
# !可以替換爲@?abc等

變量

  • 普通變量:
    • a = 值 # 值爲整體,無特殊符號
    • a = '值' # 看到什麼輸出什麼,不解析值範圍可解析內容
    • a = "值" # 如果值範圍有可解析內容,優先執行
  • 命令變量
    • a = `命令`
      • a = $(命令) # 先獲取命令值
  • 全局變量
    • env 顯示全局變量
    • a = 值 # 設置普通變量爲全局變量 export a
    • export a=值
  • 查看和取消
    • $變量名
    • "$變量名"
    • ${變量名}
    • "${變量名}"
    • # 取消 unset 變量名
  • 內置變量
    • $0 獲取當前執行shell文件名稱
    • $n (1…9) 獲取命令行參數
    • $# 獲取命令行中參數的總個數
    • $? 獲取上一個指令的返回值(0爲成功,非0爲失敗)

字符串截取

${變量名:起始位置:截取長度}

file = 112lkjlj234234

${file:0:5} 從第一個字符開始,截取5個字符(0可以省略)

${file:0-6:3} 從倒數第6個字符開始,截取之後的3個字符

獲取默認值

${變量名:-默認值} 如果變量有值,則取變量值,沒有則取默認值

${變量名:+默認值} 無論變量是否有值,強制使用默認值

測試語句

條件成立,返回0,不成立,返回1

  • test 條件表達式
  • [ 條件表達式 ]

文件表達式

  • -f 判斷後邊輸入的是否是一個文件

    [ -f file.sh ]

  • -d 判斷輸入是否是一個目錄

    [ -d Desktop ]

  • -x 判斷輸入是否有執行權限

    [ -x file.sh ]

數值操作符

-eq等於 -gt大於 -lt小於 -ne不等於

字符串比較

== !=

計算表達式

  • $(( 計算表達式 )) 只能用+-*/和()運算符(包含調用變量),並且只能用於整數運算
  • let 計算表達式

重定向符號

> 覆蓋方式寫入

>> 追加方式寫入

後臺展示符號

& 追加此符號可使程序後臺運行

fg 調出後臺程序(T掛起狀態)

全部信息符號 2>&1

1: 正確輸出信息

2: 錯誤輸出信息

eg:

bash file.sh 2>> log.log  1>> log.log
# 類同
bash file.sh >> log.log 2>&1

標準輸入:CPU,MEM, 鍵盤,掃描儀,文件

標準輸出:顯示器

錯誤輸出:終端顯示文件

linux垃圾桶

/dev/null

grep

grep [參數][關鍵字] <文件名>

grep aaa test.txt

參數:

-c 只輸出匹配行的技術

grep -c aaa test.txt

-n 顯示匹配行及行號

grep -n bbb test.txt

-v 顯示不包含匹配文本的所有行

grep -v ccc test.txt

精確定位錯誤代碼

grep -nr [錯誤關鍵字] *

grep -nr error_message * 代表任意字符

sed(行文件編輯工具)

sed [ 參數 ] `<匹配條件> [ 動作 ]` [ 文件名 ]

參數:

-i 表示對文件進行編輯(參數爲空,表示演示操作,不對實際文件進行操作)(mac 版本中需要在參數後添加任意,例:-i ' '

動作參數:

-a 在匹配到的內容下一行增加內容

-i 在匹配到的內容上一行增加內容

-d 刪除匹配到的內容

-s 替換匹配到的內容

替換命令:

sed -i [ 替換命令 ][ 文件名 ]

替換示例s:

sed '[ 行號 ]s#原內容#替換內容#[ 列號 ]' (# 可以更換爲其他特殊字符:!@/等)(行號省略,代表所有行;列號省略代表第一列(列號g 代表所有列))

增加示例-i:(選定行的上一行增加)

sed -i '行號i\增加的內容' 文件名 多行範圍(1~2):sed -i '行號1,行號2i\增加的內容' 文件名

增加示例-a:(選定行的下一行增加)

sed -i '行號a\增加的內容' 文件名 多行範圍(1~3):sed -i '行號1,行號3a\增加的內容' 文件名

刪除示例-d:

sed -i '行號d' 文件名 多行範圍(1~3):sed -i '行號1,行號3d' 文件名

awk 文檔編輯工具

awk [ 參數 ] `[ 動作 ]` [ 文件名 ]

參數:

-F 指定行分隔符(文本中內容)

動作:

print 顯示內容

$0 顯示當前行內容

$n 顯示當前行的第n列內容,如果存在多個$n,它們之間使用逗號, 隔開

常見內置變量:

FILENAME 當前輸入文件的文件名,該變量是隻讀的

NR 指定顯示行的行號

NF 輸出 最後一列的內容

OFS 輸出格式的列分隔符,缺省是空格

FS 輸入文件的列分融符,缺省是連續的空格和Tab

awk '{print $1, $3}' test.txt

awk '{print $0}' test.txt 打印所有行內容

指定行:

指定隔離分隔符,查看內容

admin-1@ubuntu:~$ awk -F ':' '{print $1,$7}' test.txt 

設置顯示分隔符,顯示內容

admin-1@ubuntu:~$ awk 'BEGIN{OFS=":"} {print NR,$0}' awk.txt 

1:nihao awk awk awk
2:nihao awk awk awk

find命令

find [路徑][參數] [關鍵字]

參數詳解

-name 按照文件名查找文件。

find /root -name *.py

-perm 按照文件權限來查找文件。

-user 按照文件屬主來查找文件。

-group 按照文件所屬的組來查找文件。

-type 查找某一類型的文件,

find /root/ -type d -name '*.py' (配合-name使用)

諸如:

b - 塊設備文件

d - 目錄

c - 字符設備文件

p - 管道文件

l - 符號鏈接文件

f - 普通文件。

-size n :[c] 查找文件長度爲n塊的文件,帶有c時表示文件長度以字節計。

-depth :在查找文件時,首先查找當前目錄中的文件,然後再在其子目錄中查找。

-mindepth n :在查找文件時,查找當前目錄中的第n層目錄的文件,然後再在其子目錄中查找。

! : 表示取反

if語句

if [條件1]
then
    指令1
elif [條件2]
    指令2
else
    指令3
fi

case語句

case 變量名 in
# 變量名可以使用$1等傳參方式1)
      指令1
         ;;
   值2)
      指令2
         ;;
   值3)
      指令3
         ;;
   *)
   # 條件*代表任意或者沒有,不能放在首位
      指令4
         ;;
esac

for語句

forin 列表
do
   執行語句
done

例:

#!/bin/bash
# for語句的使用示例
for i in $(ls /root)
do
  echo "${i}"
done

while語句

while 條件
do
   執行語句
done

例:

#!/bin/bash
# while的示例
a=1
while [ "${a}" -lt 5 ] 
do
   echo "${a}"
   a=$((a+1))
done

until語句

until 條件
# 只要條件不滿足,就會循環
do
   執行語句
done

例:

#!/bin/bash
# until的示例
a=1
until [ "${a}" -eq 5 ] 
do
   echo "${a}"
   a=$((a+1))
done

函數

函數名(){
    函數體 $n
}

調用

函數名 參數

代碼發佈

壓縮和解壓

壓縮:tar zcvf file_name

解壓:tar xvf file_name

z 指定壓縮文件的格式爲 tar.gz

c 表示壓縮

v 顯示詳細過程

f 指定壓縮文件

x 解壓

查看壓縮包文件: zcat cfile_name

SCP

本地推送到遠程:

scp python.tar.gz [email protected]:/root/

遠端文件拉取到本地:

scp [email protected]:/root/python.tar.gz ./

SFTP

sftp [email protected]

put file_name

get file_name

備份(使用時間戳)

date [option]

參數:

%F 顯示日期格式: %Y-%m-%d date +%F

%T 顯示時間格式: %H:%M:%S date +%T

連續格式(無連接符): date +%Y%m%d

複製備份:cp file_name ./file_name-$(date +%Y%m%d%H%M%S)

移動備份:mv file_name ./file_name-$(date +%Y%m%d%H%M%S)

部署環境

  • 創建基礎目錄

    mkdir /data/{server, logs, backup, softs, virtual, scriptes, codes} -p

    (服務, 日誌, 備份, 軟件, 虛擬環境, 腳本,代碼)

    touch {3.. 5} 創建3 ,4, 5連續文件

  • 主機網絡環境

    • 主機間免密認證

      生成密鑰對: ssh-keygen -t rsa

      密鑰目錄:/root/.ssh/

      私鑰:id_rsa 公鑰id_rsa.pub

      編輯認證文件: 將公鑰放置於服務器端~/.ssh/authorized_keys

      配置ssh文件: /etc/ssh/sshd_config

      AuthorizedKeysFile %h/.ssh/authorized_keys

      重啓ssh /etc/init.d/ssh restart

  • 虛擬環境安裝

    • wget http://www.....

    使用python-venv 創建:python3 -m venv ven_name

    激活: cd 至 虛擬環境下bin source ./activate

  • nginx

    • pcre 關聯軟件安裝

    檢查: nginx/sbin/nginx -t

    開啓: /nginx/sbin/nginx

    關閉: /nginx/sbin/nginx -s strop

    重啓: `/nginx/sbin/nginx -s reload

    server{
        loaction / {
        proxy_pass http://127.0.0.1:8000;
        }
    }

快速查看端口pid

lsof -Pti :8000

快速殺死端口 kill $(lsof -Pti :8000)

查看端口服務:netstat -tnulp

遠程執行

ssh user_name@ip "執行命令"

鎖文件

if [ -f "${PID_FILE}" ]
then
    err_msg
else
    main
fi

腳本調試

-n 檢查腳本中語法錯誤

-v 先顯示腳本內容,然後執行腳本,將結果輸出,如果有錯誤,將錯誤輸出

-x 將執行的每一條命令和結果反饋

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章