###### 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