linux運維基礎

重要知識點

硬件

運維工做中最重要的任務之一就是優化硬盤的訪問速度,運維的終極目標是不讓用戶訪問硬盤,盡最大可能把須要訪問的數據經過程序轉移到內存中。html

互聯網企業服務器經常使用型號

dell hp java

dell服務器品牌node

1u :r420/430,r620/630 2u:r720/730python

HP服務器品牌mysql

dl380gen9linux

陣列卡(raid卡)

有了RAID卡後,通常磁盤就會查到RAID卡上,而不是插到主板上ios

經常使用RAID 0 1 5 10正則表達式

RAID卡也是有緩存的sql

內存的優化buffer和cache

緩存無處不在(write-buffer和read-cache)shell

寫數據到內存中,這個數據的內存空間稱爲緩衝區---buffer

從內存中讀數據,這個數據的內存空間稱爲緩存區----cache

crt日誌設置

yum相關

一、修改系統的yum源爲阿里雲yum源

  • 登錄mirrors.aliyun.com,找到指定操做系統名稱,點擊後面"幫助"按鈕
  • mv /etc/yum.repos.d/CentOS-Base.repo{,.bak}
  • wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
  • yum makecache

輸入輸出重定向

>  輸出重定向

echo 1 2 3 4 >oldboy.txt
xargs -n 2 <oldboy.txt #把文本的內容當作輸入,給xargs命令使用
eg:輸入重定向

>>  追加輸出重定向

<  輸入重定向  (xargs)

<<  追加輸入重定向 (cat)

cat >>/home/dsh/test.txt<<EOF

追加內容

追加內容

EOF
eg:追加輸入重定向

2>  錯誤重定向,把錯誤信息輸入到後邊的文件中,會刪除原有內容

2>>  錯誤追加劇定向,把錯誤信息追加到後面文件中,不會刪除原有文件。

echo 'oldboy' 2>a.txt 1>b.txt  #標準輸出到b.txt 錯誤輸出到a.txt
echo 'oldboy' >a.txt 2>&1      #標準和錯誤都輸出到a.txt
eg:錯誤重定向

遠程連接服務器故障排查思路

一、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的命令提示符

linux的命令提示符由PSI環境變量控制

set | grep PSI   #查詢當前PSI環境變量值

能夠經過全局變量配置文件/etc/profile文件,調整PSI值。

linux系統基礎優化

關閉selinux()
  1. 修改/etc/selinux/config ,最好使用命令sed. eg:sed -i 's#SELINUX=disabled#SELINUX=permissive#g' /etc/selinux/config 
  2. 修改配置文件後使用setenforce修改成Permissive eg:setenforce 0
  3. getenforce 命令查看當前系統selinux狀態
設定linux的運行級別

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)

重要文件保護chattr命令

內核優化

清空/etc/issue /etc/issue.net

清除系統及內核版本登錄前的屏幕顯示

清除多餘的系統虛擬用戶帳號

爲grub引導菜單加密

禁止主機被ping

打補丁升級已有漏洞軟件

linux的目錄結構

/etc/下重要目錄和文件
  1. /etc/(二進制軟件包的 yum /rpm 安裝的軟件和全部系統管理所須要的配置文件和子目錄。還有安裝的服務的啓動命令也放置在此處)
  2. /etc/resolv.conf:目錄設置linux本地的客戶端DNS的配置文件,DNS能夠實現域名和IP的互相解析.(格式:nameserver 114.114.114.114)
  3. /etc/fstab: 記錄開機要掛載的文件系統的文件..
  4. /etc/rc.local: 存放開機自啓動程序命令的文件,(鏈接到文件/etc/rc.d/rc.local,注意兩個文件的執行權限) :(能夠利用chkconfig進行管理,自開發的程序能夠放在此處,實現開機的自啓動,linux開機時會把rc.local裏的文件內容執行一遍)
  5. /etc/inittab:設定系統啓動的時候,把系統設置成什麼樣的運行級別以及加載對應級別的文件設置.
  6. /etc/init.d/:存放系統或者服務器以system v模式啓動腳本,存放yum 或者rpm安裝的軟件的的命令的目錄
  7. /etc/profile: 系統全局變量的永久生效配置文件
  8. /etc/issue:用戶登陸前顯示的系統版本等信息.(能夠進行改變,讓別人不知道用的什麼版本,避免被利用版本漏洞攻擊)
  9. /etc/motd:用戶登陸後的顯示內容.
  10. /etc/group:設定用戶的組名與相關信息
  11. /etc/passwd:帳號的信息文件
  12. /etc/shadow:密碼信息文件.
  13. /etc/gshadow:組密碼信息文件
  14. /etc/securetty:設定哪些終端可讓root登陸.
  15. /etc/sudoers:能夠執行使用sudo命令的配置文件(權限提高).
  16. /etc/rsyslog.conf:日誌設置文件
重要子目錄/文件說明
    1. /etc/sysconfig/network-scripts/ifcfg-eth0  #網卡配置文件
    2. /etc/resolv.conf  #客戶端dns配置,注意:網卡中若是配置了dns,會優先於/etc/resolv.conf生效,而且重啓網卡,會覆蓋resolv.conf文件。若是有多塊網卡(dhcp方式)時候,可能會覆蓋/etc/resolv.conf裏已有配置。
    3. /etc/hosts  #本地域名解析,對應window中C:\WEINDOWS\system32\drivers\etc\hosts
    4. /etc/sysconfig/network   #主機名配置文件 eg:sed -i 's#HOSTNAME=DSH#HOSTNAME=PBX#g' /etc/sysconfig/network
    5. ~/.bash_profile  #用戶環境變量配置文件
    6. /var/log/secure  #記錄登錄系統系想你文件
    7. /var/log/mesages   #系統日誌文件
    8. /var/spool/cron/root   #計劃任務配置文件
    9. /etc/hostname    #centos7中配置主機名的配置文件。可是開機啓動時,仍是會調用/etc/sysconfig/network 文件,若是network中有配置會優先生效。

linux三劍客正則表達式

^  表示以....開頭^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. 定位行(sed awk head tail )
  2. 定位列,指定分割(awk cut sed)

 

():擴展正則,分組,將多個字符捆綁在一塊兒,當作一個總體處理
    分組括號匹配到的內容,會被正則表達式引擎自動記錄到內部變量中,變量爲
    \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+" 讓空格重複

 

 

linux開機啓動流程(簡單描述)

  • 開機bios自檢
  • MBR引導-->硬盤0柱面0磁道1扇區的前446byte(第一扇區還剩餘512-446=66字節,緊接着的64字節用來存儲磁盤的4個分區表信息,最後2個字節是分區的結束標誌).
  • 加載grub引導菜單--> cat /etc/grub.conf
  • 加載內核kenel
  • 啓動init進程(linux中第一個啓動進程,進程號1)
  • 讀取/etc/inittab配置文件,設置運行級別。
  • 執行/etc/rc.d/rc.sysinit腳本,設置系統的基本初始化信息。同時執行/etc/rc.d/rc腳本根據運行級別啓動相關服務。
  • 啓動mingetty進程,出現登錄窗口。

shell命令中{}用法

A{B,C} == AB AC

文件屬性

ll -hi  命令解析

說明:系統讀取文件時,首先須要根據文件名找到文件inode,而後才能讀取到文件的內容

file 文件名 #xiashi 查看文件的類型

文件權限

文件的軟硬鏈接

硬連接:

  • 硬連接ls 源文件 目標文件
  • 硬連接是經過inode來鏈接文件,至關於文件的一個入口,互爲硬連接文件,inode號相同。
  • 硬連接文件也是普通文件,能夠用rm刪除
  • 軟鏈接ls -n 源文件 目標文件(目標文件不能事先存在)
  • 文件刪除原理:由於文件系統(ext2)的原理是,只要文件的索引節點( Inode index)還有一個以上的硬連接。只刪除其中一個硬連接(即僅僅刪除了該文件的連接指向)並不影響索引節點自己和其它的連接(即數據文件實體並未被刪除),只有當文件的最後一個連接被刪除後,此時若是有新數據要存儲到硬盤上時或者系統經過相似fsck作磁盤檢查的時候。被刪除文件的數據塊及目錄的連接纔會被釋放,空間被新數據佔用並覆蓋。此時,數據就再也沒法找回了。也就是說,在inux系統中,刪除靜態文件(沒有進程調用)(目錄也是文件)的條件是與之相關的全部硬連接文件均被刪除(暫時這樣理解便可,後文會講和進程的佔用也有關。
  • 文件刪除的補充說明:

    linux中的文件名是存在於父目錄的bolk裏面,並指向這個文件的 inode節點,這個文件的 inode節點再標記指向存放這個文件的bolk的數據塊。咱們刪除一個文件,實際上並不清除inode節點和 block的數據。只是在這個文件的父目錄裏面的bolk中,刪除這個文件的名字和這個文件 inode的對應關係,使這個文件名消失,而且沒法指向這個文件的inode節點,當沒有文件名指向這個iode節點的時候,系統會同時釋放 inode節點和存放這個文件的數據塊,並更新 inode map和 block MaF,讓這些位置能夠用於放置其餘新的文件數據。文件/tmp/file的讀取原理(見下圖):

  • 綜上:刪除文件,就是刪除文件名,而文件名存放在其父目錄的block中,因此刪除文件須要文件所在目錄的寫權限 

軟鏈接:

  • 1)軟連接相似 windows的快捷方式(能夠經過 readlink查看其指向)。
  • 2)軟連接相似一個文本文件,裏面存放的是源文件的路徑,指向源文件實體。
  • 3)刪除源文件,軟連接文件依然存在,可是沒法訪問指向的源文件路徑內容了,軟鏈接已經失效,失效的時候通常是白字紅底閃爍提示, oldboy soft1 ink file--> ahoy file
  • 4)失效的時候通常是白字紅底閃爍提示, oldboy soft1 ink file-→ ahoy file
  • 5)執行命令「In 圖源文件 軟連接文件」,便可完成建立軟連接(目標不能存在)。
  • 6)軟連接和源文件是不一樣類型的文件,也是不一樣的文件。 inode號也不相同
  • 7)軟連接文件的文件類型爲(l),能夠用rm命令刪除

關於目錄鏈接:

  • ①對於目錄,不能夠建立硬連接,但能夠建立軟連接
  • ②對於目錄的軟連接是生產場景運維中經常使用的技巧(例子第二關 apache考試題)。
  • ③目錄的硬連接不能跨越文件系統(從硬連接原理能夠理解)。
  • ④每一個目錄下面都有一個硬連接「,」號,和對應上級目錄的硬連接「,」。
  • ⑤再父目錄裏建立一個子目錄,父目錄的連接數增長1(由於每一個子目錄裏都有..來指向父目錄)。可是再父目錄裏建立文件,父目錄的連接數不會增長。

用戶用戶組

每一個文件和進程,都須要對應一個用戶和用戶組

 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目錄下的全部文件都是隱藏文件(以點開頭的文件):經過修改、添加、刪除/ etc/skel目錄下的文件,咱們可爲新建立的用戶提供統一的、標準的、初始化用戶環境

注意事項:若是用戶家目錄下的配置文件被誤刪,會出現命令行提示符顯示異常。修復辦法:須要用戶本身從新執行下拷貝skel命令,管理員拷貝後,須要修改文件的屬主屬組。

/etc/login.defs配置文件

用來定義建立用戶時須要一些初始配置信息。好比建立用戶時:是否建立家目錄,默認建立用戶家目錄umask值(系統默認077),UID和GID範圍,密碼有效天數等信息。

 

/etc/default/useradd配置文件

是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

權限體系

普通文件權限:
  •  刪除文件(修改文件名等),就是刪除文件名,而文件名存放在其父目錄的block中,因此刪除文件須要文件所在目錄的寫權限。與文件自己權限無關。
  • 對於可執行權限x,普通用戶來講,須要同時具有r和x權限,才能執行。對於root來講只要有x權限就能夠執行。
目錄權限:
  • 目錄的x權限,表示能夠cd進入
  • 目錄的r權限,只能讀到文件名,屬性,和進入須要x權限
  • 目錄的w權限,表示具備增、刪、改目錄內的文件名的權限(須要x配合)
chmod、chown命令
  • chmod命令只有文件的屬主和root用戶纔有使用權限
  • chmod使用方法:一、能夠跟三位數字。二、使用+-號增長或修改某一項權限,若是不指定組,默認修改屬主屬組其餘所有。三、若是單一修改屬組或其餘權限位能夠指定g或o
  • eg:chmod 755 filename  或 chmod +x filename 或chmod -x filename 或chmod g+x filename
  • chmod -R 遞歸修改目錄及其下的子目錄和文件
umask默認權限
  • 一個網站目錄經常使用安全權限臨界點爲:文件權限爲644,目錄權限爲755,對應umask值爲022
  • 文件權限664,目錄權限775,對應umask值爲002
suid sgid

suid相關說明:

  • 啓動爲進程以後,其進程的屬主爲原程序文件的屬主;
  • 只能做用在二進制程序上,不能做用在腳本上,且設置在目錄上無心義 ;
  • 執行suid權限的程序時,此用戶將繼承此程序的全部者權限

SGID相關說明:

  • 做用在二進制程序上時:執行sgid權限的程序時,此用戶將繼承此程序的所屬組權限
  • 做用於目錄上時:此文件夾下全部用戶新建文件都自動繼承此目錄的用戶組. 

Sticky相關說明:

  • 對於一個多人可寫的目錄,若是設置了sticky,則每一個用戶僅能刪除和更名本身的文件或目錄;
  • 只能做用在目錄上.普通文件設置無心義,且會被linux內核忽略
  • 用戶在設置Sticky權限的目錄下新建的目錄不會自動繼承Sticky權限

總結:

chmod u+s ... 添加SUID

chmod g+s ... 添加SGID

chmod +s ...同時添加SUIDSGID

chmod -s ...同時刪除SUIDSGID

chmod o+t ...添加Sticky

suid應用案例:

文件建立後默認屬主屬組都是建立者自己,需求:文件建立後的默認屬主屬組跟所在目錄相同(共享文件夾)。

 

磁盤管理

磁盤存儲數據,首先要分區,其次是格式化建立文件系統,最後才能存放數據 nb

磁盤物理硬件知識及raid

在磁盤不工做的時候,磁頭停靠在靠近主軸接觸盤片的表面,即線速度最小的地方
如圖1-3,這裏是一個不存聽任何數據的特殊區域,稱爲啓停區或着陸區( Landing Zone)啓停區之外就是數據區。
在磁盤的最外圈,離主軸最遠的磁道稱爲「0」磁道,磁盤數據的存放就是從最外圈的「0磁道開始的。既然磁盤數據從最外圈開始,而中止時磁頭又是在最內圈啓停區,那麼磁頭是如何找到「0」磁道的位置的呢?那是由於在磁盤中還有一個用來完成磁盤初始定位的「0」磁道檢測器構件,由這個構件完成磁頭對「0」磁道的定位
0磁道很是重要咱們知道,系統的引導程序就在0柱面0磁道1扇區的前446Byts,早期的磁盤在每次關機以前須要運行一個被稱爲 Parking的程序,其做用是在系統關機前讓磁頭回到啓停區。現代磁盤在設計上已摒棄了這個缺陷。磁盤不工做時,磁頭會自動停留在啓停區,當磁盤須要讀寫數據時,磁盤主軸盤片開始旋轉。旋轉速度達到額定的高速時,磁頭就會因盤片旋轉產生的氣流而擡起,這時磁頭才向盤片存放數據的區域移動並開始讀取數據。

 

磁盤分區概念

分區案例

爲何一個扇區只有512字節,而不是1024字節?答:習慣問題。

fdisk分區工具

注意:

  • fdisk分區修改的分區表信息不實實時的,須要使用w保存退出fdisk工具
  • 退出後須要使用partprobe /dev/sdb   #partprobe命令後要接指定磁盤,告訴linux內核分區已經修改完成。
parted分區工具(萬能分區工具)

 

擴容swap分區

 

格式化文件系統

mkfs -t ext4 -b 4096  -I 1024 /dev/sdb1

 

 inode相關知識點
  • 磁盤的格式化分區建立文件系統後,會生成 兩部分,第一部分是Inode(不少個),第二部分是Block(不少個),Block是實際用來存放數據的,而inode就是用來存放指向bolck數據的指針等屬性信息的(即:ls -l命令結果,可是inode不包含文件名),一個inode的大小一般是128字節。
  • 訪問文件,經過文件名-->inode-->blocks。命令stat 用來查看文件的詳細屬性信息。
  •  df -i 查看磁盤inode使用狀況。df -h 查看磁盤使用狀況(block使用量)磁盤滿特徵:no space on device left 。  df -T 查看文件系統類型,ext3/4文件系統使用命令 extdumpe2fs /dev/sda3查看inode及block的大小及數量,xfs文件系統使用xfs_info。查看目錄文件夾使用du命令,du -h /home/ #列出家目錄下各個子目錄大小及家目錄自己大小,du -sh /home/   #只列出家目錄自己大小
  • inode節點號相同的文件,互爲硬連接文件,能夠認爲是一個文件的不通入口
  • ext3/4文件系統中,一個文件被建立後,至少佔用且只能佔用一個inode,至少佔用一個block
  • ext4中inode的默認大小256B block大小默認是4k,引導分區除外
  • 目錄文件:目錄也是文件,打開目錄就等於打開了目錄文件,目錄文件中存放的內容就是一系列目錄項(dirent)的列表。每一個目錄項,由兩部分組成:所包含文件的文件名,以及該文件名對應的inode號碼。
  • 目錄文件的讀權限(r)和寫權限(w),都是針對目錄文件自己。因爲目錄文件的block內存儲數據文件名和inode號碼,因此若是隻有目錄讀權限,就只能獲取文件的文件名,沒法獲取文件的其餘信息,由於文件的其餘信息都儲存在各自文件的inode節點中,而讀取inode節點內的信息則須要目錄文件的執行權限(x)。
  • 有時,文件名包含特殊字符,沒法正常刪除。這時,直接刪除inode節點,就能起到刪除文件的做用。
  • 移動文件或重命名文件,只是改變文件名,不影響inode號碼。
  • 打開一個文件之後,系統就以inode號碼來識別這個文件,再也不考慮文件名。所以,一般來講,系統沒法從inode號碼得知文件名。
block的相關知識點
  • 磁盤讀取數據是按照block爲單位讀取的
  • 一個文件可能佔用多個block,可是沒讀取一個block就會消耗一次磁盤IO
  • 若是要提高磁盤IO性能,那麼就要儘量一次性讀取數據儘可能的多。因此磁盤IO優化,針對大文件,block越大越好
磁盤相關命令 .

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通配符

linux的通配符指的是命令行的通配符,用於bash環境,正則表達式多用於linux三劍客

*   表明多個任意字符

?  表明任意單個字符

;  連續不一樣命令的分隔符

單引號  雙引號  反引號  單引號是不具有變量置換功能 ,所見即所得。雙引號具有變量值換功能,可解析變量值。反引號具有命令解析功能,解析命令結果。

 

crond定時任務

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都沒了

shell編程

if 判斷經常使用格式
if ["a" == "b"]; then
echo "執行 內容"
fi
if ["a"=="b"] && ["a"=="c"]; then 
  echo "執行 條件成立 內容"
elseif ["a"=="b"] || ["a"=="c"]; then 
  echo "執行 elseif條件成立 內容"
else
  echo "執行 內容"
fi

 

for循環經常使用格式

第一類:數字類循環

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包
# 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包的全部配置文件

uname 命令:顯示系統信息

-a :all

-r 內核版本

-m 機器32位或64位

-n 顯示主機名稱

history命令:

-c:清除歷史命令

-d 5:清除指定標號5的歷史命令

xargs命令:

之因此能用到這個命令,關鍵是因爲不少命令不支持|管道來傳遞參數,而平常工做中有有這個必要。

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命令:

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命令:

執行過程:找誰幹啥模塊能夠多組出現。

 

awk 眼中的文件,從頭至尾是一段連續的字符串,恰巧中間有些\n(回車換行符),爲了方便人的查看,就把RS的值設置爲\n

格式:awk [選項] '條件模塊 {動做表達式;動做表達式} 條件模塊{動做表達式}......' filename

條件模塊類型有

一、條件表達式(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中找出除去六個重要服務之外的其餘運行服務,並組合成設置爲開機不啓動的命令。

替換gusb

格式: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   #不會修改源文件

begin模塊end模塊

案例解析(說明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  #使用條件模塊匹配

數組:用於分類(分組)統計(統計日誌文件中 圖片.jpg 出現了多少次、統計日誌文件中 圖片.png 出現了多少次等等)

經常配置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數組

  • 例中的array[$1]++運算原理解析
  • (1)Awk在讀取第一行的時候,會讀取這個數組,此時的數組是這樣的:a[192.168.3.1]++
  • (2)此時a[192.168.3.1]的值是未定義的。可是因爲後邊有運算符號++。Awk會將數字0自動賦值給a[192.168.3.1]。而後在作++運算
  • (3)此時a[192.168.3.1]作++ ,也就是0+1獲得的值爲1
  • (4)那麼在讀第二個192.168.3.1時,此時a[192.168.3.1]的值已經通過上次運算爲1.此時在作一次運算。也就是1+1如今a[192.168.3.1]的值爲2。
  • (5)總結,最後的值是多少,也就意味着,192.168.3.1運算了多少次,也意味着192.168.3.1出現了多少次。

awk -F ':' '{array[$4]++}END{for(key in array) if(array[key]>1) print key,"=>"array[key]}' passwd.bak  #統計組ID相同的用戶數量,並列印數量大於1的

sed命令:

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命令的過濾功能

grep命令

-n  顯示行號

-i 不區分大小寫

-w 精確匹配一個單詞   

-x 精確匹配一整行

-o 只顯示匹配到的行 

-A 10 顯示匹配行,及如下10行文本內容 相似-B-C

 

ls命令

-r   反轉排序

-t   按修改時間顯示排序

ls cp mv mkdir rm 常見應用案例

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命令

seq 10   #打印輸出1-10序列

seq 3 10   #打印輸出序列,按照等差數列公差爲3排序。

seq -s '#' 10  #打印輸出序列,指定分隔符,默認是回車因此輸出列。

openssl 命令

openssl rand -hex 4  #生成八位隨機數

chconfig命令

用來配置服務開機啓動選項

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、split命令

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 命令

paste -d : file1 file2  #對file1 file2逐行合併爲一個文件,-d指定分隔符。

paste -s file1   #對file1中的全部行,合併爲同一行數據。

sort、uniq、wc、tr、diff、watch命令

sort命令

  • -n 數值排序

  • -r 降序

  • -t 字段分隔符

  • -k 以哪一個字段爲關鍵字排序

  • -u 排序後相同的行只顯示一次

  • -f 排序時忽略字符的大小寫

uniq命令

  • -c 顯示文本行重複的次數

  • -d 只顯示重複的行

wc命令

  • -l 只顯示行數

  • -w 只顯示單詞數

  • -c 只顯示字節數

  • -L 表示最長的一行包含了多少個字符

tr命令

  • -d 指定刪除特定的字符
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 命令,輸出結果。

echo 命令

-n  不換行輸出

-e  能夠解析到輸出內容的轉義字符

dos2unix命令

windows下文件轉換成linux下格式

unix2dos命令

linux下文件轉換成windows下格式

tar命令

tar -czvhf filename.tar.gz var/log/httpd   #打包,-h打包鏈接文件的源文件,務必先cd /根目錄下執行

tar -rzf filename.tar.gz var/log/cron  #追加文件,到已打包好的包文件中

tar -xzvf filename.tar.gz

date命令

-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命令

rename 「源字符」 」目標字符「 文件名

basename 取文件全路徑的文件名

dirname 取文件全路徑的目錄

md5sum filename > filename.txt#生成指定文件md5校驗碼

lsof命令

命令格式:(查詢文件的進程佔用信息。)
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命令

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 網關  #添加默認路由

netstat命令

選項:

-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命令

用法選項:
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包花費多少時間,能夠判斷訪問量大概是多少。

 

strace 命令

 

特殊字符

| 管道

\轉義字符

;命令分隔符

{}生成字符或者數字序列。find裏的{}是前面命令的結果。

- 表示上一次所在目錄,cd -,即切換到上次所在目錄

&&而且 and

vi&vim

通常模式下:

光標移動:

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

相關文章
相關標籤/搜索