---
# System prepended metadata

title: Linux

---

# Linux

## 直接檢視檔案內容(cat)
由第一行開始顯示內容
:::info
cat filename  
:::
:::warning
1. 顯示行號 -n
2. 空白行不給行號 -b
3. 完整的顯示(包含特殊字元) -A
:::





## 例行性工作排程


#### at
:::info
僅處理一次便結束排程 使用at 需要 atd 這個服務支援 atd在ＣentOS預設為啟動 其他的有可能無啟動
:::

#### crontab

:::info
crontab所設定之工作會一直循環的進行下去,時間可為分鐘、小時、每週、每月、每年等等 除了指令執行外 可編輯/etc/crontab來支援.需要crond此服務來生效
:::

指令


1. 查詢自己的crontab內容
   crontab -l     
 
2. 查看指定使用者的 crontab
   sudo crontab -u 使用者 -l
   
3. 編輯自己的crontab
   crontab -e
   
4. 編輯制定使用者的crontab
   sudo crontab -u 使用者 -e

5. 刪除crontab內容
   crontab -r


### 時間形式
 分 時 日 月 星期幾  path/to/command
 :::success
 個人設定檔:MIN HOUR DOM MON DOW CMD
 系統設定檔:MIN HOUR DOM MON DOW **USER** CMD
 :::
 可使用特殊字元
 :::warning
 星號＊:代表任意時間
 逗號，:分隔多個不同時間
 減號一:代表區間
 斜線加數字(/n):代表每隔n時間
 :::
 
 一般排程範例:
 :::info
 30 08 * * * 每天早上8.30
 30 18 * * 0 每週日下午18.30
 30 18 * * Sun 每週日下午18.30
 30 08 10 06 * 每年六月十號早上8.30
 30 21 1,15,29 * * 每月1,15,19號晚上21.30
 */10 * * * *   每隔十分鐘
 00 09-18 * * * 從早上9到晚上18 必須為整點
 :::
 
 特殊排程(以＠開頭)範例:
 :::info
 @reboot 每次重新開機執行一次
 @yearly(@annually) 每年執行一次等同0011＊
 @monthly 每月執行一次 001＊＊
 @weekly 每週執行一次 00＊＊0
 @daily 每天執行一次 00＊＊＊
 @hourly 每小時執行一次 0＊＊＊＊
 :::

 
 ## Curl
 
 透過HTTP Protocol（HTTP HyperText Transfer Protocol）定義取得網路資源的協定 使用client/server模式來取得
 
 
 ### 基本格式
 :::info
 * curl [option][URL...]
 :::
 
 在終端機輸入 curl 網址 即可獲得該網址的response HTML,JSON,XML等格式
 :::info
 * curl URL...
 :::
 下載圖片 只要加上-o以及檔名
 :::info
 * curl -o XXX.jpg URL...
 :::
 若是要直接使用下載網址的檔案檔名 則使用-O不用加上檔名 網址後需有明確檔名
 可利用迴圈多次下載
 :::info
 * curl -O URL...
 * curl -O URL...duck[1-5].jpg
 :::
 下載中斷要從中斷處繼續的話使用-C
 :::info
 * curl -C - [option]URL...
 :::
 跟隨網址redirect 使用-L
 :::info
 * curl -L URL...
 :::
 追蹤curl過程 將結果存入txt 使用 --trace-ascii,可使用cat 來顯示該txt儲存之過程
 :::info
 * curl --trace-ascii XXX.txt URL...
 * cat XXX.txt
 :::
 
 ### HTTP請求方法

:::info
-X/--request [GET|POST|PUT|DELETE|PATCH]  使用指定的 http method 來發出 http request
-H/--header                           設定 request 裡所攜帶的 header
-i/--include                          在 output 顯示 response 的 header
-d/--data                             攜帶 HTTP POST Data 
-v/--verbose                          輸出更多的訊息方便 debug
-u/--user                             攜帶使用者帳號、密碼
-b/--cookie                           攜帶 cookie（可以是參數或是檔案位置）
:::

1. GET  網址可以攜帶query string參數
:::info
ex:curl https://example.com?q1=123&q2=abc
:::
2. 同一指令輸入多個URL
:::info
curl URL 空格 URL
:::
3. 若遇到Form表單
由於Form Post 是使用 application/x-www-form-urlencoded Content-Type 所以需要編碼
:::info
範例:curl -X POST --data "email=test@example.com&press=%20OK%20" URL
:::
4. 若有涉及到上傳檔案的表單(enctype='multipart/form-data')
:::info
curl -X POST -F 'file=@./[file]' URL...
:::
5. GET 單一或全部資源
:::info
curl -X GET "URL..."
:::
6. JSON資料
:::info
curl -X [request] -H "Content-Type:application/json -d '{json內容}' "URL..."
:::
### 輸入COOKIE

指令中輸入cookie
:::info
範例：curl --cookie "name=Jack" URL
:::
從檔案讀取cookie
:::info
curl --cookie stored_cookies_file_path URL
:::
攜帶User Agent
:::info
curl --user--agent "Mozilla/<version> (<system-information>) <platform> (<platform-details>) <extensions>" URL
:::
若存取之網頁有使用Basic Authentication
:::info
curl -i --user username:password URL
:::

## 查閱文件內容(tail)

### 基本格式
:::info
tail [parameter][file]
預設10行
:::

常用參數
:::info
-f 持續顯示最尾部的內容
-q 不顯示處理訊息
-v 顯示詳細處理訊息
-c數字 顯示從尾部數來幾字元
-n數字 顯示從尾部數來幾行
:::

## 檔案的壓縮與打包(tar)

### 常用指令
:::info
-c 打包一個tar檔案
-x 解開一個tar檔案
-t 檢視一個tar檔案
---------------------
-z 使用gzip壓縮
-v 顯示建立tar的過程
-P 使用絕對路徑
-f 指定tar檔案名稱 通常放參數的最後
:::

#### 建立壓縮檔範例

:::info
tar -czvfv filename.tgz 來源檔案
將來源檔案壓縮後 打包成filename.tgz的壓縮檔 來源可以是檔案或目錄
:::
來源檔案可以使用多個 利用空白分隔
:::info
tar -czvf filename.tgz 來源1 來源2
:::
檢視 解開
:::info
* tar -tzvf filename.tgz
* tar -xzvf filename.tgz
:::
複製目錄
:::info
tar -cvf - 來源目錄 | tar - xvf -
:::

## 正規表示法全域查詢並列印(grep)



:::info
grep 關鍵字 file1 file2...
:::
可搭配*搜尋多個檔案
:::info
grep 關鍵字 /etc/*.conf 在etc目錄下所有conf檔案中尋找test
:::
篩選含有關鍵字的檔案
:::info
ls 目錄路徑 ｜ grep 關鍵字
:::
預設會分大小寫 若要不分大小寫必須加上-i 顯示匹配行號要加上-n

### 反向搜尋

除了關鍵字以外的資料加上-v 在某目錄下的所有檔案搜尋關鍵字可加上-r

特定檔案中尋找關鍵字使用-r搭配--include
:::info
grep -r --include="*.conf" 關鍵字 目錄
:::
不顯示錯誤訊息 將錯誤訊息指/dev/null
:::info
grep -r 關鍵字 目錄 2>/dev/null
:::

### 顯示前後幾行(ABC)
:::info
-A 代表after 後面接數字 顯示找到的關鍵字後面行數
-B    before                      之前行數
_C    Context                    前後之行數
:::

關閉顏色標示加上 --color=always 或 --color=never 或 --color=auto

### 正規表示法
:::warning
grep "^a" 以a開頭
grep "b$" 以b結尾
grep "＾[ab]" a或b開頭
:::
次數指定
:::warning
＊代表出現0次以上

?代表0次或1次

+代表1次以上
:::
精準篩選
:::warning
範例："<net>" network就會被排除 只會出現有net的結果
:::

## 程序監測與控制(ps)

:::info
ps 參數
:::

最常使用到ps-aux 再利用管道符號導向到grep 去查詢特定的程序 


:::warning
1. a 顯示現行終端機下所有程式 包括其他使用者的程式
2. -A 顯示所有程式
3. c 顯示每個程式真正的指令名稱 不包含路徑引數常住服務等標示
4. -e 與A相同
5. e 顯示每個程式使用的環境變數
6. f 用ASCII顯示樹狀結構 表達程式的相互關係
7. -H 同f 不同只在於它不是使用ASCII顯示
8. -N 顯示所有程式 除了執行ps終端機底下的程式之外
9. s 採用程式訊號的格式顯示程式狀況
10. S 列出程式 並且包含已經中斷的子程式資料
11. -t 終端機編號 指定終端機編號 列出屬於該終端機的程式的狀況
12. u 以使用者為主的格式來顯示程式狀況
13. x 不以終端機區分 顯示所有程式
:::


## 文字分析工具 (awk)
:::info
awk '條件類型1{動作1},條件類型2{動作2}....'filename
cat filename | awk.....
:::
### 處理流程
1. 讀入第一行 並把資料填數$0,$1,$2...等變數之中
2. 依據條件類型限制 判斷是否進行後面的動作
3. 做完所有動作與條件類型
4. 若有後續的行 重複前面三個步驟 直至所有資料儲存完畢

### 變數名稱


NF : 每一行 $0 擁有的欄位總數

NR : 目前awk所處理的第幾行資料

FS : 目前的分隔字元 預設為空白鍵
:::danger
利用print列印時 非變數都需要用雙引號來定義
{}中如果要多個指令時需要用enter或;分開
:::
範例：test.txt
:::info
a b c d
c o d e
A:W:C:D          
O:G:W:C 
Q W E R
:::
cat /home/harry-li/桌面/test | awk'BEGIN{FS=":"}{print $1 "\t lines:"NR"\t columns:"NF $3}'
結果:
:::warning
a b c d lines:1   columns:1
C O D E lines:2   columns:1
A       lines:3   columns:4C
O       lines:4   columns:4W
Q W E R lines:5   columns:1
:::


## 性能分析工具(top)

資訊說明:
:::success
PID — 行程id(Process ID)
USER — 該行程使用者ㄏ
PR — 行程優先順序
NI — nice值（值越小優先權優高）
VIRT — 該行程使用的虛擬記憶體總量，單位kb(VIRT=SWAP+RES)
RES — 該行程程使用的、未被使用的實體記憶體大小，單位kb(RES=CODE+DATA)
SHR — 共用記憶體大小（單位kb）
S — 行程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=僵屍進程
%CPU — 上次更新到現在的CPU時間佔用百分比
%MEM — 行程使用的實體記憶體百分比
TIME+ — 行程使用的CPU時間總計，單位1/100秒
COMMAND — 行程名稱

:::
### 基本格式
top 參數
:::info
-b 只會吐出純文字內容無法按鍵互動
-d (秒,毫秒)更新時間差
-h top的參數以及版本代號
-i 顯示閒置的process
-n 刷新的次數
:::
互動模式
:::warning
進入top互動模式之後可以按下以下按鍵調整顯示模式
按下 b 開啓 highlight 模式
B 開啓 反白 highlight 模式
z 可以讓畫面變成彩色
Z 可修改彩色模式的顏色設定值
l 顯示/關閉 load avg 資訊
t 顯示/關閉 task/cpu 資訊
m 顯示/關閉 memory 資訊
f 可選擇要顯示的 column
o 調整顯示的欄位的位置 (透過連按該欄位的代號可調整位置)
F or O 選擇 排序的欄位
< or > 變換排序的欄位 < 換成當前排序的左邊一欄排序 > 換成當前排序的右邊一欄排序
R 昇序/降序 調整
x highlight 當前排序欄位 (需將highlight模式開啓)
y highlight 資源使用資訊 (需將highlight模式開啓)
u 選擇顯示某個user的所創立的process
n or # 設定只顯示幾列資訊
k 在top 視窗中kill process by pid
r 在top 視窗中調整process priority
d or s 調整更新時間
W 儲存當前的顯示模式設定 (排序,顯示欄位…等) ,之後執行top 指令就會載入該設定檔調整顯示模式
檔案將會存在 /home/<username>/.toprc
如要修改全域設定請先手動建立 /etc/toprc 檔案 再行輸入設定值h
按下 q 離開top
:::

## 監測一個命令的運行結果(watch)

範例:
:::info
自動監看最新的網頁伺服器錯誤訊息 watch tail /var/log/httpd/error_log
:::

### 指令


```
調整更新速度  -n （秒） 最低不可低於0.1秒
標示差異處    -d 
加上顏色     -c 最後加上--color
關閉標頭行   -t
監看管件串接 用引號將管線串接的指令包起來
```

### 實用範例

從網頁伺服器記錄檔篩選來自192.168.0.123的最新瀏覽紀錄
:::info
watch grep -F 192.168.0.123 /var/log/httpd/access_log
:::


## ssh(Tunnel)

### 安裝事項

如果只是要登陸別台機器 只需要安裝openssh-client(ubuntu有默認安裝)
若是本機要開放則要安裝openssh-server

查看是否安裝ssh指令
dpkg -l | grep ssh

安裝openssh-server
sudo apt-get install openssh-server

確認是否啟動
ps -e | grep ssh
顯示sshd 代表已啟動

### 登入指令
ssh 該使用者username@ip

若無法登入成功檢查被連接者的防火牆
sudo afw status 若 22 被阻擋 則 使用 sudo ufw allow 22/tcp

若使用虛擬機必須先關掉Ubuntu,在ＶirtualBox 檔案->主機網路管理員 建立一張網路卡 再從設定->網路->介面卡2去設定 最後抓這張卡的IP即可


[Tunnel](https://blog.gtwang.org/linux/ssh-tunnel-socks-proxy-forwarding-tutorial

## chmod

控制用戶對文件的權限的命令

分成三級 : 文件持有者 (Owner),用戶組(Group),其他用戶(Other Users)
只有文件持有者及超級用戶可以修改文件或目錄的權限

### 語法
chmod [-cfvR] [--help] [--version] mode fiel...

### 參數說明
權限設定格式如下
[ugoa...][[+-=][rwxX]...][,...]

u 表示该文件的拥有者，
g 表示与该文件的拥有者属于同一个群体(group)者，
o 表示其他以外的人，
a 表示这三者皆是。
＋表示增加权限
－表示取消权限
＝表示唯一设定权限。
r 表示可读取，w 表示可写入，x 表示可执行，X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。

其他参数说明：
-c : 若该文件权限确实已经更改，才显示其更改动作
-f : 若该文件权限无法被更改也不要显示错误讯息
-v : 显示权限变更的详细资料
-R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
--help : 显示辅助说明
--version : 显示版本

### 八進制語法



| # | 權限 | rwx | 二進制 |
| -------- | -------- | -------- |----------|
| 7 | 讀 寫 執行     | rwx     |111|
| 6 | 讀 寫     | rw-     |110|
| 5 | 讀 執行     | r-x     |101|
| 4 | 讀     | r--     |100|
| 3 | 寫 執行     | -wx     |011|
| 2 | 寫   | -w-     |010|
| 1 | 執行     | --x   |001|
| 0 | 無     | ---  |000|


### 範例

將file.txt 設為所有人皆可讀取
:::info
chmod ugo+r file.txt
chmod a+r file.txt
:::

將file.txt 與 file2.txt設為文件擁有者 與其所屬同一團體可寫入其他人不可
:::info
chmod ug+w,o-w file.txt file2.txt
:::

將ex1.py 設為只有該文件擁有者可執行
:::info
chmod u+x ex1.py
:::

將目前目錄下所有文件及子目錄都設為任何人可讀取
:::info
chmod -R a+r *
:::

chmod abc file(chmod 777 file) 
:::info
abc 各為一個數字 r=4 w=2 x=1 7=r+w+x 以此類推
:::

[其它用法](https://www.runoob.com/linux/linux-comm-chmod.html)

## 更改檔案或目錄的擁有者或群組(chown)

可以先用ls -l 查詢每個檔案與目錄的擁有者與群組
### 語法
更改擁有者
:::info
sudo chown 擁有者 filename
:::
更改群組
:::info
sudo chown : 群組名 filename
:::
同時更改
:::info
sudo chown 擁有者:群組 filename
:::

若要輸出執行結果可加上-v 若不要回報錯誤訊息可加上-f