運維工做中最重要的任務之一就是優化硬盤的訪問速度,運維的終極目標是不讓用戶訪問硬盤,盡最大可能把須要訪問的數據經過程序轉移到內存中。html
dell hp java
dell服務器品牌node
1u :r420/430,r620/630 2u:r720/730python
HP服務器品牌mysql
dl380gen9linux
有了RAID卡後,通常磁盤就會查到RAID卡上,而不是插到主板上ios
經常使用RAID 0 1 5 10正則表達式
RAID卡也是有緩存的sql
緩存無處不在(write-buffer和read-cache)shell
寫數據到內存中,這個數據的內存空間稱爲緩衝區---buffer
從內存中讀數據,這個數據的內存空間稱爲緩存區----cache
一、修改系統的yum源爲阿里雲yum源
> 輸出重定向
echo 1 2 3 4 >oldboy.txt xargs -n 2 <oldboy.txt #把文本的內容當作輸入,給xargs命令使用
>> 追加輸出重定向
< 輸入重定向 (xargs)
<< 追加輸入重定向 (cat)
cat >>/home/dsh/test.txt<<EOF 追加內容 追加內容 EOF
2> 錯誤重定向,把錯誤信息輸入到後邊的文件中,會刪除原有內容
2>> 錯誤追加劇定向,把錯誤信息追加到後面文件中,不會刪除原有文件。
echo 'oldboy' 2>a.txt 1>b.txt #標準輸出到b.txt 錯誤輸出到a.txt echo 'oldboy' >a.txt 2>&1 #標準和錯誤都輸出到a.txt
一、ping IP地址 檢查物理地址通不通
二、檢測服務是否ok
telnet 10.195.236.174 22
不通可能緣由:
防火牆阻擋,iptables
端口沒有開放
netstat -lntup | grep 22
netstat -lntup | grep sshd
/etc/ init.d/sshd restart #重啓ssh服務
linux的命令提示符
set | grep PSI #查詢當前PSI環境變量值
能夠經過全局變量配置文件/etc/profile文件,調整PSI值。
cat /etc/inittab #查看配置文件
runlevel #命令查看當前系統的運行級別
centos7中:
systemctl get -default #查看當前運行級別
systemctl set-default multi-user.target #設置多用戶命令行模式,即運行級別3文本模式
systemctl set-default graphical.target #設置圖形模式,即運行模式中5圖形模式
centos6:
service iptables status #查看防火牆狀態
service iptables stop #關閉防火牆,臨時
chkconfig iptables iptables off #關閉防火牆,永久生效
centos7:
systemctl status firewalld.service # 查看狀態
systemctl stop firewalld.service #關閉防火牆
systemctl disable firewalld.service #禁止開機啓動
centos6:
方法一
locale -a #查看當前系統中已安裝的語言包,確保有中文字符包zh_CN.utf-8
cat /etc/sysconfig/il8n #查看系統字符編碼配置文件
echo 'zh_CN.UTF-8' > /etc/sysconfig/il8n #添加中文字符編碼
source /etc/sysconfig/il8n #從新加載配置
echo $LANG #顯示當前系統字符編碼
方法二(系統中找不到/etc/sysconfig/il8n)
locale -a #查看當前系統中已安裝的語言包,確保有中文字符包zh_CN.utf-8
echo "export LC_ALL="zh_CN.UTF-8"" >>/etc/profile
source /etc/profile
centos7:
locale -a #查看當前系統中已安裝的語言包,確保有中文字符包zh_CN.utf-8
echo 'zh_CN.UTF-8' > /etc/locale.conf #添加中文字符編碼
source /etc/locale.conf #從新加載配置文件
echo $LANG #顯示當前系統的字符編碼
注意:修改ssh客戶端crt的字符編碼爲utf-8
注意:'zh_CN.UTF-8'大小寫
ntpdate
TMOUT:
echo $TMOUT #查看當前系統TMOUT時間,若無輸出,說明沒有定義,表示服務器不會自動登出。
export TMOUT=600 #設置超時時間爲10分鐘,臨時生效。
echo 'TMOUT=300' >>/etc/profile #修改系統環境變量配置文件,方法一
source /etc/profile #使配置生效
echo $TMOUT #輸出當前系統TMOUT時間
echo 'TMOUT=360' >>~/.bash_profile #修改用戶家目錄下配置文件.bash_profile
source ~/.bash_profile #重建加載使配置生效
echo $TMOUT #輸出當前系統TMOUT時間
注意:家目錄下的.bash_porfile定義優先級要比/etc/profile下定義的值高
export HISTSIZE=10 #命令history歷史記錄數量,臨時生效
export HISTFILESIZE=20 #命令的歷史記錄文件存儲命令數量(~/.bash_history),臨時生效/etc/resolv.conf:目錄設置linux本地的客戶端DNS的配置文件,DNS能夠實現域名和IP的互相解析.
> /etc/issue #清空預提示信息
>/etc/issue.net
/etc/motd #登錄後的提示信息
企業環境下新安裝系統,有五個重要服務
ssd
rsyslog 日誌收集
network 網絡
crond 定時任務
sysstat 系統性能檢測工具一個軟件包
eg:
chkconfig | egrep -v "crond|sshd|network|rsyslog|sysstat" | awk '{print "chkconifg",$1,"off"}'|bash #命令執行關閉指定服務外的全部服務開機自啓動(centos6)
清空/etc/issue /etc/issue.net
清除系統及內核版本登錄前的屏幕顯示
清除多餘的系統虛擬用戶帳號
爲grub引導菜單加密
禁止主機被ping
打補丁升級已有漏洞軟件
^ 表示以....開頭^D 表示已D開頭 行首
$ 表示以....結尾/$ 表示以/結尾 行尾
\> :字符串結尾
\< :字符串開頭
. 任意單個字符
* 表明其前面字符0到屢次 .*匹配全部字符
[abc] 匹配字符集合中任意字符 [^abc]相反
[0-9] [a-z] 匹配0-9或 a-z 中任意字符
\{m,n}:匹配其前面的字符,最多n次,最少m次
\{m\}:精確匹配m次
\{0,n}最多n次
\{m,\}最少m次
():擴展正則,分組,將多個字符捆綁在一塊兒,當作一個總體處理
分組括號匹配到的內容,會被正則表達式引擎自動記錄到內部變量中,變量爲
\1:模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符
\2:模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符
如下元字符,不能用
\b 單詞的邊界,有別於^$
\d : 匹配數字, 例如要匹配一個固定格式的電話號碼以0開頭前4位後7位,如0737-5686123正則:^0\d\d\d-\d\d\d\d\d\d\d$ 這裏只是爲了介紹"\d"字符。
\D :匹配非數字
\w :匹配字母,數字,下劃線.例如我要匹配"a2345BCD__TTz" 正則:"\w+" 這裏的"+"字符爲一個量詞指重複的次數,稍後會詳細介紹。
\s :匹配空格 例如字符 "a b c" 正則:"\w\s\w\s\w" 一個字符後跟一個空格,若有字符間有多個空格直接把"\s" 寫成 "\s+" 讓空格重複
A{B,C} == AB AC
說明:系統讀取文件時,首先須要根據文件名找到文件inode,而後才能讀取到文件的內容
file 文件名 #xiashi 查看文件的類型
硬連接:
linux中的文件名是存在於父目錄的bolk裏面,並指向這個文件的 inode節點,這個文件的 inode節點再標記指向存放這個文件的bolk的數據塊。咱們刪除一個文件,實際上並不清除inode節點和 block的數據。只是在這個文件的父目錄裏面的bolk中,刪除這個文件的名字和這個文件 inode的對應關係,使這個文件名消失,而且沒法指向這個文件的inode節點,當沒有文件名指向這個iode節點的時候,系統會同時釋放 inode節點和存放這個文件的數據塊,並更新 inode map和 block MaF,讓這些位置能夠用於放置其餘新的文件數據。文件/tmp/file的讀取原理(見下圖):
綜上:刪除文件,就是刪除文件名,而文件名存放在其父目錄的block中,因此刪除文件須要文件所在目錄的寫權限
軟鏈接:
關於目錄鏈接:
每一個文件和進程,都須要對應一個用戶和用戶組
UID GID :root的UID GID都是0,(若是把普通用戶的UID GID都手動改成0,那麼他就成了超級管理員,生產環境中嚴禁這種操做)。虛擬用戶的uid和gid是1-499,普通用戶是500之後。
和用戶關聯的四個文件:
/etc/passwd /etc/shadow /etc/group /etc/gshadow
/etc/skel目錄是用來存放新用戶配置文件的目錄,當咱們添加新用戶時,這個目錄下的全部文件會自動被複制到新添加的用戶的家目錄下:默認狀況下,/etc/skel目錄下的全部文件都是隱藏文件(以點開頭的文件):經過修改、添加、刪除/ etc/skel目錄下的文件,咱們可爲新建立的用戶提供統一的、標準的、初始化用戶環境
注意事項:若是用戶家目錄下的配置文件被誤刪,會出現命令行提示符顯示異常。修復辦法:須要用戶本身從新執行下拷貝skel命令,管理員拷貝後,須要修改文件的屬主屬組。
用來定義建立用戶時須要一些初始配置信息。好比建立用戶時:是否建立家目錄,默認建立用戶家目錄umask值(系統默認077),UID和GID範圍,密碼有效天數等信息。
是useradd的配置文件,用來指定useradd建立用戶時,建立的用戶默認屬性信息的配置文件,好比用戶家目錄所在路徑,帳號截止日期(通常爲空不會指定),新用戶的默認shell類型等。
useradd :
-s /sbin/nologin
-g 指定所屬的主組 -G指定屬於多個組(附加組)
-e 指定過時日期
chage:
chage -l oldboy #查看用戶的密碼屬性相關信息
chage -E "2020/04/01" oldboy #設定帳號過時日期
chage -d "2018/12/07" oldboy #設定用戶密碼的修改時間
chage -M 30 oldboy #設定密碼修改後的有效天數,需配合-d參數實現準確指定到某天過時
chage -W 7 oldboy #設定密碼到期前的警告天數
passwd:
--stdin:非交互式修改密碼 echo "123456" | passwd --stdin oldboy
su:
su - 用戶名 #切換用戶,而且同時切換家目錄
su -用戶名 -c 命令 #切換到用戶執行命令,而後切回。
sudo:
經過sudo命令,咱們能夠把某些超級用戶權限分類有針對性(精細)授杈給指定的普通用戶,而且普通用戶不須要知道root密碼就可使用獲得的授(管理員真正容許的root權限)。所以,絕不誇張的說,sudo命令相對於su命令來講,在系統用戶的分權管理方面進步了不少,使得集權式管理在理論上獲得了保證,從而使系統的安全性方面增強了不少。
配置:visudo = vim /etc/sudoers #但一般使用visu命令修改,能夠自動檢查語法
sudo -l #查看當前用戶的可執行命令有哪些
visudo -c #檢查/etc/sudoers 的語法是否正確
/etc/sudoers配置文件中重要設置:
User_Alias ADMINS = oldboy,dsh,%pbx #設置用戶別名,用戶別名能夠包含指定用戶或用戶組,以達到對同一類人員的批量受權管理。
Cmnd_Alias NETWORKING = /sbin/route,/sbin/ifconfig,/bin/ping #設置命令別名,能夠對批量同類命令進行分組。以達到對同一類命令批量受權管理。
sudo執行流程:
一坨關於用戶的查詢命令:
id last lastlog w who users groups
suid相關說明:
SGID相關說明:
Sticky相關說明:
總結:
chmod u+s ... 添加SUID
chmod g+s ... 添加SGID
chmod +s ...同時添加SUID和SGID
chmod -s ...同時刪除SUID和SGID
chmod o+t ...添加Sticky
suid應用案例:
文件建立後默認屬主屬組都是建立者自己,需求:文件建立後的默認屬主屬組跟所在目錄相同(共享文件夾)。
磁盤存儲數據,首先要分區,其次是格式化建立文件系統,最後才能存放數據 nb
在磁盤不工做的時候,磁頭停靠在靠近主軸接觸盤片的表面,即線速度最小的地方
如圖1-3,這裏是一個不存聽任何數據的特殊區域,稱爲啓停區或着陸區( Landing Zone)啓停區之外就是數據區。
在磁盤的最外圈,離主軸最遠的磁道稱爲「0」磁道,磁盤數據的存放就是從最外圈的「0磁道開始的。既然磁盤數據從最外圈開始,而中止時磁頭又是在最內圈啓停區,那麼磁頭是如何找到「0」磁道的位置的呢?那是由於在磁盤中還有一個用來完成磁盤初始定位的「0」磁道檢測器構件,由這個構件完成磁頭對「0」磁道的定位
0磁道很是重要咱們知道,系統的引導程序就在0柱面0磁道1扇區的前446Byts,早期的磁盤在每次關機以前須要運行一個被稱爲 Parking的程序,其做用是在系統關機前讓磁頭回到啓停區。現代磁盤在設計上已摒棄了這個缺陷。磁盤不工做時,磁頭會自動停留在啓停區,當磁盤須要讀寫數據時,磁盤主軸盤片開始旋轉。旋轉速度達到額定的高速時,磁頭就會因盤片旋轉產生的氣流而擡起,這時磁頭才向盤片存放數據的區域移動並開始讀取數據。
分區案例
爲何一個扇區只有512字節,而不是1024字節?答:習慣問題。
注意:
mkfs -t ext4 -b 4096 -I 1024 /dev/sdb1
partprobe 磁盤分區完成後,把分區表的修改信息,通知內核。
mkfs.ext4(mkfs -t ext4) 格式化分區 -b block -I inode
mkswap 格式化swap分區
swapon/swapoff 使用swap分區
mount -t type -o選項
mount -a #從新把/etc/fstab中的內容加載一遍。通常用於編輯完/etc/fstab文件後,執行,來檢查是否配置有錯誤
umount 卸載(-lF)強制卸載
df 查看磁盤信息 -i -h -T
dumpe2fs 查看ext文件系統信息
fsck 磁盤檢測(禁止對在用正常磁盤使用此命令)
megacli 查看raid信息
ipmitools 查看硬件信息工具
linux的通配符指的是命令行的通配符,用於bash環境,正則表達式多用於linux三劍客
* 表明多個任意字符
? 表明任意單個字符
; 連續不一樣命令的分隔符
單引號 雙引號 反引號 單引號是不具有變量置換功能 ,所見即所得。雙引號具有變量值換功能,可解析變量值。反引號具有命令解析功能,解析命令結果。
crontab -l #查詢當前用戶的定時任務
crontab -e #編輯crond任務
*/70 * * * * /bin/sh /root/monitor_test.sh #指定每隔多少分鐘執行一次
0 */2 * * * date >> /tmp/time.log #指定每隔幾個小時執行一次,但務必指定分鐘數。
1)腳本中涉及文件路徑時寫全局路徑;
2)腳本執行要用到java或其餘環境變量時,經過source命令引入環境變量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
3)當手動執行腳本OK,可是crontab死活不執行時。這時必須大膽懷疑是環境變量惹的禍,並能夠嘗試在crontab中直接引入環境變量解決問題。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
4)腳本執行權限問題。
5)>/dev/null 2>&1 #能夠解決crond日誌輸出
6)新建立的cron job,不會立刻執行,至少要過2分鐘才執行。若是重啓cron則立刻執行
7)當crontab忽然失效時,能夠嘗試/etc/init.d/crond restart解決問題。或者查看日誌看某個job有沒有執行/報錯tail -f /var/log/cron。
8)在crontab中%是有特殊含義的,表示換行的意思。若是要用的話必須進行轉義\%,如常常用的date ‘+%Y%m%d’在crontab裏是不會執行的,應該換成date ‘+\%Y\%m\%d’。
9)千萬別亂運行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除用戶的Crontab文件。刪除了該用戶的全部crontab都沒了
if ["a" == "b"]; then echo "執行 內容" fi
if ["a"=="b"] && ["a"=="c"]; then echo "執行 條件成立 內容" elseif ["a"=="b"] || ["a"=="c"]; then echo "執行 elseif條件成立 內容" else echo "執行 內容" fi
第一類:數字類循環
for1-1.sh #c語言風格
#!/bin/bash for((i=1;i<=10;i++)); do echo $(expr $i \* 3 + 1); done
for1-2.sh
#!/bin/bash for i in $(seq 1 10) do echo $(expr $i \* 3 + 1); done
#for i in $(seq 1 10); do touch abc$i; sleep 2; done#命令行中寫法
for1-3.sh #python風格
#!/bin/bash for i in {1..10} do echo $(expr $i \* 3 + 1); done
第二類:按字符循環
for2-1.sh
#!/bin/bash for i in `ls` do echo $i is file name ; done
for2-2.sh
#!/bin/bash for i in my name is dsh do echo $i ; done
for2-3.sh
#!/bin/bash my_string="my name is dsh" for i in $my_string do echo $i; done
第三類:路徑遍歷
for3-1.sh
#!/bin/bash for i in /proc/* do echo $i is file path; done
for3-2.sh
#!/bin/bash for file in $(ls *.sh) do echo $file is file path \! ; done
安裝rpm包
# rpm -ivh ***.rpm #其中i表示安裝,v表示顯示安裝過程,h表示顯示進度
升級rpm包
# rpm -Uvh ***.rpm
刪除軟件包
# rpm -e PACKAGE_NAME
# rpm -e –nodeps PACKAGE_NAME #不考慮依賴包
# rpm -e –allmatches PACKAGE_NAME #刪除全部跟PACKAGE_NAME匹配的全部版本的包
查詢軟件包
# rpm -q PACKAGE_NAME
# rpm -qp ***.rpm 獲取當前目錄下的rpm包相關信息
# rpm -qa | less 列出全部已安裝的軟件包
# rpm -qf /usr/sbin/httpd 查看某個文件屬於哪一個軟件包,能夠是普通文件或可執行文件,跟文件的絕對路徑
# rpm -qi PACKAGE_NAME 列出已安裝的這個包的標準詳細信息
# rpm -ql PACKAGE_NAME 列出rpm包的文件內容
# rpm -q –scripts kernel | less 列出已安裝rpm包自帶的安裝前和安裝後腳本
# rpm -qc PACKAGE_NAME 列出rpm包的全部配置文件
-a :all
-r 內核版本
-m 機器32位或64位
-n 顯示主機名稱
-c:清除歷史命令
-d 5:清除指定標號5的歷史命令
之因此能用到這個命令,關鍵是因爲不少命令不支持|管道來傳遞參數,而平常工做中有有這個必要。
eg: find查詢的結
果爲文件的時候,若是直接送給管道cat,則當作字符串處理直接輸出,若使用xargs cat後,則會把查詢結果當作文件處理
find /home/ -type f -name file10.txt | cat
find /home/ -type f -name file10.txt | xargs cat
[root@localhost dir1]# cat >>test.txt <<eof > 11 12 13 > 24 26 23 27 28 > 33 35 > 44 > eof [root@localhost dir1]# cat test.txt 11 12 13 24 26 23 27 28 33 35 44 [root@localhost dir1]# xargs <test.txt 11 12 13 24 26 23 27 28 33 35 44 [root@localhost dir1]# xargs -n 2 <test.txt 11 12 13 24 26 23 27 28 33 35 44
/usr/bin/find . -type f -name "*.wav" -size -200k | /usr/bin/xargs /bin/rm -f >/dev/null 2>&1 /usr/bin/find . -type f -name "*.wav" | /usr/bin/xargs -i lame -r {} /usr/bin/find . -type f -name "*.wav" | /usr/bin/xargs /bin/rm -f >/dev/null 2>&1 #The first line deleted unnecessary recordings of less than 200k, the second line converts from .wav to .mp3 and the three line deleted all .wav file that was converted to mp3.
#-i參數,可使用{}來表明管道的標準輸出內容
find /var/log/ -type f -name 'zabbix*.log' -mtime +15 | xargs rm -f #刪除15天之前的文件 ,find查詢結果是多行數據,不能直接經過管道送給rm -rf ,須要使用xargs轉換。
find /var/log -type d -name 'zabbix*' -mtime +30 | xargs rm -rf #刪除30天以上的目錄,慎用。
find /var/log -type d ! -name 'zabbix_server.log' | xargs -rm -f #刪除/var/log目錄下全部文件,保留zabbix_server.log。
find /root/ -maxdepth 1 -type f -size -1k |xargs -i mv {} /tmp #移動root家目錄下小於1K的文件到/tmp目錄
find /root -maxdepth 1 -type f -size -1k -exec mv {} /tmp \; #移動root家目錄下小於1K的文件到/tmp目錄,使用-exec參數更加高效。
-mtime #按照文件修改時間查找
find查找的時間說明:
-maxdepth #按照目錄最大深度查找(此參數務必緊接在指定查找目錄以後)
-size #按照文件大小查找,後跟+-號和數字及大小單位符號
-perm 644 #按照權限查找
-user root #按照用戶查找
!表示取反
-o 邏輯或
執行過程:找誰幹啥模塊能夠多組出現。
awk 眼中的文件,從頭至尾是一段連續的字符串,恰巧中間有些\n(回車換行符),爲了方便人的查看,就把RS的值設置爲\n
條件模塊類型有
一、條件表達式(NR>=3)
二、範圍表達式(NR==2,NR==5)
三、/正則開始/,/正則結束/ #行,按行匹配,匹配到的開始行到結束行。
四、$1~/正則開始/,$3~/正則結束/ #行,按行匹配
動做表達式中類型
嵌套if 語句
格式:
if(表達式) {語句1;語句2} else{語句1;語句2}
嵌套for 語句
格式:
for(var in array) {語句1;語句2}
for(i=0;i<10;i++) {語句1;語句2}
echo 'inet addr:10.0.0.8 Boast:10.0.0.225 Mask:225.225.225.0' > oldboy.txt
awk -F ' ' '{print $3}' oldboy.txt #截取Boast:10.0.0.225,指定空格爲分隔符。默認分隔符也是空格。ifconfig | awk -F ' ' 'NR==2{print $3}' 和 ifconfig | awk 'NR==2{print $3}' 結果同樣
awk -F '[ :]+' '{print$3 "\#" $5}' oldboy.txt #截取10.0.0.225,同時指定空格和:兩個分隔符截取,若是須要將打印字符分隔,必須使用「」雙引號
變量:
NR 行號
$1 第一列
$0 整行
$NF 最後一列
$(NF-1) 倒數第二列
awk 'NR>9 && NU<20' /etc/passwd #使用NR關鍵字截取指定行數據
ifconfig | awk 'NR==2 {print$2}' #截取指定行,而且是指定行的指定字符。注意awk表達式必須使用單引號。
ll /home/ |awk '{if($2>1) print$0}' #根據條件判斷,截取指定數據,$0,表示整行。注意: if表達式務必放在大括號裏,後跟動做語句無需;,有無空格都可。
ll | awk '/^d/' #awk命令的過濾功能,相似sed
awk '{print NR,$0}' /etc/passwd #awk 輸出整行數據,並打印行號。
awk 'NR>20{print NR,$0}' /etc/passwd awk '{if(NR>20) print NR,$0}' /etc/passwd #注意這兩條命令語法規則,輸出結果同樣
awk '/oldboy/' test.txt #匹配出現oldboy的行
awk '$1~/oldboy/{print$1,$3}' test.txt #指定列匹配,匹配第一列中出現oldboy的行,打印第一列和第三列
systemctl list-units |grep 'running' | egrep -v 'sshd|rsyslog|crond|sysstat|network|mysql'| awk '{print "systemctl ","disable",$1}' #centos7中找出除去六個重要服務之外的其餘運行服務,並組合成設置爲開機不啓動的命令。
chkconfig --list |grep '3:on' | egrep -v 'sshd|rsyslog|crond|sysstat|network|mysql'| awk '{print "chkconfig ",$1," off"}' #centos6中找出除去六個重要服務之外的其餘運行服務,並組合成設置爲開機不啓動的命令。
格式:gsub(/r/,"s",t) # gsub(/找誰/,"替換成什麼",替換那個部分的)
案例分析:修改/etc/passwd文件中dsh用戶的默認shell爲/sbin/nologin
awk -F ':' '$1~/dsh/{gsub(/\/bin\/bash/,"/sbin/nologin",$NF);print NR,$0}' passwd.bak #不會修改源文件
案例解析(說明END模塊用法):統計文件裏面的空行數量
awk '/^$/{a=a+1;print a}' /home/dsh/passwd.bak #每匹配到一個空行,對變量進行加1,而後輸出變量值
awk '/^$/{a=a+1}END{print a}' /home/dsh/passwd.bak #每匹配到一個空行,對變量+1,到最後再輸出變量值。
案例解析(END模塊用法):統計password文件中uid號大於15的行有多少?
awk -F ':' '{if($3<10)a=a+1}END{print a}' passwd.bak #使用if語句篩選
awk -F ':' '$3<10{a=a+1}END{print a}' passwd.bak #使用條件模塊匹配
經常配置END模塊,先根據字段值建立、設置數組,而後在END模塊中使用for循環,輸出須要的結果。
案例解析(定義數組、輸出元素角標及元素值)
awk -F ':' '{uname[NR]=$1}END{for (i in uname)print i,uname[i]}' passwd.bak #把第一列用戶名存入數組,並分別輸出角標和值
分類統計案例解析(針對單列字段值,分類統計,統計apache訪問日誌文件中IP地址請求排名)
awk '{print $1}' access_log |sort|uniq -c|sort -r #取出第一列IP地址後,使用排序去重命令實現。
awk '{array[$1]++} END {for(key in array) print key,array[key]}' access_log #使用awk數組
awk -F ':' '{array[$4]++}END{for(key in array) if(array[key]>1) print key,"=>"array[key]}' passwd.bak #統計組ID相同的用戶數量,並列印數量大於1的
sed [options] [sed-commands] [input-file]
sed [選項] [sed命令] [輸入文件]
說明:
1. 注意sed和後面的選項之間至少有一個空格。
2. 爲了不混淆,本文稱呼sed爲sed軟件。sed-commands(sed命令)是sed軟件內置的一些命令選項,爲了和前面的options(選項)區分,故稱爲sed命令。
3. sed-commands既能夠是單個sed命令,也能夠是多個sed命令組合。
4. input-file(輸入文件)是可選項,sed還可以從標準輸入如管道獲取輸
選項參數: -n :在通常 sed 的用法中,全部來自 STDIN 的數據通常都會被列出到終端上。但若是加上 -n 參數後,則只有通過sed 特殊處理的那一行(或者動做)纔會被列出來。 -e :直接在命令列模式上進行 sed 的動做編輯; -f :直接將 sed 的動做寫在一個文件內, -f filename 則能夠運行 filename 內的 sed 動做; -r :sed 的動做支持的是延伸型正規表示法的語法。(默認是基礎正規表示法語法) -i :直接修改讀取的文件內容,而不是輸出到終端。 動做說明: [n1[,n2]]function n1, n2 :不見得會存在,通常表明『選擇進行動做的行數』,舉例來講,若是個人動做是須要在 10 到 20 行之間進行的,則『 10,20[動做行爲] 』 動做參數: a :新增, a 的後面能夠接字串,而這些字串會在新的一行出現(目前的下一行)~ c :取代, c 的後面能夠接字串,這些字串能夠取代 n1,n2 之間的行! d :刪除,由於是刪除啊,因此 d 後面一般不接任何咚咚; i :插入, i 的後面能夠接字串,而這些字串會在新的一行出現(目前的上一行); p :列印,亦即將某個選擇的數據印出。一般 p 會與參數 sed -n 一塊兒運行~ s :取代,能夠直接進行取代的工做哩!一般這個 s 的動做能夠搭配正規表示法!例如 1,20s/old/new/g 就是啦!
sed '2a I love you ' myboook.txt #指定行後增長單行內容
sed '2a i love you \n because you are my lover' mybook.txt #指定行後增長多行內容
經常使用格式:
sed 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config #替換文件指定內容後顯示
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config #替換文件指定內容後顯示 ,並修改到文件(-i)
sed -n '20,30'p oldboy.txt #輸出oldboy文件的20-30行數據。
ll | sed -n '/^d/p' 或 ll | sed -n '/^d/p' #sed命令的過濾功能
-n 顯示行號
-i 不區分大小寫
-w 精確匹配一個單詞
-x 精確匹配一整行
-o 只顯示匹配到的行
-A 10 顯示匹配行,及如下10行文本內容 相似-B-C
-r 反轉排序
-t 按修改時間顯示排序
ll -rt #把最近修改的文件,排在最後
cp /etc/sysconfig/network-scripts/ifcfg-eth0{,.bak} 等效於 cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0.bak
seq 10 #打印輸出1-10序列
seq 3 10 #打印輸出序列,按照等差數列公差爲3排序。
seq -s '#' 10 #打印輸出序列,指定分隔符,默認是回車因此輸出列。
openssl rand -hex 4 #生成八位隨機數
用來配置服務開機啓動選項
chconfig --list #列出當前系統服務開機自啓動配置信息,等於systemctl list-units --type=service | grep running
chkconfig --level 3 sshd on #設置在啓動級別三時候,開機自啓動。
注意
centos7中使用systemctl enable sshd.service 設置開機自啓動
centos7中查看服務的啓動級別,查看target當中是否由此服務systemctl list-dependencies runlevel4.target |grep sshd.service
cut參數列表:
-b 按字節選取 忽略多字節字符邊界,除非也指定了 -n 標誌
-c 按字符選取,多用於中文字符選取
-d 自定義分隔符,默認爲製表符。
-f 與-d一塊兒使用,指定顯示分隔後的第幾個區域。
split命令
split -l #指定行數分割 split -l 10 /etc/inittab new_ #指定每隔10行分割文件
split -a #指定分割後生成文件的名字長度(默認兩個英文字符)
split -d #指定分隔後生成文件的名字使用數字形式
split -b #指定大小分割 split -b 500k -d /etc/inittab new_ #指定500k大小分割文件,而且生成文件名以數字命名。
paste -d : file1 file2 #對file1 file2逐行合併爲一個文件,-d指定分隔符。
paste -s file1 #對file1中的全部行,合併爲同一行數據。
sort命令
-n 數值排序
-r 降序
-t 字段分隔符
-k 以哪一個字段爲關鍵字排序
-u 排序後相同的行只顯示一次
-f 排序時忽略字符的大小寫
uniq命令
-c 顯示文本行重複的次數
-d 只顯示重複的行
wc命令
-l 只顯示行數
-w 只顯示單詞數
-c 只顯示字節數
-L 表示最長的一行包含了多少個字符
tr命令
eg: tr 'ab' 'AB' #把小寫ab替換成AB
tr 'a-z' 'A-Z' #把小寫字母替換成大寫字母
diff命令
eg :diff ifcfg-eth0 ifcfg-eth0.bak #對比兩個文件,也可使用vimdiff命令,更好的顯示對比效果
watch命令
週期性執行命令,打印,默認頻率2秒,-n指定頻率,-d只列印出變換結果(difference)
eg:watch -n 1 -d ls#每間隔一秒鐘實行下ls 命令,輸出結果。
-n 不換行輸出
-e 能夠解析到輸出內容的轉義字符
windows下文件轉換成linux下格式
linux下文件轉換成windows下格式
tar -czvhf filename.tar.gz var/log/httpd #打包,-h打包鏈接文件的源文件,務必先cd /根目錄下執行
tar -rzf filename.tar.gz var/log/cron #追加文件,到已打包好的包文件中
tar -xzvf filename.tar.gz
-d 選項能夠指定時間eg: -d +"1day" -d +"1Hour"
%y
%m
%d
%H
%M
%S
date命令經常使用案例
格式化輸出:date +%d%m\ %H:%M #注意命令中的格式輸出表達式,若是須要空格,須要加\轉義
備份文件:tar -cvzf /var/log/zabbix*.log /var/log/zabbix_log_$(date +%y_%m_%d )
rename 「源字符」 」目標字符「 文件名
basename 取文件全路徑的文件名
dirname 取文件全路徑的目錄
md5sum filename > filename.txt#生成指定文件md5校驗碼
lsof abc.txt #顯示開啓文件abc.txt的進程。直接接文件,即顯示出使用該文件的進程。 lsof -c abc #顯示出以字母 abc 開頭進程 如今打開 的文件。-c表示顯示指定進程所打開的文件 lsof -p 1234 #列出進程號爲1234的進程所打開的文件 lsof -g gname/gid #顯示歸屬gname或gid的進程狀況,顯示進程。 lsof -u uname/uid #顯示歸屬uname或uid的進程狀況,顯示進程。 lsof +d /usr/local/ #顯示目錄下被進程開啓的文件 lsof +D /usr/local/ #同上,可是會搜索目錄下的子目錄,時間較長 lsof -d 4 #顯示使用fd爲4的進程 lsof -i #用以顯示符合條件的進程狀況 lsof -i [46] [protocol][@hostname|hostaddr][:service|port]
lsof `which httpd` #那個進程在使用apache的可執行文件 lsof /etc/passwd #那個進程在佔用/etc/passwd lsof /dev/hda6 #那個進程在佔用hda6 lsof /dev/cdrom #那個進程在佔用光驅 lsof -c sendmail #查看sendmail進程的文件使用狀況 lsof -c courier -u ^oldboy #顯示出那些文件被以courier打頭的進程打開,可是並不屬於用戶oldboy lsof -p 30297 #顯示那些文件被pid爲30297的進程打開 lsof -D /tmp #顯示全部在/tmp文件夾中打開的instance和文件的進程。可是symbol文件並不在列 lsof -u1000 #查看uid是100的用戶的進程的文件使用狀況 lsof -utony #查看用戶tony的進程的文件使用狀況 lsof -u^tony #查看不是用戶tony的進程的文件使用狀況(^是取反的意思) lsof -i #顯示全部打開的端口 lsof -i:80 #顯示全部打開80端口的進程 lsof -i@10.195.249.225 -r #顯示全部指定主機的網絡鏈接 lsof -i UDP@[url]www.akadia.com:123 #顯示那些進程打開了到www.akadia.com的UDP的123(ntp)端口的連接 lsof -i tcp@ohaha.ks.edu.tw:ftp -r #不斷查看目前ftp鏈接的狀況(-r,lsof會永遠不斷的執行,直到收到中斷信號,+r,lsof會一直執行,直到沒有檔案被顯示,缺省是15s刷新) lsof -i tcp@ohaha.ks.edu.tw:ftp -n #lsof -n 不將IP轉換爲hostname,缺省是不加上-n參數 查找斷開的打開文件 lsof +L1 /data #在指定未見系統中列出無鏈接的打開文件。用戶常常遇到這種狀況,當一個進程正在向一個文件寫數據時,該文件的目錄可能被移動。這就產生了一個很是大的問題。例如,用戶可能發現正在向/data寫數據,可是卻看不到文件增大,LSOF這個工具能夠找到到這樣的錯誤。 在卸載文件系統時,若是該文件系統中有任何打開的文件,操做一般將會失敗。那麼經過lsof能夠找出那些進程在使用當前要卸載的文件系統,以下: lsof /GTES11/ COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME bash 4208 root cwd DIR 3,1 4096 2 /GTES11/ vim 4230 root cwd DIR 3,1 4096 2 /GTES11/ 在這個示例中,用戶root正在其/GTES11目錄中進行一些操做。一個 bash是實例正在運行,而且它當前的目錄爲/GTES11,另外一個則顯示的是vim正在編輯/GTES11下的文件。要成功地卸載/GTES11,應該在通知用戶以確保狀況正常以後,停止這些進程。這個示例說明了應用程序的當前工做目錄很是重要,由於它仍保持着文件資源,而且能夠防止文件系統被卸載。這就是爲何大部分守護進程(後臺進程)將它們的目錄更改成根目錄、或服務特定的目錄(如 sendmail 示例中的 /var/spool/mqueue)的緣由,以免該守護進程阻止卸載不相關的文件系統。 恢復刪除的文件: 當Linux計算機受到入侵時,常見的狀況是日誌文件被刪除,以掩蓋攻擊者的蹤影。管理錯誤也可能致使意外刪除重要的文件,好比在清理舊日誌時,意外地刪除了數據庫的活動事務日誌。有時能夠經過lsof來恢復這些文件。 當進程打開了某個文件時,只要該進程保持打開該文件,即便將其刪除,它依然存在於磁盤中。這意味着,進程並不知道文件已經被刪除,它仍然能夠向打開該文件時提供給它的文件描述符進行讀取和寫入。除了該進程以外,這個文件是不可見的,由於已經刪除了其相應的目錄索引節點。 在/proc目錄下,其中包含了反映內核和進程樹的各類文件。/proc目錄掛載的是在內存中所映射的一塊區域,因此這些文件和目錄並不存在於磁盤中,所以當咱們對這些文件進行讀取和寫入時,其實是在從內存中獲取相關信息。大多數與 lsof 相關的信息都存儲於以進程的 PID 命名的目錄中,即 /proc/1234 中包含的是 PID 爲 1234 的進程的信息。每一個進程目錄中存在着各類文件,它們可使得應用程序簡單地瞭解進程的內存空間、文件描述符列表、指向磁盤上的文件的符號連接和其餘系統信息。lsof 程序使用該信息和其餘關於內核內部狀態的信息來產生其輸出。因此lsof 能夠顯示進程的文件描述符和相關的文件名等信息。也就是咱們經過訪問進程的文件描述符能夠找到該文件的相關信息。 當系統中的某個文件被意外地刪除了,只要這個時候系統中還有進程正在訪問該文件,那麼咱們就能夠經過lsof從/proc目錄下恢復該文件的內容。 假如因爲誤操做將/var/log/messages文件刪除掉了,那麼這時要將/var/log/messages文件恢復的方法以下: 首先使用lsof來查看當前是否有進程打開/var/logmessages文件,以下: lsof |grep /var/log/messages syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted) 也可使用: lsof +L1 /var/log/ #此命令將顯示出全部icount爲0的文件 從上面的信息能夠看到 PID 1283(syslogd)打開文件的文件描述符爲 2。同時還能夠看到/var/log/messages已經標記被刪除了。 此時咱們能夠根據進城pid號碼以及fd找到文件在內存中的鏈接(入口),並把它復原。 cat /proc/1283/fd/2 > /var/log/messages
ip addr #查看等於ifconfig
ip addr add 10.195.236.140/27 dev eth0 #給網卡eth0新增一個10.195.236.140/24 地址
ip addr add 10.195.236.140/255.255.255.224 dev eth0 #給網卡eth0新增一個10.195.236.140/27 地址
ip addr add 10.195.236.140/27 dev eth0 label eth0:1 #給網卡起別名
ip addr del ip/netmask dev eth0 #刪除IP
ip addr del ip/netmask dev eth0 [label eth0:1] #刪除別名
ip addr flush dev ech0 #清除指定網卡全部IP
ip route #顯示路由信息
ip route add 目標主機 via 網關 #添加指定目標主機的路由
ip route add 目標網絡/掩碼 via 網關 #添加指定目的網絡的路由
ip route add default via 網關 #添加默認路由
選項:
-l或--listening:顯示監聽中的服務器的Socket;
-a或--all:顯示全部連線中的Socket
-n或--numeric:直接使用ip地址,而不解析域名。
-p或--programs:顯示正在使用Socket的程序識別碼和程序名稱;
-t或--tcp:顯示TCP傳輸協議的連線情況;
-u或--udp:顯示UDP傳輸協議的連線情況;
-r或--route:顯示Routing Table;
-c或--continuous:持續列出網絡狀態;
tcpdump [ -DenNqvX ] [ -c count ] [ -i interface ] [ -r file ] [ -s snaplen ] [ -w file ] [ expression ] 抓包選項: -c:指定要抓取的包數量。注意,是最終要獲取這麼多個包。例如,指定"-c 10"將獲取10個包,但可能已經處理了100個包,只不過只有10個包是知足條件的包。 -i interface:指定tcpdump須要監聽的接口。若未指定該選項,將從系統接口列表中搜尋編號最小的已配置好的接口(不包括loopback接口,要抓取loopback接口使用tcpdump -i lo), :一旦找到第一個符合條件的接口,搜尋立刻結束。可使用'any'關鍵字表示全部網絡接口。 -n:不作主機名解析。 -nn:除了-n的做用外,還把端口顯示爲數值,不然顯示端口服務名。 -P:指定要抓取的包是流入仍是流出的包。能夠給定的值爲"in"、"out"和"inout",默認爲"inout"。 -s len:設置tcpdump的數據包抓取長度爲len,若是不設置默認將會是65535字節。對於要抓取的數據包較大時,長度設置不夠可能會產生包截斷,若出現包截斷, :輸出行中會出現"[|proto]"的標誌(proto實際會顯示爲協議名)。可是抓取len越長,包的處理時間越長,而且會減小tcpdump可緩存的數據包的數量, :從而會致使數據包的丟失,因此在能抓取咱們想要的包的前提下,抓取長度越小越好。 輸出選項: -e:輸出的每行中都將包括數據鏈路層頭部信息,例如源MAC和目標MAC。 -q:快速打印輸出。即打印不多的協議相關信息,從而輸出行都比較簡短。 -X:輸出包的頭部數據,會以16進制和ASCII兩種方式同時輸出。 -XX:輸出包的頭部數據,會以16進制和ASCII兩種方式同時輸出,更詳細。 -v:當分析和打印的時候,產生詳細的輸出。 -vv:產生比-v更詳細的輸出。 -vvv:產生比-vv更詳細的輸出。 功能性選項: -D:列出可用於抓包的接口。將會列出接口的數值編號和接口名,它們均可以用於"-i"後。 -w:將抓包數據輸出到文件中而不是標準輸出。能夠同時配合"-G time"選項使得輸出文件每time秒就自動切換到另外一個文件。可經過"-r"選項載入這些文件以進行分析和打印。 -r:從給定的數據包文件中讀取數據。使用"-"表示從標準輸入中讀取。
1、默認啓動 tcpdump -vv #普通狀況下,直接啓動tcpdump將監視第一個網絡接口上全部流過的數據包,使用tcpdump -D列出全部可用網卡 2、過濾主機 tcpdump -i eth1 host 192.168.1.1 #抓取全部通過eth1,目的或源地址是192.168.1.1的網絡數據 tcpdump -i eth1 src host 192.168.1.1 #指定源地址,192.168.1.1 tcpdump -i eth1 dst host 192.168.1.1 #指定目的地址,192.168.1.1 3、過濾端口 tcpdump -i eth1 port 25 #抓取全部通過eth1,目的或源端口是25的網絡數據 tcpdump -i eth1 src port 25 #單獨指定源端口 tcpdump -i eth1 dst port 25 #單獨指定目的端口 4、網絡過濾 tcpdump -i eth1 net 192.168 tcpdump -i eth1 src net 192.168 tcpdump -i eth1 dst net 192.168 5、協議過濾 tcpdump -i eth1 arp tcpdump -i eth1 ip tcpdump -i eth1 tcp tcpdump -i eth1 udp tcpdump -i eth1 icmp 6、經常使用表達式 非 : ! or "not" (去掉雙引號) 且 : && or "and" 或 : || or "or" tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))' #抓取全部通過eth1,目的地址是192.168.1.254或192.168.1.200端口是80的TCP數據 tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))' #抓取全部通過eth1,目標MAC地址是00:01:02:03:04:05的ICMP數據 tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))' #抓取全部通過eth1,目的網絡是192.168,但目的主機不是192.168.1.200的TCP數據 tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 #使用tcpdump抓取HTTP包 time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null #計算抓10000個SYN包花費多少時間,能夠判斷訪問量大概是多少。
| 管道
\轉義字符
;命令分隔符
{}生成字符或者數字序列。find裏的{}是前面命令的結果。
- 表示上一次所在目錄,cd -,即切換到上次所在目錄
&&而且 and
通常模式下:
光標移動:
ngg 光標移動到第n行
行首 0 行尾 $
第一行 gg 最後一行G
/word 向下搜索word,按n鍵
?word 向上搜索word ,按n鍵
:%s#A#a#g 對文本進行搜索替換,把A替換成 a,用法相似sed替換,前加%。
Ctrl+c :終止當前命令
Ctrl+d:退出當前登陸,相似exit
Ctrl+l:清屏,等於命令clear
Ctrl+a:光標移動到命令行首
Ctrl+e:光標移動到命令行尾
Ctrl+k:刪除此命令行光標之後的字符
Ctrl+u:刪除此命令行光標之前的字符
Ctrl+r:搜索命令,搜索使用過的命令
Ctrl+s:掛起
Ctrl+q:解除掛起
end