0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

Linux進程管理和啟動流程方法

馬哥Linux運維 ? 來源:51cto博客 ? 2024-01-13 10:39 ? 次閱讀

一、計算用戶ID總和

使用while read line和/etc/passwd,計算用戶id總和。

#!/bin/bash
# 初始化用戶ID和總和變量
uid=0
sum=0


while read line; do
    # 從 /etc/passwd 文件中提取用戶ID
    uid=$(echo "$line" | cut -d':' -f3)


    # 將用戶ID添加到總和中
    sum=$((sum + uid))
done < /etc/passwd


# 輸出ID總和
echo "用戶ID總和為:$sum"

上面的腳本首先定義了兩個變量 uid 和 sum,分別用于存儲當前行的用戶ID和所有用戶ID的總和。然后使用 while 循環(huán)逐行讀取 /etc/passwd 文件的內(nèi)容,每次循環(huán)提取當前行的第三個字段,也就是用戶ID,并將它加到總和變量中。最后輸出所有用戶ID的總和。

需要注意的是,腳本執(zhí)行需要 root 權限才能讀取 /etc/passwd 文件。如果沒有權限,則需要使用其他方式獲取用戶列表。

二、數(shù)組/字符串處理/高級變量

總結(jié)索引數(shù)組和關聯(lián)數(shù)組,字符串處理,高級變量使用及示例。

索引數(shù)組和關聯(lián)數(shù)組

在Bash中,數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),可以用來存儲一組值。Bash中支持兩種類型的數(shù)組:索引數(shù)組和關聯(lián)數(shù)組。

# 定義一個索引數(shù)組
my_array=("apple" "banana" "orange")


# 訪問數(shù)組中的元素
echo ${my_array[0]}   # 輸出 "apple"
echo ${my_array[1]}   # 輸出 "banana"
echo ${my_array[2]}   # 輸出 "orange"
  1. 索引數(shù)組:索引數(shù)組是按照數(shù)字索引訪問元素的數(shù)組類型。在Bash中,索引從0開始。可以使用下標語法獲取數(shù)組元素的值。例如:

  1. 關聯(lián)數(shù)組:關聯(lián)數(shù)組是一種根據(jù)鍵名(字符串)訪問元素的數(shù)組類型。定義關聯(lián)數(shù)組時需要使用聲明 -A??梢允褂面I名訪問數(shù)組元素的值。例如:

# 定義一個關聯(lián)數(shù)組
declare -A my_array
my_array["紅"]="蘋果"
my_array["黃"]="雪梨"
my_array["橙"]="橘子"


# 訪問數(shù)組中的元素
echo ${my_array["紅"]}   # 輸出 "蘋果"
echo ${my_array["黃"]}   # 輸出 "雪梨"
echo ${my_array["橙"]}   # 輸出 "橘子"

需要注意的是,Bash的版本需要在 4.0 及以上才支持關聯(lián)數(shù)組。

字符串處理

Bash中有很多內(nèi)置的字符串處理工具和技巧,可以對字符串進行各種操作。以下是一些 Bash 中常用的字符串處理函數(shù)和示例:

  1. ${#string} 可以獲得字符串的長度:

my_string="hello, world"
echo ${#my_string}   # 輸出 12
  1. ${stringlength} 可以截取子字符串,其中 start 是子字符串開始的位置, length 是子字符串的長度:

my_string="hello, world"
echo ${my_string5}   # 輸出 "hello"
echo ${my_string5}   # 輸出 "world"
  1. ${string#substring} 可以從字符串的開頭刪除指定的子字符串,其中 substring 是要刪除的子字符串:

my_string="hello, world"
echo ${my_string#hello, }   # 輸出 "world"
  1. ${string%substring} 可以從字符串的末尾刪除指定的子字符串,其中 substring 是要刪除的子字符串:

my_string="hello, world"
echo ${my_string%world}   # 輸出 "hello, "
  1. ${string/find/replace} 可以將字符串中的所有指定子字符串 find 替換為 replace:

my_string="hello, world"
echo ${my_string/world/there}   # 輸出 "hello, there"
  1. ${string//find/replace} 可以將字符串中的所有指定子字符串 find 替換為 replace,并且不止替換一次:

my_string="hello, world"
echo ${my_string//l/L}   # 輸出 "heLLo, worLd"

高級變量

在 Bash 中,更加高級的變量設置方式可以讓我們更加靈活地控制變量的使用。下面我將介紹一些常見的高級變量賦值方式:

  1. ${parameter:=word}:當變量 parameter 不存在時,將其賦值為 word。

echo "MY_VAR is ${MY_VAR:=default}"
# 輸出 MY_VAR is default
echo "MY_VAR is ${MY_VAR}"
# 輸出 MY_VAR is default
  1. ${parameter:+word}:當變量 parameter 存在時,將其賦值為 word。

MY_VAR="value"
echo "MY_VAR is ${MY_VAR:+default}"
# 輸出 MY_VAR is default
echo "MY_VAR is ${MY_VAR}"
# 輸出 MY_VAR is value
  1. ${parameter:?error message}:如果變量 parameter 不存在或者為空,則顯示錯誤信息 error message 并退出腳本的執(zhí)行。

echo "MY_VAR is ${MY_VAR:?Variable not set}"
# 在 MY_VAR 為空或未定義時,輸出 Variable not set 并退出

Bash 中的變量間接引用是一種非常有用的技巧,它允許我們使用一個變量的值作為另一個變量的名稱來引用它。這個技巧可以用在很多場景中,比如說根據(jù)運行時參數(shù)來動態(tài)引用變量。

在 Bash 中,變量間接引用可以通過 ${!varname} 的語法來實現(xiàn)。其中 varname 為一個變量名,通過 $ 和 {} 來包圍表示這是一個變量名的表達式。${!varname} 表示按照 varname 變量中存儲的名稱引用另一個變量。

下面是一個例子:

#!/bin/bash


var1="Hello"
var2="World"
varname="var1"


echo "${!varname}, ${var2}!"  # 輸出 "Hello, World!"

在這個例子中,我們首先定義了兩個變量 var1 和 var2,然后將 varname 設為 var1,表示我們希望引用 var1 這個變量。在輸出中,我們使用 ${!varname} 引用了 var1 這個變量,從而得到了輸出 Hello, World!。

需要注意的是,即使 varname 存儲的變量名稱是不存在的,${!varname} 表達式依然會被展開,并且其結(jié)果為空字符串。因此,在使用變量間接引用時應該特別小心,避免因為引用了不存在的變量而產(chǎn)生不可預測的結(jié)果。

三、求隨機數(shù)大小

求10個隨機數(shù)的最大值與最小值。

#!/bin/bash
declare -i min max
declare -a nums
for ((i=0;i<10;i++));do
  nums[$i]=$RANDOM
  [ $i -eq 0 ]  && min=${nums[0]}  && max=${nums[0]} && continue
  [ ${nums[$i]} -gt $max ] && max=${nums[$i]} && continue
  [ ${nums[$i]} -lt $min ] && min=${nums[$i]}
done
echo "All numbers are ${nums[*]}"
echo Max is $max
echo Min is $min

四、階乘算法

使用遞歸調(diào)用,完成階乘算法實現(xiàn)。

#!/bin/bash
function factorial {
  if [ $1 -eq 0 -o $1 -eq 1 ]; then
    echo 1
  else
    echo $[$1*(factorial $[$1-1])]
}


factorial $1

五、進程和線程

解析進程和線程的區(qū)別?

進程和線程都是計算機中實現(xiàn)并發(fā)的方式,但它們有不同的特點和作用。

進程是操作系統(tǒng)分配資源的基本單位,每個進程都擁有獨立的內(nèi)存空間、代碼和數(shù)據(jù),進程之間不能直接共享數(shù)據(jù)。每個進程都有自己的地址空間、堆棧、文件描述符等信息,并且進程之間通過進程間通信(IPC)的方式來進行數(shù)據(jù)傳輸。進程的創(chuàng)建、切換和銷毀會消耗一定的系統(tǒng)資源,因此進程通常是比較重量級的。

線程是進程中執(zhí)行任務的最小單位,是進程內(nèi)部的一個執(zhí)行路徑。線程與進程共享同一份數(shù)據(jù)和代碼段,每個線程都有自己的堆棧和程序計數(shù)器,但是所有線程共享進程的虛擬地址空間和物理資源,線程之間可以直接訪問同一片內(nèi)存區(qū)域,因此線程之間的通信和數(shù)據(jù)交換比進程之間更加輕便快捷。線程的創(chuàng)建、切換和銷毀所需的系統(tǒng)資源比進程要少得多,因此線程通常是比較輕量級的。

總的來說,進程和線程都是實現(xiàn)并發(fā)的方式,但是它們的作用和特點不同。進程是基本的資源分配單位,而線程則是程序執(zhí)行的最小單位,線程可以更高效地實現(xiàn)并發(fā)操作和多任務處理。

六、進程結(jié)構(gòu)

解析進程的結(jié)構(gòu)。

進程是計算機中最基本的資源分配單位,它由操作系統(tǒng)負責創(chuàng)建、管理和調(diào)度,進程可以看做是一個程序的執(zhí)行實例。

進程的結(jié)構(gòu)主要包括以下幾個部分:

  1. 程序段(Code Segment):也稱為文本段,是存放程序指令的內(nèi)存區(qū)域,通常是只讀的。程序段是進程運行期間不變的部分,它包含了所有可執(zhí)行指令,程序段在進程創(chuàng)建時就已經(jīng)確定好了。

  2. 數(shù)據(jù)段(Data Segment):數(shù)據(jù)段存儲的是程序中已經(jīng)初始化的全局變量、靜態(tài)變量和常量等數(shù)據(jù),數(shù)據(jù)段通常是可讀寫的。

  3. 堆棧段(Stack Segment):堆棧段存儲著程序執(zhí)行過程中產(chǎn)生的臨時數(shù)據(jù)和函數(shù)調(diào)用的返回地址等信息,堆棧段是一個后進先出的數(shù)據(jù)結(jié)構(gòu),它的大小可以動態(tài)擴展,通常是可讀寫的。

  4. 堆區(qū)(Heap):堆區(qū)是程序執(zhí)行期間動態(tài)申請和釋放內(nèi)存所使用的區(qū)域,堆區(qū)是可讀寫的,其大小可以動態(tài)調(diào)整。

  5. 進程控制塊(Process Control Block,PCB):進程控制塊是系統(tǒng)管理進程的數(shù)據(jù)結(jié)構(gòu),它包括了進程的基本信息,如進程狀態(tài)、進程標識符、進程優(yōu)先級、程序計數(shù)器、寄存器等,同時還記錄了進程的資源使用情況,如打開的文件、分配的內(nèi)存等。

以上是進程的主要組成部分,不同操作系統(tǒng)或編程語言中可能會有所差異,但是它們的基本結(jié)構(gòu)都包含了上述的內(nèi)容。

七、進程的各種狀態(tài)

結(jié)合進程管理命令,說明進程各種狀態(tài)。

在進程管理中,常見的進程狀態(tài)有以下幾種:

  1. 運行態(tài)(Running):指該進程正在CPU上運行。

  2. 就緒態(tài)(Ready):指該進程已經(jīng)準備好,只等待CPU分配時間片后就能運行。

  3. 阻塞態(tài)(Blocked):指該進程由于等待某些事件(例如輸入/輸出、信號等)而無法被執(zhí)行。

  4. 創(chuàng)建態(tài)(New):表示該進程已被創(chuàng)建,但還沒有被操作系統(tǒng)調(diào)度運行。

  5. 終止態(tài)(Terminated):表示該進程已經(jīng)運行完畢或者被強制終止。

Linux系統(tǒng)中,可以使用ps命令查看進程狀態(tài)。其中,運行態(tài)的進程會被標記為“R”,就緒態(tài)的進程則會被標記為“S”,阻塞態(tài)的進程會被標記為“D”,終止態(tài)的進程會被標記為“Z”,而創(chuàng)建態(tài)的進程則不會在進程列表中出現(xiàn)。

在ps aux命令的輸出中,STAT表示進程狀態(tài)。在Linux系統(tǒng)中,進程可以有不同的狀態(tài),常見的狀態(tài)包括:

  • R:進程正在運行;

  • S:進程處于休眠狀態(tài),例如等待某個事件的發(fā)生,或者正在進行I/O操作;

  • D:進程不可中斷的休眠狀態(tài),例如等待排隊在塊設備上的輸入/輸出;

  • Z:進程被終止,但是它的父進程還沒有來得及回收它的資源;

  • T:進程被暫?;蛘咄V埂?/p>

通常情況下,我們關注的進程狀態(tài)是R和S,因為它們代表的進程正在運行或者等待CPU以及其他資源。而D和Z狀態(tài)通常表示該進程出現(xiàn)了異常情況,需要進一步的檢查和處理。

八、IPC通信和RPC通信

說明IPC通信和RPC通信實現(xiàn)的方式。

IPC通信(Inter-Process Communication,進程間通信)和RPC通信(Remote Procedure Call,遠程過程調(diào)用)都是用于不同進程之間進行通信的方式。

IPC通信實現(xiàn)的方式較為多樣化,其中最常見的方式包括:

  1. 管道(Pipe):管道是一種半雙工的通信方式,通常用于父子進程之間的通信。管道只支持單向數(shù)據(jù)傳輸,它的基本思想是用一個緩沖區(qū)作為共享區(qū)域來實現(xiàn)父子進程之間的數(shù)據(jù)交換。

  2. 消息隊列(Message Queue):消息隊列是一種消息傳遞機制,通常用于同一主機內(nèi)的進程間通信。消息隊列提供了一種異步的通信方式,發(fā)送方發(fā)送消息后即可立即返回,而接收方則可以在需要時從消息隊列中取出消息。

  3. 信號量(Semaphore):信號量是一種用于進程間同步的機制。信號量的作用是保護一段代碼,在同一時刻只允許一個進程執(zhí)行。當一個進程想要執(zhí)行這段被信號量保護起來的代碼時,需要先獲取信號量,執(zhí)行完代碼后再釋放信號量,以便其他進程能夠獲取信號量并繼續(xù)執(zhí)行。

  4. 共享內(nèi)存(Shared Memory):共享內(nèi)存是一種高效的進程間通信方式。它將一段內(nèi)存映射到多個進程的地址空間中,多個進程可以直接訪問這段共享內(nèi)存,從而實現(xiàn)數(shù)據(jù)共享。

RPC通信則通過網(wǎng)絡實現(xiàn)跨主機進程之間的通信,其實現(xiàn)方式通常包括:

  1. 客戶端-服務器(Client-Server)模式:在此模式下,客戶端應用程序向服務器應用程序發(fā)送請求,并等待響應。服務器應用程序接收請求,執(zhí)行相應的操作,并將結(jié)果返回給客戶端。

  2. 遠程對象調(diào)用(Remote Object Invocation):在此模式下,客戶端使用遠程對象代理來調(diào)用遠程對象。遠程對象代理掌握著遠程對象的網(wǎng)絡地址信息,并將請求序列化為網(wǎng)絡字節(jié)流進行傳輸,然后等待遠程對象返回結(jié)果。

  3. Web服務(Web Service):Web服務是一種基于HTTP協(xié)議實現(xiàn)的RPC機制。客戶端通過HTTP請求訪問Web服務,Web服務接收請求并調(diào)用相應的處理函數(shù),最終將處理結(jié)果封裝為XML或JSON格式返回給客戶端。

九、前臺和后臺作業(yè)

總結(jié)Linux,前臺和后臺作業(yè)的區(qū)別,并說明如何在前臺和后臺中進行狀態(tài)轉(zhuǎn)換。

85e8a218-b13f-11ee-8b88-92fbcf53809c.jpg

Linux中,前臺作業(yè)和后臺作業(yè)的區(qū)別在于是否占用當前命令行終端。

前臺作業(yè)是指當前正在命令行終端中運行的程序,它會占用終端,此時用戶需要等待該程序執(zhí)行完畢才能輸入下一個命令。而后臺作業(yè)是指在后臺運行的程序,即該程序不占用當前終端,用戶可以繼續(xù)輸入其它命令。

在前臺和后臺之間進行狀態(tài)轉(zhuǎn)換有以下兩種方法:

  1. 在前臺作業(yè)中執(zhí)行后臺作業(yè):

在前臺運行的作業(yè)可以通過在命令后面添加 "&" 實現(xiàn)將其轉(zhuǎn)為后臺作業(yè)。例如:

$ ./my-program &
  1. 在后臺作業(yè)中切換到前臺:

使用命令 fg 可以將后臺作業(yè)切換至前臺,讓程序重新占用當前終端。例如:

$ fg [job ID]

其中, [job ID] 是后臺作業(yè)的進程號或任務號。

使用命令 bg 可以將前臺作業(yè)轉(zhuǎn)為后臺作業(yè)。例如:

$ bg [job ID]

同樣, [job ID] 是前臺作業(yè)的進程號或任務號。

十、內(nèi)核設計流派

總結(jié)內(nèi)核設計流派及特點。

內(nèi)核設計是操作系統(tǒng)的核心組成部分,其設計流派主要有單內(nèi)核、微內(nèi)核和混合內(nèi)核。

  1. 單內(nèi)核 單內(nèi)核是最初的內(nèi)核設計模式。在單內(nèi)核中,所有的操作系統(tǒng)服務和驅(qū)動程序都運行在核心空間內(nèi),這些服務和驅(qū)動程序直接訪問硬件設備,并且實現(xiàn)了內(nèi)存管理、進程調(diào)度、文件系統(tǒng)等核心功能。這種設計模式的優(yōu)點是效率高,因為所有服務和驅(qū)動程序都在同一個地址空間內(nèi)工作。缺點是安全性不高,因為一個錯誤的服務或驅(qū)動程序可能會破壞整個系統(tǒng)。

  2. 微內(nèi)核 微內(nèi)核是將內(nèi)核功能分解成多個獨立的程序運行的設計模式,每個程序都運行在獨立的地址空間內(nèi),只提供最基本的服務。例如,任務調(diào)度、內(nèi)存管理、IPC(進程間通信)和設備驅(qū)動程序等服務都是以相互獨立的方式運行的。這種設計模式的優(yōu)點是可靠性和安全性高,因為每個服務都以獨立的方式運行,并且錯誤的服務或驅(qū)動程序的影響只限于自己的進程。缺點是性能低,因為由于每個服務都是獨立的程序運行,因此在服務之間傳遞數(shù)據(jù)需要額外的開銷。

  3. 混合內(nèi)核 混合內(nèi)核是單內(nèi)核和微內(nèi)核的結(jié)合。它將一些核心函數(shù)移動到獨立的地址空間中,以提高系統(tǒng)的可靠性和安全性,并以較低的開銷提供IPC和設備驅(qū)動程序等服務。這種設計模式的優(yōu)點是可靠性和安全性高,同時性能也比微內(nèi)核設計模式高。缺點是代碼復雜性高,因為不同的服務和驅(qū)動程序有不同的運行方式和限制,所以必須確保它們之間的協(xié)作和一致性。

十一、Linux啟動流程

總結(jié)rocky啟動流程,grub工作流程。

86031206-b13f-11ee-8b88-92fbcf53809c.jpg

Rocky啟動流程大致如下:

1.計算機通電后,BIOS會自動運行并執(zhí)行POSTPower-On Self Test)。


2.BIOS會尋找可啟動設備,通常會先尋找硬盤、光驅(qū)和USB設備。


3.當BIOS找到可啟動設備后,它會將引導扇區(qū)(boot sector)加載到內(nèi)存中,并將控制權交給引導扇區(qū)程序。


4.引導扇區(qū)程序會加載GRUBGrand Unified Bootloader)引導程序。GRUBR默認的引導程序。


5.GRUB會顯示啟動菜單,讓用戶選擇要啟動的操作系統(tǒng)或內(nèi)核。


6.用戶選擇了操作系統(tǒng)或內(nèi)核后,GRUB會加載內(nèi)核文件和啟動選項,并將控制權交給內(nèi)核。


7.內(nèi)核會初始化硬件、加載驅(qū)動程序、掛載文件系統(tǒng)等操作。


8.內(nèi)核完成初始化后,會運行/sbin/init程序,此時系統(tǒng)進入用戶空間。


9./sbin/init程序會根據(jù)配置文件/etc/inittab啟動各種服務,并設置系統(tǒng)運行級別。


10.至此,Rocky系統(tǒng)啟動完成。

GRUB的工作流程大致如下:

1.GRUB被加載到內(nèi)存中后,顯示啟動菜單。


2.用戶選擇要啟動的操作系統(tǒng)或內(nèi)核后,GRUB會加載內(nèi)核文件和啟動選項。


3.GRUB會從文件系統(tǒng)中讀取內(nèi)核文件和相關的初始化文件,例如/etc/grub.conf。


4.GRUB會將內(nèi)核和相關文件加載到內(nèi)存中,并設置啟動參數(shù)。


5.最后,GRUB會將控制權交給內(nèi)核,讓內(nèi)核開始啟動操作系統(tǒng)。

十二、chkconfig服務腳本

手寫chkconfig服務腳本,可以實現(xiàn)服務的開始,停止,重啟。

#!/bin/bash
# chkconfig: - 96 3
# description: This is test service script


. /etc/init.d/functions


start(){
  [ -e /var/lock/subsys/testsrv ]  && exit || touch /var/lock/subsys/testsrv
  echo $PATH
  action "Starting testsrv"
  sleep 3
}


stop(){
  [ -e /var/lock/subsys/testsrv ] && rm /var/lock/subsys/testsrv || exit
  action "Stopping testsrv"
}


status(){
  [ -e /var/lock/subsys/testsrv ] && echo "testsrv is running..." || echo "testsrv is stopped"
}


case $1 in
start)
  start
  ;;
stop)
  stop
  ;;
restart)
  stop
  start
  ;;
status)
  status
  ;;
*)
  echo $"Usage: $0 {start|stop|status|restart}"
  exit 2
esac

十三、systemd服務配置文件

總結(jié)systemd服務配置文件。

systemd是一個Linux系統(tǒng)的初始化系統(tǒng)和服務管理器。在systemd中,每個服務都有一個對應的配置文件,其中定義了服務的各種屬性和行為。通常情況下,這些配置文件存儲在/etc/systemd/system目錄下。

以下是一個簡單的systemd服務配置文件的示例:

[Unit]
Description=My Service
After=network.target


[Service]
ExecStart=/usr/local/bin/my-service
Restart=always


[Install]
WantedBy=multi-user.target

該文件分為三個部分:

  1. [Unit]:包含服務的基本信息和依賴關系。

  • Description:服務的描述信息。

  • After:指定服務所需的其他服務或者單元,在這個例子中,服務需要在網(wǎng)絡服務之后啟動。

  1. [Service]:包含服務執(zhí)行時的相關信息。

  • ExecStart:指定服務的啟動命令。

  • Restart:指定服務異常退出后的重啟策略,這里設置為always表示總是重啟。

  1. [Install]:包含安裝服務時的相關信息。

  • WantedBy:指定服務在哪些運行級別下啟動,這里設置為multi-user.target表示在多用戶模式下啟動。

一個標準的systemd服務配置文件通常由三個主要部分組成:[Unit]、[Service]和[Install]。下面我們將詳細介紹這些部分以及它們的屬性。

[Unit]

該部分包含了服務的基本信息和依賴關系。下面是一些常用的屬性:

  • Description:服務的描述信息。

  • After:指定服務所需的其他服務或者單元啟動完成之后才能啟動。

  • Requires:指定服務所需的其他服務或者單元(必須同時啟動)。

  • Wants:指定服務所需的其他服務或者單元(推薦同時啟動)。

  • Before:指定服務啟動之前需要啟動的服務或者單元。

  • Conflicts:指定服務與其他服務或單元存在沖突。

[Service]

該部分包含了服務執(zhí)行時的相關信息。下面是常用的屬性:

  • Type:指定服務的類型,可以是simple(默認,直到服務退出才會返回控制權)、forking(在服務啟動時派生一個子進程)、oneshot(服務只會運行一次)等。

  • ExecStart:指定服務的啟動命令。

  • ExecStop:指定服務的停止命令。

  • Restart:指定服務異常退出后的重啟策略,可以是no(不重啟)、always(總是重啟)、on-failure(僅在非0退出狀態(tài)時重啟)等。

  • User:指定服務所屬的用戶。

  • Group:指定服務所屬的組。

  • Environment:指定服務執(zhí)行時需要的環(huán)境變量。

  • WorkingDirectory:指定服務執(zhí)行時的工作目錄。

[Install]

該部分包含了安裝服務時的相關信息。下面是常用的屬性:

  • WantedBy:指定服務在哪些運行級別下啟動,可以是multi-user.target(多用戶模式)、graphical.target(圖形化模式)等。

  • RequiredBy:指定需要該服務的其他服務或單元(必須同時啟動)。

  • Also:指定需要該服務的其他服務或單元(推薦同時啟動)。

以上是systemd服務配置文件的主要部分和屬性介紹,這些屬性根據(jù)服務需求而異。使用systemd配置文件來管理服務非常方便,可以有效地提高系統(tǒng)管理的效率和可靠性。

十四、system啟動流程

總結(jié)system啟動流程。

systemd 是一個具有啟動管理、服務管理、日志管理和設備管理等功能的系統(tǒng)和服務管理器,其啟動流程主要包括以下幾個步驟:

  1. 系統(tǒng)引導:當計算機啟動時,BIOS/UEFI會加載GRUB2或者其他引導程序,并從硬盤、光盤或者網(wǎng)絡中讀取內(nèi)核映像文件。

  2. 內(nèi)核初始化:內(nèi)核映像文件被加載后,內(nèi)核會對硬件進行初始化操作,并創(chuàng)建第一個用戶空間進程systemd(PID 1)。

  3. systemd初始化:systemd會讀取所有的unit文件,并按照啟動順序?qū)⑺鼈兗尤氲絾雨犃兄校@些unit文件包括target文件、service文件、socket文件等。

  4. 啟動目標:每個target文件都是一套預定義的unit,在systemd啟動時,會根據(jù)指定的default target決定啟動哪一個target文件(比如multi-user.target,表示只啟動多用戶模式,并不啟動圖形界面)。

  5. 加載依賴項:在啟動target前,systemd會根據(jù)unit文件中的Requires和Wants字段,來查找并自動加載必要的依賴文件和服務。

  6. 啟動服務:在所有依賴關系滿足后,systemd會按照啟動順序執(zhí)行服務文件,并在執(zhí)行過程中記錄各種系統(tǒng)日志。

  7. 啟動完成:一旦所有服務都啟動完畢,systemd會進入idle狀態(tài),并等待下一次事件發(fā)生。

總之,systemd啟動流程非常復雜和龐大,但由于其高度集成和可擴展性,已成為眾多Linux發(fā)行版的標配啟動管理器。

十五、AWK工作原理

總結(jié)awk工作原理,awk命令,選項,示例。

awk是一種文本處理工具,它按行讀取輸入文件并將每行分解為字段??梢允褂萌我夥指舴麃碇付ㄗ侄沃g的分隔符,默認情況下使用空格和制表符。在每個字段中,awk執(zhí)行指定的動作,并且可以根據(jù)需要打印輸出結(jié)果。

awk的基本工作原理如下:

  1. 將輸入文件讀入內(nèi)存,一行一行地處理。

  2. 按照指定的字段分隔符將每行拆分為多個字段。

  3. 對于每個字段,執(zhí)行指定的操作,這些操作包括條件判斷、變量設置、數(shù)學計算、字符串操作等。

  4. 根據(jù)需要輸出結(jié)果。

對于每個輸入行,awk會執(zhí)行指定的操作,這些操作可以是內(nèi)置函數(shù)、用戶自定義函數(shù)、條件語句、循環(huán)語句等。awk還支持多種模式和模式匹配方式,以便更容易地處理文本數(shù)據(jù)。常見的應用包括文本處理、報告生成、數(shù)據(jù)轉(zhuǎn)換和格式化等。

awk命令的一般語法格式為:

awk 'pattern {action}' input_file

其中,pattern用于指定需要匹配的模式,action用于指定匹配成功后需要執(zhí)行的操作,input_file表示要處理的輸入文件。如果沒有指定輸入文件,則awk默認從標準輸入讀取數(shù)據(jù)。

以下是一些常見的awk命令使用示例:

  1. 輸出指定列:打印第1列和第3列

awk '{print $1, $3}' input_file
  1. 根據(jù)條件過濾數(shù)據(jù):打印第2列等于"hello"的行

awk '$2 == "hello" {print}' input_file
  1. 基于統(tǒng)計信息生成報告:輸出文件的行數(shù)、單詞數(shù)和字符數(shù)

awk 'BEGIN {lines=words=chars=0} {lines++; words+=NF; chars+=length} END {print lines, words, chars}' input_file
  1. 對數(shù)據(jù)進行計算:求第2列的平均值

awk '{sum+=$2} END {print sum/NR}' input_file

awk命令有許多選項可用于指定模式匹配和規(guī)則動作的行為。以下是一些常見的awk選項:

  1. -F:指定字段分隔符,默認為制表符或空格。例如,-F:將冒號作為字段之間的分隔符。

  2. -v:定義變量并將其傳遞給awk程序。例如,awk -v var=value 'pattern {action}' input_file中的var變量可在awk程序中使用。

  3. -f:從文件中讀取awk程序。例如,awk -f script.awk input_file將從script.awk文件中讀取awk程序。

  4. -i inplace:啟用原地編輯模式,并將結(jié)果寫回到輸入文件中,而不是打印到標準輸出。該選項只適用于GNU awk(gawk)版本4.1及更高版本。

  5. -W:指定gawk擴展功能。例如,-W interactive可以啟用交互式模式,-W compat可以使gawk與舊版awk兼容。

  6. -n:禁用默認打印操作,只執(zhí)行指定的規(guī)則操作,不輸出處理的數(shù)據(jù)。

  7. -N:禁用所有輸入記錄的拆分,默認情況下,awk將根據(jù)空格和制表符分割輸入記錄。

這只是一小部分常見的awk選項,還有其他許多選項和功能可供選擇,具體取決于你所使用的awk版本??梢酝ㄟ^查看man awk命令來獲取完整的選項列表和說明。

十六、AWK數(shù)組/函數(shù)

總結(jié)awk的數(shù)組,函數(shù)。

awk中的數(shù)組是一種關聯(lián)數(shù)組,它可以存儲多個值,并使用一個鍵來引用每個值。awk數(shù)組中的鍵通常是字符串或數(shù)字,數(shù)組中的值可以是任何類型的數(shù)據(jù),包括字符串、數(shù)字、其他數(shù)組等。

在awk中,可以通過以下方法聲明和訪問數(shù)組:

  1. 聲明數(shù)組:使用下面的語法來聲明數(shù)組:

# 基于數(shù)字索引聲明數(shù)組
array[index]=value


# 基于字符串索引聲明數(shù)組
array["key"]=value

其中,index和key都是索引值,value則是與索引相關聯(lián)的值。

  1. 訪問數(shù)組:可以使用以下語法來訪問數(shù)組中的元素:

# 通過數(shù)字索引訪問數(shù)組
array[index]


# 通過字符串索引訪問數(shù)組
array["key"]

可以像訪問普通變量一樣使用數(shù)組來訪問它們的元素。

以下是一個簡單的例子,演示了如何在awk中創(chuàng)建和使用數(shù)組:

# test.txt
apple,fruit,red
banana,fruit,yellow
carrot,vegetable,orange


# awk程序獲取test.txt文件中所有水果的名稱
awk -F, '{ if ($2 == "fruit") { fruits[$1] = $3 } } END { for (f in fruits) print f, fruits[f] }' test.txt

在上面的例子中,我們創(chuàng)建了一個名為fruits的數(shù)組,存儲了所有水果的名稱和顏色。在每一行上,如果水果的類型是fruit,則將該水果的名稱和顏色存儲到fruits數(shù)組中。最后,使用for循環(huán)遍歷fruits數(shù)組并輸出所有水果的名稱和顏色。

希望這個例子演示了如何使用awk數(shù)組來處理文本數(shù)據(jù)。

awk是一種強大的文本處理工具,它還提供了許多內(nèi)置函數(shù)來處理文本和數(shù)值類型。此外,awk還允許用戶定義自己的函數(shù),以便更好地組織和重復使用代碼。

在awk中,可以通過以下語法來定義和調(diào)用函數(shù):

  1. 定義函數(shù):定義一個函數(shù)需要使用function關鍵字,并在函數(shù)名稱后面跟一個括號。如果函數(shù)有參數(shù),這些參數(shù)應該放在括號中,并用逗號分隔。

function name(parameter1, parameter2, ...) {
    # 函數(shù)體,包括語句和表達式
}
  1. 調(diào)用函數(shù):使用函數(shù)名稱和參數(shù)列表來調(diào)用函數(shù)。參數(shù)應該用逗號分隔,并放在括號中。

name(argument1, argument2, ...)

以下是一個簡單的例子,演示如何在awk中定義和調(diào)用函數(shù):

# awk程序計算兩個數(shù)字之和
function add(x, y) {
    return x + y
}


# 在main out中調(diào)用add函數(shù)
BEGIN {
    a = 2
    b = 3
    print "The sum of", a, "and", b, "is", add(a, b)
}

在上面的例子中,我們定義了一個名為add的函數(shù),它接受兩個參數(shù)并返回它們的和。然后,在BEGIN塊中,我們聲明了兩個變量a和b,并在print語句中調(diào)用了add函數(shù),以顯示它們的和。

除此之外,awk還提供了許多內(nèi)置函數(shù),例如字符串函數(shù)、數(shù)學函數(shù)、時間函數(shù)等??梢栽赼wk的官方文檔中查找完整列表,并在需要時使用它們來處理數(shù)據(jù)。

十七、CA管理相關工具

總結(jié)ca管理相關的工具,根據(jù)使用場景總結(jié)示例。

要建立私有證書頒發(fā)機構(gòu)(CA),可以參考以下步驟:

  1. 選擇適合的CA軟件:可以根據(jù)自己的需求選擇開源的或商業(yè)的CA軟件,如OpenSSL、EJBCA、Microsoft Certificate Services等。這些軟件提供了創(chuàng)建和管理證書的工具和面板,能夠方便地處理數(shù)字證書。

  2. 創(chuàng)建根證書:在選擇好CA軟件后,需要創(chuàng)建一個根證書。根證書是CA的頂級證書,對其進行簽名的證書只有兩種方式,即信任或被撤銷。創(chuàng)建根證書時需要輸入一些組織信息,如組織名稱、國家、州/省、城市以及聯(lián)系信息等。

  3. 創(chuàng)建中間證書(可選):如果需要更復雜的證書結(jié)構(gòu),可以在根證書下創(chuàng)建其他中間CA。中間CA是通過根CA簽名的證書,用于頒發(fā)子證書。中間CA的目的是為了隔離根證書,防止根證書被泄露后全部證書都失效。

  4. 頒發(fā)子證書:在創(chuàng)建完根證書和中間證書(可選)之后,可以開始頒發(fā)子證書。頒發(fā)子證書時需要指定證書的一些信息,如證書名稱、公鑰、有效期限等。子證書頒發(fā)之前必須使用父證書進行簽名,以便證書鏈的完整性驗證。

  5. 處理證書吊銷:如果某個證書不再被信任或者存在安全風險,需要對其進行吊銷操作。在吊銷證書后,該證書將不再被認為是有效的,并且無法用來進行加密或數(shù)字簽名。吊銷證書可以通過CA軟件中提供的工具來完成。

  6. 公開證書:最后,需要將頒發(fā)的證書公開發(fā)布到可信賴的目錄中,這樣其他人才能獲得并驗證證書的合法性。

需要注意的是,在建立私有CA時,需要非常小心和謹慎地保護私鑰,確保它們不被泄露。泄露私鑰可能會導致他人偽造證書,進而進行惡意attack。

OpenSSL的openssl.cnf配置文件比較復雜,包括多個節(jié)(section)以及各種選項參數(shù),下面是一些比較常見的選項參數(shù):

  • RANDFILE:用于指定隨機數(shù)文件的路徑,這個文件存儲了OpenSSL需要生成加密算法中所需的隨機數(shù),例如需要創(chuàng)建自簽名證書時。

  • HOME:用于指定OpenSSL默認的主目錄,默認值為/etc/pki/tls。

  • certificate:用于設置證書文件的名稱,默認值為$dir/cert.pem。

  • private_key:用于設置私鑰文件的名稱,默認值為$dir/private/key.pem。

  • default_md:用于設置默認使用的消息摘要算法,默認值為sha256。

  • req_extensions:用于設置證書請求時添加的擴展信息。

  • x509_extensions:用于設置證書時添加的擴展信息。

此外,根據(jù)你的應用場景,還可以設置其它許多參數(shù),比如:

  • [ca] 配置 CA 證書和 CA 目錄信息

  • [req] 配置證書的請求信息

  • [req_distinguished_name] 配置證書請求的 DN

  • [usr_cert] 配置用戶證書信息

  • [v3_ca] 配置 CA 證書的 V3 擴展

  • [v3_req] 配置證書請求的 V3 擴展

需要注意的是,在修改openssl.cnf文件時需要小心操作,確保其符合安全標準,并進行相應的測試和驗證,以保證系統(tǒng)的安全性和穩(wěn)定性。

創(chuàng)建CA所需要的文件

#生成證書索引數(shù)據(jù)庫文件
touch /etc/pki/CA/index.txt


#指定第一個頒發(fā)證書的序列號
echo 01 > /etc/pki/CA/serial

生成CA私鑰

cd /etc/pki/CA/
(umask 066; openssl genrsa -out private/cakey.pem 2048)

生成CA自簽名證書

openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -day 3650 -out /etc/pki/CA/cacert.pem


-new:生成新證書簽署請求
-x509:專用于CA生成自簽證書
-key:生成請求用到的私鑰文件
-days n:證書的有效期限
-out /PATH/TO/SOMECERTFILE:證書的保存路徑

用戶生成私鑰和證書申請

#生成私鑰文件
(umask 066;openssl genrsa -out /data/app1/app1.key 2048)


#生成證書申請文件
openssl req -new -key /data/app1/app1.key -out /data/app1/app1.csr

CA 頒發(fā)證書

openssl ca -in /data/app1/app1.csr -out /etc/pki/CA/certs/app1.crt -days 1000

十八、加密算法

總結(jié)對稱加密和非對稱加密算法和用openssl簽發(fā)證書步驟。

對稱加密

對稱加密:加密和解密使用同一個密鑰

特性:

  • 加密、解密使用同一個密鑰,效率高;

  • 將原始數(shù)據(jù)分割成固定大小的塊,逐個進行加密

缺陷:

  • 密鑰過多

  • 密鑰分發(fā)

  • 數(shù)據(jù)來源無法確認

常見對稱加密算法:

  • DES:Data Encryption Standard,56bits

  • 3DES:

  • AES:Advanced (128, 192, 256bits)

  • Blowfish,Twofish

  • IDEA,RC6,CAST5

非對稱加密

非對稱加密:密鑰是成對出現(xiàn)

  • 公鑰:public key,公開給所有人,主要給別人加密使用

  • 私鑰:secret key,private key 自己留存,必須保證其私密性,用于自已加密簽名

  • 特點:用公鑰加密數(shù)據(jù),只能使用與之配對的私鑰解密;反之亦然

功能:

  • 數(shù)據(jù)加密:適合加密較小數(shù)據(jù),比如: 加密對稱密鑰

  • 數(shù)字簽名:主要在于讓接收方確認發(fā)送方身份

缺點:

  • 密鑰長,算法復雜

  • 加密解密效率低下

常見算法:

  • RSA:由 RSA 公司發(fā)明,是一個支持變長密鑰的公共密鑰算法,需要加密的文件塊的長度也是可變的,可實現(xiàn)加密和數(shù)字簽名

  • DSA(Digital Signature Algorithm):數(shù)字簽名算法,是一種標準的 DSS(數(shù)字簽名標準)

  • ECC(Elliptic Curves Cryptography):橢圓曲線密碼編碼學,比RSA加密算法使用更小的密鑰,提供相當?shù)幕蚋叩燃壍陌踩?/p>

OpenSSL簽發(fā)證書

建立私有CA:

  • OpenCA:OpenCA開源組織使用Perl對OpenSSL進行二次開發(fā)而成的一套完善的PKI免費軟件

  • openssl:相關包 openssl和openssl-libs

證書申請及簽署步驟:

  1. 生成證書申請請求

  2. RA核驗

  3. CA簽署

  4. 獲取證書

#安裝包
[root@rocky86 ~]# yum install openssl-libs
#查看配置文件
[root@rocky86 ~]# cat /etc/pki/tls/openssl.cnf
#安裝包
[root@ubuntu ~]# apt install libssl-dev
#查看配置文件
[root@ubuntu ~]# cat /etc/ssl/openssl.cnf

配置文件部分內(nèi)容說明

[ CA_default ]
dir = ./demoCA #所有與證書相關的文件目錄,在實際使用時此處
要進行修改
certs = $dir/certs #頒發(fā)的證書文件目錄
crl_dir = $dir/crl #吊銷的證書文件
database = $dir/index.txt #證書索引文件
new_certs_dir = $dir/newcerts #新頒發(fā)的證書目錄
certificate = $dir/cacert.pem #CA機構(gòu)自己的證書
serial = $dir/serial #證書編號文件,下一個證書編號,16進制
crlnumber = $dir/crlnumber #存放當前CRL編號的文件
crl = $dir/crl.pem #CA證書吊銷列表文件
private_key = $dir/private/cakey.pem #CA證書的私鑰
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

匹配策略,指用此CA頒發(fā)證書時,證書的相關字段與CA的值的匹配規(guī)則

匹配規(guī)則

說明

match

要求申請?zhí)顚懙男畔⒏鶦A設置信息必須一致

optional

可有可無,跟CA設置信息可不一致

supplied

必須填寫這項申請信息

創(chuàng)建私有CA

1、創(chuàng)建CA所需要的文件

#創(chuàng)建相關目錄
[root@ubuntu ~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts,private}
[root@ubuntu ~]# tree /etc/pki/CA/
/etc/pki/CA/
├── certs
├── crl
├── newcerts
└── private
4 directories, 0 files

2、 生成CA私鑰

[root@ubuntu ~]# cd /etc/pki/CA/
[root@ubuntu CA]# openssl genrsa -out private/cakey.pem 2048

3、生成CA自簽名證書

[root@ubuntu CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days
3650 -out /etc/pki/CA/cacert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN #國家代碼
State or Province Name (full name) [Some-State]:beijing #省/州
Locality Name (eg, city) []:beijing #城市
Organization Name (eg, company) [Internet Widgits Pty Ltd]:magedu #公司/單位
Organizational Unit Name (eg, section) []:m54 #部門
Common Name (e.g. server FQDN or YOUR name) []:www.magedu.org #域名
Email Address []: #郵箱
-new #生成新證書簽署
請求
-x509 #專用于CA生成自
簽證書
-key #生成請求時用到
的私鑰文件
-days n #證書的有效期限
-out /PATH/TO/SOMECERTFILE #證書的保存路徑
#查看證書
[root@ubuntu CA]# cat /etc/pki/CA/cacert.pem
-----BEGIN CERTIFICATE-----
MIIDszCCApugAwIBAgIURIyd0TW4qqffpbh1NudkH3ZLWQUwDQYJKoZIhvcNAQEL
BQAwaTELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB2JlaWppbmcxEDAOBgNVBAcMB2Jl
aWppbmcxDzANBgNVBAoMBm1hZ2VkdTEMMAoGA1UECwwDbTU0MRcwFQYDVQQDDA53
d3cubWFnZWR1Lm9yZzAeFw0yMzA1MjIxMzMwMzFaFw0zMzA1MTkxMzMwMzFaMGkx
CzAJBgNVBAYTAkNOMRAwDgYDVQQIDAdiZWlqaW5nMRAwDgYDVQQHDAdiZWlqaW5n
MQ8wDQYDVQQKDAZtYWdlZHUxDDAKBgNVBAsMA201NDEXMBUGA1UEAwwOd3d3Lm1h
Z2VkdS5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCjAuAX6QgC
o1GBbWefyHTib/Unq7k4l1mgbjvfLv9mccSUFaZcZllIdRb5HPpeGPtjHjgxRfS6
iMNdVrVwON9gkLMv/BDPJKUdK7a3LokweohU+i0o2Xnp2ZZ1AhDgUvE1vHhOQa/a
YZKTgnbucJAeKr0u3/GoHlJvb652t7/g13yUR9XrLaLjIYk+IcDvdBVd2apRO6w3
IvkUrhhLQ3FSNWLi6mOuCdXfTs7TtQDbu1guLMo5ZNZffHXlnUNpjF5rtvsD8L7m
bvjRvEdBAyYp9IwV0vMLntSZ0bdrntAGlBXi18W2nb6LGskQhViC2J0U59gk5bVZ
0LvGbVeXMQm1AgMBAAGjUzBRMB0GA1UdDgQWBBREjMYMzWwjJT1PtwMJ3/CASxIK
EjAfBgNVHSMEGDAWgBREjMYMzWwjJT1PtwMJ3/CASxIKEjAPBgNVHRMBAf8EBTAD
AQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBJz2HTy/UlOUyVlVf+7imbToWyCkDDrB1P
26hrHIPcl+njzP5qFn662po4LczXRK1oqv7OOBjvLOTuj5eVmz3Jzf4dGk54E6jP
Vqp6SjnH0gOFBqJx0bRo5fIzbBZ6yVedXPQM5X11rhS+eJmeU2bU4QcT9PZ08M1Z
Hp+QJmJBpXHxd8ouu+YU4fyFtde24NYQNtKLFfJCyJl4wO210CXYHoTVe8dtWFoS
UvqUR49iFZW1uPXXQtP6eizw4k+sV9afaEii+u4fnGdIs2q3c+GPn276V1MrcQnw
GRdFX/WHvr0asO9wvoQTnB9LM+UEqn61oJ+aGXgkujbaTtaNYOS/
-----END CERTIFICATE-----
#查看證書
[root@ubuntu CA]# openssl x509 -in /etc/pki/CA/cacert.pem -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
44:8c:9d:d1:35:b8:aa:a7:df:a5:b8:75:36:e7:64:1f:76:4b:59:05
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = CN, ST = beijing, L = beijing, O = magedu, OU = m54, CN =
www.magedu.org
Validity
Not Before: May 22 13:30:31 2023 GMT
Not After : May 19 13:30:31 2033 GMT
Subject: C = CN, ST = beijing, L = beijing, O = magedu, OU = m54, CN =
www.magedu.org
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
......
......
#導到WINDOWS中查看
[root@ubuntu CA]# sz /etc/pki/CA/cacert.pem
https://country-code.cl/ #國家代碼

申請證書并頒發(fā)證書

1、為需要使用證書的主機生成生成私鑰

[root@ubuntu CA]# openssl genrsa -out /data/test.key 2048

2、為需要使用證書的主機生成證書申請文件

#注意:默認要求國家,省,公司名稱三項必須和CA一致
[root@ubuntu CA]# openssl req -new -key /data/test.key -out /data/test.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:beijing
Locality Name (eg, city) []:beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:magedu
Organizational Unit Name (eg, section) []:m54-class
Common Name (e.g. server FQDN or YOUR name) []:www.m54.magedu.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

3、用CA簽署證書并將證書頒發(fā)給請求者

#創(chuàng)建索引文件
[root@ubuntu CA]# touch /etc/pki/CA/index.txt
#創(chuàng)建序號文件
[root@ubuntu CA]# echo 0F > /etc/pki/CA/serial
#簽發(fā)證書
[root@ubuntu CA]# openssl ca -in /data/test.csr -out /etc/pki/CA/certs/test.crt -
days 100
Using configuration from /usr/lib/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 15 (0xf)
Validity
Not Before: May 22 13:56:23 2023 GMT
Not After : Aug 30 13:56:23 2023 GMT
Subject:
countryName = CN
stateOrProvinceName = beijing
organizationName = magedu
organizationalUnitName = m54-class
commonName = www.m54.magedu.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Subject Key Identifier:
13:7E:49:68:5E5F:23:68127EB5:90:020C:64
X509v3 Authority Key Identifier:
44:8C0C6C:23:25:3D:4F03:09F0:80:4B:12:0A:12
Certificate is to be certified until Aug 30 13:56:23 2023 GMT (100 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
#查看
[root@ubuntu CA]# tree /etc/pki/CA/
/etc/pki/CA/
├── cacert.pem
├── certs
│ └── test.crt
├── crl
├── index.txt
├── index.txt.attr
├── index.txt.old
├── newcerts
│ └── 0F.pem
├── private
│ └── cakey.pem
├── serial
└── serial.old
4 directories, 9 files
#原來是0F,加1后變成10
[root@ubuntu CA]# cat /etc/pki/CA/serial
10
#V 表示有效,230830 表示2023年8月30日過期,0F 表示證書編號
[root@ubuntu CA]# cat /etc/pki/CA/index.txt
V 230830135623Z 0F unknown /C=CN/ST=beijing/O=magedu/OU=m54-
class/CN=www.m54.magedu.com

4、查看證書中的信息:

#根據(jù)編號查看狀態(tài)
[root@ubuntu CA]# openssl ca -status 0F
Using configuration from /usr/lib/ssl/openssl.cnf
0F=Valid (V)
[root@ubuntu CA]# openssl x509 -in /etc/pki/CA/certs/test.crt -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 15 (0xf)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = CN, ST = beijing, L = beijing, O = magedu, OU = m54, CN =
www.magedu.org
Validity
Not Before: May 22 1323 2023 GMT
Not After : Aug 30 1323 2023 GMT
Subject: C = CN, ST = beijing, O = magedu, OU = m54-class, CN =
www.m54.magedu.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
......
......

如果證書申請文件中的配置項與CA機構(gòu)的匹配規(guī)則不一致,將無法簽發(fā)證書

吊銷證書

在客戶端獲取要吊銷的證書的 serial

[root@ubuntu CA]# openssl x509 -in /etc/pki/CA/certs/test.crt -noout -serial -
subject
serial=0F
subject=C = CN, ST = beijing, O = magedu, OU = m54-class, CN =
www.m54.magedu.com

在CA上,根據(jù)客戶提交的 serial 與 subject 信息,對比檢驗是否與 index.txt 文件中的信息一致,吊銷證書:

[root@ubuntu CA]# openssl ca -revoke /etc/pki/CA/certs/test.crt
Using configuration from /usr/lib/ssl/openssl.cnf
Revoking Certificate 0F.
Data Base Updated
[root@ubuntu CA]# cat /etc/pki/CA/index.txt
R 230830135623Z 230522141008Z 0F unknown
/C=CN/ST=beijing/O=magedu/OU=m54-class/CN=www.m54.magedu.com

指定第一個吊銷證書的編號,注意:第一次更新證書吊銷列表前,才需要執(zhí)行

[root@ubuntu CA]# echo 01 > /etc/pki/CA/crlnumber

更新證書吊銷列表

[root@ubuntu CA]# openssl ca -gencrl -out /etc/pki/CA/crl.pem
Using configuration from /usr/lib/ssl/openssl.cnf

查看crl文件:

[root@ubuntu CA]# openssl crl -in /etc/pki/CA/crl.pem -noout -text
Certificate Revocation List (CRL):
Version 2 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = CN, ST = beijing, L = beijing, O = magedu, OU = m54, CN =
www.magedu.org
Last Update: May 22 1400 2023 GMT
Next Update: Jun 21 1400 2023 GMT
CRL extensions:
X509v3 CRL Number:
......
......

CentOS7 創(chuàng)建自簽名證書

[root@centos7 certs]# cd /etc/pki/tls/certs
[root@centos7 certs]# make
This makefile allows you to create:
......
......
Examples:
make server.key
make server.csr
make server.crt
make stunnel.pem
make genkey
make certreq
make testcert
make server.crt SERIAL=1
make stunnel.pem EXTRA_FLAGS=-sha384
make testcert DAYS=600
#根據(jù)目錄中的 Makefile 來執(zhí)行不同操作
[root@centos7 certs]# ls
ca-bundle.crt ca-bundle.trust.crt make-dummy-cert Makefile renew-dummy-cert
[root@centos7 certs]# cat Makefile
UTF8 := $(shell locale -c LC_CTYPE -k | grep -q charmap.*UTF-8 && echo -utf8)
DAYS=365
KEYLEN=2048
......
......
#centos8中沒有該Makefile,可以SCP過去使用

8619c852-b13f-11ee-8b88-92fbcf53809c.jpg

OpenSSH 免密認證是通過使用公鑰、私鑰實現(xiàn)的。在 OpenSSH 中,客戶端和服務器端都會有一對密鑰:私鑰和公鑰。

  1. 首先在客戶端生成一對密鑰(ssh-keygen)

  2. 并將客戶端的公鑰ssh-copy-id復制到服務端

  3. 當客戶端再次發(fā)送一個連接請求,包括ip、用戶名

  4. 服務端得到客戶端的請求后,會到authorized_keys中查找,如果有響應的IP和用戶,就會隨機生成一個字符穿,例如:13579

  5. 服務端將使用客戶端復制過來的公鑰進行加密,然后發(fā)送給客戶端

  6. 得到服務端發(fā)來的消息后,客戶端會使用私鑰進行解密,然后解密后的字符串發(fā)送給服務端

  7. 服務端接受到客戶端發(fā)來的字符串后,跟之前的字符串進行對比,如果一致,就允許免密碼登錄


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11123

    瀏覽量

    207912
  • 字符串
    +關注

    關注

    1

    文章

    566

    瀏覽量

    20384
  • 變量
    +關注

    關注

    0

    文章

    607

    瀏覽量

    28257

原文標題:Linux進程管理和啟動流程

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux開發(fā)_Linux進程編程

    介紹Linux進程概念、進程信號捕獲、進程管理相關的命令的使用等知識點。
    的頭像 發(fā)表于 09-17 15:38 ?1254次閱讀
    <b class='flag-5'>Linux</b>開發(fā)_<b class='flag-5'>Linux</b>下<b class='flag-5'>進程</b>編程

    Linux使用Systemd管理進程服務

    systemd是目前Linux系統(tǒng)上主要的系統(tǒng)守護進程管理工具,由于init一方面對于進程管理是串行化的,容易出現(xiàn)阻塞情況,另一方面ini
    發(fā)表于 11-28 09:07 ?475次閱讀

    Linux使用Systemd管理進程服務

    今天浩道跟大家分享linux運維中大家很少用到的一個硬核干貨,使用 Systemd 管理進程服務。讓你體驗一下該技巧帶來的便捷性!
    發(fā)表于 12-12 09:02 ?407次閱讀

    Linux進程管理

    Linux進程管理
    發(fā)表于 05-20 10:53

    LINUX下的進程管理問題如何解決

    基于LINUX下的進程管理問題
    發(fā)表于 05-20 07:58

    linux系統(tǒng)進程存在狀態(tài)及管理

    linux系統(tǒng)進程存在狀態(tài)及管理詳解
    發(fā)表于 05-21 06:28

    Linux文件系統(tǒng)啟動流程

    Linux 命令的結(jié)合使用Linux 文件系統(tǒng)啟動流程sysvinit服務的管理與裁剪systemd服務的
    發(fā)表于 12-17 06:00

    Linux內(nèi)核編譯和啟動的相關資料分享

    Linux環(huán)境下,我們想運行一個應用程序,在shell交互環(huán)境下直接敲命令就可以了,操作系統(tǒng)給程序提供了運行環(huán)境和進程管理。那Linux操作系統(tǒng)本身是如何運行和
    發(fā)表于 12-20 06:28

    Linux進程管理

    Linux進程管理 本章主要介紹進程的概念、狀態(tài)、構(gòu)成以及Linux進程的相關知識。 掌握
    發(fā)表于 04-28 14:57 ?0次下載

    Linux守護進程詳解

    較長的進程,通常獨立于控制終端并且周期性地執(zhí)行某種任務或等待處理某些發(fā)生的事件。守護進程常常在系統(tǒng)引導載入時啟動,在系統(tǒng)關閉時終止。Linux有很多系統(tǒng)服務,大多數(shù)服務都是通過守護
    發(fā)表于 10-18 14:24 ?0次下載
    <b class='flag-5'>Linux</b>守護<b class='flag-5'>進程</b>詳解

    基于Linux進程管理的詳細剖析

    上一篇,我們講到了Linux內(nèi)核開發(fā)和應用程序開發(fā),今天我們來講講Linux重點部分Linux進程管理。
    的頭像 發(fā)表于 01-26 11:24 ?3637次閱讀
    基于<b class='flag-5'>Linux</b><b class='flag-5'>進程</b><b class='flag-5'>管理</b>的詳細剖析

    Linux進程管理:什么是進程?進程的生命周期

    所有運行在Linux操作系統(tǒng)中的進程都被task_struct結(jié)構(gòu)管理,該結(jié)構(gòu)同時被叫作進程描述。一個進程描述包含一個運行
    的頭像 發(fā)表于 02-15 14:29 ?7772次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進程</b><b class='flag-5'>管理</b>:什么是<b class='flag-5'>進程</b>?<b class='flag-5'>進程</b>的生命周期

    學會Linux進程管理方法

    Linux 是一種動態(tài)系統(tǒng),能夠適應不斷變化的計算需求。Linux 計算需求的表現(xiàn)是以進程 的通用抽象為中心的。進程可以是短期的(從命令行執(zhí)行的一個命令),也可以是長期的(一種網(wǎng)絡服務
    發(fā)表于 05-16 17:19 ?724次閱讀
    學會<b class='flag-5'>Linux</b><b class='flag-5'>進程</b><b class='flag-5'>管理</b>的<b class='flag-5'>方法</b>

    簡要剖析Linux系統(tǒng)的進程管理機制_LINUX_操作系統(tǒng)_腳本之家

    ,更詳細的說,linux采用了分時管理方法,所有的任務都放在一個隊列中,操作系統(tǒng)根據(jù)每個任務的優(yōu)先級為每個任務分配合適的時間片,每個時間片很短,用戶根本感覺不到是多個任務在運行,從而使所有的任務共同
    發(fā)表于 04-02 14:46 ?501次閱讀

    linux查看weblogic進程

    Linux操作系統(tǒng)中,WebLogic是一種常用的Java應用服務器,用于部署和管理企業(yè)級Java應用程序。為了確保WebLogic服務器正常運行,有時我們需要查看WebLogic進程以了解其狀態(tài)
    的頭像 發(fā)表于 12-05 16:07 ?1501次閱讀