## 介紹
linux distribution:
centos
ubuntu
red hat
dedora
suse
...
kernel(相同的內核) + 不同的應用程式 + 外觀 = 造就不同的版本

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

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

lo: lookback, virtual 介面, ens33 介面卡
```
sudo poweroff
```
關機

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:

bridge是把vm曝光在internet上,host、vm是對等的,兩台獨立的存在
如果vm的firewall沒有做好,不建議用bridge
優點:適合架伺服器 缺點:安全性差
NAT(Network Address Translation):


Host-only:

host <-> vm 不能連internet
LAN segment:建立出不同網路,需使用LAN segment

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 &
```
&是在背景運作,讓其它指令可以在前景執行

```
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)

在linux 0.0.0.0表示任一介面(有限無線特殊介面)可以服務
tcp表ipv4
tcp6表ipv6介面
當沒打上 n (not resolve), port變為 ssh
如果只打netstat出現非常多連線與那些程式連結, stream->TCp、DGram->UDP
但加上-tun會少掉非常多只剩下伺服器連線
```
ls
```
ls: list

```
cat
```
查看檔案內容
```
scp "file_source" "目的端":/"destination"
```
檔案傳送,檔案來源為以建立file_name
目的端ex.
user@1922.168.0.1:/tmp
/tmp 每個人都有在/tmp讀寫的權限
```
scp 目的端 :/存放位置/檔案名稱 .
```
從server端複製檔案到當前路徑
如果要複製整個資料夾,可以加上 -r代表recursive一個一個去傳

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的區別是有加密,所以要互換金鑰

連線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 等參數

directory tree
---
Linux的檔案結構為directory tree

.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動作

創建帳號
---
```
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交換內存使用狀態

對資料夾而言 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查在第幾行,再用!,即可執行

-v (verbose)列出詳細內容,-v可以很多個
-v、-vv、-vvv
如果要刪除檔案,謹慎一點加上 -i 會詢問一遍
rm有些系統預設rm -f有些是rm -i
用樹狀結構列出整個結構
apt install tree
```
tree
```
顯示樹狀結構路徑

```
alias
```
別名
:::info
ex.
alias rm='rm -i'
之後打rm就會變成rm -i
但用\就可以恢復原指令
\rm
:::
用alias只能在目前視窗生效
如果要每個視窗同時用alias 要在 .bashrc編輯

```
| more
| less
```
more只能向下
less 可以往上往下
一頁一頁顯示
more也可以用來看檔案,但比較常用cat
> director導向 會把檔案清空再加上
>> append附加 不會覆蓋,只會附加

```
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值

```
file "file_name
```
來判斷檔案類型

找檔案有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

shell會有提示符號
一般user: $
root: #
```
echo $SHELL
```
可以查看預設的shell type

用{}可以辨識環境變數,如果後面有接東西的話

切換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
---

docker run -i interact
-t terminal
-d daemon
--name 給予名
docker ps 得到docker資訊

一次性刪除所有docker $()是列出所有(running、stop)的docker並一次刪除


docker exec -it ...


產生新的image
第二種方式是使用腳本
mkdir test-dockerfile
cd test-dockerfile
gedit Dockerfile index.html &

```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"]
```


增加檔案屬性
---
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 (獲取權限

setfacl 設定權限
setfacl -m u:mary:r myfile
-m modified
讓mary這個使用者可以具有r讀取的權限

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找倒對應檔案

link如同windows的捷徑
為了快速存取
windows可以設定 資料夾/檔案進行捷徑
使用 ln來進行連結
ln ori_file hlink //hard link 應連結不帶任何參數
ln -s ori_file slink //symbolic link

hard link全線與原本檔案相同
symbolic link 權限全開+ l
rwx後面的數字是連結數
對於symbolic link 連結數都是1
以及會顯示指向的檔案 slink -> ori_file
ls -i 查看inode數字


hard link
只能在同1分割區、不能對directory使用