天天看點

Linux作業系統與指令行

作者:Java解白

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之旅

  • 通過一個終端連結Linux主機,主機本身在哪裡并不重要,如我在阿裡雲購買了一台雲伺服器,我隻需要在任意電腦上通過Shell即可連結上這台伺服器
  • 連接配接主機使用指令 密碼通路,顧名思義 SSH key pair,SSH全稱是Secure Shell,更加安全加密的Shell

通過ssh root@remoteIp,表明以root使用者進行登陸,即可通路伺服器。有密碼時會要求輸入密碼,一般情況下,在linux系統下輸入密碼是沒有回顯的

登陸後輸入whoami可以檢視目前使用者

Linux作業系統與指令行

每個使用者都有其自己的Home目錄,登陸後目前工作路徑預設就是這裡,也可以使用cd ~指令更改目前工作路徑到目前使用者的家目錄

pwd指令(print working directory)可以檢視目前工作路徑

Linux作業系統與指令行

一般來說操作root是比較危險的,因為它相當于這台伺服器的神,擁有着一切的權力,也就意味着很容把檔案系統搞壞,目前為學習使用,實際環境切記不要用root操作

建立一個使用者

sudo useradd -m kunkun指令可以建立一個使用者(-m參數表示把使用者的家目錄也建立出來),其中sudo的意思為switch user do(切換成root使用者幹活),如很多安裝程式的操作,都需要更高的權限才能操作,一般都會加sudo ,若目前使用者就是root加不加都一樣

su 使用者名則可以切換使用者,下面的操作為建立一個使用者【kunkun】,切換使用者并輸出目前使用者名

Linux作業系統與指令行

這裡跳到kunkun的家,并輸出家的路徑

Linux作業系統與指令行
  • 在切換使用者後,輸入exit可以退出目前使用者
  • 已是目前使用者輸入exit則退對外連結接

ls指令(list directory contents的縮寫)用來檢視目前工作路徑下的檔案

  • -a參數表示顯示隐藏檔案
  • -h參數表示以人類可讀的資訊形式展示,如檔案大小會轉成kb,mb等
  • -l參數表示以長格式顯示
  • -t參數表示按時間順序排列 可以看到列出了非常多資訊,随意選取一條來解釋
Linux作業系統與指令行

開頭的檔案類型以10個字元來表示

  • 第一個字元為d表示directory檔案夾
  • 為-表示這是一個檔案
  • 為l表示這是一個軟連接配接(soft link類似windows系統的快捷方式)

後面9個字元是linux權限系統的基石,分别表示不同使用者對這個檔案的不同通路權限,解析如下

Linux作業系統與指令行

緊接着的數字19是硬連接配接節點,不怎麼用得上可以跳過

第一個root表示檔案所有者

第二個root表示所有者所在的組(User Group)

接着是檔案大小,檔案夾也是檔案,可以看成一個節點,大小是固定的4kb

接着是最後更改時間以及檔案名

檔案權限問題

若用root使用者建立了一個檔案,類型字元為-rwx------,此時使用者kunkun無法對這個檔案做任何操作 在Linux系統中判斷一個檔案是否可執行取決于x的值是否為1,目錄的x表示是否有權限檢視這個目錄裡的内容

touch filename可以建立一個檔案,這裡建立了一個test.java檔案(故意用java字尾是為了證明與檔案名無關),并檢視對應的權限,可以看到沒有可執行權限

Linux作業系統與指令行

chomd 777 test.java将檔案的權限更改成可執行,再次檢視所有x權限都有了,777表示給9個權限字元指派,一個數字對應3個字元,以二進制換算

777最終解析為rwx rwx rwx(421 421 421)

Linux作業系統與指令行

echo指令可以将内容輸出到标準輸出上,這裡用>>将要輸出的字元追加到目标檔案中,最後執行該檔案,切記要不可直接test.java這種檔案名形式回車,這種輸入會去環境變量中找對應的程式(後面會說環境變量),./test.java則是一個相對路徑

Linux作業系統與指令行

理論上需要加上shebang:#!/bin/sh指定解釋器,我沒有寫也能執行是因為執行時會預設采用目前Shell去解釋這個腳本,這裡涉及shell程式設計不過多解釋

寫檔案會用vim的話更佳,不是目标内容這裡不贅述

cat filename指令可以檢視檔案的内容

Linux作業系統與指令行

了解SSH

有時候,并不想要通過密碼的方式去管理伺服器,那麼可以采用密鑰對的方式。公鑰和私鑰一般是成對生成的,公鑰放在伺服器,私鑰放在任意用戶端上,用公鑰加密的資訊隻有私鑰才能解密

  1. 用戶端嘗試通路伺服器
  2. 伺服器傳回一串經過加密後的資訊給用戶端
  3. 用戶端通過私鑰解密後将資訊傳回給伺服器
  4. 伺服器發現用戶端能解密成功認為你認證成功,放行

linux生成密鑰對

ssh-keygen -t rsa,一般來說執行後一通回車接口 執行後預設會在家目錄下的.ssh目錄中生成私鑰和秘鑰資訊 pub為字尾的檔案就是公鑰(public)

這個操作應該在本地機子上操作或第二台伺服器上操作,這裡純示範是以在伺服器上運作了(伺服器也可以當成用戶端去連另一台伺服器),輸入指令後不想過多設定全部回車即可

Linux作業系統與指令行

檢視家目錄下的密鑰對

Linux作業系統與指令行

假設這裡的操作就是在本地運作的,那麼此時需要将公鑰放到伺服器上,需要做的操作就是将id_rsa.pub的檔案内容拷貝,在伺服器的~/.ssh/authorized_keys檔案中追加進去。此時再次執行ssh root@remoteIp就無需再輸入密碼即可登入伺服器

指令行的四要素:環境變量、可執行程式、工作路徑、參數

環境變量

黑視窗本質上是一個程序,與一組鍵值對綁定到一起,這些鍵值對稱為環境變量 export指令可以檢視目前程序的所有鍵值對,可以了解成是一個“Map集合”

export aaa=123執行後,環境變量裡就多這個aaa的key,value是123

這種操作隻會影響目前會話,不會持久化配置(斷開後再連結環境變量就沒有aaa這個key了),後續會講如何持久化,使用時需要使用$[key]的方式去引用

Linux作業系統與指令行

其次,fork子程序的話,會繼承父程序的所有環境變量,在子程序中覆寫不會影響父程序,現在操作的黑視窗實際上就是一個子程序,不然這些預設的環境變量哪來的呢

可執行程式(環境變量有關)

  1. 系統内置的,如ls,cd,echo等指令,which echo指令,可以檢視程式從哪裡來,下圖所示來自環境變量/usr/bin中
  2. 非内置的,如輸入java,mvn,node等等指令,都會去環境變量的PATH中去找,如果沒有找到,就會報錯command xxx not found

指令echo $PATH可以檢視目前環境變量PATH的值

Linux作業系統與指令行

linux下環境變量的預設分割符是冒号:,不同于windows的分号;。如輸入java按下回車後,作業系統在path定義的目錄下挨個去找是否有這個可執行程式,找到後就幫你運作,否則報錯

示範在Linux上安裝開發環境

以安裝Java的JDK為例子,提供一個可下載下傳的網站 Java I tell you-爪哇我話你知 (injdk.cn)

找到目标版本并複制其64位且字尾為tar.gz的下載下傳連結,意思是經過gzip壓縮後的tar檔案,而tar是linux系統下的打封包件,這種壓縮包可以稱為綠色版,解壓就能使用

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包進行解壓縮,下載下傳并且解壓後應該能得到下圖中四個檔案

Linux作業系統與指令行

以JAVA8為例子,輸入全路徑./jdk1.8.0_341/bin/java -version來執行JAVA指令

Linux作業系統與指令行

說明目前JDK是可以使用的,但顯然非常不友善。想要像ls那樣任何路徑下輸入java就可執行,就需要把java所在的目錄加到環境變量當中

export PATH=$PATH:/root/jdk1.8.0_341/bin這段指令表示覆寫PATH的值,執行順序是先右再左,是以可以先用$PATH來擷取舊的值,加上分号拼接上需要添加的路徑,這種方式的好處是完全不用管舊址(當然手動補全也行)。添加後就可以使用java執行指令,而不需要全路徑了

Linux作業系統與指令行

如果你用的是brew,yum,rmp,apt等指令安裝的Java,不配環境變量也能直接使用,那必然是有程式幫你做了這一步!

alisa(别名)和ls(軟連接配接)

此處環境接着上文,給一段指令定義一個别名,還是以java為例,現在想通過輸入kunkun8來執行,那麼隻需要alias kunkun8=java,後面就可以用kunkun8來代替了

Linux作業系統與指令行

建立軟連接配接

建立一個軟連接配接的格式為ln -s 目标檔案 指向快捷方式,現在要建立一個名為zhiyin8的軟連接配接: 執行ln -s /root/jdk1.8.0_341/bin/java zhiyin8後,會在目前路徑生成一個軟連接配接,檢視檔案資訊可以看到檔案類型描述符第一個字元為l

Linux作業系統與指令行

此時直接輸入zhiyin8還不能用,因為PATH環境變量裡沒有這玩意,要麼将目前目錄也丢到PATH裡,要麼将軟連接配接移動到已添加到PATH到目錄中 mv zhiyin8 /usr/local/bin 此時還不行,要麼将軟連接配接移動到path中存在的目錄當中,要麼将軟連接配接所在的檔案夾加到環境變量當中,示範為移動檔案,此時zhiyin8就可以直接使用了

Linux作業系統與指令行

參數 arguments

參數以空格分開,會傳給執行程式,如何解析取決于程式,以剛剛建立軟連接配接的指令來看ln -s /root/jdk1.8.0_341/bin/java zhiyin8,ln是一個可執行程式,後面-s /root/jdk1.8.0_341/bin/java zhiyin8這部分都屬于參數

  1. 看到的參數不等于實際傳遞的參數,這條指令ls *,看似把星号傳遞給指令,實際上會被執行一個行為【指令行展開】,也就是傳遞進去的并不是*這個符号 想真多傳入一個星号需要用單引号包裹'*',此時就會去找一個名為*的檔案,下圖中報錯是因為确實沒有這個檔案,是河裡的 環境變量替換,echo $HOME 實際收到的參數是echo ~/root,如果确實想傳$HOME就用一樣的方式,單引号包裹

配置如何持久化

上面的所有操作,都是在目前會話有效,如果想要持久化就需要提供一個配置檔案,sshd服務就會去讀取這個檔案傳回一個會話

檔案名為.bashrc或.bash_prifile都可以,都能被識别,且這個檔案可以全局配置或針對使用者配置,使用者配置需要放到使用者的家目錄下

先自exit退出或者關掉黑視窗再連接配接

我在家目錄下建立了一個.bashrc檔案,檔案内容寫了一個别名為java8

Linux作業系統與指令行

此時還不能用,除非你關掉再連結,讓sshd去讀一次,更改這個配置檔案想在目前回話立即生效,可以使用. ~/.bashrc或者source ~/.bashrc,二者等價,相當于讓程式執行了一次配置,此時就可以使用别名java8了

Linux作業系統與指令行

工作路徑

很多時候工作路徑是用來計算相對路徑的,像cd指令就是用來改變工作路徑的

像在JAVA程式中,使用new File這個動作找檔案,就會在執行JVM的工作路徑中工作

基于這些概念和操作,就可以愉快的開始linux之旅了

繼續閱讀