前言
在這個只有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、xfs、btrfs等檔案系統 |
-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 | 定義預設值,相當於rw ,suid ,dev ,exec ,auto ,nouser ,async 這七個選項。 |
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的兩種主要語法型別有
Bourne
和C
,這兩種語法彼此不相容。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和小白的對話並沒有結束,在這個只有兩人的操作間之中,到底發生了啥,請接著看。