重要知識點
硬件
運維工作中最重要的任務之一就是優化硬盤的訪問速度,運維的終極目標是不讓用戶訪問硬盤,盡最大可能把需要訪問的數據通過程序轉移到內存中。
互聯網企業服務器常用型號
dell hp
dell服務器品牌
1u :r420/430,r620/630 2u:r720/730
HP服務器品牌
dl380gen9
陣列卡(raid卡)
有了RAID卡后,一般磁盤就會查到RAID卡上,而不是插到主板上
常用RAID 0 1 5 10
RAID卡也是有緩存的
內存的優化buffer和cache
緩存無處不在(write-buffer和read-cache)
寫數據到內存中,這個數據的內存空間稱為緩沖區---buffer
從內存中讀數據,這個數據的內存空間稱為緩存區----cache
crt日志設置
yum相關
1、修改系統的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命令使用
>> 追加輸出重定向
< 輸入重定向 (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
遠程鏈接服務器故障排查思路
1、ping IP地址 檢查物理地址通不通
2、檢測服務是否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()
- 修改/etc/selinux/config ,最好使用命令sed. eg:sed -i 's#SELINUX=disabled#SELINUX=permissive#g' /etc/selinux/config
- 修改配置文件后使用setenforce修改為Permissive eg:setenforce 0
- 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/下重要目錄和文件
- /etc/(二進制軟件包的 yum /rpm 安裝的軟件和所有系統管理所需要的配置文件和子目錄。還有安裝的服務的啟動命令也放置在此處)
- /etc/resolv.conf:目錄設置linux本地的客戶端DNS的配置文件,DNS可以實現域名和IP的互相解析.(格式:nameserver 114.114.114.114)
- /etc/fstab: 記錄開機要掛載的文件系統的文件..
- /etc/rc.local: 存放開機自啟動程序命令的文件,(連接到文件/etc/rc.d/rc.local,注意兩個文件的執行權限) :(可以利用chkconfig進行管理,自開發的程序可以放在此處,實現開機的自啟動,linux開機時會把rc.local里的文件內容執行一遍)
- /etc/inittab:設定系統啟動的時候,把系統設置成什么樣的運行級別以及加載對應級別的文件設置.
- /etc/init.d/:存放系統或者服務器以system v模式啟動腳本,存放yum 或者rpm安裝的軟件的的命令的目錄
- /etc/profile: 系統全局變量的永久生效配置文件
- /etc/issue:用戶登錄前顯示的系統版本等信息.(可以進行改變,讓別人不知道用的什么版本,避免被利用版本漏洞攻擊)
- /etc/motd:用戶登錄后的顯示內容.
- /etc/group:設定用戶的組名與相關信息
- /etc/passwd:賬號的信息文件
- /etc/shadow:密碼信息文件.
- /etc/gshadow:組密碼信息文件
- /etc/securetty:設定哪些終端可以讓root登錄.
- /etc/sudoers:可以執行使用sudo命令的配置文件(權限提升).
- /etc/rsyslog.conf:日志設置文件
重要子目錄/文件說明
-
- /etc/sysconfig/network-scripts/ifcfg-eth0 #網卡配置文件
- /etc/resolv.conf #客戶端dns配置,注意:網卡中如果配置了dns,會優先於/etc/resolv.conf生效,並且重啟網卡,會覆蓋resolv.conf文件。如果有多塊網卡(dhcp方式)時候,可能會覆蓋/etc/resolv.conf里已有配置。
- /etc/hosts #本地域名解析,對應window中C:\WEINDOWS\system32\drivers\etc\hosts
- /etc/sysconfig/network #主機名配置文件 eg:sed -i 's#HOSTNAME=DSH#HOSTNAME=PBX#g' /etc/sysconfig/network
- ~/.bash_profile #用戶環境變量配置文件
- /var/log/secure #記錄登陸系統系想你文件
- /var/log/mesages #系統日志文件
- /var/spool/cron/root #計划任務配置文件
- /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次
取內容思路:
- 定位行(sed awk head tail )
- 定位列,指定分割(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使用方法:1、可以跟三位數字。2、使用+-號增加或修改某一項權限,如果不指定組,默認修改屬主屬組其他全部。3、如果單一修改屬組或其他權限位可以指定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 ...同時添加SUID和SGID
chmod -s ...同時刪除SUID和SGID
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分區
#關於linux 下掛載Windows共享文件夾
#1.首先使用windows系統能正常訪問
#2.理論上如果被掛載系統為xp/2003使用vers=1.0;win7/2008使用vers=2.0;win10以上使用vers=3.0
#3.目前只在server2003測試成功,win7 win10掛載錯誤mount error(112): Host is down;可能需要參考:https://docs.microsoft.com/en-sg/windows-server/storage/file-server/troubleshoot/detect-enable-and-disable-smbv1-v2-v3;配置win7系統
#server2003成功命令:
sudo mount -t cifs //10.xxx.xx.61/CallCenter /home/dsh/win_share_dir/ -o username=super,password=SZlonghua2010\!,vers=1.0
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
條件模塊類型有
1、條件表達式(NR>=3)
2、范圍表達式(NR==2,NR==5)
3、/正則開始/,/正則結束/ #行,按行匹配,匹配到的開始行到結束行。
4、$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 命令
set 命令
#[space]set +o history #設置系統歷史記錄關閉,由於此命令前有空格,所以當前命令也不會被記錄
#[Space]set -o history #設置系統歷史記錄開啟,由於此命令前有空格,所以當前命令也不會被記錄
特殊字符
| 管道
\轉義字符
;命令分隔符
{}生成字符或者數字序列。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