新手如何入門linux,linux原來還可以這麼學

龍騰萬里sky發表於2022-01-22

前言

在這個只有cangls和小白兩人的小房間中,展開了一次關於學習方法的討論。

小白:cangls啊,我想請教一個問題,您是如何記住那麼多linux命令的。

cangls:我啊,別人都看我的小電影,我也不知道啊!可能是舉的例子多了,就記住了一些唄。

此次寫作靈感源於一本心理學方面的書籍,對話體的方式運用得當,確實很吸引人。

靈魂拷問?新手如何學linux?如何從新手到熟手?如何玩轉linux?linux大神如何掌握那麼多命令?趣味學習linux,瞭解一下。基於實戰演練,同時突出重點。2萬5千字的長文,是否真材實料,不妨先收藏再評論。

換個角度看待這個問題,linux大神都是從小白開始的,沒有人一開始就是大神

只是別人運用的比較多,自然而然記住了更多的命令,從而更擅長總結學習方法

如果你是Linux運維人員,或者是剛入門的程式設計人員。根據自己的工作經歷以及自學總結的內容,篇幅很長,加入了不少示例程式碼。但很詳細喲!相信你一定有所收穫的。

正文

7年前,我還是一個連linux是個啥都不知道的笨小孩,然而現在靠著自學積累的知識也能在日常工作中滿足剛需,還教會了新來的同事不少小技巧。先上點趣味性的知識,俗稱掃盲,擁有一顆愛學習(悶騷)的心。

01 第一夜

以linux為基礎將知識串聯起來,加入了一些個人經驗總結,僅供參考喲!當然,你可以將此篇文章推送你的親朋好友,當做是學習linux的入門課程。

個人建議,如果感覺建議不到位,可以忽略掉。請直接看正文,相信會有收穫的

在給別人建議的時候,希望能從他人的角度去思考。不要上來直接甩一個教程或者視訊過去,這樣對新人是很不友好的。

首先,我們應該養成自學的良好習慣。最優的方法往往是去官網查閱文件,其次通過各大論壇,再就是搜尋引擎。但官方文件大體都是英文版的,小白往往也是心有餘而力不足,記得多用詞典查閱並積累。但是,現在linux有簡體中文版支援,我們在搭建學習環境的時候可以選擇簡體中文。當你學到深處的時候,發現還是官方文件最靠譜。

搭建環境建議是真機配合虛擬機器工具部署linux伺服器(Redhat系列、Ubuntu、Fedora、Debian等等)使用,放心大膽的測試,再也不用擔心伺服器被自己弄崩潰了。終端管理工具推薦tabby(github上有),雖然目前終端不支援中文字元輸入,但它是開源免費的。關於以何種linux的發行版進行學習,希望不要去跟風,聽風就是雨,要根據自身實際情況而定。如果非要我推薦,那就是推薦Redhat系列的Centos或者Ubuntu系列,教程和資源多唄。給出我之前寫的稀爛的教程linux養成達人之入門實踐圖文超詳細(工欲善其事,必先利其器篇),希望對你有所幫助(基於centos6.5的):

https://blog.csdn.net/Tolove_dream/article/details/103823216

關於centos7的可以參考這篇文章:

https://blog.csdn.net/Tolove_dream/article/details/116085467

接著說linux簡體中文版,優勢在於我看幫助命令的時候有一部分是中文的,這就對我們的學習有大大大的好處。當你提這個問題的時候,應該是對linux這個極具魅力的作業系統有很大的興趣。有興趣那就好辦了,你會思考如何學習對自己更為有利。此時就會去翻閱文件,最後發現還是官方文件最為有用,學會積累經驗。慢慢的從小白到老手,這之間有一段艱難的路需要獨自走完,享受這一過程的美妙之處。

曾經你是不是在各大論壇或者部落格網站都能看到這樣一些內容,從刪庫到跑路。全球絕大部分的伺服器啊,基本上都是採用linux伺服器的,沒有許可權你還想刪庫到跑路?當然只是開個玩笑,我們都是遵紀守法的五好青年

前面的刪庫到跑路,只是為了引出linux另一大魅力所在許可權足夠透明。如果在許可權這方面玩的相當熟練,那你可以存不少cang老師的作品喲。我能自己欣賞,別人卻看不到,想想就刺激。談到cang老師,大家滿眼放光聚精會神直呼內行。我們就皮一下,這不是為了引起你學習的興趣嗎。

做了很多鋪墊,這裡就詳細的聊聊我自己的學習過程。將以對話形式展示,小白與cangls日日夜夜的對話。cangls是啥?別問我,問就是不知道,只可意會不可言傳。

一、學習方法的探討

在這個只有cangls和小白兩人的小房間中,展開了一次關於學習方法的討論。

小白:cangls啊,我想請教一個問題,您是如何記住那麼多linux命令的。

cangls:我啊,別人都看我的小電影,我也不知道啊!可能是舉的例子多了,就記住了一些唄。

小白:是這樣啊!那能具體說說嗎,我很感興趣。

cangls:好啊,那我們就互相探討探討。

這這這,啥情況?我懷疑你兩不僅在開車,而且還搞顏色,還超速了。好了,玩歸玩鬧歸鬧,言歸正傳。

小白:我想檢視一下以前放的學習資料(小電影)

cangls:使用ls命令即可檢視目錄和檔案

# 不帶引數
$ ls
# -a引數,查詢所有,包含帶.隱藏的
$ ls -a
# -l引數,長格式顯示:顯示所屬組、所有者,修改時間以及檔名
$ ls -l

小白:我想給資料夾改個名字,羞羞。

cangls:好辦,使用mv命令就能處理。

$ mv cangls  bols

小白:那我想移動到另一個資料夾呢?

cangls:同樣可以使用mv命令,但要接路徑喲!

$ mv /opt/cangls  /home/cangls/av

小白:cangls呀,我目前存的檔案過多,想集中分類處理。

cangls:你是想,將多個檔案存放到同一個目錄吧。mkdir命令新建資料夾可以滿足你,記得用上面的mv命令轉移學習資料。

$ mkdir  /home/cangls/av

此時的小白看了看時間,已經記不起這是多少次來請教cangls了。cangls教了小白一個很雞肋的但很實用的命令。

cangls:小白啊,知道今天是今年的第多少天嗎?

小白:我不記得了,看看手機就知道了。

cangls:不用那麼麻煩,用linux自帶的命令cal即可檢視。

$ cal -jy

cangls此時看小白興趣不減反增,於是介紹了幫助命令help和man來方便小白自學。

上面的對話形式,是不是很有趣。當你心煩意亂的時候,不妨靜下心來試試。找一個自己感興趣的方向,去驗證這些命令。如果你感興趣的話,我之前寫的部分文章也許會對你有一定的幫助。

cangls和小白的對話並沒有結束,在這個只有兩人的小房間中,到底發生了啥,請接著看。

02 第二夜

第一夜對學習方法進行了探討,如何一步步提升自己學習的興趣。第二夜cangls與小白繼續展開關於linux基本命令的討論。

cangls:小白啊,你來了,看來還是有不少疑問吧!

小白:是的,雖然上次你說了一些關於linux的幫助命令,我還是有些摸不著頭腦。

cangls:沒關係,下面我給你帶來了詳細的幫助命令的講解,學習方法很重要喲!

小白此時拿出了自己的小本本,開始記錄了起來...

二、基本命令的探討

注意:#符號表示root使用者登入,$符號表示普通使用者登入。

1、幫助命令(重點)

這種方法是其中一種手段,將其輸出到某個檔案,然後總結起來。再通過scp命令傳到本地記錄到小本本上

[root@cnwangk ~]# ls --help > helpcmd.txt
[root@cnwangk ~]# man ls >> helpcmd.txt
#藉助本地的終端管理工具,使用scp命令取到Windows本地桌面,即從遠端傳回本地
$ scp root@192.168.245.131:/root/helpcmd.txt ~/Desktop/
root@192.168.245.131's password:
helpcmd.txt                                                                                              100%   21KB   3.8MB/s   00:00

注意:>符號是重定向輸入會覆蓋原始檔案的內容,>>符號也是重定向輸入到指定檔案,但是是追加進去。

1.1、help命令

如下所示,直接輸入help命令就會輸出很多提示,或者在使用的命令後面加上引數--help進行操作。

$ help
$ ls --help

上面的第一條命令代表著直接輸入help命令,也會反饋一些幫助文件出來。第二種方式,則是以具體的命令ls使用--help幫助命令獲取指定命令的幫助文件。

1.2、man命令
1.2.1、man的級別作用
引數 作用
1 檢視命令的幫助
2 檢視可被核心呼叫的函式的幫助
3 檢視函式和函式庫的幫助
4 檢視特殊件的幫助(主要是/dev目錄下的檔案)
5 檢視配置檔案的幫助
6 檢視遊戲的幫助
7 檢視其它雜項的幫助
8 檢視系統管理員可用命令的幫助
9 檢視和核心相關檔案的幫助

例如:檢視passwd的配置檔案幫助、檢視null的特殊件的幫助、檢視ifconfig系統管理員可用命令的幫助

$ man 5 passwd
$ man 4 null
$ man 8 ifconfig 

man 命令,獲取指定命令的幫助,展示ls命令全部內容幫助手冊。

$ man ls

檢視命令擁有哪個級別的幫助,man -f 命令相當於whatis命令。

$ man -f
[root@cnwangk ~]# man -f
whatis 什麼?
$ whatis

檢視命令相關的所有幫助。man -k 命令,相當於apropos 命令。例如:

$ man -k
$ apropos
#檢視passwd的幫助命令
$ apropos passwd
1.2.2、man命令的詳細展示

直接在終端輸入man命令,會提示您需要什麼手冊頁?這裡以檢視ls命令的幫助手冊為例子進行講解示例說明,列舉了部分示例。

tips:輸入q直接退出幫助手冊。

[root@cnwangk ~]# man
您需要什麼手冊頁? 
#進入ls命令的幫助文件
$ man ls 
LS(1)                              General Commands Manual                                                   LS(1)
NAME
       ls, dir, vdir - 列目錄內容
提要
       ls [選項] [檔名...]
       POSIX 標準選項: [-CFRacdilqrtu1]
GNU 選項 (短格式):
       [-1abcdfgiklmnopqrstuxABCDFGLNQRSUX] [-w cols] [-T cols] [-I pattern] [--full-time] [--format={long,verbose,commas,across,verti‐
       cal,single-column}] [--sort={none,time,size,extension}] [--time={atime,access,use,ctime,status}]  [--color[={none,auto,always}]]
       [--help] [--version] [--]
描述( DESCRIPTION )
       程式ls先列出非目錄的檔案項,然後是每一個目錄中的“可顯示”檔案。如果  沒有選項之外的引數【譯註:即檔名部分為空】出現,預設為 "."(當前目錄)。 選項“ -d ”使得目錄與非目錄項同樣對待。除非“ -a ” 選項出現,文 件名以“.”開始的檔案不屬“可顯示”檔案。
       以當前目錄為準,每一組檔案(包括非目錄檔案項,以及每一內含檔案的目錄)分別按檔名比較順序排序。如果“-l”選項存在,每組檔案前顯示一摘要行: 給出該組檔案長度之和(以 512 位元組為單位)。
       輸出是到標準輸出(stdout)。除非以“-C”選項要求按多列輸出,輸出將是一行一個。然而,輸出到終端時,單列輸出或多列輸出是不確定的。可以分別 用選項“ -1 ” 或“ -C ”來強制按單列或多列輸出。
       -C     多列輸出,縱向排序。
       -F     每個目錄名加“ / ”字尾,每個 FIFO 名加“ | ”字尾, 每個可執行名加“ * ”字尾。
       -R     遞迴列出遇到的子目錄。
       -a     列出所有檔案,包括以 "." 開頭的隱含檔案。

以上就是man幫助命令的講解,相信你會愛上linux中的幫助命令的。這回該明白了,linux大神是如何記住那麼多命令的吧!

2、常見目錄作用的探討

選項 作用
/ 根目錄
/bin 命令儲存目錄(普通使用者就可以讀取的命令)
/boot 啟動目錄,啟動相關檔案
/dev 裝置檔案儲存目錄
/etc 配置檔案儲存目錄
/home 普通使用者的家目錄
/lib 系統庫儲存目錄
/mnt 系統掛載目錄
/media 掛載目錄
/root 超級使用者的家目錄
/tmp 臨時目錄
/sbin 命令儲存目錄(超級使用者才能使用的目錄)
/proc 直接寫入記憶體
/sys
/usr 系統軟體資源目錄
/usr/bin 系統命令(普通使用者)
/usr/sbin 系統命令(超級使用者)
/var 系統相關文件內容

3、最常用的命令總結

3.1、學習方法小結

最常用的命令往往也是最基本的命令,這裡也同樣以增刪改查(CURD)進行講解。如果要人為的細分,這裡給出一種學習的思路,可以按照如思維導圖所示:

當然也可以按照如下方式去總結:

列舉一些常用的命令,先做簡單的介紹,在腦海中有個印象。下面繼續做詳細介紹。

$ ls #檢視檔案和目錄
$ ll #等價於ls -l
$ cat #檢視具體內容
$ cd #切換目錄
$ mkdir # 新建資料夾
$ touch # 新建檔案
$ cp #複製檔案
$ mv #移動或者重新命名檔案
$ vim #linux下的一種編輯檔案的手段,文中會詳細介紹。
$ rm #刪除檔案
$ chmod #賦予許可權
$ chown #改變檔案所有者
3.2、命令詳細介紹

ls命令,檢視目錄以及檔案命令,下面不會全部展示出來,只展示一部分內容

#不帶任何引數
[root@cnwangk ~]# ls
anaconda-ks.cfg  av  cangls.av  history.txt  scp_test
#加上引數-l,使用較長格式列出資訊
[root@cnwangk ~]# ls -l
drwxr-xr-x  2 root root    23 1月   4 20:21 av
-rw-r--r--  1 root root    10 1月   4 20:16 cangls.av
# -a引數,不隱藏任何以. 開始的專案
[root@cnwangk ~]# ls -a
.  .bash_history  .bash_profile  .cache  .config ..  av  .bash_logout   .bashrc   cangls.av  .ssh  .viminfo

ll命令,是ls -l的縮略形式,相當於起了別名。以長格式列出資訊,包含許可權、檔案所有者、日期、檔名。

$ ll
drwxr-xr-x  2 root root    23 1月   4 20:21 av
-rw-r--r--  1 root root    10 1月   4 20:16 cangls.av
-rwxr-xr-x  1 root root    78 1月  19 21:23 hello.sh

cat命令,檢視檔案的內容,新建了一個hello.sh指令碼作為演示,展示指令碼的內容。

[root@cnwangk ~]# cat hello.sh 
#!/bin/bash
echo "hello cangls"
echo hello linux
echo create btrfs filesystem

cd命令,這個就不用做過多介紹,大家都很熟悉這個命令了。

#切換到opt目錄下
$ cd /opt
#返回上一層
$ cd ..
#進入當前使用者家目錄
$ cd ~

mkdir命令,新建目錄,新建一個cangls的合集目錄。

[root@cnwangk ~]# mkdir canglsList
[root@cnwangk ~]# ls
anaconda-ks.cfg  cangls.av  canglsList  hello.sh 

touch命令,新建一個cangls.avi檔案

$ touch cangls.avi

cp命令,複製命令,可以是單個檔案也可以是目錄。將cangls.avi檔案複製到新建的canglsList目錄中。

[root@cnwangk ~]# cp cangls.avi /root/canglsList/
[root@cnwangk ~]# ls /root/canglsList/ #檢視複製後cangls檔案集合目錄
cangls.avi

mv命令,移動或者重新命名。當檔案路徑相同時,我們就會修改重新命名;不同路徑時,則為剪下。我將cangls.avi檔案重新命名為acngls.mp4。然後將cangls.mp4檔案移動到canglsList目錄下。

[root@cnwangk ~]# mv cangls.avi cangls.mp4
[root@cnwangk ~]# ls
anaconda-ks.cfg  av  cangls.av  canglsList  cangls.mp4  hello.sh
[root@cnwangk ~]# mv cangls.mp4 /root/canglsList/
[root@cnwangk ~]# ls
anaconda-ks.cfg  av  cangls.av  canglsList  hello.sh  history.txt  scp_test
[root@cnwangk ~]# ls /root/canglsList/
cangls.avi  cangls.mp4

最終檢視在/root/目錄下cangls.mp4部件了,此時已經被我移動到canglsList集合目錄中了。

vim命令,這裡做簡單演示,下面會做詳細的說明。輸入hello cangls,使用cat展示內容。

[root@cnwangk ~]# vim /root/canglsList/cangls.avi
[root@cnwangk ~]# cat /root/canglsList/cangls.avi
hello cangls

rm命令,刪除命令。演示,刪除cangls.av檔案。

[root@cnwangk ~]# ls #檢視我有cangls.av這個檔案
anaconda-ks.cfg  av  cangls.av  canglsList  hello.sh
[root@cnwangk ~]# rm cangls.av #刪除,需要輸入確認
rm:是否刪除普通檔案 "cangls.av"?y
[root@cnwangk ~]# rm -rf cangls.av  #強制刪除,並遞迴刪除,不需要確認
[root@cnwangk ~]# ls
anaconda-ks.cfg  av  canglsList  hello.sh

chmod命令,簡單的介紹賦予許可權命令,一般755和644比較常用的。給cangls.sh輸入點內容,然後賦予許可權。

[root@cnwangk ~]# echo echo "hello cangls" > cangls.sh 
[root@cnwangk ~]# cat cangls.av 
hello cangls
[root@cnwangk ~]# ll #檢視cangls.sh指令碼許可權
-rw-r--r--  1 root root    13 1月  19 22:50 cangls.sh
[root@cnwangk ~]# chmod 755 cangls.sh 
[root@cnwangk ~]# ll #對比許可權變為了rwx-rx-rx,對應數字就是755
-rwxr-xr-x  1 root root    13 1月  19 22:50 cangls.sh
#執行指令碼cangls.sh
[root@cnwangk ~]# ./cangls.sh 
hello cangls

chown命令,改變檔案所有者,將cangls.sh檔案所以者從root改為test使用者。

[root@cnwangk ~]# chown test cangls.sh 
[root@cnwangk ~]# ll
-rwxr-xr-x  1 test root    18 1月  19 22:55 cangls.sh

個人根據多年經驗總結,認為工作中最最最常用的一些命令,以上就列舉這麼多了。還有其它常用命令,請接著往下閱讀。

4、其它常用命令

4.1、 掛載命令格式

mount [-t 檔案系統] [-o 特殊選項] 裝置檔名 掛載點

引數 作用
-t 檔案系統,加入系統檔案型別來指定掛載的型別,可以是ext3、ext4、iso9660、xfsbtrfs等檔案系統
-o 特殊選項,可以指定掛載的額外選項
4.2、查詢與掛載

查詢系統中已經掛載的裝置,mount命令。

#查詢系統中已經掛載的裝置
$ mount
#列舉我自己測試環境下已經掛載的部分裝置,Redhat7系列
#我測試使用是btrfs檔案系統
/dev/sdb2 on /data type btrfs (rw,relatime,space_cache,subvolid=5,subvol=/)
#系統預設掛載所使用檔案系統格式xfs
/dev/sda2 on /home type xfs (rw,relatime,attr2,inode64,noquota)
/dev/sda1 on /boot type xfs (rw,relatime,attr2,inode64,noquota)

上面列舉我自己測試環境下已經掛載的部分裝置,Redhat7系列。順帶一提,Redhat7開始推薦使用xfs檔案系統,我所演示的也包含了xfs檔案系統掛載的,同樣也有上面介紹過的btrfs檔案系統。

部分引數說明,如下表格所示:

引數 作用
mount -a 依據配置檔案/etc/fstb的內容,自動掛載
atime/noatime 更新訪問時間/不更新訪問時間。訪問分割槽檔案時,是否更新檔案的訪問時間,預設為更新。
async/sync 非同步/同步,預設為非同步
auto/noauto 自動/手動,執行mount -a命令時,是否會自動安裝/etc/fstb檔案內容掛載,預設自動。
defaults 定義預設值,相當於rwsuiddevexecautonouserasync這七個選項。
exec/noexec 執行/不執行,設定是否允許在檔案系統中執行可執行檔案,預設exec允許。
remount 重新掛載已掛載的檔案系統,一般用於指定修改特殊許可權。
rw/ro 讀寫/只讀,檔案系統掛載時,是否具有讀寫許可權,預設rw。
suid/nosuid 具有/不具有suid許可權,設定檔案系統是否具有suid和sgid的許可權,預設具有
user/nouser 允許/不允許普通使用者掛載,設定檔案系統是否允許普通使用者掛載,預設不允許,只有root可以掛載分割槽。
usrquota 寫入代表檔案系統支援使用者磁碟配額,預設不支援。
grpquota 寫入代表檔案系統支援組磁碟配額,預設不支援。

關於磁碟掛載,如果感興趣的話,可以參考我在github或者gitee上整理的文章。在程式碼庫中的linux資料夾中,同樣整理了PDF檔案格式的文章便於閱讀,目前還在整理完善中。

個人github倉庫地址,一般會先更新PDF檔案,然後再上傳markdown檔案。如果訪問github太慢,可以訪問gitee進行克隆。

https://github.com/cnwangk/SQL-study

4.2.1、掛載光碟

首先建立掛載點,命令如下:

$ mkdir /mnt/cdrom/

掛載光碟,這裡說明下:只是習慣在mnt下建立,media下建立也行。

簡單介紹:/dev/sr0是要掛載的檔案,/mnt/cdrom是掛載儲存的磁碟路徑

$ mount -t iso9660 /dev/cdrom /mnt/cdrom/
$ mount /dev/sr0  /mnt/cdrom/

解除安裝命令,裝置檔名或者掛載點,比如解除安裝新增磁碟掛載的sdb

$ umount /dev/sdb 

4.2.2、掛載U盤

檢視U盤裝置檔名,fdisk -l檢視磁碟列表

$ fdisk -l 
$ mount -t vfat /dev/sdb1 /mnt/usb/
4.3、使用者登入檢視命令

檢視使用者登入資訊

$ w
[root@cnwangk ~]# w
 21:31:12 up  1:39,  1 user,  load average: 0.00, 0.04, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.245.1    19:52    0.00s  0.28s  0.02s w

如上所示,輸入w命令檢視到我的登入資訊。只有1個使用者,我用ssh登入的,本機虛擬機器中並沒有登入。命令輸出如下所示:

4.3.1、命令輸出

引數說明,作用如下表格所示:

引數 作用
USER 登入的使用者名稱
TTY 登入終端
FROM 從哪個IP地址登入
LOGIN@ 登入時間
DILE 使用者閒置時間
JCPU 與該終端連線的所有程式佔用的時間。這個時間裡並不包括過去的後臺作業時間,但包括當前正在執行的後臺作業佔用時間
PCPU 當前程式所佔用時間
WHAT 當前正在執行的命令
w 查詢登入使用者,顯示系統時間和執行時間,使用者個數以及平均負載。

4.3.2、檢視登入使用者資訊

命令輸出:使用者名稱,登入終端,登入時間(登入來源IP地址)

#檢視使用者資訊
$ who
[root@cnwangk ~]# who  #檢視當前使用者資訊
root     pts/0        2022-01-19 19:52 (192.168.245.1)
#檢視當前使用者
$ whoami #檢視當前使用者身份是root
[root@cnwangk ~]# whoami 
root

檢視到當前使用者為root,登入終端pts/0,登入時鍵與IP:2022-01-19 19:52 (192.168.245.1),虛擬機器搭建的環境

查詢當前登入和過去登入的使用者資訊

last命令預設讀取/var/log/wtmp檔案資料 。命令輸出:使用者名稱,登入終端,登入IP,登入時間,退出時間(線上時間)

$ last
root     tty1                          Sun Jan  5 21:47 - 21:50  (00:02)    
reboot   system boot  3.10.0-514.el7.x Sun Jan  5 21:44 - 21:59 (7+00:15)  

可以看到記錄的我最久遠的一次登入資訊,時間確實有點久了,基本上很晚才使用的。

檢視所有使用者最後一次登入時間

#lastlog命令預設讀取/var/log/lastlog檔案內容
#命令輸出:使用者名稱,登入終端,登入IP,最後一次登入時間
$ lastlog
[root@cnwangk ~]# lastlog 
使用者名稱           埠     來自               最後登陸時間
root            pts/0   192.168.245.1      三 1月 19 22:52:46 +0800 2022
bin                                        **從未登入過**

上面的中文顯示,我在安裝的時候選擇了簡體中文版,對於初學者來說簡直太友好了

檢視網路狀態 ,一般比較關注的是ESTABLISHED狀態

$ netstat -an | grep ESTABLISHED
[root@cnwangk ~]# netstat -an | grep ESTABLISHED
tcp        0      0 192.168.245.131:22      192.168.245.1:3579      ESTABLISHED
4.4、解壓縮命令

只介紹一些常用的,比如壓縮命令zip、gzip;解打包命令tar。

4.4.1、壓縮命令

例如:zip、gzip。將canglsAVList壓縮成canglsAVList.zip格式,將bolsAVList壓縮成bolsAVList.gz格式。

zip -r canglsAVList > cangls.zip
gzip -c bolsAVList > bolsAVList.gz
4.4.2、解打包命令tar

解壓一個redis的原始碼包

$ tar -zxvf redis-6.0.8.tar.gz 

打包命令tar -zcvf,將redis-6.0.8-bak打包成tar包

$ tar -zcvf redis-6.0.8-bak > redis-6.0.8-bak.tar

然後再將redis-6.0.8-bak.tar壓縮成.gz格式

$ gzip redis-6.0.8-bak.tar > redis-6.0.8-bak.tar.gz
4.5、搜尋命令
4.5.1、locate命令

locate命令後面只能接檔名,例如,我們搜尋一下cangls的檔案。嚯,還不少啊:

locate cangls
[root@cnwangk opt]# locate cangls
/root/cangls.av
/root/cangls.sh
/root/canglsList
/root/canglsList/cangls.avi
/root/canglsList/cangls.mp4

locate命令所搜尋的後臺命令,不是及時更新,這時可以使用updatedb命令更新:

$ updatedb

locate命令配置檔案/etc/updatedb.conf配置檔案

  • PRUNE_BIND_MOUNTS:開啟搜尋限制
  • PRUNEFS="":不搜尋的系統檔案
  • PRUNENAMES="":不搜尋的檔案型別
  • PRUNEPAEHS="":不搜尋的路徑
4.5.2、命令搜尋命令

命令搜尋命令,比如wheris、which以及find命令。

此處,著重講一下find命令的使用

不區分大小寫,搜尋cangls.sh指令碼

$ find /root -iname cangls.sh 

按照所有者搜尋

$ find /root -user root

查詢10天前修改的檔案

find /var/log  -mtime +10

查詢/etc目錄下大於1M的檔案

find /etc -size +1M

查詢i節點為26267295的檔案,直呼內行,啥時候新增了個bols的小電影。

[root@cnwangk ~]# find . -inum 26267295
./bolsList

查詢/etc/目錄下大於100KB且小於200KB的檔案

find /etc -size +100k -a -size -200k
  • -a相當於and,邏輯與,兩個條件都滿足
  • -o相當於or,邏輯或,兩個條件滿足一個即可

查詢/etc/目錄下大於100KB且小於200KB的檔案,並且顯示詳細資訊

#-exec/-ok 命令 
#{}\;對搜尋結果執行操作
find /etc -size +100k -a -size -200k -exec ls -lh {} \;

grep字串搜素命令

  • grep [選項] 字串 檔名,在檔案當中匹配符合的字串
  • -i,忽略大小寫
  • -v,排除指定字串

根據檔案大小匹配,anaconda-ks.cfg檔案時Redhat系列安裝就自帶的檔案。

$ grep "size" anaconda-ks.cfg
part swap --fstype="swap" --ondisk=sda --size=2000
part /boot --fstype="xfs" --ondisk=sda --size=200
part / --fstype="xfs" --ondisk=sda --size=16278
part /home --fstype="xfs" --ondisk=sda --size=2000

find與grep的區別

  • find命令:在系統當中搜尋符合條件的檔名,如需匹配,使用萬用字元,萬用字元是完全匹配
  • grep命令:在檔案當中搜尋符合條件的字串,如需匹配,使用正規表示式進行匹配,正規表示式是包含匹配

5、關機與重啟命令

5.1、關機命令

一般而言關機和重啟命令都不會賦予許可權給普通使用者,只有root使用者才有許可權執行。

$ shutdown
# shutdown -h now #立即關機
引數 作用
-c 取消前一個關機命令
-h 關機
-r 重啟

其它關機命令:halt,poweroff,init 0

注意:使用伺服器時,不要隨便去使用關機命令。一旦使用了,會造成不必要的麻煩。

5.2、重啟命令

一般而言關機和重啟命令都不會賦予許可權給普通使用者,只有root使用者才有許可權執行。

#重啟命令1,立即重啟,同樣可以接指定世界以及間隔多久重啟
$ shutdown -r now
#重啟命令2,立即重啟
$ reboot

注意:使用logout命令登出shell,養成良好的習慣退出登入

其它重啟命令:reboot,init 6

03 第三夜

第二夜的知識有點多,小白還有點沒消化過來。

cangls:小白,你來啦。我白嗎?我大嗎?我好看嗎?別走了,我這裡...

小白:啥?一臉懵逼...

此時小白的內心真實想法:不要以為我不懂,我們為學習忍了。真的又大又白,天天誘惑我。

cangls:不逗你玩了,我們回到正題,昨天的知識點有點多,希望下去好好消化。今天會帶來linux進階方面的小技巧。

小白:點了點頭,認真的聆聽著。

三、進階常用

1、scp命令

1.1、語法
usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
           [-l limit] [-o ssh_option] [-P port] [-S program]
           [[user@]host1:]file1 ... [[user@]host2:]file2
1.2、使用方法

簡單來看:scp [可選引數] 本地檔案 目標目錄

scp /root/av/local_file.av  remote_username@ip:/root/av

scp [可選引數] 本地目錄 目標目錄

scp -r /root/av/  remote_username@ip:/root/

命令格式介紹

#複製檔案格式,本地到遠端伺服器
scp local_file remote_username@remote_ip:remote_directory 
#或者 
scp local_file remote_username@remote_ip:remote_file 
#或者 
scp local_file  remote_ip:remote_directory 
#或者 
scp local_file remote_ip:remote_file 

複製目錄命令格式

#複製命令格式,本地到遠端伺服器
scp -r local_directory remote_username@remote_ip:remote_directory 
#或者 
scp -r local_directory remote_ip:remote_directory 

詳細操作,請參考的博文:【SCP命令】安全又快捷的linux小技巧scp命令

2、路由命令

以下是對一些常用的路由命令(網路配置工具)進行簡單的介紹。

2.1、ifconfig命令,展示內容如下:

tips:我們判斷網路環境的時候,dropped引數值是很重要的,一般正常狀態是0,如果掉包數字則會上升

[root@cnwangk ~]# ifconfig 
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:38:38:ab:fe  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.245.131  netmask 255.255.255.0  broadcast 192.168.245.255
        inet6 fe80::b314:8248:917a:d808  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:47:be:5f  txqueuelen 1000  (Ethernet)
        RX packets 14160  bytes 1053042 (1.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7652  bytes 713027 (696.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 1474  bytes 91198 (89.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1474  bytes 91198 (89.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ifconfig最常見的作用就是看設定的ip地址以及dns和閘道器,其實就是看網路卡設定的引數。當你看到docker的時候,沒錯,我安裝了docker環境。

2.2、ip命令使用,如下所示:

[root@cnwangk ~]# ip addr list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:47:be:5f brd ff:ff:ff:ff:ff:ff
    inet 192.168.245.131/24 brd 192.168.245.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::b314:8248:917a:d808/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:38:38:ab:fe brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
#ip命令同樣可以配合route命令使用       
[root@cnwangk ~]# ip route list 
default via 192.168.245.2 dev ens33 proto static metric 100 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
192.168.245.0/24 dev ens33 proto kernel scope link src 192.168.245.131 metric 100        

ip命令同樣可以配合route命令使用,單獨使用route命令同樣可以起到配置作用。

下圖是我之前製作的一個簡單的思維導圖,本來是要放在防火牆知識裡面的,現在同樣適用。沒有放原圖,原圖太大了,縮小了一點也同樣能看清楚喲!

3、防火牆命令

這裡,我只介紹firewalld命令列模式,關於詳細操作說明請參考博文:【Redhat系列linux防火牆工具】firewalld與iptables防火牆工具的激烈碰撞

1.1、區域選擇

當前作業系統安裝完成後,防火牆會設定一個預設區域,將介面加入到預設區域中。使用者配置防火牆的第一步是獲取預設區域並修改,關於操作如下:

檢視當前系統中所有區域

firewall-cmd --get-zones

檢視當前預設的區域

firewall-cmd --get-default-zone

檢視當前已啟用的區域

firewall-cmd --get-active-zones

獲取介面ens33所屬區域

firewall-cmd --get-zone-of-interface=ens33

修改介面所屬區域

firewall-cmd --permanent --zone=internal --change-interface=ens33
1.2、firewalld服務管理

重新載入防火牆配置

firewall-cmd --reload

重啟防火牆(redhat系列)

systemctl restart firewalld.service

臨時關閉防火牆

systemctl stop firewalld.service

開機啟用防火牆

systemctl enable firewalld.service

開機禁止防火牆

systemctl disable firewalld.service

檢視firewalld的執行狀態

firewall-cmd --state
1.3、firewalld開放埠

公共區域(public)設定開放21埠永久生效並寫入配置檔案(引數:--permanent)

#引數:--permanent,設定即立刻生效並且寫入配置檔案
firewall-cmd --zone=public --add-port=21/tcp --permanent

查詢防火牆埠21是否開放

firewall-cmd --zone=public --query-port=21/tcp

移除開放的埠21

firewall-cmd --zone=public --remove-port=21/tcp --permanent
1.4、區域規則修改

查詢防火牆規則列表

firewall-cmd --zone=public --list-all

新增一條區域規則httpd服務

firewall-cmd --permanent --zone=internal --add-service=http

驗證規則

firewall-cmd  --zone=internal --list-all

4、程式相關命令

程式相關命令主要介紹四個

  • ps -aux | grep [服務名]
  • ps -ef | grep [服務名]
  • ps -le | grep [服務名]
  • top

如果沒有安裝httpd服務,Redhat系列可以使用yum命令進行安裝,在Ubuntu系列可以通過apt install。apt 是 Debian 和 Ubuntu 中的 Shell 前端軟體包管理器。

$ yum -y install httpd

檢視程式常用的ps命令,以httpd程式進行演示。這裡只介紹工作中比較實用的。

#使用-ef引數檢視httpd程式
$ ps -ef | grep httpd
[root@cnwangk ~]# ps -ef | grep httpd
root      1329     1  0 13:37 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    2216  1329  0 13:37 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    2218  1329  0 13:37 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    2219  1329  0 13:37 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    2220  1329  0 13:37 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    2221  1329  0 13:37 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    2222  1329  0 13:37 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
root      2276  2226  0 13:38 pts/0    00:00:00 grep --color=auto httpd
#使用-aux引數檢視httpd程式
$ ps -aux | grep httpd
[root@cnwangk ~]# ps -ef | grep httpd
root      1329     1  0 13:37 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    2216  1329  0 13:37 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    2218  1329  0 13:37 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    2219  1329  0 13:37 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    2220  1329  0 13:37 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    2221  1329  0 13:37 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    2222  1329  0 13:37 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
root      2276  2226  0 13:38 pts/0    00:00:00 grep --color=auto httpd
#以長格式查詢httpd程式
$ ps -le | grep httpd
[root@cnwangk ~]# ps -le | grep httpd
4 S     0  1329     1  0  80   0 - 104198 poll_s ?       00:00:00 httpd
5 S    48  2216  1329  0  80   0 - 70677 poll_s ?        00:00:00 httpd
5 S    48  2218  1329  0  80   0 - 105278 SYSC_s ?       00:00:00 httpd
5 S    48  2219  1329  0  80   0 - 105278 ep_pol ?       00:00:00 httpd
5 S    48  2220  1329  0  80   0 - 105278 SYSC_s ?       00:00:00 httpd
5 S    48  2221  1329  0  80   0 - 105278 SYSC_s ?       00:00:00 httpd
5 S    48  2222  1329  0  80   0 - 105278 SYSC_s ?       00:00:00 httpd

檢視程式,當然top命令也應該瞭解,不帶任何引數就能看到一些程式相關的。比如伺服器當前時間、執行天數、使用者數量、負載均衡、任務總數、多少程式在執行和休眠、停止以及殭屍程式zombie、cpu的利用率、記憶體佔用情況以及快取、緩衝的情況。檢視直接使用top即可,退出按q鍵。

$ top
top - 13:41:24 up 5 min,  1 user,  load average: 0.06, 0.28, 0.16
Tasks: 193 total,   1 running, 192 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.7 sy,  0.0 ni, 98.7 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1877588 total,   940396 free,   481804 used,   455388 buff/cache
KiB Swap:  2047996 total,  2047996 free,        0 used.  1235960 avail Mem 

檢視程式,pstree命令也必不可少,以樹狀結構展示出了我部署的vsftpd以及監控系統服務zabbix

$ pstree
        ├─vsftpd
        ├─zabbix_agentd───5*[zabbix_agentd]
        ├─zabbix_proxy
        └─zabbix_server───33*[zabbix_server]

程式實在無法正常結束,那就採取暴力手段kill命令,強行關閉。

$ kill -1 3033 #重啟程式
$ kill -9 3034   #強制殺死程式

關於程式的就講這麼多,講太多了不好消化,更多詳細描述可以參考本人的歷史博文。

5、系統許可權

系統許可權,如果非要分類,大致可分為:基本許可權、特殊許可權

許可權分配原則:對檔案來講:最高許可權為x(執行)對目錄來講:最高許可權為w(寫)。接著以cangls這個檔案進行演示,分別帶你看許可權用數字的代表含義,rwx加起來就是7:

  • r 對應的數字許可權為:4,讀許可權
  • w 對應的數字許可權為:2, 寫許可權
  • x 對應的數字許可權為:1,執行許可權
[root@cnwangk ~]# chmod 711 cangls.av
[root@cnwangk ~]# ll cangls.av
-rwx--x--x 1 root root 13 1月  19 22:49 cangls.av
[root@cnwangk ~]# chmod 722 cangls.av
[root@cnwangk ~]# ll cangls.av
-rwx-w--w- 1 root root 13 1月  19 22:49 cangls.av
[root@cnwangk ~]# chmod 744 cangls.av
[root@cnwangk ~]# ll cangls.av
-rwxr--r-- 1 root root 13 1月  19 22:49 cangls.av

通過上面的演示對cangls.av這個檔案賦予許可權711、722、744進行測試。711對應的許可權-rwx--x--x、722對應的許可權-rwx-w--w-、744對應的許可權:-rwxr--r--,當然這樣設定是沒有意義的,為了演示進行測試演示數字代表的含義。

tips:還有一種方式是ugo模式,作為了解就行。

04 第四夜

cangls:還記得前三天我們探討了哪些linux方面的知識嗎?

小白:當然記得,我都記在筆記本上了,下面進行了複述:

  • 學習方法;
  • linux基本命令,最重要的是幫助命令的運用;
  • linux進階的小技巧,比如:scp安全檔案傳輸命令、路由命令、firewalld防火牆命令等等;
  • linux程式相關命令:ps -ef、ps -aux、top;
  • linux系統許可權命令:chmod。

cangls:接下來會有一點小插曲,對伺服器部署專案的一些知識進行講解,比如Javaweb專案。

小白:好耶,我很感興趣!

四、Java相關

基於實際工作中的運用,介紹一些web專案和伺服器相關的知識。當你看到我的文章或多或少會出現Java相關的知識的時候,請不要驚訝。我其實是一個蹩腳Java碼農,就是這麼神奇。好吧,我承認自己連半吊子都算不上,只是有一段時間的CURD經驗。而在Linux上操作的經驗反而比我主學的Java經驗還要豐富,得益於多年的自學以及與伺服器和虛擬機器打交道。

1、jar包服務和war包服務

將Java程式通過中介軟體在後臺執行,&符號就是將程式放入後臺執行

$ java -jar demo-1.0.jar &

jar包或者war包在中介軟體後臺執行,優化版本,將日誌輸出到指定檔案demo-1.0.log。jvm在client模式下執行,預設Xmx大小為64M,而在server模式下預設Xmx大小為1024M預設Xms大小為1M,而在server模式下預設Xms大小為128M

$ nohup java -server -Xms256M -Xmx2048M -jar demo-1.0.jar &> demo-1.0.log &

當你遇到控制檯日誌輸出亂碼的時候,此時不要慌,請冷靜思考。當然有解決方案,那就是在控制檯執行Java -jar命令時指定固定的編碼,比如utf-8編碼。

$ java -jar -Dfile.encoding=utf-8 demo-1.0.jar &
$ nohup java -server -Xms256M -Xmx2048M -jar -Dfile.encoding=utf-8 demo-1.0.jar &> demo-1.0.log &

個人建議:基於實際工作處理。再怎麼去優化,機器始終是機器,記憶體始終要消耗。如果不能釋放,需要採取人為的干預手段,比如定期重啟伺服器。很多問題找了很多原因依舊解決不掉,但是重啟伺服器就迎刃而解了,就是這麼神奇。

2、tomcat中介軟體優化

限制堆記憶體,具體根據伺服器和真機的記憶體計算優化,下面知識給出示例值。

$ set JAVA_OPS = -Xms800m -Xmx1024m -XX:PermSize=800m -XX:MaxPermSize=1024m  

https自簽證照配置

<!--自簽證照配置,證照密碼keystorePass,key包含檔案keystoreFile=""--> 
  <!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" 
              keystoreFile="D:\\company-workspace\\mykeys\\tomcat.keystore"
              keystorePass="123456"
              truststoreFile="D:\\company-workspace\\mykeys\\tomcat.keystore"
              truststorePass="123456"
               />-->  

談到tomcat中介軟體,一般自然而然的就聯想到nginx中介軟體。一般不建議直接在tomcat中直接配置,反而使用nginx做一層反向代理,然後在nginx中設定ssl。

nginx中介軟體配置簡單介紹

負載均衡,可以通過加權重實現輪詢。

   upstream tomcat {
                server 192.168.0.233:8080;
				server 192.168.0.233:8888;
				server 192.168.0.233:9999;
        }

配置ssl參考

server
    {
        listen 80;
		listen 443 ssl;
		server_name 192.168.245.130;	
	#ssl set begin
		#優雅的編寫rewrite規則
        #rewrite ^ https://www.nginx.org$request_uri?;
        #重定向轉發到https
        #proxy_redirect http:// $scheme://;
        #301重定向
        #return  301 https://$server_name$request_uri;
        #http請求重定向到https請求,非標準433埠採用  
        #error_page 497  https://$host$uri?$args; 
        #ssl 設定off或者遮蔽
        ssl off;
        ssl_certificate ssl/server.crt;#服務端證照
  		ssl_certificate_key ssl/server.key;#服務端私鑰
        ssl_session_cache shared:SSL:1m;#設定共享會話快取大小
        ssl_session_timeout 5m;#配置session有效時間5分鐘
        ssl_prefer_server_ciphers on;#優先採取伺服器演算法
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;#啟用指定協議
        #加密演算法
        ssl_ciphers  EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
        #ssl_verify_client on;# 開啟客戶端證照校驗
        #ssl_client_certificate ssl/ca.crt;#設定驗證客戶端證照
        #ssl_verify_depth 6; #校驗深度
        #ssl_trusted_certificate ssl/ca.crt;#設定CA為受信任證照
	#ssl set end
	location / {
	  	#配置proxy_set_header請求頭
        proxy_pass_header User-Agent;
	  	proxy_set_header Host $http_host;
	  	proxy_set_header X-Real-IP $remote_addr;
	  	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
	  	proxy_pass http://tomcat;
	  	proxy_redirect http:// https://;	
	}

3、國產中創中介軟體優化

解決JDK不完整的兩種方案

  • 第一種:下載完整版的JDK;
  • 第二種:使用as內部自帶的編譯器,如下所示進行調整。

找到java-config配置那一欄,在<jvm-options>加入如下引數。

<jvm-options>-Dorg.apache.jasper.compiler.disablejsr199=true</jvm-options>

或者修改as/domains/domain1/config/目錄下的domain.xml,將false修改為true

<jvm-options>-Dorg.apache.jasper.compiler.disablejsr199=false</jvm-options>

05 第五夜

經過前四夜的深入探討,此時的小白已經具備了一些linux基本知識的運用,對於專案上線和維護也有了一定的瞭解。

cangls:相信小白同學現在已經對linux基本知識有了一定的瞭解,並能夠運用到工作中。

小白:cangls,這還是得感謝您的細心教導,是有那麼一丟丟的成就感。

cangls:學習就是要有這種勁頭,好樣的!今天再給你傳授我多年珍藏的獨家祕笈:vim工具的使用。

小白:好耶,獨家祕笈?莫非是九陽神功,還是玉女心經?表現出滿懷期待的樣子。

cangls:想啥呢?是linux中的編輯神器,用好了vim對你的工作有大大大的好處喲!

小白:原來如此,開始拿出了自己的小本本記錄...

五、vim的使用

1、vim簡單使用

接著上面的例子hello.sh指令碼繼續講。

$ vim hello.sh  #開始編輯指令碼

在hello.sh指令碼中寫入一段內容:

tips:進入後按 i 鍵進行插入內容。

#!/bin/bash
echo "hello cangls"
echo hello linux
echo create btrfs filesystem

按ESC,輸入:wq儲存退出,然後執行指令碼:

[root@cnwangk ~]# ./hello.sh 
hello cangls
hello linux
create btrfs filesystem

執行指令碼,會發現剛剛通過vim輸入的hello cangls已經生效了。

如果沒有許可權,通過root使用者賦予許可權

#賦予讀和執行許可權 
chmod 755 /hello.sh

2、玩轉vim

憑個人使用經驗總結一些常用到的快捷鍵命令

引數 作用
i 進行編輯,插入內容
:wq 儲存並退出
:q! 不儲存並退出
shirt + pgup 上翻頁
shift + pgdown 下翻頁
/ 搜尋內容
:set number 顯示行數
ESC 退出編輯

更多命令引數可以參考,man vim,強大的幫助命令man。

附上一個vim的鍵盤圖,來自菜鳥教程可以去菜鳥教程下載原圖

06 第六夜

經過前五夜的連續戰鬥,小白依舊鬥志昂揚。

cangls:小白同學啊,看你今天似乎遇到什麼難題了吧!

小白:是的,我最近閱讀了linux shell相關的文章,但是有很多疑惑。

cangls:能具體描述一下嗎?

小白:是這樣的,對基本知識和用法有些困惑。

cangls:沒關係,今天正是要給你傳授shell方面的基本知識,希望對你有所幫助。

小白:此時拿出了小本本開始記錄著...

六、shell指令碼

1、shell概述

  • shell的兩種主要語法型別有BourneC,這兩種語法彼此不相容。Bourne家族主要包括:sh、ksh、Bash、psh、zsh;
  • C家族主要包括:csh、tcsh。

Bash中其它特殊符號,如下表格所示:

選項 符號含義
' ' 在單引號中所有特殊符號,如"$"和"`"(反引號)都沒有特殊含義
" " 雙引號。在雙引號中所有特殊符號除"$"、"、"、"\"外都無特殊含義。"$"、"、"、""擁有"呼叫變數的值"、"引用命令"和"轉義符"的含義
`` 反引號括起來的是系統命令,在Bash中會優先執行它。和$()作用一樣,推薦使用$(),反引號容易誤導。
$() 與反引號作用相同,用來引用系統命令。
# 在shell指令碼中,#代表註釋。
$ 用於呼叫變數的值,如果需要呼叫name的值時,需要使用$name獲取變數的值。
\ 轉義符,跟在\之後的特殊符號將失去特殊含義,變為普通字元。例如:$將輸出"$"符號,則不會作為變數引用。

2、shell指令碼基本編寫

#編寫一個簡單的linux指令碼,使用vim命令
vim /home/hello.sh 
#注意一個標準的shell指令碼必須加上:#!/bin/bash
#!/bin/bash  
echo "hello world"  >> /root/hello.log #將hello world追加到hello.log這個檔案中
#賦予讀和執行許可權 
chmod 755 /hello.sh
#使用 sh hello.sh 命令執行
sh hello.sh && ./hello.sh

3、別名與快捷鍵

3.1、檢視與設定別名

alias 別名 = '原命令',設定命令別名,當然這樣設定只會臨時生效

alias 命令,檢視系統命令中所有的命令別名,例如我個人安裝的系統別名檢視如下:

alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

別名永久生效與刪除別名

寫入環境變數配置檔案,永久生效

#寫入當前使用者的環境變數,Ubuntu下可以這樣設定
$ vi ~/.bashrc
#Redhat7系列
[root@cnwangk ~]# vi ~/.bash_profile 

上面分別介紹了Ubuntu下的環境變數和Redhat7系列的當前使用者環境變數修改。我之前也有寫過博文,在這篇文章中:【linux環境變數】秒懂linux配置全域性與當前使用者環境變數,同樣也上傳到了我的github和gitee倉庫,微信公眾號也有釋出喲。

刪除別名

$ unalias 接別名

命令生效順序

  • 第一順位執行用絕對路徑或相對路徑執行的命令
  • 第二順位執行別名
  • 第三順位執行Bash的內部命令
  • 第四順位執行按照$PATH環境變數定義的目錄查詢順序找到的第一個命令

4、 歷史命令

直接在終端輸入history命令,就可以看到自己輸入的歷史命令。

$ history

history [選項][歷史命令儲存檔案]

  • -c:清空歷史命令
  • -w:把快取中的歷史命令寫入歷史命令儲存檔案~/.bash_history

歷史命令的呼叫

  • 使用上、下箭頭呼叫以前的歷史命令
  • 使用"!n"重複執行第n條命令
  • 使用"!!"重複執行上一條命令
  • 使用"!字串"重複執行最後一條以該字串開頭的命令

5、輸出重定向

最基本的echo用法演示,將hello world輸出到hello.sh指令碼中,如果對echo命令不熟悉,可以使用我上面介紹過的man幫助命令進行查詢。例如:

$ man echo

-e引數介紹:支援反斜線控制的字元轉換

$ echo "hello world" > hello.sh
[root@cnwangk ~]# cat hello.sh 
hello world
#輸入一段字串到hello.sh指令碼
[root@cnwangk ~]# echo -e "echo "hello linux"\necho "create btrfs filesystem"" > hello.sh 
[root@cnwangk ~]# chmod 755 hello.sh  #賦予755許可權
[root@cnwangk ~]# sh hello.sh  #執行指令碼
hello linux
create btrfs filesystem

控制字元作用,如下表格所示:

引數 作用
\a 輸出警告音
\b 退格鍵,向左刪除
\n 換行符
\r Enter鍵
\t 製表符,TAB鍵
\v 垂直製表符
\0nnn 按照八進位制ASCII碼輸出字元。其中0為數字零,nnn為三位八進位制數。
\xhh 按照十六進位制ASCII碼輸出字元。hh是兩位十六進位制數。

例如,表示以追加形式將蒼老師輸出到av檔案中。嘿嘿,我們就騷一下。

echo "cangls" >> av.avi

標準輸出重定向,作用如下表格所示:

命令格式 作用
命令 > 檔案 以覆蓋的方式,把命令的正確輸出到指定的檔案或裝置當中
命令 >> 檔案 以追加的方式,把命令的正確輸出到指定的檔案或裝置當中
錯誤命令 2> 檔案 以覆蓋的方式,把命令的錯誤輸出到指定的檔案或裝置當中
錯誤命令 2>> 檔案 以追加的方式,把命令的錯誤輸出到指定的檔案或裝置當中

正確輸出和錯誤輸出同時儲存,作用如下表格所示:

命令格式 作用
命令 > 檔案 2>&1 以覆蓋的方式,把命令的正確和錯誤輸出儲存在同一個檔案中
命令 >> 檔案 2>&1 以追加的方式,把命令的正確和錯誤輸出儲存在同一個檔案中
命令 &> 檔案 以覆蓋的方式,把命令的正確和錯誤輸出儲存在同一個檔案中
命令 &>>檔案 以追加的方式,把命令的正確和錯誤輸出儲存在同一個檔案中
命令 >> 檔案1 2>> 檔案2 把正確的輸出到檔案1中,錯誤的輸出到檔案2中

wc命令

wc [選項][檔名],輸出檔案中的行數、單詞數、行數

示例,統計hello.sh的行數,統計有兩行,與上面的演示對應起來了。

$ wc -l
[root@cnwangk ~]# wc -l hello.sh  #統計hello.sh的行數,統計有兩行,與上面的演示對應起來了。
2 hello.sh

最後總結出實用的幾種,以追加的形式把錯誤和正確的結果輸出到檔案中:

  • 命令 >> file 2>&1
  • 命令 &>> file
  • 命令 >> file1 2>> file2

6、管道符

6.1、命令格式,如下表格所示:

命令格式 作用
命令1 | 命令2 命令1的正確輸出作為命令2的操作物件
;,格式1:命令2 多個命令順序執行,命令之間沒有任何邏輯關係
&&,命令1&&命令2 邏輯與,當命令1正確執行,命令2才會執行;命令1無法正確執行,命令2不會執行
||,命令1||命令2 邏輯或,當命令1非正確執行,命令2才會執行;命令1正確執行,命令2不會執行

6.2、linux中的萬用字元,部分整理如下表格所示:

引數 作用
* 匹配任意內容
? 匹配任意一個字元
[] 匹配任意一箇中括號內的字元,例如[abc]代表匹配一個字元,可能是a,也可能是b或c。
[-] 匹配中括號裡的任意一個字元,-代表一個範圍,例如:[a-z]代表匹配一個小寫字母。
[ ^ ] 邏輯非,匹配不是中括號裡的一個字元,例如:[^0-9]代表匹配一個非數字的字元。

續更新優化中...

總結

能看到這裡的,都是帥哥靚妹。以上就是此次文章的所有內容的,希望能對你的工作有所幫助。感覺寫的好,就拿出你的一鍵三連。如果感覺總結的不到位,也希望能留下您寶貴的意見,我會在文章中進行調整優化。

原創不易,轉載也請標明出處和作者,尊重原創。本文會不定期上傳到gitee或者github以及釋出到微信公眾平臺。我的微信公眾號與其他平臺暱稱同樣是龍騰萬里sky。認準龍騰萬里sky,如果看見其它平臺不是這個ID發出我的文章,就是轉載的。

linux系列文章:linux小技巧scp命令、linux磁碟管理已經上傳至github和gitee。

個人github倉庫地址,一般會先更新PDF檔案,然後再上傳markdown檔案。如果訪問github太慢,可以訪問gitee進行克隆。

https://github.com/cnwangk/SQL-study

個人gitee倉庫地址,一般會先更新PDF檔案,然後再上傳markdown檔案。

https://gitee.com/dywangk/SQL-study

cangls和小白的對話並沒有結束,在這個只有兩人的操作間之中,到底發生了啥,請接著看。

by 龍騰萬里sky

相關文章