###### tags: `PID`
# Linux 常用指令
## 直接檢視檔案內容(cat)
由第一行開始顯示內容
:::info
cat filename
:::
:::warning
1. 顯示行號 -n
2. 空白行不給行號 -b
3. 完整的顯示(包含特殊字元) -A
:::
## 例行性工作排程
#### at
:::info
僅處理一次便結束排程 使用at 需要 atd 這個服務支援 atd在CentOS預設為啟動 其他的有可能無啟動
:::
#### 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,在VirtualBox 檔案->主機網路管理員 建立一張網路卡 再從設定->網路->介面卡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