Linux是世界上使用最多的操作器,絕大部分的伺服器都是用Linux,包括Android手機OS也是Linux系統的分支
POSIX标準
可移植作業系統接口(Portable Operating System Interface of UNIX,縮寫為 POSIX) 遵守這個标準的作業系統非常多,如macoS,centos,ubuntu等
- 類比成Java世界,有POSIX這麼一個借口 class MACOS implements POSIX{} class Linux implements POSIX{} 其他系統派生系統同理...
什麼是指令
先看兩個單詞kernel與shell
- kernel是指核心,如水果的核,而Linux核心則是常說的負責合計算機硬體互動排程的核心
- shell則是殼,負責和核心打交道
廣義的指令行包括一切通過字元終端控制計算機的方式
- windows:cmd、powerShell、git bash
- unix/linux:sh、zsh、Terminal、iterm2
sh就是shell的簡稱,都是普通的程式,隻是可以和計算機互動,為什麼要殼的原因是,沒有辦法直接和核心打交道,如下圖所示
開始之前需要準備一台安裝了Linux作業系統的主機
- 可以在各大雲主機廠商購買(阿裡雲,騰訊雲等)
- 通過虛拟機安裝鏡像
開始Linux之旅
- 通過一個終端連結Linux主機,主機本身在哪裡并不重要,如我在阿裡雲購買了一台雲伺服器,我隻需要在任意電腦上通過Shell即可連結上這台伺服器
- 連接配接主機使用指令 密碼通路,顧名思義 SSH key pair,SSH全稱是Secure Shell,更加安全加密的Shell
通過ssh root@remoteIp,表明以root使用者進行登陸,即可通路伺服器。有密碼時會要求輸入密碼,一般情況下,在linux系統下輸入密碼是沒有回顯的
登陸後輸入whoami可以檢視目前使用者
每個使用者都有其自己的Home目錄,登陸後目前工作路徑預設就是這裡,也可以使用cd ~指令更改目前工作路徑到目前使用者的家目錄
pwd指令(print working directory)可以檢視目前工作路徑
一般來說操作root是比較危險的,因為它相當于這台伺服器的神,擁有着一切的權力,也就意味着很容把檔案系統搞壞,目前為學習使用,實際環境切記不要用root操作
建立一個使用者
sudo useradd -m kunkun指令可以建立一個使用者(-m參數表示把使用者的家目錄也建立出來),其中sudo的意思為switch user do(切換成root使用者幹活),如很多安裝程式的操作,都需要更高的權限才能操作,一般都會加sudo ,若目前使用者就是root加不加都一樣
su 使用者名則可以切換使用者,下面的操作為建立一個使用者【kunkun】,切換使用者并輸出目前使用者名
這裡跳到kunkun的家,并輸出家的路徑
- 在切換使用者後,輸入exit可以退出目前使用者
- 已是目前使用者輸入exit則退對外連結接
ls指令(list directory contents的縮寫)用來檢視目前工作路徑下的檔案
- -a參數表示顯示隐藏檔案
- -h參數表示以人類可讀的資訊形式展示,如檔案大小會轉成kb,mb等
- -l參數表示以長格式顯示
- -t參數表示按時間順序排列 可以看到列出了非常多資訊,随意選取一條來解釋
開頭的檔案類型以10個字元來表示
- 第一個字元為d表示directory檔案夾
- 為-表示這是一個檔案
- 為l表示這是一個軟連接配接(soft link類似windows系統的快捷方式)
後面9個字元是linux權限系統的基石,分别表示不同使用者對這個檔案的不同通路權限,解析如下
緊接着的數字19是硬連接配接節點,不怎麼用得上可以跳過
第一個root表示檔案所有者
第二個root表示所有者所在的組(User Group)
接着是檔案大小,檔案夾也是檔案,可以看成一個節點,大小是固定的4kb
接着是最後更改時間以及檔案名
檔案權限問題
若用root使用者建立了一個檔案,類型字元為-rwx------,此時使用者kunkun無法對這個檔案做任何操作 在Linux系統中判斷一個檔案是否可執行取決于x的值是否為1,目錄的x表示是否有權限檢視這個目錄裡的内容
touch filename可以建立一個檔案,這裡建立了一個test.java檔案(故意用java字尾是為了證明與檔案名無關),并檢視對應的權限,可以看到沒有可執行權限
chomd 777 test.java将檔案的權限更改成可執行,再次檢視所有x權限都有了,777表示給9個權限字元指派,一個數字對應3個字元,以二進制換算
777最終解析為rwx rwx rwx(421 421 421)
echo指令可以将内容輸出到标準輸出上,這裡用>>将要輸出的字元追加到目标檔案中,最後執行該檔案,切記要不可直接test.java這種檔案名形式回車,這種輸入會去環境變量中找對應的程式(後面會說環境變量),./test.java則是一個相對路徑
理論上需要加上shebang:#!/bin/sh指定解釋器,我沒有寫也能執行是因為執行時會預設采用目前Shell去解釋這個腳本,這裡涉及shell程式設計不過多解釋
寫檔案會用vim的話更佳,不是目标内容這裡不贅述
cat filename指令可以檢視檔案的内容
了解SSH
有時候,并不想要通過密碼的方式去管理伺服器,那麼可以采用密鑰對的方式。公鑰和私鑰一般是成對生成的,公鑰放在伺服器,私鑰放在任意用戶端上,用公鑰加密的資訊隻有私鑰才能解密
- 用戶端嘗試通路伺服器
- 伺服器傳回一串經過加密後的資訊給用戶端
- 用戶端通過私鑰解密後将資訊傳回給伺服器
- 伺服器發現用戶端能解密成功認為你認證成功,放行
linux生成密鑰對
ssh-keygen -t rsa,一般來說執行後一通回車接口 執行後預設會在家目錄下的.ssh目錄中生成私鑰和秘鑰資訊 pub為字尾的檔案就是公鑰(public)
這個操作應該在本地機子上操作或第二台伺服器上操作,這裡純示範是以在伺服器上運作了(伺服器也可以當成用戶端去連另一台伺服器),輸入指令後不想過多設定全部回車即可
檢視家目錄下的密鑰對
假設這裡的操作就是在本地運作的,那麼此時需要将公鑰放到伺服器上,需要做的操作就是将id_rsa.pub的檔案内容拷貝,在伺服器的~/.ssh/authorized_keys檔案中追加進去。此時再次執行ssh root@remoteIp就無需再輸入密碼即可登入伺服器
指令行的四要素:環境變量、可執行程式、工作路徑、參數
環境變量
黑視窗本質上是一個程序,與一組鍵值對綁定到一起,這些鍵值對稱為環境變量 export指令可以檢視目前程序的所有鍵值對,可以了解成是一個“Map集合”
export aaa=123執行後,環境變量裡就多這個aaa的key,value是123
這種操作隻會影響目前會話,不會持久化配置(斷開後再連結環境變量就沒有aaa這個key了),後續會講如何持久化,使用時需要使用$[key]的方式去引用
其次,fork子程序的話,會繼承父程序的所有環境變量,在子程序中覆寫不會影響父程序,現在操作的黑視窗實際上就是一個子程序,不然這些預設的環境變量哪來的呢
可執行程式(環境變量有關)
- 系統内置的,如ls,cd,echo等指令,which echo指令,可以檢視程式從哪裡來,下圖所示來自環境變量/usr/bin中
- 非内置的,如輸入java,mvn,node等等指令,都會去環境變量的PATH中去找,如果沒有找到,就會報錯command xxx not found
指令echo $PATH可以檢視目前環境變量PATH的值
linux下環境變量的預設分割符是冒号:,不同于windows的分号;。如輸入java按下回車後,作業系統在path定義的目錄下挨個去找是否有這個可執行程式,找到後就幫你運作,否則報錯
示範在Linux上安裝開發環境
以安裝Java的JDK為例子,提供一個可下載下傳的網站 Java I tell you-爪哇我話你知 (injdk.cn)
找到目标版本并複制其64位且字尾為tar.gz的下載下傳連結,意思是經過gzip壓縮後的tar檔案,而tar是linux系統下的打封包件,這種壓縮包可以稱為綠色版,解壓就能使用
- 安裝jdk8:wget https://d6.injdk.cn/oraclejdk/8/jdk-8u341-linux-x64.tar.gz
- 安裝jdk11:wget https://d6.injdk.cn/oraclejdk/11/jdk-11.0.16.1_linux-x64_bin.tar.gz
也可以在本地機器下載下傳後,通過任意方式丢到伺服器上,如scp指令 scp filename user@remoteIp:/targetPath
執行指令後等待下載下傳即可,下載下傳完成可以執行指令的工作路徑中找到壓縮包 tar xvf filename可以對tar.gz包進行解壓縮,下載下傳并且解壓後應該能得到下圖中四個檔案
以JAVA8為例子,輸入全路徑./jdk1.8.0_341/bin/java -version來執行JAVA指令
說明目前JDK是可以使用的,但顯然非常不友善。想要像ls那樣任何路徑下輸入java就可執行,就需要把java所在的目錄加到環境變量當中
export PATH=$PATH:/root/jdk1.8.0_341/bin這段指令表示覆寫PATH的值,執行順序是先右再左,是以可以先用$PATH來擷取舊的值,加上分号拼接上需要添加的路徑,這種方式的好處是完全不用管舊址(當然手動補全也行)。添加後就可以使用java執行指令,而不需要全路徑了
如果你用的是brew,yum,rmp,apt等指令安裝的Java,不配環境變量也能直接使用,那必然是有程式幫你做了這一步!
alisa(别名)和ls(軟連接配接)
此處環境接着上文,給一段指令定義一個别名,還是以java為例,現在想通過輸入kunkun8來執行,那麼隻需要alias kunkun8=java,後面就可以用kunkun8來代替了
建立軟連接配接
建立一個軟連接配接的格式為ln -s 目标檔案 指向快捷方式,現在要建立一個名為zhiyin8的軟連接配接: 執行ln -s /root/jdk1.8.0_341/bin/java zhiyin8後,會在目前路徑生成一個軟連接配接,檢視檔案資訊可以看到檔案類型描述符第一個字元為l
此時直接輸入zhiyin8還不能用,因為PATH環境變量裡沒有這玩意,要麼将目前目錄也丢到PATH裡,要麼将軟連接配接移動到已添加到PATH到目錄中 mv zhiyin8 /usr/local/bin 此時還不行,要麼将軟連接配接移動到path中存在的目錄當中,要麼将軟連接配接所在的檔案夾加到環境變量當中,示範為移動檔案,此時zhiyin8就可以直接使用了
參數 arguments
參數以空格分開,會傳給執行程式,如何解析取決于程式,以剛剛建立軟連接配接的指令來看ln -s /root/jdk1.8.0_341/bin/java zhiyin8,ln是一個可執行程式,後面-s /root/jdk1.8.0_341/bin/java zhiyin8這部分都屬于參數
- 看到的參數不等于實際傳遞的參數,這條指令ls *,看似把星号傳遞給指令,實際上會被執行一個行為【指令行展開】,也就是傳遞進去的并不是*這個符号 想真多傳入一個星号需要用單引号包裹'*',此時就會去找一個名為*的檔案,下圖中報錯是因為确實沒有這個檔案,是河裡的 環境變量替換,echo $HOME 實際收到的參數是echo ~/root,如果确實想傳$HOME就用一樣的方式,單引号包裹
配置如何持久化
上面的所有操作,都是在目前會話有效,如果想要持久化就需要提供一個配置檔案,sshd服務就會去讀取這個檔案傳回一個會話
檔案名為.bashrc或.bash_prifile都可以,都能被識别,且這個檔案可以全局配置或針對使用者配置,使用者配置需要放到使用者的家目錄下
先自exit退出或者關掉黑視窗再連接配接
我在家目錄下建立了一個.bashrc檔案,檔案内容寫了一個别名為java8
此時還不能用,除非你關掉再連結,讓sshd去讀一次,更改這個配置檔案想在目前回話立即生效,可以使用. ~/.bashrc或者source ~/.bashrc,二者等價,相當于讓程式執行了一次配置,此時就可以使用别名java8了
工作路徑
很多時候工作路徑是用來計算相對路徑的,像cd指令就是用來改變工作路徑的
像在JAVA程式中,使用new File這個動作找檔案,就會在執行JVM的工作路徑中工作
基于這些概念和操作,就可以愉快的開始linux之旅了