問題:作為Linux運維人員,我們有時候也會遇到明明一個文件的名稱就在嘴邊但就是想不起來的情況。如果就記得一個文件的開頭幾個字母,想遍歷查找出所有以這個關鍵詞開頭的文件,該怎麼操作呢? 範例:單個查看硬碟文件 [root@linuxprobe ~]# ls -l /dev/sda brw-rw . ...
問題:作為Linux運維人員,我們有時候也會遇到明明一個文件的名稱就在嘴邊但就是想不起來的情況。如果就記得一個文件的開頭幾個字母,想遍歷查找出所有以這個關鍵詞開頭的文件,該怎麼操作呢?
範例:單個查看硬碟文件
[root@linuxprobe ~]# ls -l /dev/sda brw-rw----. 1 root disk 8, 0 Aug 20 2019 /dev/sda [root@linuxprobe ~]# ls -l /dev/sda1 brw-rw----. 1 root disk 8, 1 Aug 20 2019 /dev/sda1 [root@linuxprobe ~]# ls -l /dev/sda2 brw-rw----. 1 root disk 8, 2 Aug 20 2019 /dev/sda2 [root@linuxprobe ~]# ls -l /dev/sda3 ls: cannot access /dev/sda3: No such file or directory [root@linuxprobe ~]# |
範例:使用通配符*查看文件
[root@linuxprobe ~]# ls -l /dev/sda* brw-rw----. 1 root disk 8, 0 Aug 20 2019 /dev/sda brw-rw----. 1 root disk 8, 1 Aug 20 2019 /dev/sda1 brw-rw----. 1 root disk 8, 2 Aug 20 2019 /dev/sda2 [root@linuxprobe ~]# |
範例:使用?查看文件
[root@linuxprobe ~]# ls -l /dev/sda? brw-rw----. 1 root disk 8, 1 Aug 20 2019 /dev/sda1 brw-rw----. 1 root disk 8, 2 Aug 20 2019 /dev/sda2 |
範例:使用匹配[]查看文件
[root@linuxprobe ~]# ls -l /dev/sda[0-9] brw-rw----. 1 root disk 8, 1 Aug 20 2019 /dev/sda1 brw-rw----. 1 root disk 8, 2 Aug 20 2019 /dev/sda2 [root@linuxprobe ~]# ls -l /dev/sda[135] brw-rw----. 1 root disk 8, 1 Aug 20 2019 /dev/sda1 [root@linuxprobe ~]# |
常用的轉義字元如下:
反斜杠(\):使反斜杠後面的一個變數變為單純的字元串
單引號(''):轉義其中所有的變數為單純的字元串
雙引號(""):保留其中的變數屬性,不進行轉義處理
反引號(``):把其中的命令執行後返回結果
範例:輸出以雙引號括起來的字元串與變數信息
[root@linuxprobe ~]# PRICE=5 [root@linuxprobe ~]# echo "Price is $PRICE" Price is 5 |
範例:輸出“Price is $5”
//這不是我們預期的 [root@linuxprobe ~]# echo "Price is $$PRICE" Price is 3767PRICE |
//想讓第一個“$”乖乖地作為美元符號,那麼就需要使用反斜杠(\)來進行轉義 [root@linuxprobe ~]# echo "Price is \$$PRICE" Price is $5 |
範例:只需要某個命令的輸出值時,可以像`命令`這樣,將命令用反引號括起來
[root@linuxprobe ~]# echo `uname -a` Linux linuxprobe.com 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux [root@linuxprobe ~]# echo uname -a uname -a |
變數是電腦系統用於保存可變值的數據類型。在Linux系統中,變數名稱一般都是大寫的,這是一種約定俗成的規範。我們可以直接通過變數名稱來提取到對應的變數值。
簡單來說,命令在Linux中的執行分為4個步驟。
第1步:判斷用戶是否以絕對路徑或相對路徑的方式輸入命令(如/bin/ls),如果是的話則直接執行。
第2步:Linux系統檢查用戶輸入的命令是否為“別名命令”,即用一個自定義的命令名稱來替換原本的命令名稱。可以用alias命令來創建一個屬於自己的命令別名,格式為“alias 別名=命令”。若要取消一個命令別名,則是用unalias命令,格式為“unalias 別名”。我們之前在使用rm命令刪除文件時,Linux系統都會要求我們再確認是否執行刪除操作,其實這就是Linux系統為了防止用戶誤刪除文件而特意設置的rm別名命令,接下來我們把它取消掉:
[root@linuxprobe ~]# ls anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates Desktop Downloads Music Public Videos [root@linuxprobe ~]# rm anaconda-ks.cfg rm: remove regular file ‘anaconda-ks.cfg’? y [root@linuxprobe~]# alias rm alias rm='rm -i' [root@linuxprobe ~]# unalias rm [root@linuxprobe ~]# rm initial-setup-ks.cfg [root@linuxprobe ~]# |
第3步:Bash解釋器判斷用戶輸入的是內部命令還是外部命令。內部命令是解釋器內部的指令,會被直接執行;而用戶在絕大部分時間輸入的是外部命令,這些命令交由步驟4繼續處理。可以使用“type命令名稱”來判斷用戶輸入的命令是內部命令還是外部命令。
第4步:系統在多個路徑中查找用戶輸入的命令文件,而定義這些路徑的變數叫作PATH,可以簡單地把它理解成是“解釋器的小助手”,作用是告訴Bash解釋器待執行的命令可能存放的位置,然後Bash解釋器就會乖乖地在這些位置中逐個查找。PATH是由多個路徑值組成的變數,每個路徑值之間用冒號間隔,對這些路徑的增加和刪除操作將影響到Bash解釋器對Linux命令的查找。
[root@linuxprobe ~]# echo $PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin [root@linuxprobe ~]# PATH=$PATH:/root/bin [root@linuxprobe ~]# echo $PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin |
這裡有比較經典的問題:“為什麼不能將當前目錄(.)添加到PATH中呢? ” 原因是,儘管可以將當前目錄(.)添加到PATH變數中,從而在某些情況下可以讓用戶免去輸入命令所在路徑的麻煩。但是,如果黑客在比較常用的公共目錄/tmp中存放了一個與ls或cd命令同名的木馬文件,而用戶又恰巧在公共目錄中執行了這些命令,那麼就極有可能中招了。
所以,作為一名態度謹慎、有經驗的運維人員,在接手了一臺Linux系統後一定會在執行命令前先檢查PATH變數中是否有可疑的目錄,另外讀者從前面的PATH變數示例中是否也感覺到環境變數特別有用呢。
Linux系統中最重要的10個環境變數
變數名稱 |
作用 |
HOME |
用戶的主目錄(即家目錄) |
SHELL |
用戶在使用的Shell解釋器名稱 |
HISTSIZE |
輸出的歷史命令記錄條數 |
HISTFILESIZE |
保存的歷史命令記錄條數 |
|
郵件保存路徑 |
LANG |
系統語言、語系名稱 |
RANDOM |
生成一個隨機數字 |
PS1 |
Bash解釋器的提示符 |
PATH |
定義解釋器搜索用戶執行命令的路徑 |
EDITOR |
用戶預設的文本編輯器 |
範例:查看HOME變數在不同用戶身份下都有哪些值(su是用於切換用戶身份的命令)
[root@linuxprobe ~]# echo $HOME /root [root@linuxprobe ~]# su - linuxprobe Last login: Mon Aug 19 18:20:10 CST 2019 on pts/0 [linuxprobe@linuxprobe ~]$ echo $HOME /home/linuxprobe |
其實變數是由固定的變數名與用戶或系統設置的變數值兩部分組成的,我們完全可以自行創建變數,來滿足工作需求。
範例:設置一個名稱為WORKDIR的變數,方便用戶更輕鬆地進入一個層次較深的目錄
[root@linuxprobe ~]# mkdir /home/workdir [root@linuxprobe ~]# WORKDIR=/home/workdir [root@linuxprobe ~]# cd $WORKDIR [root@linuxprobe workdir]# pwd /home/workdir [root@linuxprobe workdir]# |
範例:使用export命令將其提升為全局變數
[root@linuxprobe workdir]# su linuxprobe [linuxprobe@linuxprobe ~]$ cd $WORKDIR [linuxprobe@linuxprobe ~]$ echo $WORKDIR
[linuxprobe@linuxprobe ~]$ exit exit [root@linuxprobe ~]# export WORKDIR [root@linuxprobe ~]# su linuxprobe [linuxprobe@linuxprobe workdir]$ cd $WORKDIR [linuxprobe@linuxprobe workdir]$ pwd /home/workdir |