Linux操作系統與命令行

語言: CN / TW / HK

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{} - 其他系統派生系統同理...

什麼是命令

先看兩個單詞kernelshell - kernel是指內核,如水果的核,而Linux內核則是常説的負責合計算機硬件交互調度的核心 - shell則是殼,負責和內核打交道

廣義的命令行包括一切通過字符終端控制計算機的方式 - windowscmd、powerShell、git bash - unix/linuxsh、zsh、Terminal、iterm2

sh就是shell的簡稱,都是普通的程序,只是可以和計算機交互,為什麼要殼的原因是,沒有辦法直接和內核打交道,如下圖所示

image.png

開始之前需要準備一台安裝了Linux操作系統的主機

  • 可以在各大雲主機廠商購買(阿里雲,騰訊雲等)
  • 通過虛擬機安裝鏡像

開始Linux之旅

  • 通過一個終端鏈接Linux主機,主機本身在哪裏並不重要,如我在阿里雲購買了一台雲服務器,我只需要在任意電腦上通過Shell即可鏈接上這台服務器
  • 連接主機使用命令
    • 密碼訪問,顧名思義
    • SSH key pairSSH全稱是Secure Shell,更加安全加密的Shell

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

登陸後輸入whoami可以查看當前用户

image.png 每個用户都有其自己的Home目錄,登陸後當前工作路徑默認就是這裏,也可以使用cd ~命令更改當前工作路徑到當前用户的家目錄

pwd命令(print working directory)可以查看當前工作路徑 image.png

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

新建一個用户

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

su 用户名則可以切換用户,下面的操作為創建一個用户【kunkun】,切換用户並輸出當前用户名 image.png 這裏跳到kunkun的家,並輸出家的路徑 image.png

  • 在切換用户後,輸入exit可以退出當前用户
  • 已是當前用户輸入exit則退出鏈接

ls命令(list directory contents的縮寫)用來查看當前工作路徑下的文件 - -a參數表示顯示隱藏文件 - -h參數表示以人類可讀的信息形式展示,如文件大小會轉成kb,mb等 - -l參數表示以長格式顯示 - -t參數表示按時間順序排列 image.png 可以看到列出了非常多信息,隨意選取一條來解釋

image.png 開頭的文件類型以10個字符來表示 - 第一個字符為d表示directory文件夾 - 為-表示這是一個文件 - 為l表示這是一個軟連接(soft link類似windows系統的快捷方式)

後面9個字符是linux權限系統的基石,分別表示不同用户對這個文件的不同訪問權限,解析如下 image.png

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

第一個root表示文件所有者

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

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

接着是最後更改時間以及文件名

文件權限問題

若用root用户創建了一個文件,類型字符為-rwx------,此時用户kunkun無法對這個文件做任何操作 在Linux系統中判斷一個文件是否可執行取決於x的值是否為1,目錄的x表示是否有權限查看這個目錄裏的內容

touch filename可以創建一個文件,這裏創建了一個test.java文件(故意用java後綴是為了證明與文件名無關),並查看對應的權限,可以看到沒有可執行權限 image.png chomd 777 test.java將文件的權限更改成可執行,再次查看所有x權限都有了,777表示給9個權限字符賦值,一個數字對應3個字符,以二進制換算

777最終解析為rwx rwx rwx(421 421 421) image.png

echo命令可以將內容輸出到標準輸出上,這裏用>>將要輸出的字符追加到目標文件中,最後執行該文件,切記要不可直接test.java這種文件名形式回車,這種輸入會去環境變量中找對應的程序(後面會説環境變量),./test.java則是一個相對路徑 image.png 理論上需要加上shebang:#!/bin/sh指定解釋器,我沒有寫也能執行是因為執行時會默認採用當前Shell去解釋這個腳本,這裏涉及shell編程不過多解釋

寫文件會用vim的話更佳,不是目標內容這裏不贅述

cat filename命令可以查看文件的內容

image.png

理解SSH

有時候,並不想要通過密碼的方式去管理服務器,那麼可以採用密鑰對的方式。公鑰和私鑰一般是成對生成的,公鑰放在服務器,私鑰放在任意客户端上,用公鑰加密的信息只有私鑰才能解密 1. 客户端嘗試訪問服務器 2. 服務器返回一串經過加密後的信息給客户端 3. 客户端通過私鑰解密後將信息返回給服務器 4. 服務器發現客户端能解密成功認為你認證成功,放行

linux生成密鑰對

ssh-keygen -t rsa,一般來説執行後一通回車接口 執行後默認會在家目錄下的.ssh目錄中生成私鑰和祕鑰信息 pub為後綴的文件就是公鑰(public)

這個操作應該在本地機子上操作或第二台服務器上操作,這裏純演示所以在服務器上運行了(服務器也可以當成客户端去連另一台服務器),輸入命令後不想過多設置全部回車即可 image.png 查看家目錄下的密鑰對 image.png 假設這裏的操作就是在本地運行的,那麼此時需要將公鑰放到服務器上,需要做的操作就是將id_rsa.pub的文件內容拷貝,在服務器的~/.ssh/authorized_keys文件中追加進去。此時再次執行ssh root@remoteIp就無需再輸入密碼即可登錄服務器

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

環境變量

黑窗口本質上是一個進程,與一組鍵值對綁定到一起,這些鍵值對稱為環境變量 export命令可以查看當前進程的所有鍵值對,可以理解成是一個“Map集合”

export aaa=123執行後,環境變量裏就多這個aaakeyvalue123
這種操作只會影響當前會話,不會持久化配置(斷開後再鏈接環境變量就沒有aaa這個key了),後續會講如何持久化,使用時需要使用$[key]的方式去引用

image.png

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

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

  1. 系統內置的,如ls,cd,echo等命令,which echo命令,可以查看程序從哪裏來,下圖所示來自環境變量/usr/binimage.png
  2. 非內置的,如輸入java,mvn,node等等命令,都會去環境變量的PATH中去找,如果沒有找到,就會報錯command xxx not found

命令echo $PATH可以查看當前環境變量PATH的值 image.png linux下環境變量的默認分割符是冒號,不同於windows的分號;。如輸入java按下回車後,操作系統在path定義的目錄下挨個去找是否有這個可執行程序,找到後就幫你運行,否則報錯

演示在Linux上安裝開發環境

以安裝JavaJDK為例子,提供一個可下載的網站 Java I tell you-爪哇我話你知 (injdk.cn)
找到目標版本並複製其64位且後綴為tar.gz的下載鏈接,意思是經過gzip壓縮後的tar文件,而tarlinux系統下的打包文件,這種壓縮包可以稱為綠色版,解壓就能使用 image.png

  • 安裝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包進行解壓縮,下載並且解壓後應該能得到下圖中四個文件 image.pngJAVA8為例子,輸入全路徑./jdk1.8.0_341/bin/java -version來執行JAVA命令 image.png 説明當前JDK是可以使用的,但顯然非常不方便。想要像ls那樣任何路徑下輸入java就可執行,就需要把java所在的目錄加到環境變量當中
export PATH=$PATH:/root/jdk1.8.0_341/bin這段命令表示覆寫PATH的值,執行順序是先右再左,所以可以先用$PATH來獲取舊的值,加上分號拼接上需要添加的路徑,這種方式的好處是完全不用管舊址(當然手動補全也行)。添加後就可以使用java執行命令,而不需要全路徑了 image.png 如果你用的是brew,yum,rmp,apt等命令安裝的Java,不配環境變量也能直接使用,那必然是有程序幫你做了這一步!

alisa(別名)和ls(軟連接)

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

創建軟連接

創建一個軟連接的格式為ln -s 目標文件 指向快捷方式,現在要創建一個名為zhiyin8的軟連接: 執行ln -s /root/jdk1.8.0_341/bin/java zhiyin8後,會在當前路徑生成一個軟連接,查看文件信息可以看到文件類型描述符第一個字符為l image.png 此時直接輸入zhiyin8還不能用,因為PATH環境變量裏沒有這玩意,要麼將當前目錄也丟到PATH裏,要麼將軟連接移動到已添加到PATH到目錄中 mv zhiyin8 /usr/local/bin 此時還不行,要麼將軟連接移動到path中存在的目錄當中,要麼將軟連接所在的文件夾加到環境變量當中,演示為移動文件,此時zhiyin8就可以直接使用了 image.png

參數 arguments

參數以空格分開,會傳給執行程序,如何解析取決於程序,以剛剛創建軟連接的命令來看ln -s /root/jdk1.8.0_341/bin/java zhiyin8ln是一個可執行程序,後面-s /root/jdk1.8.0_341/bin/java zhiyin8這部分都屬於參數 1. 看到的參數不等於實際傳遞的參數,這條命令ls *,看似把星號傳遞給命令,實際上會被執行一個行為【命令行展開】,也就是傳遞進去的並不是*這個符號 image.png 想真多傳入一個星號需要用單引號包裹'*',此時就會去找一個名為*的文件,下圖中報錯是因為確實沒有這個文件,是河裏的 image.png 環境變量替換,echo $HOME 實際收到的參數是echo ~/root,如果確實想傳$HOME就用一樣的方式,單引號包裹

配置如何持久化

上面的所有操作,都是在當前會話有效,如果想要持久化就需要提供一個配置文件,sshd服務就會去讀取這個文件返回一個會話
文件名為.bashrc.bash_prifile都可以,都能被識別,且這個文件可以全局配置或針對用户配置,用户配置需要放到用户的家目錄下

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

我在家目錄下新建了一個.bashrc文件,文件內容寫了一個別名為java8 image.png 此時還不能用,除非你關掉再鏈接,讓sshd去讀一次,更改這個配置文件想在當前回話立即生效,可以使用. ~/.bashrc或者source ~/.bashrc,二者等價,相當於讓程序執行了一次配置,此時就可以使用別名java8image.png

工作路徑

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

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

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

完:)