## 介紹 linux distribution: centos ubuntu red hat dedora suse ... kernel(相同的內核) + 不同的應用程式 + 外觀 = 造就不同的版本 ![image](https://hackmd.io/_uploads/SyQNBif7ex.png) red hat/fedora/centos suse/ubuntu/debian 兩個不同派系 在安裝軟體時: centos : yum ubuntu : apt-get, apt 在其他指令基本類似 在linux環境下 ubuntu/devian series軟體名稱通常是 .db結尾 redhat/centos/fedora 通常是 .rpm LTS: long term support較為穩定 在vm上設置hard disk storage: dynamically allocated :在vm上耗堆少容量,host就多少 fixed size : 設置50G,host上就是50G dynamically allocated較為節省空間,但以效能而言fixed size較好 hd分割partition prime -> extended -> logic linux至少佔用2個partition: /root、 /swap ![image](https://hackmd.io/_uploads/rJJPujMmgg.png) linux最高管理者: root, window : administrator host上有網卡,在vm上也有,如果vm用NAT設定,可以讓vm的網卡連到host的網卡上,讓vm可以連上internet,前提是host看不到vm,像是有牆保護vm,讓host與vm無法相互看見 網卡設置host only,可以與host通訊,不能進行上網 在virtual box需要用上述兩網卡設定,但vmware不用,只需要NAT可以同時上網與host通訊 要怎麼確定host-only網卡可以與window連線,在window cmd去ping host-only ip 基礎指令1 --- ``` sudo apt install net-tools ``` 在安裝軟體時,一般使用者沒有安裝的權利 sudo:這個指令把使用者暫時變為管理者 apt:是ubuntu安裝軟體的命令, apt可以做升級 安裝 移除 apt "update install remove" install:是動作 net-tools:是軟體套件 ``` ifconfig ``` 新版預設使用 ip address show (縮寫 ip a s) ifconfig查看網路設定,在window上用ipconfig ![image](https://hackmd.io/_uploads/rk57YsMmlg.png) lo: lookback, virtual 介面, ens33 介面卡 ``` sudo poweroff ``` 關機 ![image](https://hackmd.io/_uploads/H1yYYiMmex.png) rollback 回滾到先前的snapshot ``` sudo kill -9 "process_id" ``` -9: 強制執行 force delete the process ``` cd ``` cd: change directory :::info ex: cd 回到根目錄 cd ~ 回到根目錄 cd .. 回到前一目錄 cd Desktop/ 切換至桌面 ::: ``` touch ``` touch: 產生空白file :::info ex. touch aaa 產生名為aaa的空白檔案 ::: ``` > ``` > : direct導引,可以導到其它file :::info ex. >bbb 到bbb的file把檔案清空,但如果沒有bbb的檔案,會打開bbb,再把檔案清空 ::: ``` echo ``` echo: 輸出一個輸入的內容,預設在terminal :::info ex. echo hello 在terminal輸出 echo hello > ccc 到ccc的檔案輸出hello ::: stdin 標準輸入 (0)預設為keyboard stdout 標準輸出 (1)預設為terminal stderr 標準錯誤輸出 (2)預設為monitor ``` su ``` su: 從一般user切換成root 一般使用者的提示符為$,root為# ``` sudo halt -p ``` 關機 halt: 停止 p: pause 匯出 --- virtual box export file的格式為 .ova(open virtualization format archive)ova檔可以跨平台到vmware vmware export file的format為.ovf,但vmware在export時候會export三個檔案 網卡設置 --- Bridge: ![image](https://hackmd.io/_uploads/rJ2rCif7le.png) bridge是把vm曝光在internet上,host、vm是對等的,兩台獨立的存在 如果vm的firewall沒有做好,不建議用bridge 優點:適合架伺服器 缺點:安全性差 NAT(Network Address Translation): ![image](https://hackmd.io/_uploads/SJ2T0szmel.png) ![image](https://hackmd.io/_uploads/H1myyhfQxl.png) Host-only: ![image](https://hackmd.io/_uploads/HJX-J2M7gl.png) host <-> vm 不能連internet LAN segment:建立出不同網路,需使用LAN segment ![image](https://hackmd.io/_uploads/S1q4yhG7gg.png) clone --- Full clone:複製原本vm,以檔案copy的方式,在新得HD上建立(效能較好) Linked clone:複製原本的vm,但只有執行write的檔案修正,才會在HD產生新的data(節省空間,效能較差) 基礎指令2 --- ``` ping "ip_addr" -c "num" ``` 在linux沒有設定ping的次數會一直ping, -c後面接ping的次數 如果沒有設定次數想要暫停可以按 ctrl-c ``` sudo hostnamectl set-hostname "要更改得主機名稱 ``` 更改主機名稱,輸入完沒有變更名稱,輸入bash ``` clear ``` 清空screen linux在執行止另有分為前景、背景 ``` firefox & ``` &是在背景運作,讓其它指令可以在前景執行 ![image](https://hackmd.io/_uploads/SkLUzhM7gx.png) ``` netstat -tu森| grep ssh ``` netstat: 查看網路連線狀態 tunlp: t: TCP u: UDP n: not resolve不解析 l: Listen 觀測這台device想要聆聽什麼,等待別人的連線,像是linux伺服器的應用,當client端就不會用 p: process id區分不同process用id區分 | : pipe管道 將前面執行完結果輸出,需要standard output才能使用pipe :::info ex. echo "qwert" | passwd --stdin rusky 原本passwd無法使用|讀取,但加上 --stdin才能 ::: program: 一個軟體,用檔案呈現在系統(靜態),執行一次產生一個process process:被系統載入到ram,也稱為running program(動態) netstat後面只得是要提供那些資訊該啟那些功能 grep: 塞選出keyword (後面的ssh) ![image](https://hackmd.io/_uploads/rJv4EhMQel.png) 在linux 0.0.0.0表示任一介面(有限無線特殊介面)可以服務 tcp表ipv4 tcp6表ipv6介面 當沒打上 n (not resolve), port變為 ssh 如果只打netstat出現非常多連線與那些程式連結, stream->TCp、DGram->UDP 但加上-tun會少掉非常多只剩下伺服器連線 ``` ls ``` ls: list ![image](https://hackmd.io/_uploads/SkqQS3zmxx.png) ``` cat ``` 查看檔案內容 ``` scp "file_source" "目的端":/"destination" ``` 檔案傳送,檔案來源為以建立file_name 目的端ex. user@1922.168.0.1:/tmp /tmp 每個人都有在/tmp讀寫的權限 ``` scp 目的端 :/存放位置/檔案名稱 . ``` 從server端複製檔案到當前路徑 如果要複製整個資料夾,可以加上 -r代表recursive一個一個去傳 ![image](https://hackmd.io/_uploads/Hk24D3Gmlx.png) ssh --- 讓vm1連到vm2 安裝ssh ``` apt install openssh-server ``` 連線前要先確保伺服器是否正常運行,使用 systemctl ``` systemctl status sshd ``` status、start、stop、reload...restart sshd: ssh得伺服器, d指的是daemon 按Q可以結束查看 ``` ssh user@"VM2_ip_addr" ``` ssh是使3用TCP連線,port number is 22,ssh與telnet的區別是有加密,所以要互換金鑰 ![image](https://hackmd.io/_uploads/S1gwbhGmxl.png) 連線ssh 1. 確認ssh daemon有沒有正常運行,有的話執行ssh 2. 確認ssh daemon在哪個port運行 3. 看系統確認firewall rule是否開啟,入前的ubuntu妹有firewall rule,不用確認,但在其他系統如centos就需要 通佩符 --- *可以代表匹配任意字元 (0~多個) :::info ex. a* 可以匹配a,a1,a11,只要是a開頭就會匹配到 *b 表示b結尾的 *表示任一file ::: []表choose :::info ex. a[ac] -> aa,ac [a-zA-Z1-9] -> aa...az,aA...aZ,a1...a9 a[a-z] -> aa...az [[:upper:]] 匹配大寫 [[:lower:]] 匹配小寫 ::: ``` uname ``` 加上-a/-r 等參數 ![image](https://hackmd.io/_uploads/By75Ohz7eg.png) directory tree --- Linux的檔案結構為directory tree ![image](https://hackmd.io/_uploads/r1Xythzmxg.png) .ssh / .a.txt 為隱藏檔案目錄 如果要用ls查看 要加上-a 用ls -l會有10bit - --- --- --- -(-/d) -是file d是directory ---(RWD)為owner ---(RWD)group ---(RWD)為other ``` chmod 600 ``` 用二進制表示 rw- 提到的directory /etc 系統配置檔核伺服器配置檔 /var 可變動directory ex.網路伺服器家目錄 /var/www/html或是log檔(記錄檔) /boot 開機鏡像檔核開機配置 /dev (device)系統device ex. keyboard,mouse,hd /mnt (mount)掛載,別台設備分享資料夾,透過/mnt動作 ![image](https://hackmd.io/_uploads/H1Vqc2GXll.png) 創建帳號 --- ``` useradd "user_name" ``` 創建新的user,但是需要調整參數 adduser "user_name"可以讓系統幫你設定參數 ``` passwd "user_name" ``` 更改密碼 ``` userdel "user_name" ``` 刪除user 如果是root透過 su "username"去切換不同使用者 ``` whoami ``` 告訴目前使用者名稱 whoami的用途為linux腳本使用,因為腳本無法得知目前使用者身份,所以whoami是一個方便功能,並不是每個使用者都能使用sudo,除非加入sudoer list 基礎指令3 --- ``` free ``` 顯示系統的記憶體核swap交換內存使用狀態 ![image](https://hackmd.io/_uploads/S1pWhhzQle.png) 對資料夾而言 r代表可以查看資料夾內部file x代表是否可以進入資料夾 w代表是否在資料夾新增修改刪除檔案 ``` stat "file_name" ``` 顯示3種不同時間 Access 只要讀過時間就會改變 Modify 修改時間 Change 改變屬性 or檔案有變 ``` ls -sS ``` s:顯示檔案大小 S:佔用大小來排序 如果要建立同名directory會發生錯誤 ``` mkdir -p "directory_name" ``` -p這個動作如果有相同名稱就不會建立 ``` rmdir "dir_name" ``` 刪除空白資料夾 如果不為空只能使用 rm -rf ``` cp "file_path" "des_path" ``` 複製檔案到指定路徑 重複之前的指令先用history查在第幾行,再用!,即可執行 ![image](https://hackmd.io/_uploads/Byl3ThGQxl.png) -v (verbose)列出詳細內容,-v可以很多個 -v、-vv、-vvv 如果要刪除檔案,謹慎一點加上 -i 會詢問一遍 rm有些系統預設rm -f有些是rm -i 用樹狀結構列出整個結構 apt install tree ``` tree ``` 顯示樹狀結構路徑 ![image](https://hackmd.io/_uploads/HywsETf7el.png) ``` alias ``` 別名 :::info ex. alias rm='rm -i' 之後打rm就會變成rm -i 但用\就可以恢復原指令 \rm ::: 用alias只能在目前視窗生效 如果要每個視窗同時用alias 要在 .bashrc編輯 ![image](https://hackmd.io/_uploads/B1ZwBTGXge.png) ``` | more | less ``` more只能向下 less 可以往上往下 一頁一頁顯示 more也可以用來看檔案,但比較常用cat > director導向 會把檔案清空再加上 >> append附加 不會覆蓋,只會附加 ![image](https://hackmd.io/_uploads/BJ-V8azXxx.png) ``` pwd ``` pwd: print working directory 顯示目前所在路徑 也可以用echo $PWD 系統呼叫環境變數 locate --- apt install plocate ``` sudo updatedb locate "file_name" ``` locate會放在database,用locate之簽需要更新database find "directory" -name "file_name" -print 在disk裡尋找,可以找directory/file,甚至找檔案大小,缺點指令很長 find後面可以接-exec來執行找到的檔案執行指令 find . -name "file_name" -exec rm {}\; find -name "file_name" -type f -type後免可接f,d,c,b,l c字元 b區塊 l連結 用echo $? 來判斷前面指令是否執行過程錯誤,錯誤為非0值 ![image](https://hackmd.io/_uploads/B167YaMmee.png) ``` file "file_name ``` 來判斷檔案類型 ![image](https://hackmd.io/_uploads/BJdLY6MQgx.png) 找檔案有3種方式 1. locate database 2. find 到path去找 3. which 只能找執行檔 SUID/SGID/SBIT --- 對/usr/bin/passwd一般使用ls -l顯示出 rws rwx rwx為SUID SUID氏為了讓一般user變更passwd,暫時擁有root權限,去更改密碼 chmod 4777為SUID SGID -> /usr/bin/plocate chmod 2777 SBIT ex. /tmp chmod 1777 有設定sticky bit的directory是一個特別的directory,任何人可以創建file,但只有root可以delete其它使用者的fire shell --- ubuntu使用bash shell, 有多種不同類型的shell ![image](https://hackmd.io/_uploads/Bywy5TfXlx.png) shell會有提示符號 一般user: $ root: # ``` echo $SHELL ``` 可以查看預設的shell type ![image](https://hackmd.io/_uploads/rydE9TGmge.png) 用{}可以辨識環境變數,如果後面有接東西的話 ![image](https://hackmd.io/_uploads/S1l_5afXxx.png) 切換shell 直接打shell的名稱: tcsh,sh... 或者用 chsh ...在輸入shell的位置 chsh -s /usr/sbin/nologin "user_name" 讓使用者無法登入 bg and fg --- background執行要在後免加上& jobs查看bg有什麼在執行 fg 把指令從背景移到前景 bg 把指令從前景移到背景 ctrl-c 終止當前指令 (finish) ctrl-z 中斷當前指令 (stop) curl,wget --- curl會讀取網路內容,並輸出為命令列式browser wget可以幫你抓file docker --- ![image](https://hackmd.io/_uploads/H14k2pzQlg.png) docker run -i interact -t terminal -d daemon --name 給予名 docker ps 得到docker資訊 ![image](https://hackmd.io/_uploads/BJWvhTGXel.png) 一次性刪除所有docker $()是列出所有(running、stop)的docker並一次刪除 ![image](https://hackmd.io/_uploads/SkZuh6M7xg.png) ![image](https://hackmd.io/_uploads/ByDuhTfXlx.png) docker exec -it ... ![image](https://hackmd.io/_uploads/BJWt3azXel.png) ![image](https://hackmd.io/_uploads/SJ8Yh6MXxe.png) 產生新的image 第二種方式是使用腳本 mkdir test-dockerfile cd test-dockerfile gedit Dockerfile index.html & ![image](https://hackmd.io/_uploads/B1P52TfQgg.png) ```shell FROM ubuntu:22.04 RUN apt update; apt install -y apache2 EXPOSE 80 ADD index.html /var/www/html ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] ``` ![image](https://hackmd.io/_uploads/ryZhnpMmex.png) ![image](https://hackmd.io/_uploads/ryIn3pf7xe.png) 增加檔案屬性 --- lsattr file_name 可以查看檔案屬性 chattr +i file_name 為加鎖防止所以使用者包含root不能刪除修改 chattr -i 解除鎖定 +i: insert +a :append a lock不能刪除修改但可以追加 ACl: access control list linux分為 u、g、o 但現實中比較複雜 如果要 tom、mary可以讀但是peter不行 這樣的要求以目前學到的ugo是沒辦法實現的 myfile希望給user、mary讀取,但peter不行 如果在user建立一個myfile,user/group都是user 所以mary peter都不能讀 getfacl myfile (獲取權限 ![image](https://hackmd.io/_uploads/BJOga6Gmlx.png) setfacl 設定權限 setfacl -m u:mary:r myfile -m modified 讓mary這個使用者可以具有r讀取的權限 ![image](https://hackmd.io/_uploads/SyHm6aG7xe.png) tar --- tar ball tar.gz 壓縮副檔名 讓所有檔案打包變為一個檔案 dmesg :duration message relationship tail -f /var/...... -f: follow 打包 系統狀態可能隨時變動,-f會隨時顯示出來 du 查看資料夾擊檔案大小 -a 全部 -BM 以mega為檔案單位 沒有指定目錄,在當前目錄執行 apt install dstate iotop dstate -d 10 硬碟讀寫速度 dstate -c -n -d 10 查看cpu使用狀態 在使用iotop之前 linux內建top 會顯示系統時間,開機時間,線上使用者,平均負載(1 min/5min/10min) 每個程序使用情形 記憶體使用情況 磁碟使用情形 iotop 可以看那一隻程式使用磁碟的情況 -u 可以指定特定使用者 hard link & soft link --- hard link在產生的時候會指向同一個inode inode是一種metadata inode來描述檔案名稱 屬性 大小 權限 放在硬碟那一資料 使用者在讀取檔案 會先在inode查看權限,如果權限不足就無法讀取 hard link跟原本檔案,原本檔案刪除後,還是可以透過inode讀取檔案 soft/symbolic link 與原本檔案 sumbolic link 原本檔案刪除該inode也會不見 進行symbolic link的檔案無法透過他的inode找倒對應檔案 ![image](https://hackmd.io/_uploads/S1QdaTMQgl.png) link如同windows的捷徑 為了快速存取 windows可以設定 資料夾/檔案進行捷徑 使用 ln來進行連結 ln ori_file hlink //hard link 應連結不帶任何參數 ln -s ori_file slink //symbolic link ![image](https://hackmd.io/_uploads/ByRKTazQxe.png) hard link全線與原本檔案相同 symbolic link 權限全開+ l rwx後面的數字是連結數 對於symbolic link 連結數都是1 以及會顯示指向的檔案 slink -> ori_file ls -i 查看inode數字 ![image](https://hackmd.io/_uploads/By-opTGQll.png) ![image](https://hackmd.io/_uploads/B1Usp6GQxl.png) hard link 只能在同1分割區、不能對directory使用