常用命令
- 編輯相關
-
awk:awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤爲強大。簡單來說awk就是把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部分再進行各種分析處理。
- NF:字段總數
- NR:第幾行數據
- FS:分隔字符
-
sed
- -n
- -i 直接修改
- 4a:在第四行後添加
- 4i:在第四行前插入
- 1,5c sting:用sting替換1到5行的內容
- s/要被替換的字符串/新的字符串/g
-
sort
- -t
- -nr sort |uniq -c |sort -nr
-
tr
- -d:刪除
- [a-z] [A Z]:替換
-
- 查看負載相關
- top
- load average cpu
裏面的幾個數字代表什麼意思,怎麼衡量,爲什麼- load average 50 算高還是低?怎麼計算的?
- 系統在1,5,15分鐘的平均工作負載,進程隊列中的平均進程數量。
- 一般不能大於系統邏輯CPU的個數
- /proc/loadavg
- 關鍵參數
- Task:殭屍進程的數量
- CPU:%wa IOwait
- Mem:
- Swap:要儘可能的少用
- load average cpu
- uptime
- free:讀取自文件:/proc/meminfo
- buffer存放要寫回到磁盤的數據
- cache存放從磁盤上讀出的數據
- -buffers/cache,表示一個應用程序認爲系統被用掉多少內存;被程序實實在在佔用的內存
- +buffers/cache,表示一個應用程序認爲系統還有多少內存;可用的內存數。
- vmstat:動態的瞭解系統資源運行
- -d:磁盤
- r:等待運行的進程數,r<5表示狀態好
- b:處於非中斷睡眠狀態的進程數,b≈0表示狀態好
- id:CPU閒置時間
- 如果r經常大於3或4,且id經常小於50,表示CPU負荷很重
- ps
- aux
- -l
- lsof:列出被進程所打開的文件名
- pwd
- 首先獲取當前目錄的i節點編號,但是並不能知道當前目錄的名稱,我們切換到其的父目錄,在裏面尋找當前i節點編號對應的文件名即可。終止條件是".“和”…"指向同一個i節點,我們可以以此判斷是否發到達了根目錄
- pgrep
- top
- 查找
- grep
- -n
- -v
- -A
- -B
- find
- 時間:
- 4:4天前的那一天
- +4:大於等於5天之前
- -4:小於等於4天之內
- -exec 命令 { } ;
- 時間:
- grep
- 磁盤
- du
- -sh /
- du -cks * | sort -rn | head -n 10
- 評估目錄所佔容量,通過將指定文件系統中所有的目錄、符號鏈接和文件使用的塊數累加得到該文件系統使用的總塊數
- du命令是用戶級的程序,它不考慮Meta
Data,而df命令則查看文件系統的磁盤分配圖並考慮Meta Data。 - du以文件名、目錄名爲依據計算空間使用的,而df是以硬盤塊使用情況來計算空間使用的。
- -sm 以M爲單位列出文件容量
- df
- 列出所有文件系統的整體磁盤使用量,通過讀取塊位圖獲取
- dumpe2fs
- du
- 網絡配置命令
- netstat
- -tlnp
- ss
- ping
- traceroute
- tcpdump
- tcpdump ip host
- tcpdump tcp port 25 and host 210.27.48.1
- nslookup
- dig
- nmap
- tcp端口掃描:-sT、-sP
- TCP SYN端口掃描:-sS
- nmap -sS 192.168.137.10 -255 -p 20,21,53-110,30000 --v
- UDP端口掃描:-sU
- TCP ACK掃描:-sA
- netstat
系統調優參數
- /etc/sysctl.conf
這個文件有沒有改過?列舉一些常見的kernel參數和作用。- time_wait相關
- net.ipv4.tcp_tw_reuse =
1:是否允許新的TCP連接重新應用處於time_wait狀態的socket - net.ipv4.tcp_tw_recycle = 1:加速time_wait socket回收
- net.ipv4.tcp_max_tw_buckets:time_wait套接字的最大數量,把time_wait所佔用內存控制在一定範圍
- net.ipv4.tcp_tw_reuse =
- syn攻擊相關
- net.inet.tcp.syncookies =
1:開啓syncookies功能,防止dos攻擊,syn攻擊 - net.ipv4.tcp_synack_retries =
2:內核放棄連接之前發送SYN+ACK包的數量 - net.ipv4.tcp_syn_retries =
2:新連接,內核放棄連接之前發送SYN包的數量 - net.ipv4.tcp_max_syn_backlog = 65536:表示SYN隊列的長度
- net.inet.tcp.syncookies =
- 緩衝區
- net.core.rmem_default:接收套接字緩衝區大小缺省值
- net.core.wmem_default:發送套接字緩衝區大小缺省值
- net.core.rmem_max:最大TCP接收緩衝區大小
- net.core.wmem_max:最大TCP發送緩衝區大小
- kern.ipc.somaxconn :併發連接數
- net.core.netdev_max_backlog = 32768:進入包的最大設備隊列
- time_wait相關
常見服務佔用端口
- 80 8080 443
- 20 21 22 23 25 53
- 135(RPC)137(NetBIOS/UDP) 138(UDP) 139 (samba)
- 161 SNMP
- 1080 Socket代理
- 3306 11211 8080 jboss tomcat 50170
文件系統
-
(ext4)性能 安全性
-
啓動扇區 塊組 超級塊 inode表格 block 塊對照表(Bitmap) inode對照表
- 超級塊
- 記錄整個文件系統的整體信息,包括inode(記錄文件的權限與屬性)與block(記錄數據)總量、使用量、剩餘量
- inode表格 = inode + 存儲block號碼的block (ls -l命令)
- inode本身不記錄文件名,文件名的記錄在目錄的block中
- 創建新的目錄時,新目錄的鏈接數是2(產生了/.),上層目錄的鏈接數會增加1(產生了/…)
- 超級塊
-
讀寫文件會遇到的問題
- 文件數據離散:文件很大、經常變動、無法寫在連續的塊中、機械臂移動大、
- 複製出來、格式化、複製回去
- 創建文件流程
- 查詢目錄權限
- 在日誌記錄塊中記錄準備寫入的信息
- 查詢inode bitmap,向inode中寫入權限和屬性
- 查詢block bitmap,向block寫入數據
- 更新inode指向block
- 更新inode bitmap和block bitmap 的狀態,更新superblock內容
- 在日誌記錄塊中完成文件記錄
- 讀文件失敗
- 塊數據損壞
- inode損壞:記錄數據塊號碼的塊損壞
- 寫文件失敗
- 文件描述符不夠
- 存儲空間不夠了(塊不夠、inode不夠)
- 文件數據離散:文件很大、經常變動、無法寫在連續的塊中、機械臂移動大、
-
hdfs的一個block多大,爲什麼128M?
- 不能遠小於128M:減少硬盤尋道時間、減少Namenode內存消耗
- 不能遠大於128M:
- Map崩潰問題 (數據塊大,重新加載時間長)
- 預設時間間隔問題(從數據塊的角度大概估算,數據塊越大,時間越長)
- 問題分解問題:數據量大小和問題解決的複雜度成線性關係
- 約束map輸出:map之後的數據需要排序後再執行reduce,大文件不利於歸併排序的思想
-
ext4文件系統的block多大?
- 4k
- HDFS的塊比磁盤塊大,其目的是爲了最小化尋址開銷
-
索引式文件系統:ext
-
非索引式文件系統:FAT 碎片整理
-
cp/mv/rm的區別(實現)
- cp
- -a(pdr:連同文件屬性一起、鏈接文件屬性、遞歸)
- -u(新才複製)
- -l -s (複製爲鏈接)
- -d
複製鏈接文件時,默認複製的是源文件,除非加-d參數,纔會複製鏈接文件
- 當目標文件存在時,cp
命令並不是先刪除已經存在的目標文件,而是將原目標文件內容清空後再寫入。 - mv
的主要功能就是檢查初始文件和目標文件是否存在及是否有訪問權限,之後執行
rename 系統調用,因而,當目標文件存在時,mv 的行爲由 rename()
系統調用決定,即類似於刪除文件後再重建一個同名文件。 - 刪除文件名是指在原目錄下不再含有此文件名,並不一定刪除磁盤上文件的內容。只有在文件的鏈接數爲1,並且沒有進程打開此文件的時候,unlink()
纔會真正刪除文件內容。
- cp
-
軟硬連接(inode這塊,ln / ln -s)
- 硬鏈接:一個inode節點對用不同的文件名,
- 不創建新的inode,每增加一個硬鏈接,inode節點鏈接數加一
- rm
硬鏈接:刪除的只是文件名,對應的數據塊只有在inode節點鏈接數減少爲0的時候纔會被系統回收。 - 不能對目錄創建硬鏈接,因爲文件系統不能存在鏈接環,否則會導致文件便利操作的混亂(du,pwd等命令的運作原理就是基於文件硬鏈接)
- 不能跨文件系統
- 不能對不存在的文件創建硬鏈接
- 軟鏈接:如果目標路徑名較短則直接保存在inode中,如果較長則分配一個block存儲
- 創建新的inode,指向的數據塊存放着源文件的路徑
- 刪除源文件,軟鏈接失效
- 可以對目錄 創建軟連接,遍歷操作會忽略目錄的軟鏈接
- 可以跨文件系統
- 可以對不存在的文件創建軟鏈接
- 硬鏈接:一個inode節點對用不同的文件名,
開機啓動過程
- Mbr 與gpt的區別
- BIOS、CMOS、MBR、Boot
Loader、Grub2、Kernel、/sbin/init、/etc/init/*.conf、/ect/inittab、/etc/rc.d/rc.sysinit、/etc/rc.d/rc.$runleave - 雙系統
- 多重引導:MBR、各分區的啓動扇區boot sector
Shell常用腳本
- 從日誌文件裏面篩選出符合要求的ip或者其他信息
- cat logname | sort | uniq -c | sort -nr | head -n 10
- 正則表達式匹配IP地址
- [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1-3}\.{1,3}
- ^((25[0-5]|2[0-4]\d|[1]{1}\d{1}\d{1}|[1-9]{1}\d{1}|\d{1})()\.)){4}$
- ((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))).){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))
- 20G大小的文件,內容都是IP,有重複的,如何找出這裏面的top N ?
- 分表、哈希
- 統計nginx日誌出現次數最多的ip
- awk ‘{print $1}’ urllogfile | sort | uniq -c | sort -nr -k1
| head -n 10
- awk ‘{print $1}’ urllogfile | sort | uniq -c | sort -nr -k1
- 查看Web服務器(Nginx Apache)的併發請求數及其TCP連接狀態
- netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print
a, S[a]}’
- netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print
Swap
- swap分區是怎麼設置的?
- 使用物理分區構建swap:fdisk分區(改分區類型ID)、mkswap格式化、swapon啓動、free查看、
- 使用文件構建swap:dd、mkswap、swapon、free
- 爲什麼要有swap分區,工作原理是什麼?爲什麼雲服務器上的swap沒有開啓?
- 內存不足時,將內存中暫時不使用的程序與數據放置到swap中
- 服務器休眠時,運行中的程序狀態會被記錄到swap
- 某些程序運行時會利用swap的特性
Iptables
- filter
- INPUT
- OUTPUT
- FORWARD
- nat
- PREROUTING
- OUTPUT
- POSTROUTING
- mangle
- PREROUTING
- INPUT
- FORWERD
- POSTROUTING
- OUTPUT
- 語法
- iptables [-t 表名] <-A|I|D|R>鏈名 -i|o網卡名稱 -p
協議類型 -s源IP --sport 源端口號 -d 目標IP地址 --dport
目標端口號 <-j 動作> - iptables -P INPUT DROP
- iptables -A INPUT -m state --state NEW -j DROP
- iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- iptables -A INPUT -p tcp -dport 445 -j ACCEPT
- iptables -A INPUT -p tcp -m multiport --dports 22,80 -j ACCEPT
- 只允許某個IP上網
- iptables [-t 表名] <-A|I|D|R>鏈名 -i|o網卡名稱 -p
Shell操作
-
find /data -type f -name “*.txt” | xargs sed -i ‘s/oldgirl/oldboy/g’
-
mkdir -p /data/oldboy && echo
-
算術運算
- $[]
- $(())
- $(expr a + b) 或者
expr a \* b
:注意運算符兩邊要空格,且乘法符號要轉義
-
查看http的併發請求數與其TCP連接狀態
- netstat -tan | awk ‘/^tcp>/{split($5,ip,"😊;count[ip[1]]++}END{for(i in count) print i,count[i]}’
-
awk ‘{print $1}’ /var/log/nginx/access.log | sort | uniq -c | sort -nr -k1 | head -n 10
-
cat /dev/urandom | head -1 | md5sum | haed -c 5
-
watch -n 1 “/sbin/ifconfig eth0 | grep bytes”
-
find /opt -size +15k -exec mv {} /tmp/ ;
-
sed和awk
- 如果文件是格式化的,即由分隔符分爲多個域的,優先使用awk
- awk適合按列(域)操作,sed適合按行操作
- awk適合對文件的抽取整理,sed適合對文件的編輯。
-
寫一個腳本,該腳本能對標準的apache日誌進行分析並統計出總的訪問次數和每個訪問ip的訪問次數,按訪問次數列出前5名?
-
顯示/test下所有目錄
- ls -d */
- find . -type d -maxdepth 1
- ls -F | grep ‘/$’
- ls -l | grep ‘^d’ | awk ‘{print $9}’
-
將文件/etc/a 下中除了 b文件外的所有文件壓縮打包放到/home/a下,名字爲a.tar.gz
- tar -exclude /etc/a/b -Pcvfz /home/a/a.tar.gz /etc/a
-
如何查看某進程打開的所有文件
- lsof -p `ps -ef | grep crond | awk ‘{print $2}’`
-
獲取網卡eth0的80端口的數據包信息,找出訪問最高的
- tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F “.” ‘{print $1"."$2"."$3"."$4"."}’|sort|uniq -c|sort -nr|head -5
-
查看/var/log目錄下的文件數
- ls /var/log -1R | grep “-” | wc -l
-
查看Linux系統每個IP的連接數
- netstat -n | awk ‘/^tcp/{print $5}’ | awk -F":" ’{print $1}’ | sort | uniq -c | sort -rn
-
用iptables控制來自192.168.1.2主機的80端口請求
- iptables -A INPUT -p tcp -s 192.168.1.2 -dport 80 -j ACCEPT
-
Linux如何掛載Windows下的共享目錄
- mount .cifs //IP地址/server /mnt/server -o user=username,password=123
-
生成32位隨機密碼
- cat /dev/urandom | head -1 | md5sum | head -c 32
-
密碼加密
- echo abc | openssl md5
- echo abc | openssl base64
- echo abc | openssl sha
-
ps aux 中的VSZ代表什麼意思,RSS代表什麼意思?
- VSZ:虛擬內存集,進程佔用的虛擬內存空間
- RSS:物理內存集,進程佔用的實際物理內存空間
-
修改內核參數
- vi /etc/sysctl.conf
- sysctl -p
-
取0-39隨機數
- expr $[RANDOM%39] + 1 # 注意操作符兩邊的空格
-
限制apache每秒新建連接數爲1,峯值爲3
- iptables -A INPUT -d 172.16.100.1 -p tcp -dport 80 -m limit -limit 1/second -j ACCEPT
-
怎麼把腳本添加到系統服務裏,即用service來調用?
- 腳本里添加
- #!/bin/bsh
- # chkconfig: 345 85 15
- # description: httpd
- chkconfig httpd -add
- service start httpd
- 腳本里添加
-
按修改時間排序顯示目錄中的文件
- ls -lrt /etc
-
打印文件的權限值
- stat -c %a /etc/inittab
-
查看 ARP 緩存記錄的命令是?
- “arp –a”
-
軟件工具的原則
- 一次做好一件事
- 處理文本行,不要處理二進制數據
- 使用正則表達式
- 默認使用標準輸入、輸出
- 避免喋喋不休
- 輸出格式必須與可接受的輸出格式一致
- 讓工具去做困難的部分
- 構建特定工具前,先想想
-
獲取密碼
- printf “Enter new password:”
- stty -echo
- read pass < /dev/tty
- printf “Enter again:”
- read pass2 < /dev/tty
- stty echo
-
在程序中執行跟蹤:
- set -x:打開跟蹤功能
- set +x:關閉跟蹤功能
-
爲/home/qiuye目錄結構建立一份副本在/home/qy下
- find /home/qiuye -type -d -print | sed ‘s;/home/qiuye/;/home/qy/;’ | sed ‘s/^/mkdir /’ | sh -x
-
sed ‘s/Tony/Camus/2’:只替換第二次匹配到的
-
單詞頻率過濾器
- tr -cs A-Za-z’ ‘\n’ | tr A-Z a-z | sort | uniq -c | sort -k1,1nr -k2 | head 25
-
tcpdump tcp port 80 -s 0 -w net_stat.pcap