Linux學習筆記-《Linux就該這麼學》
重置RHEL7的root密碼
1,重啟Linux系統,在出現引導介面時按下e,進入核心編輯介面
2,在linux16引數的最末UTF-8後加上\rd.break引數,然後按下Ctrl+X來執行修改後的核心程式
3,大約30S左右系統進入緊急求援模式
求援模式下輸入以下命令重置root使用者密碼:
# mount -o remount,rw /sysroot
# chroot /sysroot
# passwd
# touch /.autorelabel
# exit
執行reboot後系統會重啟大約兩次,等待重啟完成後用新密碼登入即可
rpm命令
rpm為了簡化安裝的複雜度,類似windows下的控制面板,會建立統一的資料庫檔案詳細記錄軟體資訊並自動分析依賴關係(僅分析依賴,還需要使用者自己處理)rpm -ivh filename.rpm 安裝rpm軟體
rpm -uvh filename.rpm 升級rpm軟體
rpm -e filename.rpm 解除安裝rpm軟體
yum命令
yum是為了解決軟體包之間的依賴關係,yum軟體倉庫可以根據使用者需求分析出所需軟體包及其依賴關係,然後自動從伺服器下載所需軟體包並安裝到系統上。
yum list all 列出倉庫中所有軟體
yum info 軟體包名 檢視軟體包資訊
yum install 軟體包名 安裝軟體包
yum reinstall 軟體包名 重新安裝軟體包
yum update 軟體包名 升級軟體包
yum update 軟體包名 移除軟體包
yum clean all 清除所有倉庫快取
yum check-update 檢查可更新的軟體包
yum grouplist 檢查系統中已安裝的軟體包組
yum groupinstall 軟體包組 安裝指定的軟體包組
yum groupremove 軟體包組 移除指定的軟體包組
yum groupinfo 軟體包組 查詢指定的軟體包組資訊
system初始化程序
linux作業系統開機過程是:先從bios開始,然後進入bootloder,再載入系統核心,然後核心進行初始化,最後啟動system初始化程序。初始化程序是linux系統啟動的第一個程序,它需要完成相關初始化的工作,為使用者提供合適的工作環境。
systemctl start 服務 啟動服務
systemctl restart 服務 重啟
systemctl status 服務 狀態
systemctl stop 服務 停止
systemctl reload 服務 重新載入服務配置檔案(不重啟服務)
systemctl enable 服務 設定服務開機自啟
systemctl disable 服務 開機不自動啟動
systemctl is-enabled 服務 查詢該服務是否為開機自啟
systemctl list-unit-files --type=service 查詢各個級別下服務的啟動與禁用情況
systemctl 列出所有的系統服務
systemctl poweroff 系統關機(=init 0)
systemctl reboot 重新啟動(=init 6)
強大的shell
一般來講,計算機是由運算器、控制器、儲存器、輸入/輸出裝置組成,而讓各個硬體各司其職又能協同執行的東西就是系統核心,linux核心完成硬體資源的分配和排程管理。由此可見核心對於系統的重要性,一般不建議直接去編輯核心中的引數,而是讓使用者通過基於系統呼叫介面開發出的程式或服務來管理計算機
shell是一個命令列工具,充當的是人與核心(硬體)之間的翻譯官
linux常用命令
1,echo 內容 列印顯示
2,date 顯示系統時間
date -s "20171221 12:30:12" 修改系統時間
3,wget [引數] 下載地址 下載網路檔案
引數:-b後臺下載模式 -P下載到指定目錄 -t最大嘗試次數 -c斷點續傳 -p下載頁面內所有內容,包括圖片、視訊等 -r遞迴下載(http://man.linuxde.net/wget)
4,ps 檢視系統中的程序狀態,通常結合管道命令grep使用-a顯示所有程序 -u顯示使用者和其他詳細資訊 -x顯示沒有控制終端的程序 -e顯示全部程序 -f全格式顯示
程序狀態:R執行 S中斷 D不可中斷 Z殭屍程序 T停止(收到停止訊號後停止)
5,top命令 動態監視程序和系統負載資訊
6,pidof 查詢程序的pid值
7,kill 引數 程序PID 用於終止程序
8,killall 引數 服務名 終止該服務對應的全部程序
9, ifconfig [網路裝置] [引數]
引數:up啟動指定的網絡卡裝置 down關閉網絡卡裝置
10,uname -a 檢視系統核心和系統版本資訊
11,uptime 檢視系統負載資訊,顯示當前系統時間、系統已執行時間、啟動終端數量和平均負載值資訊。負載值越低越好,儘量不要長期超過1,生產環境不要超過512,free -h顯示當前記憶體使用情況
13,who 檢視當前登入主機的使用者終端資訊
14,last 檢視系統的登入記錄
15,history 顯示近1000條執行的命令記錄,可在/etc/profile下修改HISTSIZE變數值
history -c 清空本機的命令記錄
16,sosreport 用於收集系統配置及架構資訊並輸出診斷文件。
17,cat -n 文字名 顯示行號
18,tr 原始字元 目標字元 替換文件中的字元
cat anaconda-ks.cfg | tr [a-z] [A-Z] 將文字中的小寫字母替換為大寫
19,wc [引數] 文字 用於統計文字的行數、字數和位元組數
20,stat 文字 用於檢視文字的儲存資訊和時間資訊
21,diff -brief 文字A 文字B 比較兩個文字的差異(無差異時無結果返回)
22,touch 新建文字或設定檔案時間
touch -d "2017-12-21 12:21:11" 文字
23,mkdir 新建資料夾
mkdir -p /a/b/c/d 可建立逐級資料夾
24,cp/mv/rm
25,dd [引數] 用於按照指定大小和個數的資料塊來複制或轉換檔案
dd if=/dev/zero of=/dev/sdx count=2 bs=10G 初始化磁碟/dev/sdx
dd if=/dev/zeor of=/root/test.txt count=1 bs=1M 在root目錄下新建1M大小的test.txt檔案
/dev/null是黑洞 能無限丟棄垃圾卻不佔空間
/dev/zero不佔用記憶體,卻能提供無窮無盡的資料
26,file 檔名 檢視檔案型別(文字、目錄、裝置都統稱為檔案)
27,tar [引數] [檔案]
引數:-c建立壓縮檔案 -x解壓縮 -t檢視壓縮包內有哪些檔案 -z用gzip解壓或者壓縮 -j用bzip2壓縮或解壓 -v顯示解壓或壓縮的過
程 -f目標資料夾 -p保留原始的許可權與屬性 -p使用絕對路徑來壓縮 -c指定解壓到的目錄
tar -czvf x.tar.gz /root/test.txt
28,grep用於文字中關鍵詞搜尋 grep [引數] [搜尋內容] [文字]
引數:-b把可執行檔案當文字檔案來搜尋 -c僅顯示找到的行數 -i忽略大小寫 -n顯示行號 -v反向選擇(列出沒有關鍵詞的行)
29,find 查詢檔案 find [位置] [條件] [數值]
find / -name "test" 根目錄下查詢名稱包含test的檔案
30,awk '{print $1}' 表示獲取結果的第一個域(第一豎行)
free -m |grep Mem |awk '{print $4}' 獲取剩餘記憶體容量 (grep是顯示匹配字元的行)
四、管道符、重定向與環境變數
1,輸入輸出重定向
標準輸入重定向,檔案描述符為0,預設從鍵盤輸入,也可以從其他檔案或者命令中輸入
標準輸出重定向,檔案描述符為1,預設輸出到螢幕
錯誤輸出重定向,檔案描述符為2,預設輸出到螢幕
2,命令格式
輸入重定向
“命令 < 檔案”將檔案作為命令的標準輸入
“命令 << 分界符” 從標準輸入中讀入,直到遇到分界符才停止
“命令 < 檔案1 > 檔案2” 將檔案1作為命令的標準輸入並將標準輸出到檔案2
wc -l < readme.txt 將readme檔案作為wc命令的輸入,統計文件行數
輸出重定向
“命令 > 檔案” 將標準輸出重定向到一個檔案中(清空原有檔案的資料)
“命令 2> 檔案” 將錯誤輸出重定向到一個檔案中(清空原有檔案的資料)
“命令 >> 檔案” 將標準輸出重定向到一個檔案中(追加到原有內容的後面)
“命令 2>> 檔案” 將錯誤輸出到重定向到一個檔案中(追加到原有內容的後面)
“命令 >> 檔案2 >&1”或“命令 &>> 檔案”將標準輸出與錯誤輸出共同寫入到檔案中(追加)
備註:錯誤輸出重定向就是當命令執行錯誤時將錯誤重定向到文字,而當命令正確時是不執行重定向的
ls readme.txt >/root/test.txt
ls readmeno.txt 2>/root/test.txt
3,管道符
命令1 | 命令2 :把命令1的輸出作為命令2的標準輸入
cat /root/readme.txt | grep "hehe"
echo "password" |passwd --stdin root (只需要知道這條命令可以修改root密碼為password即可)
4,萬用字元
*表示匹配0個或多個字元 ?表示匹配單個字元 [0-9]表示匹配0-9之間的單個數字的字元 [a-c]表示匹配abc三個字元中的任意一個
ls -l /dev/sd*
ls -l /dev/sd?
ls -l /dev/sd[a-c]
ls -l /dev/sda[1-10]
5,轉義符
\ 使反斜槓後面的一個變數變為單純的字串
" 轉義其中所有的變數為單純的字串
"" 保留其中的變數屬性,不進行轉義
'' 把其中的命令執行後返回結果
6,環境變數
echo $PATH 可以檢視當前配置的環境變數,多個變數間用:隔開
PATH=$PATH:/root/bin 增加/root/bin變數
export 變數名 可以將一般變數轉換為全域性變數
五、vim編輯器與shell指令碼
1,vim常用命令
dd 刪除/剪下游標所在行
5dd 刪除/剪下從游標處開始的5行
yy 複製游標所在整行
5yy 複製從游標開始處的5行
n 顯示搜尋命令定位到的下一行字串
N 顯示搜尋命令定位到的上一行字串
u 撤銷上一步操作
p 將之前剪下或複製的資料貼上到游標後面
:set nu 顯示行號
:set nonu 不顯示行號
:命令 執行該命令
:整數 跳轉到該行
:s/one/two 將當前游標所在行的第一個one換成two
:s/one/two/g 將當前游標所在行的所有one換成two
:%s/one/two/g 將全文的所有one換成two
/字串 從上往下搜尋字串
?字串 從下往上搜索字串
2,配置yum庫
#cd /etc/yum.repos.d/
#vim rhel7.repo
[rhel7]
name=rhel7
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0
#mkdir -p /media/cdrom
#mount /dev/cdrom /media/cdrom
#vim /etc/fstab
/dev/cdrom /media/cdrom iso9660 defaults 0 0
可以測試安裝httpd
3,shell指令碼
接受使用者的引數 sh test.sh [引數]
$0 對應的是當前shell指令碼的名稱
$# 對應的是總共有幾個引數
$* 對應的是所有位置的引數
$? 顯示上一次命令執行的返回值
$1 表示位置為1的引數
4,shell下判斷使用者的引數
判斷結果為真則返回0,結果為假則返回非0(可使用$?顯示上一條命令的返回值)
a,檔案測試語句:用指定條件來判斷檔案是否存在或許可權是否滿足
-d測試檔案是否為目錄型別
-e測試檔案是否存在
-f判斷是否為一般檔案
-r測試當前使用者是否有許可權讀取
-w測試當前使用者是否有許可權寫入
-x測試當前使用者是否有許可權執行
#[ -d /etc/fstab ] #$? 1
b,邏輯測試語句
shell中“與”是&&,表示它前邊的命令執行成功後才會執行後邊的命令,因此也可以寫成
#[ -e /etc/fstab ] && echo"exist"
shell中“或”是||,表示它前邊的命令執行失敗後才會執行後邊的命令,因此也可以寫成
#[ -e /etc/hahaha] || echo"notexist"
shell中“非”是!,它表示把條件語句中的結果取反值
c,整數比較運算子
-eq 是否等於
-ne 是否不等於
-gt 是否大於
-lt 是否小於
-le 是否等於或小於
-ge 是否大於或等於
#FREEMEM='free -m |grep Mem |awk '{print $4}''
#[$FREEMEM -lt 1024 ] && echo"記憶體不足了"
d,字串比較:用於判斷字串是否為空值,或兩個字串是否相同
=比較字串內容是否相同
!=比較字串內容是否不同
-z判斷字串是否為空值
#[ -z $string ] #echo #?
5,流程控制語句
a,if條件判斷
if 條件成立
then 執行條件成立的語句
else 執行不成立的語句
fi
#!/bin/bash
pwd="/root/haha"
if [ ! -e $pwd ]
then
mkdir $pwd
fi
if 條件1成立
then 執行1
elif 條件2成立
then 執行2
else 執行3
fi
Linux中read是指令碼讀取使用者輸入的指令
read -p "please enter you age:" NUM 其中-p是為了在螢幕列印提示,NUM是變數
b,for迴圈
for 變數名 in 取值列表
do
執行命令
done
#vi user.txt
zhangsan
lisi
wangwu
#!/bin/bash
read -p "please enter a password for user:" PASSWD
for UNAME in `cat users.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "user already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME,add success"
else
echo "$UNAME,add fail"
fi
fi
done
需要注意:UNAME通過cat對比本地檔案user.txt時,是··符號(~號),不是單引號。
讓指令碼從文件中讀取主機列表,然後逐個測試這些主機是否線上
#!/bin/bash
for HOST in `cat /root/hosts.txt`
do
ping $HOST -c 2 &>/dev/null
if [ $? -eq 0 ]
then
echo "$HOST up"
else
echo "$HOST down"
fi
done
c,while條件迴圈語句
while是根據某些條件來重複執行命令的,不同於for迴圈有目標有範圍的使用條件
while 條件
do 命令
done
while 如果條件為true且不變,則只有遇到exit時才會終止執行。
d,case條件語句
case 變數值 in
模式1)
命令1
;;
模式2)
命令2
;;
......
*)
預設命令
esac
#!/bin/bash
read -p "please enter:" KEY
case $KEY in
[a-z] | [A-Z])
echo "this is a zimu"
;;
[0-9])
echo "this is a num"
;;
*)
echo "teshuzifu"
esac
6,計劃任務服務程式
一次性任務:只執行一次的計劃任務
at 時間 =>輸入要執行的命令=>ctrl+D即可結束計劃任務編寫
at -l :可以檢視已經設定好但還未執行的計劃任務
atrm 任務號:可以刪除計劃任務
週期性任務:系統週期性、有規律的執行某些具體任務
crontab -e:建立、編輯計劃
crontab -l:檢視當前計劃
crontab -r:刪除計劃
如果當前是管理員登入的系統,還可以在crontab命令中加上-u引數來編輯他人的計劃任務
“分 時 日 月 星期 命令”,如果有些欄位沒有設定,需要使用佔位符*(注意,分是不能佔位的)
例如每週1,3,5 23:12分重啟伺服器
#crontab -e
12 23 * * 1,3,5 /usr/sbin/reboot
需要說明的是,除了用逗號表示多個時間段外,還可以用減號-表示一段時間,例如“日”的取值為12-15,則表示每月的12-15號執行
;也有用除號/來表示執行任務的間隔時間,例如/2表示每隔2分鐘執行一次任務。
需要注意的是,crontab下命令都必須使用絕對路徑,例如/usr/sbin/reboot,可用whereis 命令 來查詢命令的絕對路徑。