Linux基本知識

     
命令類型:
    內置命令:{shell 內置}
    外部命令:在文件系統的某個目錄下有與命令名稱相應的可執行文件

date :時間管理 linux: rtc date -s "2012-05-23 01:01:01" //這樣能夠設置所有時間 硬件時間:hwclock 系統時間:date ———————————————————————————————————————————————————————— #!/bin/bash start=$(date +%s) nmap man.linuxde.net &> /dev/null end=$(date +%s) difference=$(( end - start )) echo $difference seconds. —————————————————————————————————————————————————————————— 得到命令的使用幫助: 內部命令: help command 外部命令: command --help {大多數外部命令支持} 命令手冊:manual man command whatis command 查看命令在哪些章節 man 分章節: 八個章節 1.用戶命令 2.系統調用 3.庫用戶 4.特殊文件 {設備文件} 5.文件格式 {配置文件的語法} 6.遊戲 7.雜項 miscellaneous 8.管理命令 {/bin , /usr/sbin, /usr/local/sbin} synopsis :概要 <> :必選 [] : 可選 .......:能夠出現屢次 | : 多選一 {} : 分組 MAN : NAME : 命令名稱及功能簡要 SYMOPSIS :用法說明 OPTIONS :說明每個選項的意義 FILES : 此命令的相關配置文件 BUGS : EXAMPLES :使用示列 SEE ALSO :另外參照 翻屏: 向後翻一屏:SPACE 向前翻一屏:b 向後翻一行:enter 向前翻一行:k 關鍵字查找: /KEYWORD : 向後查找 n: 查找下一個 N: 查找上一個 q :退出 info :在線手冊 hwclock -w :讀取系統時間 hwclock -s :讀取硬件時間 hwclock--------SYNOPSIS hwclock -r or hwclock --show hwclock -w or hwclock --systohc hwclock -s or hwclock --hctosys hwclock -a or hwclock --adjust hwclock -v or hwclock --version hwclock --set --date=newdate hwclock --getepoch hwclock --setepoch --epoch=year 文檔目錄: /usr/share/doc cal 日曆: echo 命令用法: -e 啓用換行 printf 命令: Windows :PE Linux :ELF 文件系統: rootfs :根文件系統 FHS:文件系統層級化標準 /boot :系統啓動相關文件:如內核 ,initrd ,以及grub {bootload 啓動引導程序} /dev :設備文件 塊設備:隨機訪問,數據塊 字符設備:線性訪問: 按字符爲單位 設備號:主設備號和次設備號 /etc : 配置文件 /home ;用戶家目錄 /lib : 庫文件, /lib/modules :內核模塊文件 動態庫:.dll .so {share object} 靜態庫:.a /media :掛載點目錄,移動設備 /mnt : 掛載點目錄,額外的臨時文件 /option : 可選目錄,第三方程序的安裝目錄 /proc :僞文件系統,內核映射文件 /sys : 僞文件系統,跟硬件設備相關的屬性映射文件 /tmp : 臨時文件 /var/tmp /var :可變化的文件,用於存放常常變化的數據,好比日誌 /bin : 可執行文件,用戶命令 /sbin :管理命令 /usr :shared ,read-only 用戶二進制目錄,大量用戶級的GNU工具和數據文件都存儲在這裏 /usr/bin /usr/sbin /usr/lib/ /usr/local: /usr/local/bin /usr/local/sbin /usr/local/lib 命名規則: 1.長度不能超過255個字符 2.不能使用 / 當文件名 3.嚴格區分大小寫 introduction :介紹 描述GPL,BSD,apache www.kernel.org linux ,GUN/linux 源代碼 發行版:http://os.51cto.com/art/201703/534139.htm?mobile 十大發行版 redhat {centos} ,SUSE ,Debin 三大發行版 文件管理 touch ,stat, file ,rm ,cp ,mv 日期時間: date ,clock , hwclock ,cal 文本處理:cut ,join ,sed ,awk cat ,more ,less ,head ,tail ,cut ,sort ,uniq ,grep cat :連接並顯示 -n :顯示行號 -E :每行末尾顯示$ shift + pageup or pagedown 翻屏 tac :和cat 的輸出相反 分屏顯示: more less : more : 向後翻 less :space 向後翻屏,b 向前翻屏 ,enter 向下一行 ,k 向上一行 head :看前多少行 head -n number tail :看最後多少行 tail -n number tail -f : 當即顯示末尾追加的內容 cut : -d : 指定分隔符 -f : 指定要顯示的字段 sort : -n :根據字符串數值進行比較 -r : 降序排序 -t :字段分隔符 -k :分隔符號指定的的字段 -u :排序時相同的行只顯示一次 -f :排序時忽略大小寫 examples: sort -t : -k 3 -n /etc/passwd uniq : 報告和省略重複的行 -c : 統計重複的行出現的次數 -d : 只顯示重複的行 單詞:duplicate 重複 wc : wc /etc/issue 3 9 48 /etc/issue 對應行數 單詞數 字節數 -l :行數 -w :單詞數 -c :字節數 -L :輸出最長的行 tr :轉換或者刪除字符 examples : tr "a-z" "A-Z" < passwd_test //將小寫所有換成大寫 -d :刪除字符 目錄管理 ls cd pwd mdkir rmdir -p 建立父目錄 命令行展開: {} 列入: mkdir /root/test/{test1/qqq,test_222} mkdir /root/test/{a,b}{c,d} tree: 查看目錄樹 刪除目錄文件: rmdir {remove directory} 刪除空目錄 touch :修改文件時間戳 -a 修改access 時間 -m 修改modify 時間 -t 自定義時間 -c 只更新時間戳,不建立文件 stat :顯示文件狀態 標準:GB18030, GBK,GB2312,unicode , rm :刪除命令 rm 別名爲 rm -i \rm test1 :可以不提示直接刪除文件目錄 執行程序 設備管理 軟件管理 進程管理 網絡管理 bash 及其特性: shell :外殼 GUI :GNOME ,KDE ,Xface CLI :sh ,bash ,csh ,ksh , rcsh, zsh 程序 :進程 容許一個用戶帳號登陸屢次,每次登陸打開一個bash 進程 進程:在每一個程序看來,當前主機只存在內核和當前進程 進程是程序的副本,進程是程序執行的實列 用戶工做環境: shell :子shell bash: 1. 支持命令歷史 2.管道,重定向 3.支持命令別名 4.支持命令編輯 5.支持命令行展開 6.支持文件名統配 7.變量 8.編程 命令行編輯: Ctrl + a :跳到命令行首 Ctrl + e :跳到命令行尾 Ctrl + u :刪除光標至行首 Ctrl + k :刪除光標至行尾 命令歷史: history : 查看歷史命令 -c :清楚全部歷史命令 -d :刪除指定位置的命令 examples : history -d 59 6 //刪除指定位置後的命令個數 -w :保存命令歷史至歷史文件中 ! n :執行指定序號的命令 !! :執行是一條命令 !string : 執行近段時間以這個字符開頭的命令 !$ :應用前一個命令的最後一個參數 Esc . :應用前一個命令的最後一個參數 //按下Esc鍵,按 . 環境變量: PATH :命令搜索路徑 HISSIZE :命令歷史大小 //查看方式爲 echo $HISSIZE 命令補全: Tab 鍵 路徑補全: Tab 鍵 //連按兩下 命令別名: alias : examples :alias cp='cp -i' 別名有效時間爲當前shell 生命週期有效,只做用在當前shell 進程 unalias : 取消別名 執行命令自己,不帶參數 使用 \command 命令替換:格式 $(COMMAND) or `` 反引號 echo "the current directory is $(pwd)" //命令替換 date +%F-%H-%M-%S //顯示年月日小時分鐘 touch ./file-$(date +%F-%H-%M-%S).txt bash 支持的引號: ·· :命令替換 "" :弱引用,能夠實現變量替換 '' :強引用,不完成變量替換 文件名通配:globbing * :任意長度的任意字符 ? :任意單個字符 [] :匹配指定範圍的任意字符 examples: [abc],[a-z],[1-9],[A-Z],[a-zA-Z] [0-9a-zA-Z] [[:space:]]:空白符號 [[:punct:]]:標點符號 [[:lower:]]:小寫字母 [[:upper:]]:大寫字母 [[:alpha:]]:大小寫 [[:digit:]]:數字 [[:alnum:]] :數字和大小寫字母 查詢: man 7 glob ^ :脫字符,匹配指定指定範圍外的選項, //examples ls [^0-9]* 用戶及權限: 計算資源 權限 用戶 用戶,容器,關聯權限, 用戶組:利於分配權限 用戶 :標識符 用戶組:標識符 文件: 用戶,組,權限 安全上下文 (secure context) 權限:r, w, x 文件: r :可讀,能夠使用相似cat 等命令查看文件內容 w :可寫,能夠編輯或者刪除此文件 x :可執行,exacutable,能夠在命令行下提交給內核運行 目錄: r :能夠對此目錄執行ls 列出內部全部文件 w : 能夠在此目錄建立文件 x :能夠使用cd 切換進去目錄,也能夠使用ls -l 列出文件內部詳細信息 r--:只讀 r-x:讀和執行 ---:無權限 0 000 ---:無權限 1 001 --x: 可執行 2 010 -w-:可寫 3 011 -wx: 可寫可執行 4 100 r--: 可讀 5 101 r-x: 可讀可執行 6 110 rw-: 可讀可寫 7 111 rwx: 可讀可執行 //8進制 用戶:UID /etc/passwd 組 :GID /etc/group 解析:名稱解析 影子口令: 用戶: /etc/shadow 組 : /etc/gshadow 用戶類別: 管理員: 0 普通用戶:1-65535 系統用戶:1-499 通常用戶:500-60000 用戶組: 系統組: 通常組: 用戶組類別: 基本組:用戶默認的組 私有組:建立用戶時,若是沒有爲其指定所屬的組,系統會自動爲其建立一個與用戶同名的組 附加組:額外組 程序在執行時屬於進程,進程的權限=執行者的權限 加密方式: 對稱加密,相同密碼 非對稱加密:公鑰,私鑰 單向加密:散列加密,提取數據特徵碼,經常使用與完整性效驗 1.雪崩效應 2.定長輸出 MD5: 128 定長輸出 SHA1 :secure hash algorithm 160 位定長輸出,hash 算法 /etc/passwd 解析: account ;帳戶名稱 passwd :密碼 UID :用戶ID GID :基本組ID GECOS :用戶註釋信息 directory :用戶家目錄 shell : 用戶使用的shell // 查看 cat /etc/shells 有哪些shell /etc/shadow 解析: 1.account : 用戶名 2.encrypted password :加密的密碼,單向加密 3.days since Jan 1, 1970 that password was last changed:1970.1.1 到最近一次修改密碼的天數 4.days before password may be changed:密碼最短使用期限 5.days after which password must be changed:密碼最長使用期限 6.days before password is to expire that user is warned:密碼到期以前的幾天,該用戶被警告 7.days after password expires that account is disabled:密碼到期後的幾天該賬戶被禁用 8.days since Jan 1, 1970 that account is disabled:帳號有效期 9.a reserved field: 一個保留字段 useradd name :添加用戶 /etc/default/useradd //不指定使用默認參數配置文件 /etc/group 解析: 1.組名 2.密碼佔位符 3.組ID ,GID 4.以這個組爲附加組的用戶列表,沒有及爲空 groupadd name :添加組 環境變量: echo $SHELL //保存當前用戶的shell echo $PATH echo $HISTSIZE 用戶管理: useradd , userdel ,usermod ,passwd , chsh ,chfn ,finger ,id ,chage 組管理: groupadd ,groupdel ,groupmod ,gpasswd newgrp 權限管理: chown ,chgrp ,chmod ,umask useradd [option] USERNAME -u UID -g GID (基本組) -G GID ,,,,,,,附加組 -c "COMMENT" -d /path //用戶指定家目錄 -s :指定shell 路徑 examples : useradd -s /bin/tsch user5 -m -k :建立家目錄,而且將/etc/skel 的文件copy 到家目錄 -M :不建立家目錄 // /etc/login.defs 指定了建立用戶的默認期限 userdel [option] USERNAME //不指定選項,默認不刪除家目錄 -r :同時刪除用戶家目錄 usermod [option] USERNAME -u :改UID -g :改基本組 // 組必須事先存在 -G :修改附加組 //此前附加組將被刪除 -a -G : 追加附加組 -c :註釋信息 -d :爲用戶建立新的家目錄,原有文件沒法訪問 -d -m :將原目錄文件copy 到新的目錄 -l : 修改用戶名 -L :鎖定帳號 -U :解鎖帳號 shch :修改shell shch account // 修改的shell 須要帶路徑 chfn : 修改註釋信息 chfn account 密碼管理: passwd USERNAME --stdin :從標準輸入中讀取密碼 examples: echo "test" |passwd --stdin user6 -l :lock 帳號 -u :unlock account -d :刪除密碼 passwd [-k] [-l] [-u [-f]] [-d] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username] -n :最短使用期限 -x :最長使用期限 pwck :檢查密碼文件的完整性,用戶帳號完整性 組管理: 建立組:groupadd groupadd: -g :指定GID -r : 對於useradd 添加系統用戶 0-500 -r :對於groupadd 添加系統組 groupmod : -g :GOD -n :修改組名 groupdel :刪除組 groupdel groupname gpasswd :修改組密碼 newgrp : 切換屬組,臨時切換用戶基本組,登陸爲一個新組,exit 還原 chage :改變用戶密碼過時信息 -d :最近一次的修改時間 -E :過時時間 -I :非活動時間 -m :最短使用期限 -M :最長使用期限 -W :警告時間 id :查看帳戶屬性信息 -u :UID -g :GID -G :GID -n :顯示name finger :檢索用戶信息 examples :finger userone 權限管理:chown ,chgrp 三類用戶: u:用戶 g:組 o:其餘 chown :改變文件屬主 -R :修改文件及其內部的文件的屬組,遞歸方式 --reference=<參考文件或目錄>:把指定文件或目錄的擁有者與所屬羣組所有設成和參考文件或目錄的擁有者與所屬羣組相同; chgrp :修改文件及目錄屬組 -R :遞歸修改 --reference=參考目錄屬組 chmod : chmod mode file,...... -R : 遞歸修改 --reference= 參考修改 修改某類用戶權限: u,g,o,a u=user g=group o=other a=all examples : chmod u=rwx abc chmod u=r,g=r,o=r abc 修改某類用戶的某個權限 chmod u-x,g+x abc chmod u+x,g+rwx,o+x abc ---------------------------------------------------------------- ls -l `which passwd` -rwsr-xr-x 1 root root 27936 Aug 11 2010 /usr/bin/passwd ---------------------------------------------------------------- openssl passwd -1 -salt '12345678' 將後面輸入的密碼進行加密,-1 指定MD5 加密,-salt 指定加"鹽"進行加密,單向加密 umask :遮罩碼,決定用戶默認目錄或文件默認權限 顯示當前用戶的umask 權限爲:文件爲666 -umask 目錄爲777 -umask 文件默認不能具備執行權限,不然權限+1 , SHELL 的類型, 登陸式shell : 正常經過某終端登陸 su - unername su -l usernal 非登陸式shell: su username 圖形終端打開命令窗口 自動執行的shell 腳本 bash 的配置文件: 全局配置: /etc/profile, /etc/profile.d/*.sh, /etc/bashrc 我的配置 ~/.bash_profile, ~/.bashrc 分析: profile 類的文件: 設定環境變量 運行命令或腳本 bashrc 類的文件: 設定本地變量 定義命令別名 登陸式shell 讀取配置文件: /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc 非登陸式shell 讀取配置文件: ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh echo "Hello . welcome my system `date`." profile設定環境變量 /etc/profile /etc/profile.d/*.sh . bash_profile ******************************************************************** 查看PATH:echo $PATH 以添加mongodb server爲列 修改方法一: export PATH=/usr/local/mongodb/bin:$PATH //配置完後能夠經過echo $PATH查看配置結果。 生效方法:當即生效 有效期限:臨時改變,只能在當前的終端窗口中有效,當前窗口關閉後就會恢復原有的path配置 用戶侷限:僅對當前用戶 修改方法二: 經過修改.bashrc文件: vim ~/.bashrc //在最後一行添上: export PATH=/usr/local/mongodb/bin:$PATH 生效方法:(有如下兩種) 一、關閉當前終端窗口,從新打開一個新終端窗口就能生效 二、輸入「source ~/.bashrc」命令,當即生效 有效期限:永久有效 用戶侷限:僅對當前用戶 修改方法三: 經過修改profile文件: vim /etc/profile /export PATH //找到設置PATH的行,添加 export PATH=/usr/local/mongodb/bin:$PATH 生效方法:系統重啓 有效期限:永久有效 用戶侷限:對全部用戶 #####環境變量的幾種修改方式,大多數咱們使用第三種 修改方法四: 經過修改environment文件: vim /etc/environment 在PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"中加入「:/usr/local/mongodb/bin」 生效方法:系統重啓 有效期限:永久有效 用戶侷限:對全部用戶 ********************************************************************************* 管理及I/O 重定向 管道和重定向: 程序:指令和數據 控制器:指令 運算器: 存儲器: 地址總線:內存尋址 數據總線:傳輸數據 控制總線:控制指令 寄存器:CPU 暫時存儲器 I/O 硬盤 系統設定 默認輸出設備:標準輸出 ,STDOUT 數字表示1 默認輸出設備:標準輸入,STDIN 數字表示0 標準錯誤輸出:STDERR .數字表示2 Linux : 0: Standard Input (STDIN) 1: Standard Output (STDOUT) 2: Standard Error Output (STDERR) 輸出 > 覆蓋文件中原有內容 set -C 禁止對已存在文件使用覆蓋重定向 set +C 表示關閉上述功能 強制覆蓋輸出 >| 追加輸出 >> 不覆蓋原有內容 &> 重定向標準輸出或者錯誤輸出到同一個文件 輸入 < tr "a-z" "A-Z" < /etc/fstab 輸入無追加方式,不能使用<< << 表示在此處生成文檔 examples : ----------------------------------------------- [root@centos /]# cat << END > sffs > sfsfs > fsfsff > END sffs sfsfs fsfsff [root@centos /]# ------------------------------------------------ [root@centos /]# cat >> /qazwsx.txt << EOF > sfsfs > gdgdg > gdgdg > EOF [root@centos /]# cat qazwsx.txt sfsfs gdgdg gdgdg [root@centos /]# 在腳本中使用文件 cat >> file.name << EOF 內容 >EOF EOF 和END 一對錶示起始和結束 ----------------------------------------------------- 管道:| : 前一個命令的輸出做爲後一個命令的輸入 ------------------------------------- echo "hello" | tr "a-z" "A-Z" HELLO 前一個命令的輸出作爲後一個命令的輸入 [root@centos /]# echo "default_zy" |passwd --stdin zy Changing password for user zy. passwd: all authentication tokens updated successfully. // 將輸出結果做爲後面passwd 的輸入來改變用戶密碼 cut -d: -f3 /etc/passwd |sort -n // 排序 cut -d: -f1 /etc/passwd |sort |tr "a-z" "A-Z" // 排序換成大寫 ls /var |tr "a-z" "A-Z" // 換成大寫 -------------------------------------- tee命令文件過濾分割與合併 tee命令用於將數據重定向到文件, 另外一方面還能夠提供一份重定向數據的副本做爲後續命令的stdin。 簡單的說就是把數據重定向到給定文件和屏幕上。 ls |tee out.txt //屏幕輸出一份,導入out.txt 文件一份 wc -l out.txt |cut -d " " -f1 //只顯示行號 查看 usr/bin 的個數 ls /usr/bin |ls -l 查看passwd 有哪些shell cut -d: -f 7 /etc/passwd |sort -u file /var/log/* or file `ls /var/log` 取出第6行,使用這個方法 head -6 /etc/inittab |tail -1 取出第七行的shell 類型,並顯示保存 tail -9 /etc/passwd |head -1 | cut -d : -f 7 |tee /out.put 顯示/etc 目錄下以pa 開頭的文件 ls -d /etc/pa* grep :文本查找須要 根據模式搜索文本,並將符合模式的文本顯示出來 grep ,egrep ,fgrep pattern :文本字符和正則表達式的元字符組合而成的匹配條件 使用方法: grep [options] PATTERN [FILE...] -i :忽略大小寫 --colour :語法高亮 -v :顯示沒有被匹配到的行 -o :只顯示被模式匹配到的字符串 正則表達式:Regular Expression *:任意長度任意字符 ?:任意單個字符 {} :範圍內 {^} :範圍外 [] :匹配指定範圍內的單個字符 字符集合:[:digit:],[:lower:],[:upper:],[:space:],[:alpha:],[:alnum:] 元字符: . 匹配任意單個字符 grep 'r..t' /etc/passwd --colour 匹配次數(竟可能長去匹配): *:匹配其前面的任意次數 grep 'a*b' ccc.txt // *號前面的字符出現任意次數 .*: 任意字符 // *號前面的. 表明的任意字符出現任意次數 ?:前一項可選,0次或者1次 \?轉義 \{m,n\}: 匹配其前面的字符,至少m 次,至多n 次 位置錨定: ^ :位置錨定 ,指定字符必須在行首出現 grep '^r..t' /etc/passwd $ :此字符前面的內容沒必要須出如今行尾 grep 'w$' /etc/inittab …^$:空白行 grep '^$' /etc/inittab |wc -l grep '[[:digit:]]$' /etc/inittab //查找數字結尾的行 grep '[[:space:]][[:digit:]]$' /etc/inittab //前面有一個空白字符 \< :錨定詞首,其後面的任意字符必須做爲單詞首部出現 \> :錨定詞尾,其前面的任意字符必須做爲單詞尾部出現 或者 \b 表示等同於 \>或者\< 分組: \(\) \(ab\)* 後向引用 \1:第一個左括號以及對應右括號所包括的全部內容 grep '\(l..e\).*\1' maoding.txt // 前面匹配到什麼後面就引用什麼,要求一致 grep '\([0-9]\).*\1$' /etc/inittab //前面有數字而且以相同數字結尾的行 正則表達式: 基本正則表達式:basic regexp 擴展正則表達式:extended regexp 基本正則表達式: .: []: [^]: 次數匹配: *: \? :0 或者1次 \{m.n\} :至多n 次 ,至少m次 .* :任意長度的任意字符 錨定: ^ : $: \< .\b \< .\b \1 , \2 ,\3 ........應用第幾個括號內的內容 grep :使用基本正則表達式定義的模式來過濾文本的命令。 -i :忽略大小寫 -v :不匹配的顯示 -o :只顯示匹配到的字符串 --colour :匹配高亮 -E :使用擴展的正則表達式 -A:而且顯示後面多少行 -B: 後面多少行 -C:先後多少行 擴展正則表達式: 字符匹配: .: 任意那個字符 [] :範圍內 [^]: 範圍外 次數匹配: * :其前字符任意次 ?: + :匹配其前面字符至少一次 {m,n} : 至少m 次至多n 次 位置錨定相同 分組: 或者 | : or grep -E 'C|cat' maoding.txt //表示查詢C或者cat grep -E '(C|c)at' maoding.txt //查詢 Cat 或者cat grep -E '^[[:space:]]+' maoding.txt //查詢使用空格結尾的行 egrep 等同於 grep -E 找出 /boot/grub/grub.conf 文件中1-255 之間的數字: egrep --colour '\<([1-9]|[1-9][0-9]|1[0-9]|2[0-4][0-9]|25[0-5])\>' \. \爲逃逸符讓 . 表示自己的意思 類IP段  1.0.0.0 到126.255.255.255 (0段和127段不使用) B類IP段 128.0.0.0 到191.255.255.255 C類IP段 192.0.0.0 到223.255.255.255 grep, egrep, fgrep fgrep :不支持正則表達式 shell 腳本編程: 編輯器,解釋器 編程語言:機器語言,彙編語言,高級語言 靜態語言:編譯型語言 強類型 (變量) 編譯完成纔可以執行 C,C++ .JAVA,C# 動態語言:解釋型語言 弱類型 邊解釋邊執行 ASP, ASP.net PHP ,shell python,perl 面相對象:JAVA,python ,perl ,C++ 面向過程:shell ,C 變量:內存空間,命名 內存:內存是編址的存儲單元 變量類型:肯定數據的存儲格式和長度 字符 數值 整型 浮點型:帶小數點 整型:8bit 0-255 布爾型:邏輯變量定義符 與運算: 1 0 0 1 1 1 0 0 0 非運算: !真 假 !假 真 異或運算 1 1 0 0 0 0 1 0 1 0 1 1 若是a、b兩個值不相同,則異或結果爲1。若是a、b兩個值相同,異或結果爲0 NULL 空 N/A 表示不適用 :Not Applicable bash 變量類型: 環境變量: 本地變量: 局部變量 位置變量: 特殊變量: 本地變量 bash: 引用變量${ } 能夠省略 echo "this is ${name}" // 不引發混淆能夠不加花括號 '' 單引號作強引用不作變量替換,不然"" 本地變量:做用於爲整個bash 進程 VARNAME=VALUE 局部變量:做用於當前代碼段 環境變量:做用於當前進程及其子進程 腳本在執行時會啓動一個子shell 進程 命令行中啓動的腳本會繼承當前sehll 環境變量 系統自動執行的腳本{非命令行啓動} 須要自我定義環境變量 pstree 查看當前進程 位置變量: $1 $2 //引用腳本參數 特殊變量:$? 保存上一個命令的執行狀態返回值 //保存某些特殊數據 程序執行,可能有兩類返回值 程序執行結果 程序狀態返回代碼 {0-255} 0:正確執行 1-255:錯誤執行:1 2 127 系統預留 s輸出重定向: > >> $>同時重定向 2> 錯誤重定向 /dev/null 軟件設備,bit bucket ,數據黑洞 ls fsfdsfds >out_success.txt 2>out_err.txt //將正確的導入success ,錯誤的導入err ls fsdfsfds &> test.txt //正確和錯誤的都導入一個文件 不支持&>> 追加輸出 ------------------------------------------------------------------------------------------------------------------- ********************************************************************************************************************** ls /etcfsdfdsfs >/dev/null 2>&1 //將標準錯誤輸出導入標準正確輸出,而後將標準正確輸出重定向到 /dev/null ********************************************************************************************************************** ---------------------------------------------------------------------------------------------------------------- >/dev/null 2>&1 // 實際上,應該等同於這樣: 1>/dev/null 2>/dev/null , 默認狀況下就是1,標準輸出,因此通常都省略。 而&符號, 後面接的是必須的文件描述符。不能寫成2>1, 這樣就成了標準錯誤重定向到文件名爲1的文件中了, 而不是重定向標準錯誤到標準輸出中。 因此這裏就是:標準輸出重定向到了/dev/null,而標準錯誤又重定向到了標準輸出, 因此就成了標準輸出和標準錯誤都重定向到了/dev/null 2>&1 >/dev/null //此方式爲不正確方式 命令從左往右執行,2>&1 爲將標準錯誤輸出重定向到標準輸出,而這時標準輸出是打印在屏幕上的,還沒執行到 >/dev/null 命令行的重定向什麼的, 是在執行命令以前就準備好了的. 解釋順序從左至右依次進行, 2&>1 ,而1是屏幕, 因此標準錯誤重定向到屏幕, 再而 1>/dev/null , 即標準輸出重定向到 /dev/null, 上述2>&1 >/dev/null 並非什麼同一時刻要麼產生標準輸出要麼產生標準錯誤. 而是兩個不一樣的東西. ---------------------------------------------------------------------------------------------------------------------- 撤銷變量: unset VARNAME //不用帶變量$ 符號 查看當前shell 中變量: set //不帶任何參數,查詢結果包含環境變量和本地變量 查看當前shell中的環境變量: printenv: env: export: export PATH=$PATH:/usr/local/apache/bin 添加環境變量 name=$name:zy_test //添加新的環境變量 腳本:命令的堆砌,按實際須要,編寫的程序 shebang:魔數 magic number) ******************************************************************* bash 實現條件判斷: 條件測試類型: 整數測試 字符測試 文件測試 條件測試的表達式: [ expression ] [[ expression ]] test expression 整數比較: -eq :測試兩個整數是否相等 好比 $A -eq $B 等於爲真 // 0 爲正確 1-255 表示錯誤 -ne :測試兩個整數是否不等,不等爲真 , -gt :測試一個數是否大於另外一個數,大於爲真,不然爲假 -lt :測試一個數是否小於另外一個數 -ge :大於或等於 -le :小於或等於 命令間的邏輯關係: 邏輯與: && id user1 &> /dev/null && echo "test" //前面執行成功,繼續執行後面,前面不成功後面不執行 邏輯或: || id user1 &> /dev/null && echo "test" //前面執行成功,就完成,不成功就執行後面的 !取反 !id user1 && useradd user1 //分析id user1 查看用戶是否存在, //存在爲0 ,不存在爲1,若是用戶不存在取反爲0 ,與的關係須要 //執行後半部分,使用種方式添加用戶,並檢測用戶是有以存在 。 變量名稱:只能包含字母數字下劃線,而且不能以數字開頭,不該該和系統中 已有的環境變量重名。最好作到見名知意。 ***************************************************** #!/bin/bash lines=`wc -l /etc/inittab` #echo $lines //判斷文件大小, finlines=`echo $lines |cut -d " " -f 1` //與和或的使用 #echo $finlines [ $finlines -gt 100 ] && echo "/etc/inittab is big file" || echo "/etc/inittab is small file" **************************************************************** #!/bin/bash name=root userid=`id -u $name` [ $userid -eq 0 ] && echo "$name is management" ||echo "$name is common user" ******************************************************************************** 條件判斷,控制結構: 單分支的if 語句, if 判斷條件,then statement1 statement2 ..... fi ———————————————————————————————————————————————————————————— 雙分支的if 語句, if 判斷條件 ; then statement1 statement2 ..... else statement1 .... fi ______________________________________________________ #!/bin/bash name=test110 if id $name &>/dev/null ;then echo "$name is exists" else useradd $name && echo "$name" | passwd --stdin $name echo "add $name is successful" fi ********************************************************************************* `` 反引號,引用命令執行結果 #!/bin/bash # # # # if grep '^$' /etc/inittab &> /dev/null ; then k_number=`grep '^$' /etc/inittab |wc -l ` echo "/etc/inittab null_line is $k_number" else echo "etc/inittab is null_line is null" fi *******// 判斷結構結尾必須有 fi // '^$' 表示空白行 ************************************************************** bash 之算數運算 let 命令: 1. let 算數表達式: let c=$a + $b 2.$ c=$[$a + $b] 3.$(()) c=$(($a+$b)) 4.expr 算數運算表達式,有空格 c=`expr $a + $b` exit :退出腳本 exit number —————————————————————————————————————————————————————— exit命令同於退出shell,並返回給定值。 在shell腳本中能夠終止當前腳本執行。 執行exit可以使shell以指定的狀態值退出。 若不設置狀態值參數,則shell以預設值退出。 狀態值0表明執行成功,其餘值表明執行失敗 ——————————————————————————————————————————————————————— 整數測試及特殊變量: ****************************************************** #!/bin/bash # # # # user_name=root_007 if ! grep "^$user_name\>" /etc/passwd &> /dev/null ;then // !取反,若是grep 爲真,取反爲假,因此不會執行then 的動做, //若是用戶不存在爲假,取反爲真,所以會執行then 的動做 echo "$user_name is non-existent" fi ******************************************************* 文件測試: 整數測試, -gt 大於 -le 小於等於 -ne 不等於 -eq 等於 -ge 大於等於 -lt 小於 number1 -eq number2 :比較number1和number2是否相等。若是相等,測試結果爲0 number1 -ne number2 :比較number1和number2是否不相等。若是不相等,測試結果爲0 number1 -gt number2 :比較number1是否大於number2。若是number1大於number2,測試結果爲0 number1 -lt number2 :比較number1是否小於number2。若是number1小於number2,測試結果爲0 number1 -ge number2 :比較number1是否大於等於number2。若是number1大於等於number2,測試結果爲0 number1 -le number2 :比較number1是否小於等於number2。若是number1小於等於number2,測試結果爲0 測試方法: [ expression ] 命令測試 [[ expression ]] 關鍵字測試 test 命令: test 命令是shell 環境中測試條件表達式的實用工具 -e file: 測試文件是否存在 -f file:測試文件是否爲普通文件 -d file: 測試文件是否爲目錄 -r -w :測試當前用戶對指定文件是否有rxw 權限 -x ------------------------------------------------------- #!/bin/bash # # # file=/etc/indfssfsfsdf if [ -e $file ] ; then echo "$file is exists " else mkdir -p /test_file1 fi ---------------------------------------------------------- #!/bin/bash # # # file=/etc/indfssfsfsdf if [ ! -e $file ] ; then //存在即爲真,不存在爲假,! 取反, //用戶不存在爲假,取反爲真。執行then echo "$file is exists " exit 8 fi -------------------------------------------------------- 圓整: echo $HISTSIZE echo $HISTFILESIZE history |tail -1 |cut -d ' ' -f 2 //剪裁cut 的使用 多分支的if 語句: if 判斷條件1;then statement1 elif 判斷條件2 ;then statement2 elif 判斷條件3 ;then statement4 else fi 測試腳本是否有語法錯誤,腳本 bash -n bash -x 將腳本每一步執行都進行輸出 echo $? //查詢上一條命令執行結果 0 or 1-255 bash 變量類型: 本地變量 {當前shell 進程 ,局部變量} 環境變量 { 當前和子 shell 進程 } 位置變量 $1 $2 shift ,按順序剔除變量,輪替 shift n : 剔除 n 指定的多個變量 特殊變量 $? 上一條命令的退出狀態碼 $# 顯示參數的個數 $* 參數列表 $@ 參數列表 —————————————————————————————————————————————————————————————— #!/bin/bash # # # if [ -e /etc/$1 ] ;then echo "OK file is $1" elif [ -e /etc/$2 ] ;then echo 「OK file is $2」 else echo "no such file " fi [root@centos /]# ./test111.sh inittab rc.d #將執行腳本後面跟的inittab #做爲變量賦值給$1 和 $2 OK file is inittab [root@centos /]# ./test111.sh inittabggg rc.d 「OK file is rc.d」 # shell 腳本 # 號表示註釋, shebang有兩個目的: 說明直接執行時以哪一個解釋器來執行; 明確該腳本應該以哪一個解釋器來執行; #!/bin/bash # # # if [ $# -lt 1 ] ;then # $# 的使用,判斷在執行時必須給定變量,不然error echo "error" #test123 elif [ -e /etc/$2 ] ;then echo 「OK file is $2」 else echo "no such file " fi ———————————————————————————————————————————————————————————————————— #!/bin/bash # # # echo "$1" "$2" HE=$[ $1 + $2 ] echo "$HE" JI=$[ $1 * $2 ] echo "$JI" ———————————————————————————————————— #!/bin/bash # # # if [ $# -lt 2 ] ; then echo "you value is <2 " exit 2 # 不符合退出 else echo "$1" "$2" HE=$[ $1 + $2 ] echo "$HE" JI=$[ $1 * $2 ] echo "$JI" fi [root@centos /]# ./test222.sh 123 456 # 將輸出的123 和456 做爲變量導入腳本,相加和相乘的結果輸出 ———————————————————————————————————————————————————————————— 工具: grep , sed , awk sed :流編輯器 ,模式空間 默認不編輯源文件,只對模式空間數據進行處理 sed 'addressCommand' file ... 命令格式 sed [options] 'command' file(s) sed [options] -f scriptfile file(s) d :刪除符合條件的行 p : 顯示符合條件的行 -n :只顯示符合條件的行,和p 配合使用 -n或--quiet或——silent:僅顯示script處理後的結果 s :查找而且替換 sed '1,2d' /etc/fstab |wc -l # 刪除指定文件fstab 中的1.2兩行,將模式空間打印在屏幕上 sed '/oot/d' /etc/fstab |wc -l # 刪除包含 oot 的行 選定行的範圍 '/字符串/' sed ' /^\//d' /etc/fstab |wc -l #刪除以 / 開頭的行 ,須要用 \ 進行轉義 sed -n ' /^\//p' /etc/fstab #只顯示匹配的行,顯示處理後的結果 \n 換行符 sed -n ' /^\//a\##################################' /etc/fstab #a\string 在當前行下面插入文本。爲在以\ 開頭的行下賣弄插入一行##.... sed -n ' /^\//i\##################################' /etc/fstab i\string 在當前行上面插入文本。 sed ' /^\//i\##################################\n$$$$$$$$$$$$$$$$$$$$$$$' /etc/fstab r :file 從file中讀行。將指定文件內容添加到符合條件的行處 w :將指定範圍內的內容另存至指定文件中 sed '/oot/w out_oot.txt' /etc/fstab #在fstab 文件中過濾包含oot 的行,w 可以將濾出來的行保存至指定文件夾。 sed 's/oot/OOT/' /etc/fstab # s 替換每行中第一次被模式匹配到的字符串 修飾符: g: 全局替換 sed 's/oot/OOT/g' /etc/fstab i: 查找時忽略大小寫 s 替換能夠使用其餘字符做爲分隔符,如: s@@@ , s### & :引用模式匹配整個串 sed 's@l..e@&r@g' sed_test.txt #查找l..e 的字符串後面加r 字符 ".." 爲模式匹配任意字符 sed 's@l\(..e\)@L\1@g' sed_test.txt 反向引用替換某個單詞中的某個字符 -i :-i 選項直接修改源文件 -e : 能夠同時執行多個腳本 -f : 調用腳本文件處理 列如: sed /path/sed.script file sed '$d' file # 刪除最後一行 sed -i '$d' /etc/fstab # 直接在源文件進行修改,刪除最後一行 history |sed 's@^[[:space:]]@@g' |cut -d ' ' -f1 取出history 的序號,刪除空格 sed 練習: 1. 刪除 /etc/grub.conf 文件中行首的空白字符 sed -r 's@^[[:space:]]+@@g' /etc/grub.conf 2.替換 /etc/inittab 文件中的"id:3:initdefault" 中的數字爲5 sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab sed -n 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g'\p /etc/inittab #-n 和p 參數組合使用,只顯示修改的參數 #-n選項和p命令一塊兒使用表示只打印那些發生替換的行 3.刪除 /etc/inittab 中的空白行 sed '/^$/d' /etc/inittab 4.刪除 /etc/inittab 文件中開頭的#號 sed 's@^#@@g' /etc/inittab 5.刪除文件中以# 號開頭的及後面的空白字符,且必須含有空白字符才執行。 sed -r 's@^#[[:space:]]+@@g' /etc/inittab #### -r 參數表示在腳本中使用擴展正則表達式 6.刪除空白字符及# 號開頭的部分 sed -r 's@^[[:space:]]+#@@g' /etc/inittab 7,取出一個文件中的目錄名稱 echo "/etc/rc.d" |sed -r 's@^(/.*/)[^/]+/?@\1@g' 字符串測試: == : 使用方法: [ $a = $b ] #等號兩邊爲空格 ,不然爲賦值的意思 != :不等號,不等爲真 > < -n :測試指定字符串是否爲空,空則真,不空則假。 -s :指定字符串是否不空,不空爲真,不然假 —————————————————————————————————————————————————————————————————————— #!/bin/bash # # # if ! id $1 &> /dev/null ; then echo "no such user" exit 10 #先判斷用戶是否存在不存在直接退出 fi if [ 'id -n -u $1' == 'id -n -u $1' ]; then echo "success" else echo "filed" fi ------------------------------------------------------------------------- shell 腳本循環: for 循環 while 循環 until 循環 格式: for value in 列表 ; do declare -i 聲明類型格式 循環體 done 如何生成列表: 整數列表:{1..100} seq 100 seq 命令: seq 起始數 步進數 結束數 ---------------------------------------------------------------------- #!/bin/bash # # # declare -i SUM=0 for number in {1..100} ; do let SUM=$[$SUM + $number] done echo "the sum is :$SUM" #計算1加到100的和 #!/bin/bash # # # LINES=`wc -l /etc/passwd | cut -d' ' -f1` for I in `seq 1 $LINES` ; do echo "hello user:`head -n $I /etc/passwd |tail -1 |cut -d: -f1`" done #取出全部用戶,而且使用hello user :輸出 ------------------------------------------------------------------------- vim 文本編輯器:字處理器 編輯模式: 輸入模式 末行模式 模式轉換: 編輯到輸入: i:在當前光標所在字符的前面插入 a:在當前光標所在字符的後面插入 o: 在當前光標所在行的下方插入一行 I: 定位在當前光標行首 A:當前光標行尾 O:在當前光標上方插入一行 編輯到末行: : 一:打開文件 vim +10 /etc/inittab # 打開文件光標直接處在第10 行 vim + /etc/inittab #快速處在最後一行 vim +/PATTERN :打開文件定位到第一次別pattern 匹配到的行 二:關閉文件 1.末行模式關閉文件 wq :保存而且退出 q :退出 q! : 強行退出 w : 保存 w! :強行保存 x :保存退出 2.編輯模式下退出 ZZ 按鍵: 保存退出 三。移動光標: 1.逐字符移動 h:左 j:下 k:上 l:右 n+光標鍵 ,可以快速移動{n 表示數字} 2.逐個單詞移動 w :移至下一個單詞的詞首 e :移至當前或下一個單詞詞尾 b : 跳至當前或者前一個單詞詞首 ##均可以使用數字加跳轉符號 3.行內跳轉 0 :絕對行首 ^ :行首的第一個非空白字符 $ : 絕對行尾 4.行間跳轉 G :#G 直接跳轉到指定的行例如:50G 末行模式下跳轉 :50 ## 直接給出行號便可 四:翻屏 Ctrl +f :向下翻譯屏 Ctrl +b :向上翻一屏 Ctrl +d :向下翻半屏 Ctrl +u : 向上翻半屏 五 : 刪除單個字符 x ;刪除單個字符 #x :能夠和數字配合,向後刪除,共# 號個字符 六,刪除命令:d d$:從光標刪除到行尾 d0:從光標刪除到行首 dw:逐個刪除單個單詞 #dw :刪除#號個單詞 dd :刪除當前光標所在行, #dd :刪除當前光標日後的行,包含當前行 末行模式: stataddr,endaddrd :刪除指定行範圍,末行模式 . :表示當前行 $ :最後一行 +# :向下的#行 七。粘貼命令:p p: 若是刪除的,或複製的爲整行內容分,則粘貼至光標所在行的下方,不然粘貼到光標所在後面 P:若是複製爲整行則粘貼到上方,不然粘貼到光標前面 八,複製命令 用法和d 命令相同 九.修改:c ,先修改再進入輸入模式 用法同d 命令 十.替換 r r: 單個字符替換 R:進入替換模式,替換多個字符,很是好的功能 十一. 撤銷編輯操做 u :撤銷前一次編輯操做 連續u命名可撤銷以前的操做,最多5次 #u 直接撤銷最近的操做,# 號表明數字 撤銷最近一次撤銷操做: Ctrl + r 十二: 重複前一次編輯操做 "." 符號 十三. 可視化模式 v: 按照字符選取 V:按照塊刪除 十四:查找 /PARRERN :向下 ?PATTERN :向上 n :向下 N : 向上 十五,替換 s/value1/value2/g g:全局替換 i:忽略大小寫 :%s/echo/yue/g #將全文中的echo 替換爲yue "%" 符號和1,$ 相同 。表示全文,指定全文查找並替換 ".",$:表示從當前行到行尾 %s@"ftp://wwww"@www.com@g ##最後分隔符不用轉義 十六: vim 編輯多個文件 vim 能夠跨文件使用 vim file1 file2 file3 末行模式下 :next 切換到下一個文件 :prev 切換到前一個文件 :last 切換到最後一個文件 :first 切換到第一個文件 :qa 退出全部文件 十七:分屏顯示 Ctrl +w ,s 水平分屏顯示 Ctrl +w ,v :垂直拆分窗口 在窗口之間切換 Ctrl +w ,方向鍵 :qa 關閉全部窗口 十八,分窗口多個文件 vim -o file1 file2 vim -O file1 file2 十九,將當前文件中部份內容保存到另一個文件 末行模式下使用w 命令 :w :w /etc/file #指定目錄文件 :addr.addew /etc/file #將某一部分保存 二十.將另一個文件內容填充到當前文件中 :r /etc/abc.txt #命令爲r 二十一,跟shell 交互 :! command 二十二,高級功能 1.顯示行號 set number 簡寫set null 2.取消顯示 set nonu 3.忽略大小寫 :set ic :set ignorecase :set noic 4.縮進 :set autoindent :set ai :set noai 5.搜索高亮 :set hlsearch :set nohlsearch 6.語法高亮 :syntax on 開 :syntax off 關 二十三,配置文件 /etc/vimrc 全局配置 家目錄 .vimrc 單個用戶影藏配置文件 --------------------------------------------------------------------- #!/bin/bash # # for I in {1..10}; do if id user$I &>/dev/null ;then echo "user$I is exists." userdel -r user$I #else # useradd user$I # echo user$I |passwd --stdin user$I &>/dev/null fi done #添加用戶刪除用戶練習 -------------------------------------------------------------------- #!/bin/bash # echo "$#" # "$#" 檢查輸入變量個數 if [ $# -lt 1 ] ;then #判斷是否小於1 echo "you enter is null" exit 1 #退出 ,失敗編碼1 fi if [ $1 == "add" ];then #if 判斷 for I in {1..10} ;do #for 循環 if id user$I &>/dev/null ;then echo "user:user$I is exists." else useradd user$I echo user$I |passwd --stdin user$I &>/dev/null echo "user$I is add" fi done elif [ $1 == "del" ];then for I in {1..10} ;do if id user$I &>/dev/null ;then userdel -r user$I echo "user$I is delete" else useradd user$I echo "user:user$I is add" fi done else echo "unknown enter" exit 8 fi ------------------------------------------------------------------------------------------------- for 循環 for I in {1.2.3.4} ;do done if 判斷 if id $I &>/dev/null ; then command if --------------------------------------------------------------- #!/bin/bash # # echo $1 for I in `echo $1 |sed 's/,/ /g'`; do if id $I &> /dev/null ;then echo "$I exists." else useradd $I echo $I |passwd --stdin $I &> /dev/null echo "add $I finished." fi done ###添加列表用戶 ./adminuser2.sh user1,user100,user200 ### `` 反引號,引用命令執行結果 ———————————————————————————————————————————————————————————————————————————— #!/bin/bash # # echo $1 $2 if [ $1 == "--add" ];then for I in `echo $2 |sed 's/,/ /g'`; do if id $I &> /dev/null ;then echo "$I exists." else useradd $I echo $I |passwd --stdin $I &> /dev/null echo "add $I finished." fi done elif [ $1 == '--del' ]; then for aaa in `echo $2 |sed 's/,/ /g'` ;do if id $aaa &> /dev/null ;then echo "$aaa del exists." userdel $aaa else echo "del user is not exists." fi done else echo "you write is error" exit 1 fi ### 添加和刪除用戶的測試腳本 ###輸入內容以下 #[root@centos test]#./adminuser2.sh --del tom1,tom2,tom3 #[root@centos test]#./adminuser2.sh --add tom1,tom2,tom3 -------------------------------------------------------------------- #!/bin/bash # # echo $1 $2 if [[ $1 == "--add" ]];then for I in `echo $2 |sed 's/,/ /g'`; do if id $I &> /dev/null ;then echo "$I exists." else useradd $I echo $I |passwd --stdin $I &> /dev/null echo "add $I finished." fi done elif [[ $1 == '--del' ]]; then for aaa in `echo $2 |sed 's/,/ /g'` ;do if id $aaa &> /dev/null ;then echo "$aaa del exists." userdel $aaa else echo "del user is not exists." fi done else echo "you write is error" exit 1 fi ###和上面腳本的區別,命令比較和關鍵字比較 #[ EXPIESS ] 命令比較如 :[ $1 -lt 2 ] #[[ express ]] 關鍵字比較 : [[ $1 == '--del' ]] ---------------------------------------------------------------------------------------------- usage :用法的意思,列入下面的使用 #!/bin/bash # # echo $1 $2 if [[ $1 == "--add" ]];then for I in `echo $2 |sed 's/,/ /g'`; do if id $I &> /dev/null ;then echo "$I exists." else useradd $I echo $I |passwd --stdin $I &> /dev/null echo "add $I finished." fi done elif [[ $1 == '--del' ]]; then for aaa in `echo $2 |sed 's/,/ /g'` ;do if id $aaa &> /dev/null ;then echo "$aaa del exists." userdel $aaa else echo "del user is not exists." fi done elif [[ $1 == '--help' ]];then echo "usage:adminuser2.sh -add or -del USERNAME1,USERNAME2" else echo "you write is error" exit 1 fi ------------------------------------------------------------------- 組合條件測試: 整數測試 le lt ge gt eq ne 字符測試 文件測試 組合測試: -a:與關係 -o:或關係 ! :非關係 大於1 小於3 if [ $# -gt 1 -a $# -le 3 ] if [ $# -gt 1 ] && [ $# -le 3 ] 兩種寫法 ---------------------------------------------------- #!/bin/bash # # # if [ $1 == 'q' -o $1 == 'Q' -o $1 == 'Quit' ]; then echo "quiting......start" exit 0 else echo "you write $1 is error" exit 1 fi #或參數的使用 -o -------------------------------------------------------- #!/bin/bash # # # if [ ! \($1 == 'q' -o $1 == 'Q' -o $1 == 'Quit'\) ]; then echo "quiting......start" exit 0 else echo "you write $1 is error" exit 1 fi ###取反和反斜線轉義的使用 ------------------------------------------------------------ 摩根定律 :非A 或 非B 表示 交集 let I=$[$1+1] let SUM+=$I 變量I 自己加 let I+=1 -= 至關於I-- += 至關於I++ /= %= --------------------------------- declare -i M # 聲明整型變量M ------------------------------------- #!/bin/bash # # declare -i ji_sum=0 declare -i ou_sum=0 for number in {1..100} ; do if [ $[$number%2] -eq 0 ];then let ou_sum+=$number else let ji_sum+=$number fi done echo "ji_sum:$ji_sum" echo "ou_sum:$ou_sum" #腳本取出奇數的和和偶數的和 #declare -i 定義整數變量 # let ou_sum+=$number # 在ou_sum 定義0 的基礎上,循環加上$I 定義的偶數 #奇數同理 ------------------------------------------- 文件查找:is not 文本查找 locate :全系統查找文件,非實時的,根據文件數據庫查找的 locate命令和slocate命令都用來查找文件或目錄。 locate命令實際上是find -name的另外一種寫法,可是要比後者快得多, 緣由在於它不搜索具體目錄,而是搜索一個數據庫/var/lib/locatedb, 這個數據庫中含有本地全部文件信息。Linux系統自動建立這個數據庫, 而且天天自動更新一次,因此使用locate命令查不到最新變更過的文件。 爲了不這種狀況,能夠在使用locate以前,先使用updatedb命令, 手動更新數據庫。 updatedb :手動更新文件數據庫 find : 實時 精確 支持衆多查找標準 遍歷指定目錄中全部文件,速度慢 usage : find 查找路勁 查找標準 查找後的處理動做 查找路徑:默認爲當前路徑 查找標準: 默認爲指定路徑下的全部文件 處理動做; 默認爲顯示 匹配標準: -name 'filename' :對文件名作精確匹配 文件名通配: * find -name '*passwd*' :表示出如今任意位置 ? [] -iname : 表示查找文件名時不區分大小寫 -regex pattern :基於正則表達式的文件名匹配 -user USRENAME : 根據屬主查找,查找指定用戶的文件 -group GROUPNAME ;根據屬組查找 -uid UID :根據UID 查找 用戶刪除後 ,屬主就是uid -gid GID :根據GID 查找 -nouser :沒有屬主的文件 -nogroup :沒有屬組的文件 -type: f:普通文件 d:目錄 c b l p s find /etc/tmp -type s -size k M G 組合條件: -a 與 -o 或 -not 非 find /tmp/ -not \( -user user1 -o -user user2 \) #查找屬主既不是user1 的也不是user2 的文件 UNIX/Linux文件系統每一個文件都有三種時間戳: 訪問時間(-atime/天,-amin/分鐘):用戶最近一次訪問時間。 + 大於5天 - 小於5天 ,啥沒有表示正好5天 修改時間(-mtime/天,-mmin/分鐘):文件最後一次修改時間。 變化時間(-ctime/天,-cmin/分鐘):文件數據元(例如權限等)最後一次修改時間。 -perm MODE #精確匹配 perm<權限數值>:查找符合指定的權限數值的文件或目錄 / 斜槓任意一位知足 - 減號精確匹配 動做:action -print :顯示 -ls :相似 ls -l 的形式顯示每一個文件的詳細狀況 -ok COMMAND {} \; find .-type f -user root -exec chown tom {} \; #找出當前目錄下全部root的文件,並把全部權更改成用戶tom -ok 和-exec 的區別就是-ok 的每一步執行都須要確認 stat 顯示文件狀態 xargs : xargs命令是給其餘命令傳遞參數的一個過濾器,也是組合多個命令的一個工具 -------------------------------------------------------------------------------- 特殊權限 SUID :運行程序時,進程的屬主是程序自身的屬主而不是啓動着 chmod u+s FILE chmod u-s FILE 若是文件自己有執行權限,則SUID 爲s ,不然S 大寫 -rwsr-xr-x 1 root root 25248 Mar 21 2012 /bin/cat 執行時使用root 用戶執行,而不是執行命名的普通用戶 ------------------------------------------------------------------- SGID :運行程序時,相應進程的屬組是程序文件自身的屬組,而不是啓動者所屬的基本組 chmod g+s chmod g-s --------------------------------------------------------------------- sticky :在一個公共目錄,每一個均可以建立文件,刪除本身的文件,但不能刪除別人的文件 chmod o+t chmod o-t chmod 1755 /backup/test 表示添加sticky 權限 ************************************************* 文件系統訪問列表: FACL :filesystem access control list 利用文件擴展保存額外的訪問控制權限 setfacl 設置 -m :設定 -x :取消設定 -d :爲目錄設置擴展屬性 ,裏面的都繼承 u :設定用戶 g: 設定組 列入:setfacl -m user:john:rw- ./test.txt #設定權限 setfacl -x user:zy inittab #取消設定,不須要指定用戶權限 setfacl -d -m user:john:rw ./dir #目錄下的文件都被john 訪問 -------------------------------------------------------- [root@centos test1]# getfacl inittab # file: inittab # owner: root # group: root user::rw- user:zy:rw- group::r-- mask::rw- //mask 不強制會隨着用戶的改變而變化 other::r-- ----------------------------------------------------- getfacl 獲取 查看某個文件acl ******************************* who: 顯示目前登陸用戶的信息 whoami :顯示當前有效用戶名稱 和 id -un 做用相同 w :顯示登陸用戶和正在作什麼 last :顯示用戶登陸及登陸時間信息 顯示 /var/log/wtmp 文件信息 lastb : /var/log/btmp 顯示錯誤的登陸信息 lastlog :顯示系統中全部用戶最近一次登陸信息 /var/log/lastlog mail : 命令行電子郵件發送接收工具 basename :打印文件或目錄的基本名稱 $0 命令自己,執行腳本時的路勁和名稱 -------------------------------- [root@centos log]# cat test123.sh #!/bin/bash echo " 'basename $0' " [root@centos log]# [root@centos log]# [root@centos log]# ./test123.sh 'basename ./test123.sh' ----------------------------- *************************************************** 重定向發送郵件 echo "hello,this is the content of mail.welcome to www.linuxde.net" | mail -s "Hello from linuxde.net by pipe" admin@linuxde.net echo 爲郵件正文內容 mail -s "Hello from linuxde.net by file" admin@linuxde.net < mail.txt #使用上面的命令後,咱們就能夠把mail.txt文件的內容做爲郵件的內容發送給admin@linuxde.net了。 ********************************************************************************** 隨機數 RANDOM :0-32768 隨機數生成器: /dev/random /dev/urandom echo -n :參數表示不輸出尾隨的換行符 ************************************* ***************************************************** #!/bin/bash # max=0 #min=0 for nub in {1..10}; do myrandom=$RANDOM [ $nub -eq 1 ] && min=$myrandom if [ $nub -le 9 ];then echo -n "$myrandom," else echo "$myrandom" fi [ $myrandom -gt $max ] && max=$myrandom [ $myrandom -lt $min ] && min=$myrandom done echo "$max,$min ###取出10 個隨機數找出最大和最小 ************************************************************************ bash -n :檢測語法錯誤 bash -x :顯示詳細執行過程 多分支if 語句 ***************************************** 經常使用格式 case 字符串 in 模式) 語句 ;; 模式2 | 模式3) 語句 ;; *) 默認執行的 語句 ;; esac 提示:esac就是case反過來寫。 ****************************************************** case 語句,選擇結構,結構明晰 case SWITCH in value1) statement ... ;; value2) statement ... ;; *) statement ... ;; esac -------------------------------- 列子:case 是bash 的多多分支判斷語句的一種 #!/bin/bash # case $1 in [0-9]) echo "$1 IS number" ;; [A-Z]) echo "$1 is character" ;; *) echo "$1 is error character" ;; esac ----------------------------------------------------- **************************************** 只接受start ,stop ,restart ,status #!/bin/bash # case $1 in 'start') echo "start server ..." ;; 'stop') echo "stop server ..." ;; 'restart') echo "restart server ..." ;; 'status') echo "running ..." ;; *) echo "`basename $0` {start|stop|restart|status}" ;; esac ##注意多分支判斷每一個判斷結束都要在後面加上;; **************************************************** #!/bin/bash # case $1 in -v|-verbose) echo "hello" ;; *) echo "unknown options" exit 7 ;; esac ##case 多分支判斷語句的多種實現方式 ******************************************* #!/bin/bash # DEBUG=0 case $1 in -v|-verbose) DEBUG=1 ;; esac useradd tom &> /dev/null [ $DEBUG -eq 1 ] && echo "add user tom," 加-v 或者-verbose 輸出咱們須要的指定信息 ************************************************ 腳本學習:case 和if for 循環的多種使用 ----------------------------- #!/bin/bash # # DEBUG=0 ADD=0 DEL=0 for I in `seq 1 $#`; do case $1 in -v|-verbose) DEBUG=1 shift ;; -h|-help) echo "Usage: `basename $0` --add userlist --del userlist -v|-verbose -h|-help" exit 0 ;; --add) ADD=1 ADDUSERS=$2 echo " show $2" shift 2 ;; --del) DELUSERS=$2 shift 2 ;; # *) # echo "error" # ;; esac done echo $DEBUG $ADD $DEL if [ $ADD -eq 1 ]; then for USER in `echo $ADDUSERS |sed 's@,@ @g'`;do if id $USER &>/dev/null ;then [ $DEBUG -eq 1 ] && echo "$USER exists" else useradd $USER [ $DEBUG -eq 1 ] $$ echo "add user $USER finished." fi done fi if [ $DEL -eq 1 ]; then for USER in `echo $DELUSERS |sed 's@,@ @g'`;do if id $USER &>/dev/null ;then [ $DEBUG -eq 1 ] && echo "DELETE $USER FINSHED" else useradd $USER [ $DEBUG -eq 1 ] $$ echo "$USER IS not exists." fi done fi ------------------------------------------------------------------------------- 腳本學習,比較複雜 #!/bin/bash # # DEBUG=0 ADD=0 DEL=0 for I in `seq 1 $#`; do if [ $# -gt 0 ] ;then case $1 in -v|-verbose) DEBUG=1 shift ;; -h|-help) echo "Usage: `basename $0` --add userlist --del userlist -v|-verbose -h|-help" exit 0 ;; --add) ADD=1 ADDUSERS=$2 echo " show $2" shift 2 ;; --del) DELUSERS=$2 shift 2 ;; *) echo "error" ;; esac fi done echo $DEBUG $ADD $DEL if [ $ADD -eq 1 ]; then for USER in `echo $ADDUSERS |sed 's@,@ @g'`;do if id $USER &>/dev/null ;then [ $DEBUG -eq 1 ] && echo "$USER exists" else useradd $USER [ $DEBUG -eq 1 ] $$ echo "add user $USER finished." fi done fi if [ $DEL -eq 1 ]; then for USER in `echo $DELUSERS |sed 's@,@ @g'`;do if id $USER &>/dev/null ;then [ $DEBUG -eq 1 ] && echo "DELETE $USER FINSHED" else useradd $USER [ $DEBUG -eq 1 ] $$ echo "$USER IS not exists." fi done fi ---------------------------------------------------------------------------------------- ****************************************************************************** 磁盤管理: 機械式硬盤: U盤,光盤,軟盤,硬盤,磁帶 sector : 扇區 cylinder :柱面 MBR :主引導記錄 (master boot record ) 446 byter:bootloader ,程序 64字節: 16byter :標識一個分區 {4個主分區} 2 byter :magic number 標識MBR 是否有效 BIOS : BIOS是英文"Basic Input Output System"的縮略詞, 直譯過來後中文名稱就是"基本輸入輸出系統"。 在IBM PC兼容系統上,是一種業界標準的固件接口。 [1] BIOS這個字眼是在1975年第一次由CP/M操做系統中出現。 [2] BIOS是我的電腦啓動時加載的第一個軟件。 其實,它是一組固化到計算機內主板上一個ROM芯片上的程序,它保存着計算機最重要的基本輸入輸出的程序、 開機後自檢程序和系統自啓動程序,它可從CMOS中讀寫系統設置的具體信息。 其主要功能是爲計算機提供最底層的、 最直接的硬件設置和控制。此外,BIOS還向做業系統提供一些系統參數。系統硬件的變化是由BIOS隱藏, 程序使用BIOS功能而不是直接控制硬件。現代做業系統會忽略BIOS提供的抽象層並直接控制硬件組件。 CRLF是Carriage-Return Line-Feed 縮寫: carriage-return line-feed BIOS 自檢> 根據啓動順序查找啓動設備> >讀取硬盤MBR > 把bootloader 加載到內存> 讀取分區表 > 查找操做系統內核> 內核啓動>系統啓動 主分區 擴展分區 inode :文件索引,標識文件信息 硬連接和軟鏈接(符號連接) -rwxr--r-x 1 root root 0 May 3 01:29 test1.txt 數字1爲硬連接的次數 ln -s 符號連接 使用絕對路徑 -v :顯示執行過程 1.可應用於目錄 2.能夠跨文件系統 3.不會增長被連接文件的次數 4.其大小爲指定路徑所包含的字符個數 ln 硬連接 1.只能對文件建立,不能應用於目錄 2.硬連接不能跨文件系統 3.建立硬連接會增長文件被連接的次數 ls -i 顯示文件inode 連接文件在一個上面修改,全部連接文件都生效 ----------------------------- [root@centos test1]# ls -i ln_case.sh 616086 ln_case.sh [root@centos test1]# ls -i case.sh 616086 case.sh [root@centos test1]# ls -i ./backup/test2.sh 616086 ./backup/test2.sh 硬連接inode 相同 ------------------------------------------- du :對文件和目錄磁盤佔用空間大小查看 df :查看磁盤分區可以使用的磁盤空間 設備文件: 塊設備 字符設備 主設備號 標示設備類型 次設備號 標示同一種類型不一樣設備 mknod :建立塊設備或者字符設備 -m :指定權限 mknod /dev/ttyUSB32 c 188 32 mknod -m 640 /dev/ttyUSB32 c 188 32 #建立字符設備,-m 指定訪問權限,指定文件名字符設備, 主設備,次設備號 設備文件試訪問入口 硬盤設備文件名: IDE。ATA :hd SATA :sd SCSI :sd USB :sd a.b.c 來區別同一種類型下的不一樣設備 查看當前系統識別硬盤: fdisk -l [Dev/device_name] sector :扇區 512 byter 格式化:低級格式化 ,建立磁道 高級格式化,建立文件系統 mkfs : VFS:virtual file system 管理磁盤分區: fdisk /dev/sda p:顯示當前硬盤分區,包括沒保存的改動 n: 建立新分區 d:刪除一個分區 w:保存並退出 q:不保存並退出 t:修改分區類型 L:在t 下查看分區類型 l: 顯示全部支持的類型 擴展分區是個指針,須要建立新的分區指向 partprobe :重讀分區表 cat /proc/partitions :查看是否讀取分區表 ext3:日誌文件系統,journal file system 在實際使用中: home .var usr/local 使用單獨分區,由於常常被使用 stat :顯示文件或文件系統狀態 stat -f :顯示文件系統狀態 文件系統管理: 從新建立文件系統會損毀已有數據 mkfs ; make file system 建立文件系統 mkfs -t 指定文件系統類型 文件系統類型: cat /proc/filesystems ;查看支持文件系統 mke2fs : 專門管理ext 文件系統 -j : 直接建立爲ext3 文件系統 -b BLOCK_SIZE:指定塊大小 -L :指定分區卷標 -m #:指定預留給超級用的塊數百分比 mke2fs -m 3 /dev/sda6 b<區塊大小>:指定區塊大小,單位爲字節; -c;檢查是否有損壞的區塊; -f<不連續區段大小>:指定不連續區段的大小,單位爲字節; -F:無論指定的設備爲什麼,強制執行mke2fs; -i<字節>:指定"字節/inode"的比例; -N:指定要創建的inode數目; -l<文件>:從指定的文件中,讀取文件西中損壞區塊的信息; -L<標籤>:設置文件系統的標籤名稱; -m<百分比值>:指定給管理員保留區塊的比例,預設爲5%; -M:記錄最後一次掛入的目錄; -q:執行時不顯示任何信息; -r:指定要創建的ext2文件系統版本; -R=<區塊數>:設置磁盤陣列參數; -S:僅寫入superblock與group descriptors,而不更改inode able inode bitmap以及block bitmap; -v:執行時顯示詳細信息; -V:顯示版本信息。 blkid : 查詢磁盤相關屬性 e2label : 查看卷標 partprobe /dev/sda :從新讀取 調整文件系統的相關屬性 tune2fs: -j : 將我ext2 升級爲ext3 -L :修改卷標 -m #: 調整預留百分比 -o :設定默認掛載選項 -c #: 指定掛載次數達到#次後進行自檢,0或者-1 表示關閉此功能 -i #:沒掛載多少天后進行自檢 -l :顯示超級塊 的信息 dumpe2fs: dumpe2fs命令用於打印「ext2/ext3」文件系統的超級塊和快組信息 -h ; 只顯示超級塊的信息 fsck :檢查並修復linux 文件系統 -t ; 指定文件系統 -a:自動修復文件系統,不詢問任何問題; -A:依照/etc/fstab配置文件的內容,檢查文件內所列的所有文件系統; -N:不執行指令,僅列出實際執行會進行的動做; -P:當搭配"-A"參數使用時,則會同時檢查全部的文件系統; -r:採用互動模式,在執行修復時詢問問題,讓用戶得以確認並決定處理方式; -R:當搭配"-A"參數使用時,則會略過/目錄的文件系統不予檢查; -s:依序執行檢查做業,而非同時執行; -t<文件系統類型>:指定要檢查的文件系統類型; -T:執行fsck指令時,不顯示標題信息; -V:顯示指令執行過程。 -f ;強制檢查,即便文件系統標記爲乾淨 e2fsck : 專用於修復ext2/ext3 文件系統 -p :-f強制檢查,即便文件系統標記爲乾淨 -f : 強制檢查 掛載:將新的文件系統關聯至當前根文件系統 卸載:將某文件系統與當前根文件系統的關聯關係移除 mount ; mount 設備 掛載點 設備: 設備文件 卷標 UUID 掛載點: 1. 此目錄沒有被使用 2.目錄事先要存在 3.目錄中原有的文件暫時被影藏 umount 設備,或者卸載點 注意;1 ,沒有被進程使用 mount : 顯示當前系統已經使用的掛載點和設備 mount [options] [-o options] device MOUNTPOINT -a :掛載 /etc/fstab 中定義的全部文件系統 -n :默認狀況下mount 命令沒掛載一個設備都會將信息保存在/etc/mtab 中,-n 不寫 -t ; 指定正在掛載設備上的文件系統類型,不指定默認 blkid 指定 -r : 只讀掛載, 掛載光盤時使用 -w ; 讀寫掛載 -o : 指定額外的掛載選項,也指定掛載的文件屬性 remount :掛載爲只讀 ro :掛載爲只讀、 rw ;讀寫掛載 mount -o remount,ro /dev/sda6 #從新掛載指定權限爲只讀 SWAP : 虛擬內存,交換分區 free: -m 選項以M 顯示 建立交換分區: mkswap /dev/sda8 須要在fdisk 中調整分區類型 swapon /dev/sda7 #啓用交換分區 swapoff /dev/sda7 #關閉交換分區 迴環設備: loopback :使用軟件來模擬實現硬件 建立一個鏡像文件, dd 命令:dd命令用於複製文件並對原文件的內容進行轉換和格式化處理 dd if=/dev/zero of=sun.txt bs=1M count=1 dd if=/dev/sda of=/root/mbr.backup bs=512 count=1 #將sda 分區的前512 個字節複製到root 下 ------------------------------------------------------------------------------------------------ mount -o loop /root/BIGIP-9.4.8.355.0.iso /mnt/test/ 迴環設備( 'loopback device')容許用戶以一個普通磁盤文件虛擬一個塊設備。 設想一個磁盤設備,對它的全部讀寫操做都將被重定向到讀寫一個名爲 disk-image 的普通文件而非操做實際磁盤或分區的軌道和扇區。(固然,disk-image 必須存在 於一個實際的磁盤上,而這個磁盤必須比虛擬的磁盤容量更大。)迴環設備容許你 這樣使用一個普通文件。 ------------------------------------------------------------------------------------------------ #********掛載本地迴環設備 df -h :查看分區 文件系統的配置文件: /etc/fstab OS 在初始化時會定義fstab 的每一個文件系統 掛載設備 掛載點 文件系統類型 掛載選項 轉儲平率 自檢次序{根爲1} mount -a ;掛載/etc/fstab 文件中定義的全部文件系統 fuser :驗證進程正在運行的用戶 fuser -v /root fuser -km /root #將掛載點上的用戶踢掉 -a:顯示命令行中指定的全部文件; -k:殺死訪問指定文件的全部進程; -i:殺死進程前須要用戶進行確認; -l:列出全部已知信號名; -m:指定一個被加載的文件系統或一個被加載的塊設備; -n:選擇不一樣的名稱空間; -u:在每一個進程後顯示所屬的用戶名。 迴環設備是指用一個文件來模擬一個文件系統,由於是在文件系統之上來模擬文件系統因此有迴環一說。 壓縮和解壓縮: 格式: gz,bz2,xz,zip,Z 壓縮算法:算法不一樣,壓縮比也會不一樣 compress ;最先的壓縮算法 uncompress : xz,bz2,gz gzip :gz bzip2 :.bz2 xz :.xz gzip /PATH/TO/FILE : 壓縮完成後刪除源文件 gunzip /PATH/TO/FILE.gz :解壓縮後刪除源文件 gzip -d :也能夠執行壓縮和gunzip 功能相同 zcat : 查看壓縮文件,查看文本文件 bzip2 : 比gzip 壓縮效率更小 bzip2 /PATH/TO/FILE : 壓縮完成後刪除源文件 -d :解壓縮 -k :保留源文件 bunzip2 :解壓縮 bzcat2 : 查看壓縮文件 xz : xz /PATH/TO/FILE : 壓縮完成後刪除源文件 -d :解壓縮 -k :保留源文件 -# : 指定壓縮比,默認6 unxz :解壓縮 xzcat :查看壓縮文件 xzdec :解壓縮,保存須要重定向 zip :壓縮目錄,技能歸檔又能壓縮,默認不刪除源文件 格式: zip FILENAEM.zip file1 file2 unzip :解壓縮 tar :建立文件和歸檔 -c :建立歸檔文件 -f :file.tar :操做的歸檔文件 tar -cf test.tar test* #歸檔 -x : 展開歸檔 tar -xf test.tar --xzttrs :歸檔同時保留擴展屬性信息 -t : 查看歸檔文件 tar -tf test.tar 查看歸檔文件 -zcf : 壓縮歸檔 ,gzip -zxf :解壓縮歸檔 ,gzip -jcf : bzip2 -jxf : -Jcf : xz -Jxf : tar -zxf :指定的解壓縮格式能夠省略 tar -jtf :不展開查看壓縮文件 cpio :歸檔工具 cpio命令主要是用來創建或者還原備份檔的工具程序, cpio命令能夠複製文件到歸檔包中,或者從歸檔包中複製文件 ---------------------------------------------------------------- #!/bin/bash # echo -n "input two number:" read A B echo "$A + $B is :$[ $A+$B ]" #####read 交互式執行 -p :直接添加要附加輸出的內容 read -p "proint" A B -t :指定超時時間 read -t 5 -p "input number" A B ------------------------------------------------------------------ while 循環,適用於循環次數位置的場景,要有退出條件 語法: while CONDITION; do statement ...... done ---------------------------------------------------------------- #!/bin/bash # # declare -i start=1 declare -i SUM=0 while [ $start -le 100 ]; do let SUM+=$start let start++ done echo "$SUM" ###while 循環1到100 的和 ----------------------------------------------------------------- #!/bin/bash # # who | grep "hadoop" &> /dev/null RETVAL=$? while [ $RETVAL -ne 0 ] ; do echo " `date` user hadoop is not login " sleep 5 who |grep "hadoop" &> /dev/null RETVAL=$? done echo "hadoop is login successful" ###檢查Hadoop 用戶是否登陸 -------------------------------------------------------------------- RAID : 磁盤陣列(Redundant Arrays of Independent Disks,RAID), 有「獨立磁盤構成的具備冗餘能力的陣列」之意。 RAID 的磁盤組織方式不一樣,沒有上下之分 RAID1: 鏡像:每一個盤都保存相同數據 RAID2:校驗碼, RAID有不一樣的級別。 在這裏,咱們僅列出在真實 下的使用最多的 RAID 級別。 RAID0 = 條帶化 RAID1 = 鏡像 RAID5 = 單磁盤分佈式奇偶校驗 RAID6 = 雙磁盤分佈式奇偶校驗 RAID10 = 鏡像 + 條帶。(嵌套RAID) 硬件RAID 軟件RAID mdadm:將任何塊設備作成RAID 模式化命令: 建立模式 -C 專用選項: -l:級別 -n:設備個數 -a:自動爲其建立設備文件 -c:指定chunk 大小默認64Kb 管理模式 --add ,--remove ,--fail 監控模式 -F 增加模式 -G 裝配模式 -A **************************************************** mdadm -C /dev/md0 -a yes -l 0 -n 2 /dev/sda{5,6} #建立raid0 , mke2fs -j /dev/md0 #格式化 mount /dev/md0 /mnt/test #掛載使用 fdisk -l #查看 ******************************************************** 查看raid 陣列詳細信息 mdadm -D /dev/md1 or /md0 --detial :詳細 mdadm -S |--stop /dev/md0 #中止陣列 mdadm -A |--start /dev/md1 /dev/sda7 /dev/sda8 mdadm /dev/md1 -f /dev/sda7 #模擬硬件損壞 mdadm --detail -scan /dev/mdadm.conf #將raid 信息保存到 /etc/mdadm.conf 下次啓動自動裝配,不用指定 mke2fs -j -E stride=16 指定條帶大小,16 X4 cat /proc/mdstat watch :週期性的執行某個命令,並以全屏方式顯示 -n : 指定週期長度,單位爲秒。默認2s 格式: watch -5 `COMMAND` lsmod命令用於顯示已經加載到內核中的模塊的狀態信息 MD,DM DM :device mapper 邏輯設備: RAID ,LVM2 device Mapper(DM)是Linux 2.6全面引入的塊設備新構架, 經過DM能夠靈活地管理系統中全部的真實或虛擬的塊設備。 DM以塊設備的形式註冊到Linux內核中, 凡是掛載(或者說「映射」)於DM結構下的塊設備, 無論他們是如何組織,如何通信,在Linux看來都是一個完整的DM塊設備。 所以DM讓不一樣組織形式的塊設備或者塊設備集羣在Linux內核面前有一個完 整統一的DM表示。 1、DM與MD 在Linux內核代碼中(本文以2.6.33內核代碼爲參照), DM指的是整個Device Mapper的設計框架。 MD(Mapped Device)是框架所虛擬出來的各類設備。 簡而言之DM就是不一樣種類的MD通過特定的關係鏈接到塊設備管理器上的大構架。 DM的內核代碼集中在drivers/md目錄中。 DM構架相關的代碼在dm.c和dm-io.c文件中, 各類抽象的MD虛擬設備代碼分散在同目錄的其餘文件中, 除了dm-ioctl.c是dm設置接口設備。 LVM2(Linux Volume Manager 2 version):邏輯卷管理 DM:LVM2 鏡像: 多路徑 pv: 物理卷 pe :物理區塊 vg:卷組 lv:邏輯卷 pvcreate 建立物理卷 pvs :查看 pvdisplay: 查看 pvscan :掃描 pvremove:將PV 刪除 pvmove:將當前PV 數據移到其餘pv vg: vgcreate ,vgremove ,vgextend ,vgs,vgreduce vgcreate VG_NAME /path/to/pv -s #;PE 大小,默認4MB vgremove myvg ::刪除VG lvcreate -n lv_name -L #G VG_NAME #建立卷 lv -n 指定名字 -L 指定卷的大小 須要格式化,而後掛載使用 lvremove :移除邏輯卷,須要指定卷路徑 /dev/mapper/lvname 一.擴展邏輯卷: resize2fs命令被用來增大或者收縮未加載的「ext2/ext3」文件系統的大小。 若是文件系統是處於mount狀態下,那麼它只能作到擴容,前提條件是內核 支持在線resize。,linux kernel 2.6支持在mount狀態下擴容但僅限於ext3 文件系統。 lvextend: -L [+]# /path/to/LV resize2fs -p /path/to/LV 5G 二.縮減邏輯卷: 不能在線縮減,先卸載,並確認剩餘空間能保存以前的文件,先強行檢查文件系統 resize2fs /PATH/TO/pv 3G #將邏輯捲進行縮減 lvreduce -L [-]# /path/to/LV 從新掛載 e2fsck -f #強行檢查文件是否同步 三.快照卷: 1.生命週期爲整個數據時長,在這段時間內,數據增加大於擴招卷自動損毀 快照卷和原卷在一個卷組內 lvcreate -s ;指定快照卷 -p :r|w 指定權限 lvcreate -L # -n SLV_NAME -p r /path/to/LV LVM是Linux環境中對磁盤分區進行管理的一種機制, 是創建在硬盤和分區之上、文件系統之下的一個邏輯層, 可提升磁盤分區管理的靈活性。RHEL5默認安裝的分區格式就是LVM邏輯卷的格式, 須要注意的是/boot分區不能基於LVM建立,必須獨立出來。 until CONDITION; do #unitl 到.....爲止 statement .... done 進入循環條件不知足,退出循環條件知足 for 變量 in 列表;do 循環體 done for (( expr1 ; expr2 ; expr3 )); do 循環體 done ******************************************************************* #!/bin/bash declare -i SUM=0 for I in {1..100}; do let SUM+=$I done echo $SUM declare -i SUM2=0 for ((nub=1;nub<=100;nub++));do let SUM2+=$nub done echo $SUM2 ## for 循環體的另外一種使用 # # ********************************************************************* ping -c 指定ping的次數 -c 2 -w :指定超時時間 ping -c 2 -W 2 192.168.1.100 &>/dev/null $? awk 的使用: awk是一種編程語言,用於在linux/unix下對文本和數據進行處理 awk 'pattern{ACTION}' file df -h |awk '{print $1 }' #顯示第一列 df -h |awk '{print $NF}' #顯示最後一列 awk -F: '{print $1,$3}' /etc/passwd -F :指定分隔符 sync: sync命令用於強制被改變的內容馬上寫入磁盤,更新超塊信息 printf: printf命令格式化並輸出結果到標準輸出 \n :換行 TCP/IP linux 網絡配置: linux :網絡屬於內核的功能 lo: 本地迴環接口 以太網網卡:ethX 開頭 pppX RHEL5:/etc/modprobe.conf alias: RHEL6:/etc/udev/rules.d/ ifconfig ;網絡配置命令 -a :顯示全部接口的信息 ifconfig eth0 IP/MASK [up|down] 當即生效重啓失效 網絡服務: RHEL5; /etc/init.d/network {start|stop|restart|status} RHEL6: etc/init.d/networkManager {start|stop|restart|status} route:路由 add :添加 -host :主機路由 -net: 網絡路由 -net 0.0.0.0 route add -net|-host DEST gw 下一跳 del:刪除 -host -net route del -net 10.0.0.0/8 route -n:以數字方式顯示主機等信息 #上述修改重啓失效 網絡配置文件: /etc/sysconfig/network 網絡接口配置文件: /etc/sysconfig/network_scripts/ifcfg-eth0 DEVICE=:關聯設備名稱 BOOTPROTO=: {static|none|dhcp|bootp} 引導協議 IPADDR=:地址 NETMASK=:掩碼 GATEWAY=:默認網關 ONBOOT=:開機時是否自動啓動 HWADDR=: 硬件地址;可省 USERCTL :{yes|no} 是否容許普通用戶控制接口 PEERDNS=:{yes|no} 是否接受在dhcp 模式下的dns、 #上述配置重啓主機或服務生效 重啓: /etc/init.d/network 路由: /etc/sysconfig/network-scripts/route-ethX 添加格式: DEST via nexthop ———————————————————————————————————————————— create 文件:route-eth1 100.100.100.100/32 via 172.16.0.254 ———————————————————————————————————————————————— 格式二: ADDRESSO= NETMASK0= GATEWAY0= ********************************************************************* 1、臨時添加路由 重啓network服務失效 方法一 route命令 frags爲路由標誌,標記當前網絡節點的狀態 add 增長路由 U Up表示此路由當前爲啓動狀態 del 刪除路由 H Host,表示此網關爲一主機 -net 目標地址是一個網絡 G Gateway,表示此網關爲一路由器 -host 目標地址是一個主機 R Reinstate Route,使用動態路由從新初始化的路由 netmask 子網掩碼 D Dynamically,此路由是動態性地寫入 gw 出口網關 IP地址 M Modified,此路由是由路由守護程序或導向器動態修改 dev 出口網關 物理設備名 ! 表示此路由當前爲關閉狀態 ------------------------------------------------------------------------------------------------------------------------- 例子:eth0 192.168.14.209/24 192.168.14.254 eth1 192.168.8.107/24 192.168.8.1 兩個網卡都能上網 系統啓動時前後啓動eth0 eth1並把eth1網關設置爲默認網關,要求把eth0設置爲默認網關,訪問公網ip123.57.223.144 123.57.190.33分別走不一樣網卡 route del default gw 192.168.8.1 dev eth1 刪除默認網關 後邊的dev eth1也能夠不寫 route add default gw 192.168.14.1 dev eth0 添加默認網關 route del -net 0.0.0.0 gw 192.168.8.1 dev eth1 刪除默認路由 後邊dev eth1能夠不寫 route add -net 192.168.15.0/24 gw 192.168.14.254 dev eth0 添加到15網段的路由 在eth0 route add -host 192.168.15.119 gw 192.168.14.254 dev eth0 添加到主機路由 在eth0 route add -host 123.57.223.144 gw 192.168.14.254 dev eth0 訪問公網IP 123.57.223.144走eth0 route add -host 123.57.190.33 gw 192.168.8.1 dev eth1 訪問公網ip 123.57.190.33 走eth1 route del -net 192.168.30.0/24 reject 屏蔽一條路由 -------------------------------------------------------------------------------------------------------------------------- 添加完成查看命令 route -n | route -e | netstat -rn | ip route show | ip route list [root@3F-209 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 123.57.190.33 192.168.8.1 255.255.255.255 UGH 0 0 0 eth1 U up G Gateway H Host 192.168.15.119 192.168.14.254 255.255.255.255 UGH 0 0 0 eth0 123.57.223.144 192.168.14.254 255.255.255.255 UGH 0 0 0 eth0 192.168.15.0 192.168.14.254 255.255.255.0 UG 0 0 0 eth0 192.168.30.0 - 255.255.255.0 ! 0 - 0 - 192.168.14.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.8.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1 0.0.0.0 192.168.14.254 0.0.0.0 UG 0 0 0 eth0 -------------------------------------------------------------------------------------------------------------------------- 臨時添加路由 方法二 ip route add default via 192.168.14.254 dev eth0 ip route add 192.168.15.0/24 via 192.168.14.254 dev eth0 ip route add 123.57.190.33 via 192.168.8.1 dev eth0 -------------------------------------------------------------------------------------------------------------------------- 2、永久添加路由 重啓network服務生效 支持用#註釋 方法一 a、添加默認網關,即默認路由 兩塊網卡在配置文件ifcfg-ethX中不配置網關,在/etc/sysconfig/network中設置默認網關 vim /etc/sysconfig/network GATEWAY=192.168.14.254 b、添加路由 建立/etc/sysconfig/static-routes配置文件 vim /etc/sysconfig/static-routes any net 192.168.15.0/24 gw 192.168.14.254 any host 123.57.223.144 gw 192.168.14.254 any host 123.57.190.33/32 gw 192.168.8.1 -------------------------------------------------------------------------------------------------------------------------- 方法二 在/etc/sysconfig/network-scripts/下建立配置文件route-ethX vim /etc/sysconfig/network-scripts/route-eth0 0.0.0.0/0 via 192.168.14.254 dev eth0 這條爲默認路由,另外一種格式 default 192.168.14.254 dev eth0 192.168.15.0/24 via 192.168.14.254 dev eth0 123.57.223.144 via 192.168.14.254 dev eth0 vim /etc/sysconfig/network-scripts/route-eth1 123.57.190.33 via 192.168.8.1 dev eth1 配置完重啓服務 service network restart <pre name="code" class="plain">-------------------------------------------------------------------------------------------------------------------------- 注:linux雙網卡默認路由問題linux在加載網卡配置文件的時候是先加載eth0,再加載eht1的,這樣,若是eth1設置了gateway項,則會覆蓋掉eth0中的gateway設置,所以解決方法就是刪除eth1的gateway設置,在配置/etc/sysconfig/network添加網關 ***************************************************************************************** DNS服務器修改配置文件: {最多三個} /etc/resolv.conf nameserver dns1 nameserver dns2 nameserver dns3 host文件: /etc/hosts 配置寫法: 主機IP 域名 別名 hostname:主機名 hostname 主機名:當即生效,但不是永久有效 /etc/sysconfig/network HOSTNAME=NAME setup: network config tools #上面操做直接修改配置文件,重啓生效 iproute2軟件: ip命令用來顯示或操縱Linux主機的路由、網絡設備、 策略路由和隧道,是Linux下較新的功能強大的網絡配置工具 ip link:網絡接口屬性 addr:協議地址 route:路由 link: show set 用法: ip -s link show ip link set DEVICE {up |down |arp on|off} ip link set eth1 down addr 一塊網卡能夠有多個地址, eth0:0 以下: ifconfig eth0:0 3.3.3.3/24 清除地址 ifconfg eth0:0 down 配置方法; ifconfig ethX:X /etc/sysconfig/network-scripts/ifcfg-ethX:X DEVICE=ethX:X 不能使用dhcp add ip addr add ADDRESS dev DEVICE #使用 ip addr show 查看 label :指定別名 del ip addr del ADDRESS dev DEVICE show ip addr show dev DEV to PREFIX flush :清空地址 ip addr flush to 10/8 #刪除10開頭的地址 ip route add -- 添加新路由   ip route change -- 修改路由   ip route replace -- 替換已有的路由   縮寫:add、a;change、chg;replace、repl   示例1: 設置到網絡10.0.0/24的路由通過網關193.233.7.65   # ip route add 10.0.0/24 via 193.233.7.65   示例2: 修改到網絡10.0.0/24的直接路由,使其通過設備dummy   # ip route chg 10.0.0/24 dev dummy 軟件包管理: 應用程序: 程序: C 語言:源代碼> 編譯(二進制格式) 腳本:解釋器,(二進制程序) RPM是RPM Package Manager(RPM軟件包管理器)的縮寫 源代碼>編譯>連接>運行 程序: 庫: 靜態庫 動態庫 配置文件: ******************************************************************** RPM 有五種基本的操做方式(不包括建立軟件包): 安裝, 卸載, 升級, 查詢,和驗證。 軟件包的組成部分: 二進制程序:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin 庫文件:/lib, /usr/lib, /usr/local/lib 配置文件:/etc 幫助文件:手冊, README, INSTALL (/usr/share/doc/) RPM: RPM is Package Manager 源程序:name-version.tar.{gz|bz2|xz} 版本號:major.minor.release bash-4.3.1.tar.xz 包名-主版本號-次版本號-發行號 包名-主版本號.次版本號.源程序發行號-rpm包的發行號.主機平臺.cup架構 ******************************************************************************************* /etc,/bin,/sbin,/lib 系統啓動須要的程序,不能單獨掛載分區 /usr/ bin sbin lib 操做系統核心功能,能夠單獨分區 /usr/local/ bin sbin lib/ etc man 第三方軟件 /opt #有些軟件默認安裝在opt 目錄下 /dev :設備文件,不能單獨分區 lsb_release -a 查看linux系統版本 uname -a 查看內核版本 /root 不能單獨分區 /var 日誌文件,建議單獨分區 /boot 內核 initrd 內核: POST(加電自檢) BIOS MBR > 內核 ********************************************************* 啓動第一步--加載BIOS 當你打開計算機電源,計算機會首先加載BIOS信息,BIOS信息是如此的重要,以致於計算機必須在最開始就找到它。這是由於BIOS中包含了CPU的相關信息、設備啓動順序信息、硬盤信息、內存信息、時鐘信息、PnP特性等等。在此以後,計算機內心就有譜了,知道應該去讀取哪一個硬件設備了。 啓動第二步--讀取MBR 衆所周知,硬盤上第0磁道第一個扇區被稱爲MBR,也就是Master Boot Record,即主引導記錄,它的大小是512字節,別看地方不大,可裏面卻存放了預啓動信息、分區表信息。 系統找到BIOS所指定的硬盤的MBR後,就會將其複製到0×7c00地址所在的物理內存中。其實被複制到物理內存的內容就是Boot Loader,而具體到你的電腦,那就是lilo或者grub了。 啓動第三步--Boot Loader Boot Loader 就是在操做系統內核運行以前運行的一段小程序。經過這段小程序,咱們能夠初始化硬件設備、創建內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便爲最終調用操做系統內核作好一切準備。 Boot Loader有若干種,其中Grub、Lilo和spfdisk是常見的Loader。 咱們以Grub爲例來說解吧,畢竟用lilo和spfdisk的人並很少。 系統讀取內存中的grub配置信息(通常爲menu.lst或grub.lst),並依照此配置信息來啓動不一樣的操做系統。 啓動第四步--加載內核 根據grub設定的內核映像所在路徑,系統讀取內存映像,並進行解壓縮操做。此時,屏幕通常會輸出「Uncompressing Linux」的提示。當解壓縮內核完成後,屏幕輸出「OK, booting the kernel」。 系統將解壓後的內核放置在內存之中,並調用start_kernel()函數來啓動一系列的初始化函數並初始化各類設備,完成Linux核心環境的創建。至此,Linux內核已經創建起來了,基於Linux的程序應該能夠正常運行了。 啓動第五步--用戶層init依據inittab文件來設定運行等級 內核被加載後,第一個運行的程序即是/sbin/init,該文件會讀取/etc/inittab文件,並依據此文件來進行初始化工做。 其實/etc/inittab文件最主要的做用就是設定Linux的運行等級,其設定形式是「:id:5:initdefault:」,這就代表Linux須要運行在等級5上。Linux的運行等級設定以下: 0:關機 1:單用戶模式 2:無網絡支持的多用戶模式 3:有網絡支持的多用戶模式 4:保留,未使用 5:有網絡支持有X-Window支持的多用戶模式 6:從新引導系統,即重啓 關於/etc/inittab文件的學問,其實還有不少 啓動第六步--init進程執行rc.sysinit 在設定了運行等級後,Linux系統執行的第一個用戶層文件就是/etc/rc.d/rc.sysinit腳本程序,它作的工做很是多,包括設定PATH、設定網絡配置(/etc/sysconfig/network)、啓動swap分區、設定/proc等等。若是你有興趣,能夠到/etc/rc.d中查看一下rc.sysinit文件,裏面的腳本夠你看幾天的 啓動第七步--啓動內核模塊 具體是依據/etc/modules.conf文件或/etc/modules.d目錄下的文件來裝載內核模塊。 啓動第八步--執行不一樣運行級別的腳本程序 根據運行級別的不一樣,系統會運行rc0.d到rc6.d中的相應的腳本程序,來完成相應的初始化工做和啓動相應的服務。 啓動第九步--執行/etc/rc.d/rc.local 你若是打開了此文件,裏面有一句話,讀過以後,你就會對此命令的做用一目瞭然: # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don’t # want to do the full Sys V style init stuff. rc.local就是在一切初始化工做後,Linux留給用戶進行個性化的地方。你能夠把你想設置和啓動的東西放到這裏。 啓動第十步--執行/bin/login程序,進入登陸狀態 此時,系統已經進入到了等待用戶輸入username和password的時候了,你已經能夠用本身的賬號登入系統了。:) === 漫長的啓動過程結束了,一切都清靜了… ****************************************************************************** 軟件包管理器的核心功能: 1.製做軟件包 2.安裝,卸載,升級,查詢,效驗 Redhat ,SUSE : RPM Debian :dpt 依賴關係; 前端工具;yum ,apt-get yum 是RPM 的前端工具 apt-get 是dpt 的前端工具 後端工具:RPM,dpt rpm : 數據庫 :/var/lib/rpm 安裝: rpmbuild: 安裝,查詢,卸載,升級,效驗,數據庫的重建工做 noarch是no architecture的縮寫,說明這個包能夠在各個不一樣的cpu上使用 1.安裝 rpm -i /PATH/TO/PACKET_FILE -i : 指定安裝文件 -h : 以#號顯示進度,每一個# 表示2%; -v :顯示詳細過程 -vv :顯示更詳細的過程 examples: rpm -ivh /PATH/TO/PACKET_FILE --nodeps: 忽略依賴關係 --replacepkgs:從新安裝,替換原有安裝 --force :強行安裝,能夠實現重裝和降級 rmp格式文件有兩種形式 二進制包(Binary)以及源代碼包(Source)兩種。 二進制包能夠直接安裝在計算機中,而源代碼包將會由RPM自動編譯、安裝。 源代碼包常常以src.rpm 2.查詢 -q :查詢模式 rpm -a 包名 rpm -qa :查詢安裝的全部包, rpm -qi PACKET_NAME :查詢指定包的信息 rpm -ql PACKAGE_NAME :查詢指定安裝包生成的文件列表 rpm -qf /path/to/somefle :查詢指定的文件是有那個rpm 包生成的 rpm -qc NAME : 查詢指定安裝包的配置文件 rpm -qd NAME :查詢指定安裝包的幫助文件 rpm -q --scripts PACKAGE_NAME: 查詢指定安裝包包含的腳本 rpm deplist:顯示rpm軟件包的全部依賴關係。 rpm -qpi /PATH/TO/PACKAGE_NAME : rpm -qpl /PATH/TO/PACKAGE_NAME : #查詢某個rpm包還沒有安裝,查詢其說明信息,安裝之後的生成的文件 3.升級 rpm -Uvh /PATH/TO/NAME_FILE :若是有老版本則升級,不然退出 rpm -fvh /PATH/TO/NAME_FILE :若是有老版本則升級,不然退出 rpm -ivh --oldpackage NAME :降級到低版本 4,卸載 rpm -e PACKAGE_NAME :卸載, --nodeps :有依賴關係沒法卸載,使用nodeps 強制卸載 5.效驗 rpm -V package_name : 效驗 6.重建數據庫 rpm : --rebuilddb :重建數據庫,必定會從新創建 --initdb :初始化數據庫。沒有則進行創建 7.檢驗來源合法性,及軟件完整性 rpm -K /path/to/file_name rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 #導入祕鑰 scp :scp命令用於在Linux下進行遠程拷貝文件的命令,和它相似的命令有cp,不過cp只是在本機進行拷貝不能跨服務器,並且scp傳輸是加密的。可能會稍微影響一下速度 #將本地文件傳送到遠程服務器 scp /home/daisy/full.tar.gz root@172.19.2.75:/home/root #將遠程服務器文件傳送傳到本地 scp root@www.cumt.edu.cn:/home/root/others/music /home/space/music/1.mp3 yum : client : 配置文件:指定yum 倉庫的信息,路徑等 yum工具做爲rpm包的軟件管理器,能夠進行rpm包的安裝、升級以及刪除等平常管理工做,並且對於rpm包之間的依賴關係能夠自動分析,大大簡化了rpm包的維護成本。 yum工具的配置,主要由兩個文件控制:/etc/yum.conf以及/etc/yum.repos.d/filename.repo 關於/etc/yum.conf文件:主要承擔全局配置[main],此外也能夠在此處配置軟件倉庫(repository) 關於/etc/yum.repos.d/filename.repo:主要承擔具體軟件倉庫的配置(若上面yum.conf中配置了軟件倉庫,此處也能夠選擇不配置),filename可自行定義。 參數解釋以下: [rhel-debuginfo]:用於區分不一樣的repository,在一個filename.repo文件中,能夠定義一個或者多個repository name:用於對repository的描述 baseurl:用於指定獲取rpm包的源位置,支持http://、ftp://、file://三種協議。 enabled:用於定義此軟件倉庫是否可用。0:不可用,1:可用 gpgcheck:定義是否對rpm包進行GPG校驗。 gpgkey:用於定義校驗的gpg密鑰文件的位置。 如下是關於管理的經常使用命令 yum repolist : 查看可用的軟件倉庫信息 yum list rpm包 : 查看rpm包的安裝狀況,支持通配符*,若爲被安裝,顯示可用的軟件倉庫 yum list installed |grep rpm包: 查看rpm包是否被安裝 yum info rpm包 : 查看rpm包詳細信息 yum check-update : 檢查可用的rpm包更新 yum install rpm包 : 安裝rpm包,支持通配符* yum remove rpm包 : 刪除rpm包 yum clean packages : 清除rpm包緩存 yum clean headers : 清除rpm頭文件緩存 yum clean all : 清除rpm頭文件以及包緩存 yum -y update :更新yum 源, yum makecache : 就是把服務器的包信息下載到本地電腦緩存起來 *************************** 運行命令生成緩存: yum clean all yum makecache #替換yum 必需要作的動做 ******************************** wget 命令: wget 命令用來從指定的URL 下載文件。 編譯環境,開發環境 手動編譯安裝; make :項目管理工具, Makefile : make install :安裝 **************************************************** #準備編譯環境,安裝"development tool" 編譯安裝的三步驟: ./configure --help :獲取腳本使用幫助 --prefix=/path/to/somewhere : --sysconfdir=/path/to/config_file ;指定配置文件安裝位置 make make install ************************************************ 這些都是典型的使用GNU的AUTOCONF和AUTOMAKE產生的程序的安裝步驟。 ./configure是用來檢測你的安裝平臺的目標特徵的。好比它會檢測你是否是有CC或GCC,並非須要CC或GCC,它是個shell腳本。 make是用來編譯的,它從Makefile中讀取指令,而後編譯。 make install是用來安裝的,它也從Makefile中讀取指令,安裝到指定的位置。 AUTOMAKE和AUTOCONF是很是有用的用來發布C程序的東西。 **************************************************** ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf 其中咱們經過--prefix制定了安裝路徑, 經過--conf-path制定了配置文件的具體位置 1.修改path 環境變量,可以識別二進制程序路勁 2. 添加額外的lib 庫路徑 3.頭文件:include netstat -ntlp: -t或--tcp:顯示TCP傳輸協議的連線情況; -u或--udp:顯示UDP傳輸協議的連線情況; -r :顯示路由 -p: Linux 進程管理: thread :線程 Psmisc 軟件包含: fuser 顯示使用指定文件或者文件系統的進程的PID。 killall 殺死某個名字的進程,它向運行指定命令的全部進程發出信號。 pstree 樹型顯示當前運行的進程。 #若是沒有pstree 命令請安裝 psmisc 軟件 進程狀態 父子關係 優先級關係 優先級:100-139 用戶優先級 0-99 內核優先級 數字越小,優先級越高 PID :process ID 進程號 init : 全部進程的父進程 pstree :顯示進程樹 ps: a:查看和終端有關的進程 u:顯示進程是哪一個用戶啓動的 x:和終端無關 ps aux |head 進程的分類: 和終端有關 和終端無關 進程狀態: D:不可中斷睡眠 R:運行或者就緒 S:可中斷睡眠 T:中止 Z:殭屍 < :高優先級 N :低優先級 +: 前臺進程組中的進程 l:多線程進程 s: 會話進程首進程 pgrep:命令以名稱爲依據從運行進程隊列中查找進程,並顯示查找到的進程id #只顯示進程號 pgrep bash top:實時動態的查看系統運行狀態 M:根據駐留內存大小進行排序; P:根據CPU使用百分比大小進行排序; T:根據時間/累計時間進行排序; w:將當前設置寫入~/.toprc文件中。 l:切換顯示平均負載和啓動時間信息; m:切換顯示內存信息; t:切換顯示進程和CPU狀態信息; top -d 1 :指定刷新時長 top -b : 批處理模式 top -n 3 :只顯示3屏 vmstat:顯示虛擬內存信息 vmstat 1 :每秒鐘顯示一次 free:查看內存 kill: pkill: bg: fg: 進程間通訊:IPC inter process Communication 共享內存 信號:signal semaphore : kiil : 終止一個進程 1 號信號 SIGHUP:不用重啓從新讀取配置文件 2 SIGINT: 終止一個前臺進程 9 SIGKILL : 殺死一個進程 15 SIGTERM : 終止一個進程 ,進程正常退出 指定一個信號: 信號號碼: kill -1 信號名稱: kill -SIGKILL 信號名稱簡寫: kill -KILL kill -9 PID killall 進程名 :killall httpd & 符號:在前臺程序執行最後面添加& 符號,使進程在後臺工做 前臺————》後臺: Ctrl + z 做業送日後臺中止 bg :讓後臺中止做業繼續運行 jobs :查看後臺做業 + :命令默認將操做的做業 - :第二個要操做的做業 bg {JOBID} :bg 1 fg : 將後臺做業調回前臺 fg jobid : fg 1 kill %1 :殺死後臺的做業 :kill 時不能省略 uptime : 查看系統運行時間 /proc/meminfo : 查看當前信通內存信息 LINUX 系統啓動流程 POST (加電自檢) > BISO 包含啓動信息> MBR 裝載boot loader > kernel > /sbin/init 內核設計風格; 單內核: 微內核: redat :內核 /lib/modules/內核版本號命名的目錄/ vmlinux-2.6 ;內核 ldd :顯示程序所依賴的庫文件 chroot : 根切換 ,指定位置坐根目錄 linux的基礎啓動流程 1. 加載BIOS的硬件信息,並獲取第一個啓動設備的代號。 2. 讀取第一個啓動設備的MBR的引導加載程序(即lilo、grub、spfdisk等)的啓動信息。 3. 加載操做系統的核心信息,核心開始解壓,並嘗試驅動全部的硬件設備。 4. 核心執行init程序並得到運行信息。 5. init執行/etc/rc.d/rc.sysinit文件。 6. 啓動核心的外掛模塊(/etc/modprobe.conf)。 7. init執行運行的各個批處理文件(Script) 8. init執行/etc/rc.d/rc.local文件。 9. 執行/bin/login程序,等待用戶登陸。 10. 登陸以後開始以shell控制主機。 分區1:啓動分區 /boot Boot 存放開機文件,通常爲100M左右(50M~200M)。 分區2:根分區 / 根目錄(必須與/bin, /sbin, /lib, /dev, /etc這5個目錄在同一分區,不可掛載在不一樣分區,不然系統沒法正常啓動) - /bin Binaries 普通命令,如文件操做。 - /sbin System-only binaries 系統命令,如分區、格式化操做。 - /lib Libraries 開機時會用到的函式庫,以及/bin或/sbin下的指令會用到的函式庫。 - /dev Devices 在linux中任何裝置與周邊設備都是以檔案的型態存在於這個目錄當中,如/dev/tty, /dev/hd*, /dev/sd*等。 - /etc Etcetera 系統的全部配置文件,包括經過系統自動安裝的程序的配置文件,如nginx,mysql等配置文件。 啓動服務不一樣: 運行級別: 0 :halt 1 :單用戶模式,直接以管理員的身份登陸 2 :多用戶模式,不啓用nfs (網絡文件系統) 3 :正常模式, 多用戶模式,文本模式,只有命令行 4 :保留模式,沒有定義的模式,不適用 5 :圖形模式,有圖形界面操做 6 :reboot ,重啓 詳解: 主引導記錄(MBR,Main Boot Record)是位於磁盤最前邊的一段引導 (Loader)代碼 bootloader {MBR} LILO :linux loader GRUB: stage 1 :加載MBR stage 2 :加載bootloader ———————————————————————————————————————————————————————————————————————————————————————— grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/sda2 # initrd /initrd-version.img #boot=/dev/sda default=0 #默認啓動的編號 timeout=5 #等待用戶選擇的時長 splashimage=(hd0,0)/grub/splash.xpm.gz #指定背景圖片 hiddenmenu #影藏菜單 password --md5 $1$yufSX/$./Yv4PRkp9t2IANb4SLVg/ #對grub 進行進入驗證 #注意--md5 必須是-- 哦 title CentOS (2.6.18-398.el5) #內核標題 root (hd0,0)#表示第一塊磁盤的第一個分區 #內核文件所在的設備,對grub 全部類型硬盤都是hd 光盤第cdrom kernel /vmlinuz-2.6.18-398.el5 ro root=LABEL=/ rhgb quiet #指定kernel 內核文件路徑及傳遞給內核的參數 initrd /initrd-2.6.18-398.el5.img #initrd 文件 —————————————————————————————————————————————————————————————————————————————————————— grub-md5-crypt 給grub 加密,將一個密碼進行MD5 加密 查看運行級別: runlevel :顯示當前運行級別 who -r : 顯示當前運行級別 查看當前內核: uname -r : 顯示當前內核版本 安裝grub stage1: 執行grub 命令 dd if=/dev/zero of=/dev/sda bs=400 count=1 #將grub 啓動的分區前400 字節破壞掉 修復 :執行grub root (hd0,0) setup (hd0) #從新安裝grub quit :退出 grub-install -root-directory=/mnt /dev/hda #在新分區安裝grub 修復2 : grub find 查找 root (hd#,0) kernel /path/kernel initrd /path/to/file boot kernel 初始化的過程: 1.設備探測 2.驅動初始化 須要從initrd 文件中裝載驅動模塊或者initramfs 3.以只讀方式掛載根文件 4.裝載第一個進程init (PID 1 ) /sbin/init {/etc/inittab} LANG=zh_CN.UTF-8 id:runlevels:action:process 標識符:運行級別:什麼狀況下執行動做:要執行的動做 id:3:initdefault: initdefault :設定默認運行級別 sysinit :系統初始化 wait:等待級別切換完成 respawn:進程終止就再啓動一次 /etc/rc.d/rc.sysinit 1.激活udev 和selinux 2.根據/etc/sysctl.conf 文件來設定內核參數 3.設定時鐘 4.裝載鍵盤映射 5.啓用交換分區 6.設置主機名 7.根文件系統檢測,並以讀寫方式從新掛載 8.激活raid 和LVM 設備個數 9.啓用磁盤配額 10.根據 /etc/fstab 檢查並掛載其餘文件系統 11.清理過時的鎖和PID 文件 si::sysinit:/etc/rc.d/rc.sysinit #開機服務啓動OS 初始化 rc0.d/ K* stop S* start /etc/rc/d/init.d /etc/init.d 服務類腳本: SysV /etc/rc.d/init.d start |stop |restart|status reload|configtest chkconfig :定義運行級別,在哪些級別下默認啓動的 chkconfig: 2345 95 05 runlevel SS KK :級別 ;啓動次序 :關閉次序 description:描述信息,說明此腳本的簡單功能 \. 反斜槓換行 chkconfig 命令:檢查設置系統的各項服務 chkconfig --list #查看全部獨立守護進程的服務 chkconfig --del service_name chkconfig --level servie_name {on|off} chkconfig --level 24 httpd on chkconfig --level 3 httpd on runlevels :- 表示沒有級別默認S* 開頭的連接 /etc/rc.d/rc.local 系統最後啓動的一個腳本,能夠定製開機啓動的命令 /etc/inittab 功能: 1.設定默認運行級別 2.運行系統初始化腳本 3.運行指定運行級別對應目錄下的腳本 4.設備ctrl+alt+delete 組合鍵的操做 5.定義UPS 電源在電源故障/恢復時指定的腳本 6.啓動虛擬終端 7.啓動圖形終端 (5運行級別) ************************************************************************************ ************************************************************************************ #重點 CentOS 6: init 程序爲;upstart 配置文件爲 /etc/inittab /etc/init/*.conf 啓動流程: POST :加電自檢 BOOT sequence (BISO) boot loader {MBE} :搜索啓動功能的設備bootloader 存放在MBR kernel :加載內核 ,經過ramdisk 完成加載 rootfs :加載真正的根文件系統,完成根切換 /sbin/init : 加載init程序 ,centos 6 是 /etc/inittab ,/etc/init/*.conf 設定默認運行級別 系統初始化 關閉或啓動對應服務下的服務 分解: GRUB (boot loader):GRand Unified Bootloader 是一個來自GNU項目的多操做系統啓動程序 grub legacy: stage1 :mbr stage1_5: mbr 以後的扇區,讓stage1 中的BootLoader 識別stage2 所在分區的文件系統 stage2 :磁盤分區 (/boot/grub), 配置文件:/boot/grub/grub.conf <-- /etc/grub.conf #內核文件和ramdisk 在grub.conf 中定義 #1.5 階段給grub 加載文件系統驅動 stage2 及內核等一般放置在一個基本磁盤分區 功用: 1.提供菜單,而且提供交互式接口 e: 編輯模式 ,編輯菜單 c: 命令模式,交互式接口 2.加載用戶選擇的內核或操做系統 容許用戶傳遞參數給內核 可影藏詞菜單 3.爲菜單提供保護機制 爲編輯菜單進行認證 爲啓用內核或操做系統提供認證 如何識別設備: root hd#,# :第幾塊磁盤的第幾塊分區 hd#: 磁盤編號,數字表示 # :分區編號,數字表示,從0 開始編號 grub 的命令行接口 help ;查看幫助 find (hd0,0)/path/file_name root (hd0,0) kernel /path/to/kernel_name #指定本次啓動使用的內核文件,額外還能夠添加許多內核支持的cmdline參數 initrd /path/to/initrd_name #設定爲選定的內核提供額外文件的ramdisk boot #引導啓動選定的內核 手動在grub 命令行接口啓動系統: root (hd0,0) kernel /vmlinux- ro root=/dev/device initrd /initramfs-version-release.img boot 配置文件: /boot/grub/grub.conf 配置項: default=# 設定默認啓動的菜單項,菜單項(title)編號從 0 開始 timeout=# 等待時間 splashimage=(hd#,#)/path/to/xpm_pic.xpm.gz hiddenmenu :影藏菜單 password --md5 string密碼串 #菜單編輯認證,須要認證才能進行編輯 #每一個title 下面均可以進行認證, title TITLE:定義菜單項"標題" root (hd#,#)grub 查找stage2 及kernel 文件所在的設備分區,爲grub "根" kernel /path/to/vmlinux-vresion [parameters] #啓動的內核 initrd /path/to/initrams_file #內核匹配的ramfs 文件 #grub-md5-crypt 給grub 加密,將一個密碼進行MD5 加密 進入單用戶模式: 1.編輯grub 菜單 (選定要編輯的titile ,按e鍵進入 ) 2.在選定的kernel 後附加 1,s,S 或者single 均可以 3.在kernel 所在行,鍵入b 命令 安裝grub test: 添加硬盤格式化,建立boot 分區 根分區 mount grub-install -root-directory=/mnt /dev/hda #在新分區安裝grub cp kernel cp initrd 編輯 grub.conf #從新建立 root (hd0,0) kernel /vmlinux ro root=/dev/sda3 selinux=0 init=/bin/bash 建立 根目錄 mount 建立各類文件目錄 cp /bin/bash /mnt/sysroot/bin/ ldd /bin/bash #把全部的庫文件cp 一份 chroot /mnt/sysroot 安裝grub stage1: 執行grub 命令 dd if=/dev/zero of=/dev/sda bs=400 count=1 #將grub 啓動的分區前400 字節破壞掉 修復 :執行grub root (hd0,0) setup (hd0) #從新安裝grub quit :退出 緊急救援模式修復grub 守護進程類型: 獨立守護進程 xinetd :超級守護進程 瞬時守護進程,不須要關聯至運行級別 核心:/boot/vmlinux-vresion 內核模塊:ko ,/lib/modules/version 內核設計: 單內核: 微內核: 裝載模塊: insmod modprobe www.kernel.org 用戶空間訪問,監控內核的方式 /proc ,/sys 僞文件系統 /proc/sys :此文件不少事可讀寫的 設定內核參數值的方法: echo VALUE > /proc/sys/file sysctl 命令: sysctl命令被用於在內核運行時動態地修改內核的運行參數, 可用的內核參數在目錄/proc/sys中。它包含一些TCP/ip堆棧和 虛擬內存系統的高級選項, 這可讓有經驗的管理員提升引人注目的系統性能。用sysctl能夠讀取設置超過五百個系統變量。 sysctl -a :查看全部可讀變量 編輯此文件:/etc/sysctl.conf :內核參數設定文件,永久有效 sysctl : -p:從配置文件「/etc/sysctl.conf」加載內核參數設置 sysctl -a :查看全部可讀變量 內核模塊管理: lsmod :列出當前內核加載的模塊 modprobe MOD_name :裝載模塊 modprobe -r MOD_NAME :卸載模塊 modinfo MOD_name : 查看單個模塊信息 insmod ;將指定模塊加載到內核中 insmod /path/to/file 裝載模塊 rmmod mod_name :卸載模塊 內核中編譯時的三中功能: 1.不使用此功能 2.編譯成內核模塊 3.編譯盡內核 yum grouplist --disablerepo=\* --enablerepo=local 查詢本地yum 源 ,指定查詢yum 爲本地配置的鏡像文件 yum groupinstall 開發工具 --disablerepo=\* --enablerepo=local 指定本地yum 源安裝套件組 如何手動編譯內核: make gconfig :Gnome 桌面環境使用 ,須要圖形開發庫 make kconfig :KED 桌面環境, 須要圖形開發庫 make menuconfig : 手動編譯安裝 執行make menuconfig q缺乏ncurses 文件 執行下面 yum install ncurses-devel cp config-3.10.0-693.el7.x86_64 /usr/src/linux #通常編譯將本機系統的config文件複製到編譯的內核目錄中進行編譯 make menuconfig :選擇 make ;編譯 make modules_install:安裝內核模塊 make install :安裝內核 reboot 在重啓時會提時使用新的內核 screen 命令:命令行中斷切換軟件 screen -ls :顯示已經創建的屏幕 screen :直接打開一個新的屏幕 ctrl +a ,d:拆除屏幕 screen -r ID:還原某屏幕 二次編譯時清理:備份文件 make clear make mrproper grub----->kernel---->initrd---->rootfs{/sbin/init,/bin/bash} 將內核複製到 /mnt/boot/ 目錄下 mkinitrd /boot/initrd-`uname-r`.img `uname -r` 指定 文件路徑 內核版本號 cpio -id <../initrd-2.6_name 或者 zcat /boot/initrd_name |cpio -id find . |cpio -H newc --quit -o |gzip -9 > /mnt/boot/initrd.gz 打包壓縮輸出重定向 ldd命令用於打印程序或者庫文件所依賴的共享庫列表 ******************************************************************************************* POST------BIOS --------BOOTloader-----kernel(initrd,initramfs)---init(/etc/inittab) /etc/inittab 設定默認運行級別 系統初始化(/etc/rc.d/rc.sysinit) 設定指定級別的服務腳本 /etc/rc.d/init.d /etc/rc.d/rc#.d rc0.d ---rc6.d K* S* 00-99 運行次序 啓動虛擬終端 啓動圖形終端 /etc/rc.d/rc.sysinit: 檢測並以只讀方式從新掛載根文件系統 設定主機名 檢測並掛載 /etc/fstab 中的其餘文件系統 啓動swap分區 初始化外圍硬件設備 根據/etc/sysctl.conf 設定內核參數 激活udev 和selinux 激活LVM 和RAID 設備 清理過時的鎖和PID 文件 裝載鍵盤映射 ************************************************************************************** parted命令 是由GNU組織開發的一款功能強大的磁盤分區和分區大小調整工具,與fdisk不一樣, 它支持調整分區的大小。做爲一種設計用於Linux的工具,它沒有構建成處理與fdisk 關聯的多種分區類型,可是,它能夠處理最多見的分區格式,包括:ext二、ext三、 fat1六、fat3二、NTFS、ReiserFS、JFS、XFS、UFS、HFS以及Linux交換分區。 對於Linux 的編譯在後邊進行學習 腳本編程知識: ${parameter:-word}: 若是parameter 爲空或者未定義,則變量展開爲word 不然爲parameter的值 ${parameter:+word}:若是parameter 爲空或者未定義,不作任何操做,不然展開爲word 的值 ${parameter:=word}: 若是parameter 爲空或者未定義,則展開變量爲word ,並將展開後的值賦值給parameter ${parameter:offset} : ${parameter:offset:length}:取子串,從offset 處的後一個字符開始,取length的長的字符串 ———————————————————————————————————————— #!/bin/bash a=1 test () { local a=$[3+4] #local 定義局部變量 } test for I in `seq $a 10` ;do #for循環 echo $I done ---------------------------------------------------- 5.mktemp 建立臨時文件或目錄 mktemp /tmp/file -d :建立臨時目錄 mkemp /tmp.file.XX #XX 表明生成的隨機數位數 file=`mktemp /tmp/file.XXXXX` echo $file #使用方式XX 必定要大寫 6.信號 kill -SIGNAL PID 1.HUP 2.INT 9.KILL 15.TERM 腳本中能實現信號捕捉,9和15沒法捕捉 trap COMMAND SIGNAL trap "exit 1" HUP INT PIPE QUIT TERM 一行執行多個語句,語句間用分號隔開 --------------------------------------------------------- #!/bin/bash # NET=10.2.101 for I in {200..254}; do if ping -c 1 -W 1 $NET.$I &> /dev/null ;then #-c ping 包的個數。-W 指定超時時間 echo "$NET.$I is up." else echo "$NET.$I is down" fi done -------------------------------------------------------------- 任務計劃: 1.在將來某個時間點執行一次 at batch at 時間 at > COMMAND at > crtl +d :提交 指定時間: 絕對時間: HH:MM DD:MM:YY MM/DD/YY 相對時間: now+# 單位: minutes ,hours ,days ,weeks 模糊時間:noon ,midnight ,teatime 命令的執行結果將以郵件的形式發送給安排任務的用戶 at -l :顯示做業 at -d :刪除做業 at -c ;顯示執行的內容 2.週期性執行 cron :crontab 自身是一個不間斷執行的程序 anacron: cron 的補充。可以實現cron 沒執行的動做 cron: 系統cron 任務 /etc/crontab 分鐘 小時 天 月 周 用戶 任務 用戶cron 任務 /var/spool/cron/USERNAME 時間統配符:* *:對應全部有效取值 * * * * * :每分鐘執行一次 3 * * * * :表示每週每個月天天每小時的第三分鐘執行一次 3 * * * * :每一個星期天的每小時的第三分鐘執行一次 13 12 * * 5 :每週五12 點13 分執行一次 13 12 6 7 * :每一年7月6號12點13 分執行一次 ,:離散時間點 10,40 * * * * :每小時的第10 分和第40 分執行一次 -:連續時間點 10 02 * * 1-5 :每週一到週五的2 點 10 分執行一次 /:對應取值範圍內每多久執行一次 */3 * * * * :每三分鐘執行一次 * */2 * * * :每隔2 小時執行60 次, 由於每分鐘爲* 每分鐘都會執行 01 */2 * * * :每隔 2小時的第一分鐘執行一次 執行結果將以郵件方式發送給管理員 */3 * * * * cat /etc/fstab > /dev/null :每3 分鐘執行一次,而且將正確輸出重定向,錯誤內容郵箱發送 cron 環境變量在PATH 查找 在腳本中 export 定義環境變量: service crond status :查看crond 服務運行狀態 crontab -l :查看定時任務 crontab -e : 編輯, 注意使用crontab -e 編輯,直接/etc/crontab 不行 crontab -r : 移除全部任務 crontab -u :指定以哪一個用戶來運行 日誌系統: 信息詳細程序,日誌級別 子系統,設施 syslog ,syslog-ng syslog 服務: syslogd :系統,非內核產生的信息 klogd :內核,專門負責記錄內核產生的信息 內核日誌 kernel ————》 物理終端/dev/console ----》 /var/log/dmesg klogd: dmesg 命令: cat /var/log/dmesg syslog : /sbin/init /var/log/messages :系統標準錯誤信息,非內核產生的引導信息 /var/log/maillog : 郵件系統產生的文件 /var/log/secure : 安全審計日誌 日誌切割: logtotate: logrotate命令用於對系統日誌進行輪轉、壓縮和刪除,也能夠將日誌發送到指定郵箱 priority (log level):日誌級別 debug :程序或者系統的調試信息 info :通常信息 notice :不影響正常功能,須要注意的信息 warning/warn : 可能影響系統功能,須要提醒用戶的重要事件 err/error :錯誤信息 crit :比較嚴重的 alert :必須立刻處理的 emerg/panic :會致使系統不可用 * :表示全部的日誌級別 none :根* 相反不包含任何級別的日誌、 action : 系統記錄日誌的位置 系統上的絕對路徑 #普通文件,如: /var/log/XXXXX | #管道, 經過管道送給其餘命令處理 終端 # 好比 /dev/console @HOST # 遠程主機,如@10.0.0.1 用戶 #系統用戶 ,如 root * #登陸到系統的用戶,通常emerg 級別日誌這樣設置1 定義日誌格式列子: mail.info /var/log/mail.log #info 級別及以上級別的日誌 auth.=info @10.0.0.1 #auth 子系統的info 級別 user.!=error #記錄user相關的不包含error 的信息 user.!error #比error 低的信息 *.info #全部info 信息 mail.* #mail 全部信息 *.* #全部 cron.info;mail.info #多個;分開 mail.*;mial.!=info #mail 全部不包含info *.info;mail.none;authpriv.none;cron.none /var/log/messages #全部子系統info及以上信息不包mail ,authpriv cron 信息 mail.* -/var/log/maillog #- 表示異步寫入 linux openssh : c/s 服務端:sshd :配置文件 /etc/ssh/sshd_config 客戶端 ssh :配置文件 /etc/ssh/ssh_config ssh-keygen :祕鑰生成器 -t rsa : ~/.ssh/id_rsa 私鑰 ~/.ssh/id_rsa.pub 公鑰 ssh-copy-id :將公鑰發送給遠端 ssh zy@10.2.101.250 #指定用戶身份登陸 ssh zy@10.2.101.250 `ls -a /etc/` 在遠程主機執行命令 ssh root@10.2.101.250 `ifconfig` scp username@host:/path/to/somefile /path/to/local 遠端到本地 scp /path/to/file username@host:/path/to/filename 本地到遠端 基於祕鑰的認證: ssh-keygen :祕鑰生成器 -t rsa : ~/.ssh/id_rsa 私鑰 ~/.ssh/id_rsa.pub 公鑰 公鑰保存在遠端家目錄的.ssh/authorized_keys 密鑰登錄 ssh-copy-id 的使用方法: ssh-copy-id -i .ssh/id_rsa.pub root@10.3.27.38 function 函數: 過程式編程: 模塊化編程 結構化編程 語法一: function f_name { ......函數體...... } 語法二: f_name() { ......函數體..... } 調用:函數只有被調用時才執行: 調用:給定函數名 函數名出現的地方,會被自動替換爲函數代碼 函數生命週期,被調用時建立,返回時結束 return 命令返回自定義狀態結果; 0;成功 1-255 :失敗 函數返回值: 函數的執行結果返回: 1.使用echo 或print 命令進行輸出 2. 函數體調用命令的輸出結果; 函數的退出狀態碼: 1.不定義默認取決於函數體中最後一條執行的退出狀態碼 2.自定義退出狀態碼 return 函數能夠接受參數; 傳遞參數給函數,調用函數時,在函數名後面以空白分割給定參數 函數能夠接受參數: 傳遞參數給函數,調用函數時,在函數名後面以空白分割給定參數表便可, 在函數體重,能夠使用$1 $2 調用這些參數 ------------------------------------------------------------- #!/bin/bash # username='myname' function adduser { if id $username &>/dev/null ;then echo "$username is exists" && return 0 echo "return test" else useradd $username [ $? -eq 0 ] && echo "user $username is add success" fi } adduser echo $? ------------------------------------------------------------------------ #!/bin/bash # function adduser { if id $username &>/dev/null ;then echo "$username is exists" && return 0 echo "return test" else useradd $username [ $? -eq 0 ] && echo "user $username is add success" fi } for i in {1..10};do username=myuser$i adduser done -------------------------------------------------------------- 變量做用域: 本地變量 :當前shell 進程,爲了執行腳本會啓動的專用進程 局部變量: 函數上下文,函數的生命週期 若是函數中有局部變量,其名稱同本地變量 在函數中定義局部變量的方法: local NAME=VALUE #申明爲局部變量 函數遞歸: 函數間接或直接調用自身。 centos7 調用: POST ---BOOT sequence ---bootloader---kernel---initramfs---rootfs---/sbin/init systemd 新特性: 系統引導時實現服務並行啓動。 按需激活進程 系統狀態快照 基於依賴關係定義服務控制邏輯 核心概念:unit (單元) 配置文件進行標識和配置,文件中主要包含系統服務,監聽socket,保存系統快照及其餘init 相關信息 文件保存至: /usr/lib/systemd/system /run/systemd/system /etc/systemd/system unit 類型: service unit :文件擴展名爲.service ,用於定義系統服務 Target unit:文件擴展名爲.target ,用於模擬實現運行級別 device unit :.device 用於定義內核識別的設備 mount unit:.mount 定義文件系統掛載點 socket unit : .socket ,用於標識進程間通訊的socket文件 snapshot unit :管理系統快照 swap unit :用於標識swap 設備 automount unit : .automount 文件系統的自動掛載點 path unit :.path 用於定義文件系統中的文件或目錄 關鍵特性: 基於socket 的激活機制,socket 與服務程序分離 基於bus 的激活機制; 基於device 的激活機制 基於path 的激活機制 系統快照 向後兼容sysv init 腳本。 不兼容: systemctl 命令固定不變, 非由systemd 啓動的服務,systemctl 沒法與之通訊 管理系統服務: CENTIOS 7:service unit 注意 能兼容早起的服務腳本 命令:systemctl COMMAND name.service systemctl start name.service systemctl stop name.service systemctl status name.service systemctl restart name.service 條件式重啓: systemctl try-restart name.service 查看服務當前狀態: systemctl is-active name.service -------------------------------------------------------------- 當前位置:首頁 » 系統管理 » systemctl systemctl命令進程和做業管理 systemctl命令是系統服務管理器指令,它實際上將 service 和 chkconfig 這兩個命令組合到一塊兒。 任務 舊指令 新指令 使某服務自動啓動 chkconfig --level 3 httpd on systemctl enable httpd.service 使某服務不自動啓動 chkconfig --level 3 httpd off systemctl disable httpd.service 檢查服務狀態 service httpd status systemctl status httpd.service (服務詳細信息) systemctl is-active httpd.service (僅顯示是否 Active) 顯示全部已啓動的服務 chkconfig --list systemctl list-units --type=service 啓動某服務 service httpd start systemctl start httpd.service 中止某服務 service httpd stop systemctl stop httpd.service 重啓某服務 service httpd restart systemctl restart httpd.service 顯示全部服務:chkconfig --list systemctl list-units --type=service --all 查看全部服務開機啓動狀態 systemctl list-unit-files --type=service target units: unit 配置文件 .target 運行級別: 0 ==== runlevel0.target poweroff 關機 1 ==== runlevel1.target rescue.target 救援模式 2 ===== runlevel2.target multi-user.target 3 ===== runlevel3.target multi-user.target 4 ==== runlevel4.target multi-user.target #2 3 4 級別相同 5 ==== runlevel5.target GUI 級別 graphical.target 6 ==== runlevel6.target reboot.target 級別切換: init N ==== systemctl isolate name.target systemctl isolate graphical.target #切換爲圖形界面 systemctl list-units --type target #查看裝載級別 -------------------------------------------------------------- basic.target loaded active active Basic System cryptsetup.target loaded active active Encrypted Volumes getty.target loaded active active Login Prompts graphical.target loaded active active Graphical Interface local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems multi-user.target loaded active active Multi-User System network-online.target loaded active active Network is Online network-pre.target loaded active active Network (Pre) network.target loaded active active Network paths.target loaded active active Paths remote-fs.target loaded active active Remote File Systems slices.target loaded active active Slices sockets.target loaded active active Sockets swap.target loaded active active Swap sysinit.target loaded active active System Initialization timers.target loaded active active Timers ------------------------------------------------------- 獲取默認運行級別: /etc/inittab systemctl get-default 修改默認級別 /etc/inittab systemctl set-default graphical.target 或者修改配置文件 /etc/systemd/system/default.target /usr/lib/systemd/system/multi-user.target. 將user lib 文件軟鏈接至 etc 下 切換至救援模式: systemctl emergemcy 其餘經常使用命令 systemctl halt 關機 systemctl poweroff 關機 systemctl reboot 重啓 systemctl suspend 掛起 systemctl hiberate 快照 systemctl hybrid-sleep 快照而且掛起 -------------------------------------------------------- System Commands: is-system-running Check whether system is fully running default Enter system default mode rescue Enter system rescue mode emergency Enter system emergency mode halt Shut down and halt the system poweroff Shut down and power-off the system reboot [ARG] Shut down and reboot the system kexec Shut down and reboot the system with kexec exit Request user instance exit switch-root ROOT [INIT] Change to a different root file system suspend Suspend the system hibernate Hibernate the system hybrid-sleep Hibernate and suspend the system ------------------------------------------------------------------- systemctl list-dependencies httpd.service #查看依賴關係 systemctl reload-or-restart #重載或重啓服務 禁止設定爲開機自啓: systemctl mask name.service 取消設定 systemctl umask name.service bash 腳本編程: 變量: 存儲單個元素 數組 :存儲多個元素的連續內存空間 數組名: 索引編號:編號從0 開始 屬於數值索引 #也支持使用自定義的格式,不只僅是數值格式 引用數組中的元素:${arrary_name[INDEX]} 聲明數組: declare -a array_name declare -A array_name 關聯數組 數組元素的賦值: 一次只賦值一個元素 array_name[INDEX]=valuew weekdays[0]="sunday" weekdays[6]="thursday" 一次賦值所有元素: array_name=("value1" "value2"...) GUN awk : 文本處理三工具:grep , sed ,awk grep ,egrep ,fgrep 文本過濾工具 sed :行編輯器 模式空間,保持空間 awk :報告生成器,格式化文本輸出 gawk : 基本用法: gawk [options] `program` FILE... program : PATTERN{ACTION STATEMENTS} 語句之間用分號分隔 print ,printf 選項: -F :指明輸入時用到的字段分隔符; -v var=value :自定義變量 tail -2 /etc/fstab | awk '{print $2,$4}' #awk 剪裁分割,輸出第2,4 段 1.print print item1,item2,..... 要點: (1):逗號分隔符; (2),輸出各item 能夠是字符串,或者數值, 在awk 中變量要作替換不容許在引號中引發來 (3):如省略item ,至關於 print $0 2. 內建變量 FS :input filed seperator :默認爲空白字符 OFS :output filed seperator:默認爲空白字符 RS: input record seperator :輸出換行符 ORS:輸出換行符 NF: number of filed :字段數量 引用字段加 $ 符號 NR :顯示文件行數,顯示沒一行的行號 FNR :各文件分別計數 FILENAME : 顯示文件名 ARGC :命令行中給定的參數個數 ARGV : 數組,保存的是命令行中給定的各參數 awk -v FS=':' '{print $1,$2}' /etc/passwd # -v FS= 指定分隔符 awk -v F=: '{print $1,$2}' /etc/passwd awk -F: '{print $1,$2}' /etc/passwd awk -F: -v OFS='@' '{print $1,$2}' /etc/passwd #-v OFS='@'指定輸出的分隔符 awk -v RS=' ' '{print}' /etc/passwd #RS=' ' 定義空格爲換行符 awk '{print NF}' /etc/fstab #顯示字段數量 {print NF},{print $NF} 在awk 中引用變量無需加$ awk '{print NR}' /etc/passwd awk 'BEGIN{print ARGC}' /etc/passwd #顯示每一行參數個數 awk 'BEGIN{print ARGV[1]}' /etc/fstab #顯示指定位置的參數內容 #BEGIN 將多行合併爲一行 2. 自定義變量; 1. -v var=value 變量名區分大小寫 awk -v test='hello gg' 'BEGIN{print test}' awk 'BEGIN{test="nihao";print test}' #做用和上面相同 2.在program 中定義 3.printf 命令: 格式化輸出:printf FORMAT ,item1 .item2.... 1.FORMAT 是必需要給出的 2.printf 不會自動換行,須要給出換行度 \n 3.FORMAT 中須要分別爲後面的每個item 指定一個格式化符號 格式符: %c :顯示字符的ASCII 碼 %d :%i:顯示十進制整數 %e :%E: 科學計數值顯示 %f:顯示爲浮點數 %g:%G:以科學計數法顯示 %s:顯示字符串 %u:無符號整數 %%:顯示%自身 awk -F: '{printf "username: %s\n",$1}' /etc/passwd #顯示用戶名 awk -F: '{printf "username: %s, UID: %s\n",$1,$3}' /etc/passwd 修飾符: #[.#] : 第一個數字顯示的寬度,第二個顯示小數點後的精度 %3.1f -:左對齊 awk -F: '{printf "username: %-15s, UID: %s\n",$1,$3}' /etc/passwd + :顯示數值的符號 4.操做符 算數操做符: +,-,*,/,^,% 字符串操做符:沒有符號的操做符 賦值操做符: =,+=,-= 比較操做符: > ,>=,<=,!=,== 模式匹配符: ~:是否匹配 !~:是否不匹配 邏輯操做符: && || ! 函數調用: function_name( ) 條件表達式: selector?if-true-expression:if-false-expression 5.pattern 參數 OenSSL : openssh : dns bind web http,httpd {apache},php,mariadb 安全攻擊: 安全機制: 安全服務: 密碼算法和協議: Linux 系統: openssl : gpg 軟件(pgp 協議): 加密算法和協議: 對稱加密:加密和解密使用用一個祕鑰; DES :Data encryption standard, 數據加密標準 3DES:TDEA,Triple Data Encryption Algorithm AES :Advanced Encryption Standard (128 bits,258,384,512 bits ) blowfish: twofish: IDEA RC6 CAST5 特性: 1.加密解密使用同一個祕鑰 2.將原始數據分割成固定大小的塊,逐個進行加密 缺陷: 1.祕鑰過多 2.祕鑰分發 公鑰加密: 祕鑰成對出現, 公鑰:公開 public 私鑰:私密性 secret key 身份認證:接收方認證發送的的身份 祕鑰交換:發送方公鑰加密,通訊。 數據加密: 數字簽名: 特色:用公鑰加密的數據只能用與之配對的私鑰解密 算法:RSA,DSA,ELGamal 單向加密:只能加密不能解密.提取數據特徵碼 特性: 定長輸出,雪崩效應 算法: MD5; SHA1 SHA256 ;SHA512 功能:保證數據的完整性 祕鑰交換:IKE 公鑰加密: DH (deffie-Hellman) SSL :secure socket layer ssl 2.0 ssl 3.0 TLS: Transport Layer Security TLS 1.2 版本 分層設計: 1.最低層:基礎算法原語的實現 aes ,rsa ,MD5 2.向上一層:各類算法的實現 3.再向上一層,組合算法實現的半成品 4.用各類組件拼裝而成的種種成品密碼學協議/軟件 ssh /tls Openssl : 開源項目 openssl :多用途的命令行工具: libcrypto: 公共加密庫 libssl :庫 ,實現了ssl 及tls 的功能 Openssl 命令: openssl version :版本序列號 標準命令, 消息摘要命令,加密命令 標準命令: encryption :加密 ca : req : ...... 對稱加密: OpenSSL ,enc ,gpg 算法:3des ,aes ... 單向加密: 工具: MD5sum ,sha1sum penSSL整個軟件包大概能夠分紅三個主要的功能部分: 密碼算法庫、SSL協議庫以及應用程序。 OpenSSL的目錄結構天然也是圍繞這三個功能部分進行規劃的 消息摘要算法應用例子 用SHA1算法計算文件file.txt的哈西值,輸出到stdout: # openssl dgst -sha1 file.txt 用SHA1算法計算文件file.txt的哈西值,輸出到文件digest.txt: # openssl sha1 -out digest.txt file.txt 用DSS1(SHA1)算法爲文件file.txt簽名,輸出到文件dsasign.bin。簽名的private key必須爲DSA算法產生的,保存在文件dsakey.pem中。 # openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt 用dss1算法驗證file.txt的數字簽名dsasign.bin,驗證的private key爲DSA算法產生的文件dsakey.pem。 # openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt 用sha1算法爲文件file.txt簽名,輸出到文件rsasign.bin,簽名的private key爲RSA算法產生的文件rsaprivate.pem。 # openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt # 用sha1算法驗證file.txt的數字簽名rsasign.bin,驗證的public key爲RSA算法生成的rsapublic.pem。 # openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt 文件加密: openssl enc -des3 -salt -in vim_test.txt -out vim_ssl_test.txt 文件解密: openssl enc -d -des3 -in vim_ssl_test.txt -out vim_d_test.txt #上述文件制定了salt 須要將加密時輸入的salt 從新進行輸入 生成用戶密碼: openssl passwd -l -salt salt_字符 生成隨機數: openssl rand -base64|-hex NUM NUM:表達字節數,-hex 每一個字符4位,出現的字符數爲NUM*2 公鑰加密: 加密:算法 RSA,ELG 工具: gpg,openssl rsa,dsa 簽名算法: 算法:RSA ,DSA, ELG 工具: openssl rsa ,ELG 祕鑰交換: 算法:dh 生成密鑰對: genrsa ,gendsa ,gendh 隨機數生成器: 隨機數生成器: /dev/random 僅從商池返回隨機數 ,阻塞 /dev/urandom 非阻塞 生成密鑰對: 私鑰:openssl genrsa -out private.pem 1024 從私鑰提取公鑰: openssl rsa -in private.pem -pubout DNS and bind : DNS :domain name server BIND :bekerley internal name TCP :面向鏈接 UDP :user datagram protocol 本地配置文件: /etc/hosts 查詢方法: 遞歸方式 recursive 迭代方式 iterative dns 服務器類型: 主dns 服務器: 輔助dns 服務器 緩存dns 輔助器 轉發dns 服務器 區域傳送: 全量傳送:傳送整個解析庫 增量傳送: 序列號: 解析庫版本號,主服務器更新,序列號增長 刷新時間: 輔助dns 從主dns 同步解析庫的的時間間隔 重試時長: 失敗,重新請求的時間間隔 過時時長: 請求失敗過時時長,中止服務 通知機制:notify FQDN :徹底合格域名 解析答案: 確定答案: 否認答案: 資源記錄: resource record RR 記錄類型: A ,PTR ,SOA ,NS ,CANME, MX , A ;internet address ,做用 FQDN ----IP AAAA :ipv6 PTR :IP ---GQDN 指針 SOA :start of authority :起始受權記錄 一個域只能有一個 NS : name server :專用於標明當前域的DNS 服務器 CNAME :別名記錄 MX :mail exchanger ,郵件交換記錄 資源記錄定義的格式: 語法:name [ttl] IN rr_type value 1. ttl 能夠從全局繼承 2. @ 可用於引用當前區域的名字 SOA : name : 當前區域的名字 value : 1.當前區域的主DNS 服務器的FQDN ,也能夠使用當前區域的名字 2.當前管理員郵箱地址,地址中不能使用@符號, . 替代 3.(主從服務器協調屬性的定義以及否認ttl 定義) 列如: zy.com. 86400 IN SOA ns.zy.com.cn. zy.zy.com. ( 20171024 ;序列號 Serial Number 2H ;刷新時間 Refresh 10M ;重試時間 Retry 1W ;過時時間 Expire 1D ;否認答案的ttl Negative TTL ) NS : name :當前區域的名字 value :當前區域某DNS 服務器的名字 如: ns.zy.com. 注意:一個區域可有有多個NS 記錄 列入: zy.com. IN NS ns1.zy.com. zy.com. IN NS ns2.zy.com. 注意: (1),相鄰的兩個資源記錄name 相同時,後續的可省略 (2), 對於NS 記錄而言,任何一個NS 記錄的名字都對應一個A 記錄 MX : name ;當期那區域的名字 value ;當前區域的某郵件服務器的主機名 定義郵件服務器的優先級 (0-99)數字 列入: zy.com. IN MX 10 MX1.zy.com. zy.com. IN MX 20 MX2.zy.com. 注意:對應MX 有一個對應的A 記錄 A ; name ;某主機的FQDN ,www,zy.com. value :對應主機IP 地址 列入: www.zy.com. IN A 11.22.33.44 www.zy.com. IN A 11.22.33.66 注意: 同一個名字可對應多條記錄,輪訓解析 同一個值能夠有不一樣名字的定義 泛域名解析: *.zy.com. #避免主機名錯誤,經過泛域名解析至指定主機 AAAA : name ;fqdn value : IPV6 PTR ; name : ip 特定格式1.2.3.4 寫五爲 :4.3.2.1.in-addr.arpa. value : FQDN 列入: 4.3.2.1.in-addr.arpa. IN PTR www.zy.com. 簡寫: 4 IN PTR www.zy.com. 注意: 網絡地址及後綴可省略,主機地址依然須要 CNAME : name :別名的FQDN value :正式名字的FQDN 列入: web.zy.com IN CNAME www.zy.com. H ;小時 D :天 M :分鐘 W :周 子域受權: 相似根域受權: .com. IN NS ns1.com. .com. IN NS ns2.com. ns1.com. IN A 1.1.1.1 ns2.com. IN A 2.2.2.2 zy.com. 在.com 的名稱服務器上,解析庫中添加資源記錄 zy.com. IN NS ns1.zy.com. zy.com. IN NS ns2.zy.com. zy.com. IN NS ns3.zy.com. ns1.zy.com. IN A 4.4.4.4 ns2.zy.com. IN A 4.4.4.5 ns3.zy.com. IN A 4.4.4.6 #上述爲子域受權記錄 域名註冊: 代理商,萬網,新網,godaddy 管理後臺: 把 NS 記錄和A 記錄指向本地dns 服務器 BIND 的安裝和配置: dns 服務,程序包名爲bind ,程序名稱爲named 只須要安裝 bind ,bind-libs ,bind-utils 生產環境所有安裝 bind 服務腳本 :/etc/rc.d/init.d/named 主配置文件:/etc/named.conf, /etc/named.rfc1912.zones, /etc/rndc.key rndc: remote name domain controller,默認與bind 安裝在同一主機,只能經過本地迴環地址登陸 解析庫文件: /var/named/ZONE_NAME.ZONE 注意:一臺服務器能夠同時爲多個區域提供解析 2,必須有根區域文件 3. 應該有兩個特殊區域,實現localhost 和本地迴環地址的解析庫 var/named/named.ca :13 個根文件資源記錄 named.localhost :127.0.0.1 named.loopback :本地迴環地址 主配置文件: 全局配置文件: options {} 日誌子系統配置: logging {} 區域定義: 本機可以爲哪些zone 進行解析,就要定義哪些zone zone "ZONE_NAME" IN {} 注意: 任何服務若是指望可以經過網絡被其餘主機訪問,至少應該監聽 在一個可以與外部主機通訊的地址上 dnssec :dns 安全機制 #建議關閉dns sec 主dns 名稱服務器; 1.在主配置文件中定義區域 列入:在 /etc/named.rfc1912.zones 定義 zone "ZONE_NAME" IN { type {master;slave;forward}; file "ZONE_NAME.zone."; } 2. 定義區域解析庫文件 宏 $TTL 定義 資源記錄定義 named-checkconf : 檢查配置文件 named-checkzone ;檢查區域 named-checkzone "zy.com" /var/named/zy.com.zone // 格式指定 zone 名字和指定的目錄 rndc status :顯示當前dns 實時狀態 ---------------------------------------------------------------------------- *********************************************************************** BIND 配置文件: // // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // // See the BIND Administrator's Reference Manual (ARM) for details about the // configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html options { listen-on port 53 { 127.0.0.1; any; // 設定容許監聽的端口 }; // listen-on-v6 port 53 { ::1; }; directory "/var/named"; // 加載目錄 dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { localhost; any; }; //allow query 容許訪問的客戶端 /* - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion. - If you are building a RECURSIVE (caching) DNS server, you need to enable recursion. - If your recursive DNS server has a public IP address, you MUST enable access control to limit queries to your legitimate users. Failing to do so will cause your server to become part of large scale DNS amplification attacks. Implementing BCP38 within your network would greatly reduce such attack surface */ recursion yes; // 容許遞歸查詢 dnssec-validation no; dnssec-enable no; // 關閉dnssec 功能,一個安全傳輸機制 /* dnssec-enable yes; dnssec-validation yes; */ //dns sec is disable /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key"; **************************************************************** ---------------------------------------------------------------- 配置zone 文件: /var/named/zy.com.zone ------------------------------------------- $TTL 3600 $ORIGIN zy.com. //定義了zone 的基名,能夠下在後面的資源記錄中不添加相似ns1.zy.com. 後半部分 //可查閱這篇文檔:http://blog.csdn.net/bpingchang/article/details/38377053 //.bind-utils是bind軟件提供的一組DNS工具包,裏面有一些DNS相關的工具.主要有 //:dig,host,nslookup,nsupdate.使用這些工具能夠進行域名解析和DNS調試工做. @ IN SOA ns1.zy.com. admin.zy.com ( 20171024 1H 5M 1D 1D ) IN NS ns1.zy.com. IN NS ns2.zy.com. IN MX 10 mx1.zy.com. IN MX 20 mx2.zy.com. ns1.zy.com. IN A 1.1.1.1 ns2.zy.com. IN A 2.2.2.2 mx1.zy.com. IN A 3.3.3.3 mx2.zy.com. IN A 4.4.4.4 www IN A 5.5.5.5 ------------------------------------------------------------- named -v :查看bind 版本 ************************************************* //新定義的寫法 $TTL 3600 $ORIGIN zy.com. @ IN SOA ns1.zy.com. admin.zy.com ( 20171024 1H 5M 1D 1D ) IN NS ns1 IN NS ns2 IN MX 10 mx1 IN MX 20 mx2 ns1 IN A 1.1.1.1 ns2 IN A 2.2.2.2 mx1 IN A 3.3.3.3 mx2 IN A 4.4.4.4 www IN A 5.5.5.5 **************************************************** ----------------------------------------------------------------- 反向區域: 區域名稱:網絡地址反寫 172.16.100--> 100.16.172.in-addr.arpa. //保留不變的部分定義反向區域的名稱 1.定義反向區域 zone "zone_name" IN { type{master|slave|forward}; file "網絡地址.zone" }; 2.提供區域解析庫文件: 注意: 不須要MX和A 記錄 ******************************************* //在/etc/named.rfc1912.zones 定義PTR zone zone "100.16.172.in-addr.arpa" IN { type master; file "172.16.100.zone"; }; //而後在/var/named/ 目錄下定義PTR zone 的記錄 $TTL 86400 $ORIGIN 100.16.172.in-addr.arpa. @ IN SOA ns1.zy.com. admin.zy.com. ( 20171025 1H 5M 1D 1D ) IN NS ns1.zy.com. IN NS ns2.zy.com. 10 IN PTR ns1.zy.com. 20 IN PTR ns2.zy.com. 30 IN PTR mx1.zy.com. 40 IN PTR mx2.zy.com. 50 IN PTR www.zy.com. ************************************************************* dig 的用法: dig : dig -t [type] name [@server] [query options] 查詢選項: +[no]trace 迭代查詢 +[no]recurse 遞歸查詢 dig -t A www.baidu.com +trace dig -t A www.baidu.com +recurse 指定查詢的RR 記錄類型, @ 指定server —————————————————————————————————————— dig -x 172.16.100.20 @10.2.101.250 -x :查詢PTR 記錄 測試反向記錄 qr query,查詢標誌,表明是查詢操做 rd recursion desired :表明但願進行遞歸(recursive)查詢操做 ra recursive available :在返回中設置,表明查詢的服務器支持遞歸(recursive)查詢操做。 aa Authoritative Answer :權威回覆,若是查詢結果由管理域名的域名服務器而不是緩存服務器提供的,則稱爲權威回覆 —————————————————————————————————————— flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3 #上述信息中aa 表示權威應答 host 命令: host [-t type] name [SERVER] 列子: host -t A ns2.zy.com 10.2.101.250 nslookup命令: nslookup : server IP :指定查詢的dns server set q=TYPE : set q=a NAME : 要查詢的名稱 模擬區域傳送: dig -t axfr zy.com @172.16.100.20 // -axfr 全量傳送 dig -t ixfr zy.com @172.16.100.20 //增量傳送 dig -t axfr 100.16.172.in-addr.arpa @10.2.101.250 //反向區域全量傳送 主從複製: 區域複製: 首先在主服務器須要將NS 指向區域複製dns 服務器, 保證在主服務器變動配置時可以通知區域複製dns 注意事項: 1. 應該爲一臺單獨的dns 服務器 2. 主服務器的區域解析庫文件必須有一條NS 記錄指向從服務器 3.從服務器只須要定義區域,而無需提供解析庫文件,解析庫文件應該放置於 /var/named/slave目錄中 4.主服務器須要容許從服務器進行區域傳送 5.主從服務器版本一致,不一致從高主低 6.主從時間一致 NTP 定義從區域的方法: zone "zone_name" IN { type slave; masters { IP ;}; file "slaves/zy.com.zone"; }; 反向解析複製: 配置文件:改變配置序號增長 zone "1.168.192.in-addr.arpa" IN { type slave; masters { 192.168.1.150; }; file "slaves/192.168.1.zone"; }; rndc :命令tcp/953 端口 COMMAND: reload :重載主配置文件 reload zone :加載單個zone retransfer zone :手動區域傳送 notify zone :從新對區域發送通知 reconfig :重載主配置文件 querylog [on|off] :開啓關閉查詢日誌 trace :調整日誌級別 ,遞增debug 級別 rndc trace 5 //日誌壓力很是大 slave dns 配置文件梳理: **************************************************************** options { listen-on port 53 { 127.0.0.1; 192.168.1.200; }; //named.conf 配置基本和主dns 相同, listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { localhost; any; }; /etc/named.rfc1912.zones zone "zy.com" IN { type slave; //指定爲slave dns masters { 192.168.1.150; }; //指定masters dns 地址 file "slaves/zy.com.zone"; //指定傳送的zone 文件保存位置 // bind 默認讓保存到 /var/named/slave/ 目錄下 }; *************************************************************** bind 安裝: bind ,bind-libs, bind-utils 主從同步: 主服務器受權容許同步,默認容許 1.NS 記錄 2.受權容許傳送區域 從服務器: 1.只需定義區域 子域受權 :分佈式數據庫的方式 正向解析區域子域受權方法: 定義一個子區域: ziyu.zy.com. IN NS ns1.ziyu.zy.com. ziyu.zy.com. IN NS ns2.ziyu.zy.com. ns1.ziyu.zy.com. IN A 1.1.1.1 ns2.ziyu.zy.com. IN A 1.1.1.2 轉發服務器 : 須要關閉dnssec 功能 注意: 被轉發的服務器容許遞歸 1.所有轉發:非本機所負責解析區域的請求,統統轉發給指定服務器 options 中定義: options { forward {first|only}//first 優先轉發,不然本身迭代查詢,only 直接遞歸至轉發服務器 forwarders {}; }; 2.區域轉發;僅轉發特定區域的請求至某服務器 zone "zone_name" { type forward; forward forwarders }; ------------------------------------- zone "test.com" IN { type forward; forward only; forwarders { 192.168.100.150; }; }; //單個區域轉發 -------------------------------------------- 父域配置文件; ************************************************************** $TTL 1D $ORIGIN test.com. @ IN SOA ns1.test.com. admin.test.com. ( 01 1H 5M 1D 1D ) IN NS ns1 IN NS ns2 ns1 IN A 192.168.100.150 ns2 IN A 1.1.1.100 www IN A 2.2.2.2 ops IN NS ns1.ops.test.com. ns1.ops IN A 192.168.100.200 //ops 爲委派子域 *************************************************************** 子域配置文件: $TTL 1D $ORIGIN ops.test.com. @ IN SOA ns1.ops.test.com. admin.ops.test.com. ( 01 1h 30M 1d 300M ) IN NS ns1.ops.test.com. IN NS ns2.ops.test.com. ns1 IN A 192.168.100.200 ns2 IN A 3.3.3.3 www IN A 6.6.6.6 ****************************************************************** bind 中基礎的安全相關配置: acl ;把一個或多個地址歸併爲一個集合,統一調用 acl acl_name { ip; ip; net; }; 示列: acl acl_1 { 192.168.100.0/24; }; bind 有四個內置的acl : none :沒有一個主機 any; 任意主機 local;本機 localnet :本機IP 掩碼運算後的網絡地址 注意acl 只能先定義,後使用,通常定義下options 上面 訪問控制的指令: allow-query {}; 容許查詢的主機;可在全局配置和zone 裏面進行指定 zone "test.com" IN { type master; file "test.com.zone"; allow-query { 127.0.0.1; 192.168.100.200; }; }; allow-transfer {]; 容許進行區域傳送的主機,白名單 zone "zy.com" IN { type master; file "zy.com.zone"; allow-update { none; }; allow-transfer { 127.0.0.1; }; }; or allow-transfer { 192.168.100.200; }; allow-recursion {};容許遞歸的主機,通常容許本地,不定義容許全部 //recursion yes; allow-recursion { 127.0.0.1; 192.168.100.200; }; allow-update {}; 容許跟新區域庫中的內容,通常none allow-update {none;}; bind view : 視圖:功能相似於F5 GTM 智能dns 解析 一個bind 服務器能夠定義多個view, 每一個view能夠定義一個或者多個zone: 每一個view 用來匹配一組客戶 多個view 內可能須要對同一個區域進行解析,可是用不一樣的區域進行解析 用法: view view_name { match-clients {}; }; 注意: 1.一旦啓用了view ,全部的zone 都只能在view 中定義 2.僅有必要再匹配到容許遞歸請求的客戶端所在的根區域 3.客戶端請求到達時是自上而下檢查每一個view 所服務的客戶端列表 vim 定義的方式 : view 至關於數據接口,由上往下匹配客戶端地址,而後響應所請求的域名, 在每一個view 中 裏面每一個zone 所包含的域名信息由本身定義 首先將在主配置文件中的 hint 根域文件剪切到 /etc/named.rfc1912.zones 文件中 而後定於客戶端的 class 類 以下: ———————————————————— acl 200_net { 192.168.100.200; 127.0.0.1; }; acl 100_net { 192.168.100.100; 127.0.0.1; }; —————————————————————————— 而後在/etc/named.rfc1912.zones 文件中 定義view 配置文件以下: ****************************************************************** // named.rfc1912.zones: // // Provided by Red Hat caching-nameserver package // // ISC BIND named zone configuration for zones recommended by // RFC 1912 section 4.1 : localhost TLDs and address zones // and http://www.ietf.org/internet-drafts/draft-ietf-dnsop-default-local-zones-02.txt // (c)2007 R W Franks // // See /usr/share/doc/bind*/sample/ for example named configuration files. // view test100 { //注意這個花括號裏面定義的zone 都是包含在這個view 的匹配規則中 match-clients { //咱們的根域名只能在每一個view 中分別指定,相對於F5 少一個檢測機制的靈活調用 200_net; }; //在這個match-clients 中定義客戶端地址網段,匹配後再繼續往下匹配規則和請求的域名 allow-recursion { 200_net; }; zone "." IN { type hint; file "named.ca"; }; zone "localhost.localdomain" IN { type master; file "named.localhost"; allow-update { none; }; }; zone "localhost" IN { type master; file "named.localhost"; allow-update { none; }; }; zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN { type master; file "named.loopback"; allow-update { none; }; }; zone "1.0.0.127.in-addr.arpa" IN { type master; file "named.loopback"; allow-update { none; }; }; zone "0.in-addr.arpa" IN { type master; file "named.empty"; allow-update { none; }; }; zone "zy.com" IN { type master; file "zy.com.zone"; allow-update { none; }; }; zone "100.168.192.in-addr.arpa" IN { type master; file "192.168.100.zone"; }; zone "test.com" IN { type master; file "test.com.zone"; allow-query { 127.0.0.1; 192.168.100.200; }; }; }; view external { // 咱們能夠定義多個view ,指定不一樣的匹配規則 match-clients { 100_net; }; zone "test.com" IN { type master; file "test.com.zone.external"; allow-update {none;}; }; }; ********************************************************************** 編譯安裝bind: isc.org: bind 9 1. yum groupinstall "Development Tools" 2. yum -y install openssl* //缺乏openssl 庫文件 3. ./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named/ --enable-threads 程序安裝路徑 配置文件路徑 開啓多線程 --enable-epoll --disable-chroot 多路複用IO 不使用chroot 4. ./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named/ --enable-threads --enable-epoll --disable-chroot 5./etc/profile.d/named.sh // export PATH=/usr/local/bind9/bin:/usr/local/bind9/sbin:$PATH 後續本身建立named.conf 文件 和 ln -sv /usr/local/bind9/include/ /usr/include/named vim /etc/ld.so.conf.d/named.conf 庫文件 queryperf dns 壓力測試 —————————————————————————————————————————————————————————————————————————————————————— @ IN SOA dns.wubinary.com dnsadmin.wubinary.com ( 2014031201 ;標識序列號,十進制數字,不能超過10位,一般使用日期 2H ;刷新時間,即每隔多久到主服務器檢查一次,此處爲2小時 4M ;重試時間,應該小於刷新時間,此處爲4分鐘 1D ;過時時間,此處爲1天 2D ;主服務器掛後,從服務器至多工做的時間,此處爲2天) —————————————————————————————————————————————————————————————————————————————————————— centos 啓動流程: POST :加電自檢,檢測硬件是否可以正常工做, ROM:CMOS BIOS :基本輸入輸出系統,設定硬件協做方式,啓動順序 ROM+RAM : BOOT sequence :BIOS 設定的啓動順序 bootloader : 引導加載器, windows :ntloader linux : LILO :linux loader GRUB :GRand uniform bootloader grub 0.X :grub legacy grub 1.0 : grub2 功能:提供一個菜單,容許用戶選擇要啓動的系統,把用戶選定的內核加載到內存中 MBR : 446 bootloader 64 :文件系統分配表 FAT 2 :標誌是否有效 GRUB : bootlaoder :1st stage 查找硬盤起始位置,查找第2 階段 1.5 stage 識別分區文件系統 disk :2nd stage 查找啓動文件 kernal : 自身初始化; 探測識別硬件 加載硬件驅動程序, 以只讀方式掛載根文件系統 運行用戶空間的第一個應用程序 :/sbin/init init 程序的類型: unix ;sysv : centos 5 upstart : centos 6 systemd : centos 7 ramdisk :輔助內核啓動加載 initramfs-2.6.32-431.el6.x86_64.img initrd :centos 5 mkinitrd initramfs :centos 6 mkinitrd,dracut initramfs 虛擬系統 openssh : C/S 工具: ssh ,scp,sftp 服務端:sshd 客戶端組件: ssh /etc/ssh/ssh_config ssh USER@HOST ssh root@192.168.100.230 "ls /root" #只執行命令 服務器端: sshd 配置文件: /etc/ssh/sshd_config 基於祕鑰的認證: ssh-keygen -t rsa #生成一對祕鑰 把公鑰傳至遠程服務器對應的家目錄 ssh-copy-id [-f] [-n] [-i [identity_file]] [-p port] [-o ssh_option] [user@]hostname ssh-copy-id -i ./id_rsa.pub -p 8888 root@192.168.100.230 #基於祕鑰認證的方式,在客戶端生成一對祕鑰而後將公鑰發送至遠程到服務器,而後 #登陸能夠直接登陸 xshell 能夠使用作相同工做 scp : sftp: sftp root@192.168.100.230 ssh 服務的最佳實踐: 1.不要使用默認端口 2.禁止使用protocol version 1 3.限制可登陸用戶 4. 設定空閒會話超時時長 5.利用防火牆設置ssh 的訪問策略 6.僅監聽特定的IP 地址 7.使用口令登陸時使用強密碼 8.使用基於祕鑰的認證 9.禁止使用空密碼 10.禁止root 用戶直接登陸 11.限制ssh 的訪問頻度和併發在線數 12.作好日誌,常常分析 限制可登陸用戶的辦法: AllowUsers user1 USER2 AllowGroups groups 列入: AllowUsers root zy ssh 協議的另一種實現 dropbear Opensll : 三個組件: openssl :多用戶命令行工具 libcrypto:加密解密庫 libssl : 是ssl 協議的實現 PKI :public key infrastructure CA RA CRL 整數存取庫 創建私有CA openCA openssl 證書申請及簽署步驟 1.生成證書申請請求 2.RA 效驗 3.CA 簽署 4. 獲取證書 openssl 默認配置文件:/etc/pki/tls/openssl.cnf 1.建立所須要的文件 touch index.txt echo 01 > serial 2.CA 自簽發證書 生成私鑰: (umask 077; openssl genrsa -out private/cakey.pem 2048) 生成新證書: openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out cacert.pem -new :生成新的證書籤署文件 -x509 :專用於CA 自簽發證書 -key :私鑰 -days :有效期 -out : 證書的保存路徑 而後根據信息填完能夠生成新的證書了 3.發證 1.主機生成證書請求文件 2.將請求文件發給CA 3.CA 效驗請求文件 4.簽發 給httpd 服務器簽發證書。 建立私鑰: (umask 077;openssl genrsa -out httpd.key 2048) 建立證書請求文件 openssl req -new -key httpd.key -days 365 -out httpd.csr 簽發證書 openssl ca -in /etc/httpd/ssl/httpd.csr -out httpd.crt -days 365 查看證書中的信息: openssl x509 -in /path/cert_file -noout -text 4.吊銷證書 獲取要吊銷證書的serial openssl -x509 -in /path/file_crt -noout -serial -subject CA 先根據客戶端提交的serial 與subject 信息,對比校驗是否與index.txt 文件中信息一致 吊銷證書: openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem 生成吊銷證書的編號,第一次吊銷使用 echo 01 > /etc/pki/CA/crlnumber 跟新證書吊銷列表 openssl ca -gencrl -out thisca.crl 查看crl 文件: openssl crl -in /path/from/crl_file.crl -noout -text web service : socket :IPC 的一種實現,容許位於不一樣主機上不一樣進程之間的通訊,數據交換,socket api SOCKET_STREAM :tcp 套接字 SOCKET_DGRAM :udp 套接字 SOCKET_RAM :裸套接字 0-1023 衆所周知, 永久分配給固定應用使用,22(ssh), 80(web), 1024-41951:一位註冊端口, 41952+ :動態端口 ss命令用來顯示處於活動狀態的套接字信息。 ss命令能夠用來獲取socket統計信息,它能夠顯示和netstat相似的內容。 但ss的優點在於它可以顯示更多更詳細的有關TCP和鏈接狀態的信息, 並且比netstat更快速更高效 socket domain : AF_INET .address family,ipv4 AF_INET6 :ipv6 AF_UNIX ;同一主機的不一樣進程 每類套接字都至少提供了兩種流 流: 可靠地傳遞,面向鏈接, 無邊界 ,有鏈接 數據報, 不可靠的傳遞,有邊界 無鏈接 套接字相關係統調用: socket :建立一個套接字 bind :綁定一個進程 listen :監聽 accepted :接受請求 connect : 請求鏈接創建 write : 發送數據 read :接受數據 send ,recv ,sendto,recvfrom http :超文本傳輸協議 hyper text transfer protocol html ;編程語言,超文本標記語言 css : 層疊樣式表 js :javascript MIME :多用途互聯網郵件擴展類型,可以發送非文本數據 web resource :web 資源 靜態文件: .jpg ,.gif .html .txt .js .css .mp3 .avi 動態文件:.php .jsp 媒體: 媒體類型 {MIME 類型} :major /minor text /html text /plain image /jpeg image /gif http 協議版本; HTTP/0.9 :原型版本 HTTP/1.0 : 第一個普遍使用的版本,支持MIME HTTP/1.1 :加強了緩存功能 SPYD : HTTP/2.0 : 一次完整的http 請求過程: 1.創建鏈接 2.接收請求 web I/O 結構 單線程 : 每次只處理一個,對個請求被串行響應 多線程結構:並行啓動多個線程,每一個進程響應一個請求 I/O 複用 :一個進程響應多個用戶請求 多線程模型:一個進程生成多個線程,每一個線程響應一個請求 事件驅動 :event-driven 複用的多進程I/O 結構,啓動多個進程,每一個進程響應多個請求 3.處理請求,對請求報文進程解析,並獲取請求的資源及請求方法的相關信息 元數據:請求的報文首部 method :方法 URI http version host : connection : 4.獲取資源 web 服務器,獲取請求報文中的請求資源,資源放置在本地文件的路徑下 docroot alias 虛擬主機 docroot 用戶家目錄 docroot 5.構建響應報文 MIME 類型; 顯示分類 魔法分類 協商分類 URI 衝定向 永久重定向 301 臨時重定向 302 6.發送響應報文 7.記錄日誌 http 服務器: httpd {apache} nginx lighttpd 應用程序服務器: IIS tomcat,jsp容器,jetty ,jboss,resin webshpere,weblogic ,oc4j www.netcraft.com httpd 的安裝配置和使用: httpd {Apache} a patchy server =apache ASF :Apache software foundation httpd 的特性: 模塊化設計,DSO 機制 core + modules 核心加模塊 DSO:dynamic Shared object MPM :多路處理模塊 prefork :多進程模型,每一個進程響應一個請求 一個主進程:負責生成N個子進程,子進程爲工做進程 每一個子進程處理一個用戶請求,即使沒有用戶請求,也會 預先生成多個空進程,閒時等待請求到達,最大不超過1024個 主進程負責監聽socket ,把請求交給子進程 worker :多進程模型,每一個進程可生成多個線程,每一個線程響應一個請求;預先生成多個空閒進程 event :一個進程直接響應n個請求,可同時啓動多個進程(n*m);基於事件驅動工做。 MPM的三種模型: prefork:多進程模型,每一個進程響應一個請求;穩定性好,但併發能力有限,預先生成多個空閒進程,select()系統調用,不能超過1024個; worker:多進程模型,每一個進程可生成多個線程,每一個線程響應一個請求;預先生成多個空閒進程; event:一個進程直接響應n個請求,可同時啓動多個進程(n*m);基於事件驅動工做。 併發服務器響應請求: 單進程I/O 模型 多進程I/O 模型 複用I/O 模型 多線程模型 事件驅動 利用多進程I/O模型 httpd {2}: centos 6: 2.2 centos 7: 2.4 安裝方式: rpm 編譯安裝 centos 6: 程序環境: 配置文件: /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf 服務腳本: /etc/rc.d/init.d/httpd 腳本配置文件:/etc/sysconfig/httpd 主程序文件: /usr/sbin/httpd /usr/sbin/httpd.event /usr/sbin/httpd.worker 日誌文件: /var/log/httpd access_log :訪問日誌 error_log :錯誤日誌 站點文檔目錄: centos 6: /var/www/html 配置文件的組成部分: grep "Section" /etc/httpd/conf/httpd.conf ### Section 1: Global Environment ### Section 2: 'Main' server configuration ### Section 3: Virtual Hosts 經常使用配置: 1.修改監聽端口: Listen [IP:]PORT 省略 IP 表示監聽本機全部IP ,listen 可重複出現屢次 2. 持久連接: persistent connection :創建鏈接,每一個資源獲取完成不會斷開 ,而是繼續等待其餘請求 如何斷開: 數量限制:100 時間限制:可配置 反作用:對併發訪問量較大的服務器,持久連接功能會使用有些請求的得不到響應, 折中方案: 使用較短的持久連接, http-2.4 支持毫秒級的持久連接 非持久連接; KeepAlive Off MaxKeepAliveRequests 100 KeepAliveTimeout 15 配置格式: directive value 3. MPM multipath process Module : 多路徑處理模塊 prefork ,worker ,event httpd-2.2 不支持同時編譯多個模塊,只能選定一個,rpm 包提供了三個二進制的模塊,選一個 #ps aux |grep httpd 默認/usr/sbin/httpd 爲prefork 模型 查看模塊列表的方式: 查看靜態編譯的模塊; httpd -l 查看靜態編譯和及動態裝載的模塊: httpd -M 更換httpd 程序: 編輯 /etc/sysconfig/httpd HTTPD=/usr/sbin/httpd.event HTTPD=/usr/sbin/httpd.worker 重啓生效 prefork 配置: StartServers 8 ;初始啓動的進程數 MinSpareServers 5 :最小空閒進程數 MaxSpareServers 20 : 最大空閒進程數 ServerLimit 256 : 服務生命週期最大的值 MaxClients 256 :服務端最多同時請求進程 MaxRequestsPerChild 4000 :一個服務器進程最多響應的請求 worker 配置: <IfModule worker.c> StartServers 4 MaxClients 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule> PV: page view UV: user view 獨立IP 量: 4. DSO 機制; 配置指令實現模塊加載 loadmodule {mod_name} {mod_path} 模塊路徑可以使用相對路徑 相對於serverroot {/etc/httpd} 指向的路徑而言: /etc/httpd/modules 5.定義 "Main" server 的文檔頁面路徑 DocumentRoot : 文檔路徑映射 ; DocumentRoot 指向的路徑爲URI 路徑的起始位置 6.站點訪問控制 可基於兩種類型的路徑指明對哪些資源進程訪問控制 文件系統路徑: <Directory ""></Directory> <File ""> </File> URI 路徑: <loacation ""> </location> 訪問控制機制: 基於來源地址: 基於用戶帳號密碼的方式: 7.Directory 中基於來源地址實現訪問控制 (1), options : Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None ,Allow Indexes 索引: 默認主頁面 FollowSymLinks :容許跟蹤符號連接 (2), 基於來源地址的訪問控制 Order Allow from deny from Order allow,deny :白名單 容許一些,其餘所有deny Order deny,allow 黑名單 deny 一些 ,其餘所有allow 來源地址: IP netaddr Order allow,deny Allow from 192.168.100.100 總結:很重要在這個策略中從Order 看先匹配Allow , 其餘都拒絕, Order allow,deny Allow from 192.168.100.100 Deny from all 這個策略看先容許 allow 的,可是在其中寫了Deny ,因此這 條策略所有都爲deny 。allow 也不生效 Order deny,allow Allow from 192.168.100.100 Allow from 192.168.100.200 Deny from all 先匹配deny all ,而後匹配allow ,因此只容許這兩個地址 8.定義默認主頁面: DirectoryIndex index.html index.html.var 9.配置 httpd 日誌設定 ErrorLog logs/error_log :錯誤日誌配置文件 debug, info, notice, warn, error, crit, alert, emerg. LogLevel warn :warn 及以上級別的錯誤日誌記錄 CustomLog logs/access_log combined :日誌格式,有以下幾種 ****************************************************** LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent ************************************************************ %h :客戶端ip地址 %l : 遠程登陸的用戶名。- 表示爲空 %u :remote user ,登陸表單的用戶名 %t : 服務器收到請求的時間 %r : 請求報文的首行信息 %>s : 請求的響應狀態碼 %b :以字節爲單位的響應大小,不包括HTTP標頭。 在CLF格式中,即當沒有字節被髮送時,是「 - 」而不是0 %{Referer}i :請求報文中首部referer 的值 %{User-Agent}i :user-agent 的值 elinks :實現一個純文本界面的WEB 訪問 elinks -dump http://www.baidu.com 10. 路徑別名 DocumentRoot "/www/root" Alias "/URL/" "/PATH/TO/DRI/" 把一個URI 映射到其餘位置,爲 路徑別名 11.設定默認字符集 AddDefaultCharset UTF-8 GBK,GB2312,gb18030 12. 基於用戶的訪問控制 認證質詢 WWW-Authenticate:響應碼爲401,拒絕客戶端請求,並要求客戶端驗證用戶名密碼 認證經過,服務器返回響應報文 認證方法: basic :明文 digest: 消息摘要 安全域:須要用戶認證後方能訪問的路徑 應該經過名稱對其進行標識,並告知用戶認證的緣由 用戶的帳號密碼存儲位置: 虛擬帳號: 僅用於訪問某個服務 存儲: 文本文件 SQL 數據庫 ldap 服務器 nis basic 認證: 1.定義安全域 <Directory ""> Options None AllowOverride None AuthType Basic AuthName "" AuthUserFile "/PATH/file" Require user usrname1 2 <Directory> 容許帳號文件中的全部用戶登陸訪問: 2.提供帳號密碼存儲 文本文件 使用 htpasswd 命令進行管理 ************************************* <Directory "/www/DR/admin"> Options None AllowOverride None AuthType Basic AuthName "test page" AuthUserFile "/etc/httpd/conf.d/.htpasswd" Require valid-user #容許全部用戶訪問 #Require tom #僅容許tom 訪問 </Directory> ********************************************** htpasswd 命令的使用: htpasswd options username -c :自動建立passwd file ,所以僅在第一個用戶添加時使用 -m :MD5 加密用戶密碼 -s :SHA1 加密用戶密碼 -D :刪除指定用戶 -b:在命令行中一併輸入用戶名和密碼而不是根據提示輸入密碼 htpasswd -c -m .htpasswd tom #首次建立文本加 -c htpasswd -m .htpasswd tom #後面不用加 -c 密碼能夠直接加在後面: htpasswd -b -m .htpasswd tom1 123.com 3.基於組進行認證 <Directory "/www/DR/admin"> Options None AllowOverride None AuthType Basic AuthName "test page" AuthUserFile "/etc/httpd/conf.d/.htpasswd" AuthGroupFile "path/file" Require group </Directory> 提供用戶帳號文件,組文件 組文件: 每一行定義一個組 GRP_Name : user1 user2 user3 ********************************************** 列子: <Directory "/www/DR/admin"> Options None AllowOverride None AuthType Basic AuthName "test page" AuthUserFile "/etc/httpd/conf.d/.htpasswd" AuthGroupFile "/etc/httpd/conf.d/.htgroup" Require group webadmin </Directory> 組文件格式: webadmin:tom1 tom2 zy:zy #多個用戶用空格隔開 ********************************************** 報錯信息: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName 修改:在配置文件中添加 ServerName 127.0.0.1 虛擬主機: 基於IP 爲每一個虛擬主機配置第一個ip 基於port 每一個虛擬主機一個port,不多用 基於hostname 每一個虛擬主機至少一個hostname 注意:通常虛擬主機不與中心主機混用,所以使用時先禁用虛擬主機 每一個虛擬主機專用配置: <VirtualHost "IP.port"> ServerName DocumentRoot "" #uri </VirtualHost> ServerAlias :虛擬主機的別名 ErrorLog : CustomLog : <Directory ""> #訪問控制 </Directory> —————————————————————————————————————————————— 列子: <VirtualHost 192.168.100.230:80> ServerName test1.virtualhost DocumentRoot "/www/1/" </VirtualHost> <VirtualHost 192.168.100.220:80> ServerName test1.virtualhost DocumentRoot "/www/2/" </VirtualHost> ___________________________________________________ 基於hostname :須要開啓NameVirtualHost 功能,而且這個地址和下面的地址同樣,或者都是* 號 NameVirtualHost 192.168.100.230:80 <VirtualHost 192.168.100.230:80> ServerName test1.virtualhost #經過ServerName 來區分 DocumentRoot "/www/1/" </VirtualHost> <VirtualHost 192.168.100.230:80> ServerName test2.virtualhost DocumentRoot "/www/2/" </VirtualHost> log 配置: <VirtualHost 192.168.100.230:80> ServerName test1.virtualhost DocumentRoot "/www/1/" CustomLog logs/web1_access_log combined #本身定義log 文件 </VirtualHost> <VirtualHost 192.168.100.230:80> ServerName test2.virtualhost DocumentRoot "/www/2/" CustomLog logs/web2_access_log combined </VirtualHost> 14.內置的status 頁面: # Allow server status reports generated by mod_status, # with the URL of http://servername/server-status # Change the ".example.com" to match your domain to enable. # <Location /server-status> SetHandler server-status Order deny,allow Deny from all # Allow from .example.com Allow from 192.168 </Location> #能夠在其中使用基於basic 的認證 http 協議和httpd 配置: URI、URL和URN URI :Uniform Resource Identifier,統一資源標識符; URL:Uniform Resource Locator,統一資源定位符; URN:Uniform Resource Name,統一資源名稱 URL 方案: scheme 服務器地址:ip:port 資源路徑: 基本語法 : scheme://user:password:@host:port/path/params:query#frag 或者: scheme://user:password@host:port/path;params?query#frag 通用格式:方案://用戶名:密碼@主機名:端口/服務器上資源的路徑;參數?查詢#片斷 params:參數 query :查詢標準 frag : 片斷 相對URL : 絕對URL : http 協議: cookie 機制會話保持方式 session ; http 事務: 請求:request 響應:response 報文語法格式: request 報文: method request-uri version headers entity-body response 報文: version status reason-phrase headers entity-body method :請求方法;代表客戶端但願服務器對資源執行的動做 GET HEAD POST version : HTTP<major>.<minor> status :標記請求過程當中發生的狀況 200 ,301,302,404,502 reason-phrase : 狀態碼所標記的狀態簡要描述 headers: 每一個請求或者響應報文可包含任意個首部,每一個首部都有一個首部名稱 entity-body:請求或響應時附加的數據 method : GET :獲取資源 HEAD:只從服務器獲取響應首部 POST :向服務器發送要處理的數據 PUT :將請求的主體部分存儲在服務器上 DELETE :請求刪除服務器上指定的文件 TRACE :追蹤請求過程當中到達服務器中間通過的代理服務器 OPTIONS :請求服務器返回對指定資源的支持使用的請求方法 協議查看分析工具: tcpdump 。wrieshark,tshark status 狀態碼: 1xx 100-101 信息提示 2xx 200-206 成功 3xx 300-305 重定向 4xx 400-415 錯誤信息,客戶端發生的錯誤 5xx 500-505 錯誤信息,服務器端錯誤 經常使用狀態碼: 200 成功:請求數據經過響應報文 entity-body 部分發送.0K 301 永久重定向: 請求的資源被刪除,可是在響應報文中經過首部location 指定資源新的位置 302 臨時重定向: 與301 類似,可是在響應報文中經過location指明資源臨時新的位置 304 客戶端發送了條件請求,假如客戶端緩存了文件,從新請求是服務器響應304 401 須要輸入帳號和密碼認證才能訪問資源,unauthorized 403 請求被禁止,forbidden 404 服務器沒法找到客戶端請求的資源 not found 500 服務器內部錯誤,internal server error 502 代理服務器從後端服務器收到一條僞響應 headers : 格式: 請求headers Request URL:https://translate.google.cn/ Request Method:GET Status Code:200 Remote Address:203.208.39.215:443 Referrer Policy:no-referrer-when-downgrade 響應headers : Accept-Ranges:bytes Cache-Control:max-age=604800 Connection:keep-alive Content-Length:185 Content-Type:image/gif Date:Thu, 09 Nov 2017 02:57:31 GMT Expires:Thu, 16 Nov 2017 02:57:31 GMT Last-Modified:Sun, 01 Aug 2010 07:22:34 GMT Load-Balancing:web05 Load-Balancing:web05 Load-Balancing:web05 首部的分類: 通用首部 請求首部 響應首部 實體首部 擴展首部 通用首部: date :報文建立的時間 connection :鏈接狀態 keep-alive ,close Via ;顯示報文通過的中間節點 Cache-Control :控制緩存 請求首部; accept: 通知服務器可接受的媒體類型 Accept-Charset:接受的字符集 Accept-Encoding ;可接受的編碼格式 Accept-language ;接受的語言 Client-ip: host :請求的服務器名稱 referer :包含當前正在請求的資源的上一級資源 User-Agent:客戶端代理 條件式請求首部: expect if-modified-since:自從指定的時間後,請求的資源是否發生更改 if-unmodfied-since:沒修改過 if-None-Match :本地緩存文檔的Etag 和與服務器的是否不匹配 if-Match : 安全請求首部: Authorization :向服務器發送認證信息。如帳號和密碼 cookie :客戶端向服務器發送cookie cookie2: 第二個版本 代理請求首部: Proxy-Authorization :向代理服務器認證 響應首部: 信息性: Age : 響應持續時長 server :服務器軟件名稱和版本 協商首部:某資源有多種表示方法時使用 Accept-Range :服務器接受的範圍 Vary :服務器查看的其餘首部列表 安全響應首部: set-cookie ;向客戶端設置cookie WWW-Authenticate :來自服務器對客戶端的驗證表單 實體首部: Allow :列出對此實體可以使用的請求方法 location :告訴客戶端真正實體的位置 content-encoding: content-language content-length Content-Type :主體的對象類型 緩存相關; Etag;實體的擴展標籤 expire :過時時間 last-Modified :最後一次修改的時間 httpd-2.2. curl 命令: curl命令是一個利用URL規則在命令行下工做的文件傳輸工具。 它支持文件的上傳和下載,因此是綜合傳輸工具,但按傳統, 習慣稱curl爲下載工具。做爲一款強力工具,curl支持包括HTTP、 HTTPS、ftp等衆多協議,還支持POST、cookies、認證、從指定偏移處 下載部分文件、用戶代理字符串、限速、文件大小、進度條等特徵。 作網頁處理流程和數據檢索自動化,curl能夠祝一臂之力。 -A :用戶代理併發送給服務器 用法; curl [options] URL elinks 工具: 16. 使用mod_deflate 模塊壓縮頁面優化傳輸速度 須要先肯定關於壓縮的兩個模塊是否啓用 #LoadModule deflate_module modules/mod_deflate.so 去掉「#」號 ----------------------------------------------------- SetOutputFilter DEFLATE #啓動壓縮過濾器DEFLATE <IfModule mod_deflate.c> #啓動了deflate壓縮模塊的時候: AddOutputFilterByType DEFLATE text/plain #壓縮text/plain類型的文件 AddOutputFilterByType DEFLATE text/html #壓縮text/html類型的文件 AddOutputFilterByType DEFLATE text/xml #壓縮text/xml類型的文件 AddOutputFilterByType DEFLATE text/javascript #壓縮text/javascript類型的文件 AddOutputFilterByType DEFLATE text/css #壓縮text/css類型的文件 AddOutputFilterByType DEFLATE application/xhtml+xml #壓縮這個格式的 ... #DeflateCompressionLevel 9 #指定壓縮級別爲9,這裏註釋起來了使用默認壓縮級別6 # Netscape 4.x has some problems. BrowserMatch ^Mozilla/4 gzip-only-text/html #對火狐4.x的只使用gzip壓縮text/html # Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4\.0[678] no-gzip #對火狐4.06-4.08不使用gzip壓縮 # MSIE masquerades as Netscape, but it is fine BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html 對IE使用gizp </IfModule> ———————————————————————————————————————————————————————————————————————————————————————————— 17.https 的實現 SSL 會話的簡化過程: 1.客戶端發送可供選擇的加密方式,並向服務器請求證書 2.服務器發送證書及選定的加密方式給客戶端 3.證書效驗 若是信任給其版發的證書的CA 1.驗證證書來源合法性,用CA 的公鑰解密證書上的數字簽名 2.驗證證書的內容合法性,2完整性驗證 3.檢查證書的有效期限 4.檢查證書是否被吊銷 5.common name 是否一致 4.客戶端生成臨時會話祕鑰{對稱祕鑰},並使用服務端的公鑰加密此數據發送給服務器,完成祕鑰交換 5.服務器用此祕鑰加密用戶的請求資源響應給客戶端 注意:SSL 會話基於IP 的,所以虛擬主機僅能夠使用一個https 配置httpd 支持https : 須要安裝模塊 mod_ssl 以下: yum install mod_ssl -y *************************************************************** 配置文件: /etc/httpd/conf.d/ssl.conf DocumentRoot "/www/1" ServerName web1.zy.com:443 SSLCertificateFile /etc/httpd/ssl/web1.zy.com.crt SSLCertificateKeyFile /etc/httpd/ssl/httpd.key httpd ssl 加密的配置 ********************************************************************** 測試基於https 訪問響應的主機: openssl s_client -connect 192.168.100.230:443 -CAfile /etc/pki/CA/cacert.pem 18. httpd 自帶的工具程序 htpasswd : Apachectl :httpd 服務控制腳本 apxs ;擴展工具, rotatelogs :日誌滾動工具 suexec :訪問某些特殊權限的資源時,臨時切換用戶執行 19. 壓力測試工具 ab :Apache benchmark webbench http_load jmeter loadrunner tcpcopy ab 工具: ab {options} URL -n :總的請求數 -c :模擬的併發數 -k :以持久連接模式測試 ulimit -n :調整用戶所同時打開的文件數、 ab -c 100 -n 10000 http://192.168.100.230/ httpd-2.4 : 新特性 1.MPM 支持運行DSO 機制 2.支持event MPM 3.支持異步讀寫 4.支持每一個模塊及每一個目錄分別使用各自的日誌級別 5.每請求配置 6.加強版的表達式分析器 7.支持毫秒級的 keeplive timeout 8.支持FQDN 的虛擬主機不在須要namevirtualhost 指令 9.支持用戶自定義變量 新模塊: 1.mod_proxy_fcgi 2.mod_ratelimit 3.mod_remoteip 修改了一些機制: 再也不支持使用order ,deny ,allow 來作基於IP 的訪問控制 centos 6:使用httpd-2.4 須要apr-util,1.4及以上版本 ./configure --prefix=/usr/local/apache --sysconf=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork #提示openssl 版本太老 Centos 7 : httpd-2.4 配置文件分紅三類: 主配置文件: /etc/httpd/conf/httpd.conf 模塊配置文件: /etc/httpd/conf.modules.d/*.conf 輔助配置文件: /etc/httpd/conf.d/*.conf mpm :以DSO 機制提供, 配置文件mpm.conf 服務控制使用systemctl {retart |start |stop |status |reload} httpd 配置: 1.切換使用MPM loadModule mpm_NAME_module modules/mod_mpm_NAME.so NAME: prefork ,event ,worker 2.修改Main server的DocymentRoor 3.基於IP 的訪問控制法則 須要封裝爲類:單獨使用 requireall 定義 <RequireAll> Require not ip 192.168.100.100 Require all granted </RequireAll> 容許全部主機訪問:Require all granted 拒絕全部主機訪問:require all deny 控制特定ip 訪問; Require ip IPADDR; 受權指定來源地址的訪問 Require not ip ipaddr ; 指定拒絕來的地址的主機訪問 IP 類型: ip ; 1.1.1.1 Network/Mask ; 1.1.1.0/255.255.255.0 Network/length : 1.1.1.0/24 net : 1.1.1 控制特定主機的{Hostname} 訪問 Require host HOST_NAME Require not host host_name HOSTNAME ; FQDN :特定主機 DOMAIN :指定域內的全部主機 4.虛擬主機 基於 IP port hostname 都支持 基於 FQDN 不在須要namevirtualhost 指令 5. ssl 啓用模塊: LoadModule ssl_module modules/mod_ssl.so 6. centos 6 服務腳本 ************ LAMP : linux : apache mariadb ,mysql php ,perl ,python LAMMP ;memcached 靜態資源: 靜態文件, 客戶端從服務器得到資源的的表現形式與源文件相同 動態資源: 一般指程序文件,需在在服務器執行後,將結果返回給客戶端 CGI :Common Gateway Interface 通用網關接口 fastCGI : moudles : centos 7 : 程序包 : httpd ,php ,php-mysql,mariadb-server #php 要求httpd 工做在prefork mpm 啓動服務: systemctl start httpd systemctl start mariadb centos 6: 程序包 : httpd ,php ,php-mysql ,mysql-server 測試: PHP 程序執行環境, test.php <?php phpinfo(); ?> 測試PHP程序與mysql 通訊 : ____________________________________________________ <?php $link=mysql_connect('127.0.0.1','mysql',''); if ($link) echo "success" ; else echo "Failure" ; mysql_close(); ?> __________________________________________ centos 7 : 程序包 httpd php,php-mysql ,mariadb-server #必須工做在perfork 模式下 systemctl start httpd systemctl start mariadb ss命令用來顯示處於活動狀態的套接字信息 ssl -tnl wordpress 的實現: *************************************** // ** MySQL 設置 - 具體信息來自您正在使用的主機 ** // /** WordPress數據庫的名稱 */ define('DB_NAME', 'worddb'); /** MySQL數據庫用戶名 */ define('DB_USER', 'zy'); /** MySQL數據庫密碼 */ define('DB_PASSWORD', 'default_zy'); mySQL : ******************************************** 1.爲用戶建立數據庫 [sql] view plain copy create database test DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 列子: create database test1; 爲新用戶分配權限 授予用戶經過外網IP對於該數據庫的所有權限 [sql] view plain copy grant all privileges on `testdb`.* to 'test'@'%' identified by '123456'; 列子:grant all on test1.* to 'wpuser'@'localhost' identified by 'default_zy'; 授予用戶在本地服務器對該數據庫的所有權限 [sql] view plain copy grant all privileges on `testdb`.* to 'test'@'localhost' identified by '123456'; grant all privileges on `testdb`.* to 'test'@'127.0.0.1' identified by '123456'; #mysql 可能會反解地址 刷新權限 [sql] view plain copy flush privileges; 退出 root 從新登陸 [sql] view plain copy exit 連接數據庫 mysql -uzy -pdefault_zy phpMyAdmin : mariadb 的 webGUI # $cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */ 提供隨機字符串 tr -d 'a-zA-Z0-9' < /dev/urandom |head -30 | md5sum 依賴擴展: yum install php-mbstring service httpd restart 添加:skip_name_resolve = on 到 /etc/my.cnf $cfg['Servers'][$i]['host'] = '127.0.0.1'; #將localhost 改成 127.0.0.1 ____________________________________________________ 檢查安裝環境是否齊全: yum -y install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre* make gd-devel libjpeg-devel libpng-devel libxml2-devel bzip2-devel libcurl-devel freetype-devel _________________________________________________________ wordpress 的實現: 須要httpd 安裝php 擴展模塊 phpMyAdmin : mariadb 的 webGUI php 解釋器如何與mariadb 交互: 解釋器:解釋執行php 代碼,無需與mariadb 交互 存儲系統: 文件系統: 文件 SQL :mariadb ,oracle ,MSSQL noSQL :redis ,mongodb ,hbase... newsql: PHP 是通用服務器腳本編程語言,主要用於開發實現動態WEB 站點, 嵌入HTML 源碼文檔中的服務器腳本語言。 php 編譯的四個步驟: 1.Scanning(Lexing) ,將PHP代碼轉換爲語言片斷(Tokens) 2.Parsing, 將Tokens轉換成簡單而有意義的表達式 3.Compilation, 將表達式編譯成Opocdes 4.Execution, 順次執行Opcodes,每次一條,從而實現PHP腳本的功能。 關於PHP 1、PHP簡介 PHP是通用服務器端腳本編程語言,其主要用於web開發以實現動態web頁面,它也是最先實現將腳本嵌入HTML源碼文檔中的服務器端腳本語言之一。同時,php還提供了一個命令行接口,所以,其也能夠在大多數系統上做爲一個獨立的shell來使用。 Rasmus Lerdorf於1994年開始開發PHP,它是初是一組被Rasmus Lerdorf稱做「Personal Home Page Tool」 的Perl腳本, 這些腳本能夠用於顯示做者的簡歷並記錄用戶對其網站的訪問。後來,Rasmus Lerdorf使用C語言將這些Perl腳本重寫爲CGI程序,還爲其增長了運行Web forms的能力以及與數據庫交互的特性,並將其重命名爲「Personal Home Page/Forms Interpreter」或「PHP/FI」。此時,PHP/FI已經能夠用於開發簡單的動態web程序了,這便是PHP 1.0。1995年6月,Rasmus Lerdorf把它的PHP發佈於comp.infosystems.www.authoring.cgi Usenet討論組,今後PHP開始走進人們的視野。1997年,其2.0版本發佈。 1997年,兩名以色列程序員Zeev Suraski和Andi Gutmans重寫的PHP的分析器(parser)成爲PHP發展到3.0的基礎,並且今後將PHP重命名爲PHP: Hypertext Preprocessor。此後,這兩名程序員開始重寫整個PHP核心,並於1999年發佈了Zend Engine 1.0,這也意味着PHP 4.0的誕生。2004年7月,Zend Engine 2.0發佈,由此也將PHP帶入了PHP 5時代。PHP5包含了許多重要的新特性,如加強的面向對象編程的支持、支持PDO(PHP Data Objects)擴展機制以及一系列對PHP性能的改進。 2、PHP Zend Engine Zend Engine是開源的、PHP腳本語言的解釋器,它最先是由以色列理工學院(Technion)的學生Andi Gutmans和Zeev Suraski所開發,Zend也正是此二人名字的合稱。後來兩人聯合創立了Zend Technologies公司。 Zend Engine 1.0於1999年隨PHP 4發佈,由C語言開發且通過高度優化,並可以作爲PHP的後端模塊使用。Zend Engine爲PHP提供了內存和資源管理的功能以及其它的一些標準服務,其高性能、可靠性和可擴展性在促進PHP成爲一種流行的語言方面發揮了重要做用。 Zend Engine的出現將PHP代碼的處理過程分紅了兩個階段:首先是分析PHP代碼並將其轉換爲稱做Zend opcode的二進制格式(相似Java的字節碼),並將其存儲於內存中;第二階段是使用Zend Engine去執行這些轉換後的Opcode。 3、PHP的Opcode Opcode是一種PHP腳本編譯後的中間語言,就像Java的ByteCode,或者.NET的MSL。PHP執行PHP腳本代碼通常會通過以下4個步驟(確切的來講,應該是PHP的語言引擎Zend): 一、Scanning(Lexing) —— 將PHP代碼轉換爲語言片斷(Tokens) 二、Parsing —— 將Tokens轉換成簡單而有意義的表達式 三、Compilation —— 將表達式編譯成Opocdes 四、Execution —— 順次執行Opcodes,每次一條,從而實現PHP腳本的功能 掃描-->分析-->編譯-->執行 4、php的加速器 基於PHP的特殊擴展機制如opcode緩存擴展也能夠將opcode緩存於php的共享內存中,從而可讓同一段代碼的後續重複執行時跳過編譯階段以提升性能。由此也能夠看出,這些加速器並不是真正提升了opcode的運行速度,而僅是經過分析opcode後並將它們從新排列以達到快速執行的目的。 常見的php加速器有: 一、APC (Alternative PHP Cache) 遵循PHP License的開源框架,PHP opcode緩存加速器,目前的版本不適用於PHP 5.4。項目地址,http://pecl.php.net/package/APC。 二、eAccelerator 源於Turck MMCache,早期的版本包含了一個PHP encoder和PHP loader,目前encoder已經不在支持。項目地址, http://eaccelerator.net/。 三、XCache 快速並且穩定的PHP opcode緩存,通過嚴格測試且被大量用於生產環境。項目地址,http://xcache.lighttpd.net/ 四、Zend Optimizer和Zend Guard Loader Zend Optimizer並不是一個opcode加速器,它是由Zend Technologies爲PHP5.2及之前的版本提供的一個免費、閉源的PHP擴展,其可以運行由Zend Guard生成的加密的PHP代碼或模糊代碼。 而Zend Guard Loader則是專爲PHP5.3提供的相似於Zend Optimizer功能的擴展。項目地址,http://www.zend.com/en/products/guard/runtime-decoders 五、NuSphere PhpExpress NuSphere的一款開源PHP加速器,它支持裝載經過NuSphere PHP Encoder編碼的PHP程序文件,並可以實現對常規PHP文件的執行加速。項目地址,http://www.nusphere.com/products/phpexpress.htm 5、PHP源碼目錄結構 PHP的源碼在結構上很是清晰。其代碼根目錄中主要包含了一些說明文件以及設計方案,並提供了以下子目錄: 一、build —— 顧名思義,這裏主要放置一些跟源碼編譯相關的文件,好比開始構建以前的buildconf腳本及一些檢查環境的腳本等。 二、ext —— 官方的擴展目錄,包括了絕大多數PHP的函數的定義和實現,如array系列,pdo系列,spl系列等函數的實現。 我的開發的擴展在測試時也能夠放到這個目錄,以方便測試等。 三、main —— 這裏存放的就是PHP最爲核心的文件了,是實現PHP的基礎設施,這裏和Zend引擎不同,Zend引擎主要實現語言最核心的語言運行環境。 四、Zend —— Zend引擎的實現目錄,好比腳本的詞法語法解析,opcode的執行以及擴展機制的實現等等。 五、pear —— PHP 擴展與應用倉庫,包含PEAR的核心文件。 六、sapi —— 包含了各類服務器抽象層的代碼,例如apache的mod_php,cgi,fastcgi以及fpm等等接口。 七、TSRM —— PHP的線程安全是構建在TSRM庫之上的,PHP實現中常見的*G宏一般是對TSRM的封裝,TSRM(Thread Safe Resource Manager)線程安全資源管理器。 八、tests —— PHP的測試腳本集合,包含PHP各項功能的測試文件。 九、win32 —— 這個目錄主要包括Windows平臺相關的一些實現,好比sokcet的實如今Windows下和*Nix平臺就不太同樣,同時也包括了Windows下編譯PHP相關的腳本。 php.ini官方文檔: 配置參數:http://www.php.net/manual/zh/ini.list.php 核心配置參數詳解:http://www.php.net/manual/zh/ini.core.php php的安裝: rpm包 編譯安裝 開源php站點程序: wordpress drupal, joomlar phpwind(阿里) discuz(騰訊) phpbb phpMyAdmin: php, 管理 mysql程序 SELinux: selinux :Security-Enhanced Linux;工做與內核之中 DAC :自主訪問控制 MAC :強制訪問控制 兩種工做級別: strict :每一個進程都受到selinxu 的控制 targeted :僅有限個進程受的selinux 控制 只監控容易被入侵的進程; subject operation object subject :進程 object :進程,文件 {被操做的對象} 文件可執行的動做: open ,write,read,close ,chmod chown ls -Z :查看selinux 爲每一個進程文件提供的標籤 selinux 配置文件: /etc/sysconfig/selinux SELINUX=permissive user:role:type user:selinux 定義的user role:角色 type:類型 selinux 規則庫: 規則:哪一種域能訪問哪一種或哪些類型的文件 getsebool命令是用來查詢SElinux策略內各項規則的布爾值。 SELinux的策略與規則管理相關命令:seinfo命令、sesearch命令、 getsebool命令、setsebool命令、semanage命令。 配置 seLinux : SELinux 是否啓用: 給文件從新打標 設定布爾型開關 日誌位置: /var/log/audit/audit.log selinux 的狀態: enforcing :強制,每一個受限的進程必然受限 permissive :啓動,每一個受限的進程違規操做時不會禁止,會記錄日誌 disable :關閉,要重啓 必須從新啓動系統,內核會對文件系統從新標籤 getenforce: 查看當前狀態 setenforce :設置狀態 0或1 :0 設置爲permissive 1 設置爲enforcing 此設定重啓系統無效,須要修改配置文件 配置目錄:相同文件,連接文件 /etc/sysconfig/selinux /etc/selinux/config chcon : change file SELinux security context 改變類型: chcon -t admin_home_t tmp.txt ———————————————————————————————————————————————— 參數: -h, --no-dereference:影響符號鏈接而非引用的文件。 --reference=參考文件:使用指定參考文件的安全環境,而非指定值。 -R, --recursive:遞歸處理全部的文件及子目錄。 -v, --verbose:爲處理的全部文件顯示診斷信息。 -u, --user=用戶:設置指定用戶的目標安全環境。 -r, --role=角色:設置指定角色的目標安全環境。 -t, --type=類型:設置指定類型的目標安全環境。 -l, --range=範圍:設置指定範圍的目標安全環境。 —————————————————————————————————————————————————————————————————— 還原文件的默認標籤: restorecon restorecon index.html 布爾型規則: setsebool命令是用來修改SElinux策略內各項規則的布爾值 getsebool : 查看,獲取 getsebool -a getsebool zebra_write_config setsebool [-P] 布爾值=[0|1] -P 永久有效 setsebool -P tftp_home_dir 0 setsebool -P tftp_home_dir on 確保防火牆處於關閉狀態: ~]# iptables -L -n LAMP (2): PHP : php 解釋器 配置文件:/etc/php.ini,/etc/php.d/*.ini 配置文件:PHP.ini 在PHP 啓動時被讀取,對於服務器模塊的版本的php , 僅在web 啓動時讀取一次, 對於CGI 和CLI 每次調用都會讀取 mariadb (mysql) : 數據接口模型:層次模型,網狀結構,關係模型 關係型數據庫的一種開源的實現。 關係型數據庫的優點: 1. 保持數據的一致性(事務處理) 2.因爲以標準化爲前提,數據更新的開銷很小(相同的字段基本上都只有一處) 3. 能夠進行Join等複雜查詢 其中可以保持數據的一致性是關係型數據庫的最大優點。 前主流的關係型數據庫有Oracle、DB二、Microsoft SQL Server、Microsoft Access、MySQL等。 非關係型數據庫有 NoSql、Cloudant。 結構化查詢語言(Structured Query Language)簡稱SQL( 數據庫管理系統: DBMS 關係:relational ,RDBMS RDBMS; MYSQL : Mysql ,mariadb ,percona-Server postgreSQL :簡稱 pgsql --> EnterpriseDB Oracle : MSSQL :微軟SQL 事務:多個寫操做要被當作一個總體對待 ACID: 結構化查詢語言(Structured Query Language)簡稱SQL SQL 解釋器 數據存儲協議: 應用層協議 ,C/S 每一個數據庫的類型都有本身的協議, S :server ,監聽於套接字,接受並處理客戶端請求 C :client 程序接口: CLI GUI 應用編程接口, 庫 ODBC :open database connection 範式:第一範式、第二範式、第三範式 基礎概念: 約束:constraint ,向數據表中提供的數據要遵照的限制 主鍵: 一個或多個字段組合,能惟一標識本行記錄,NOT NULL 惟一鍵:一個或多個字段的組合,填入的數據必須能在本表中標識本行,容許爲NULL 外鍵: 一張表中某字段可填入數據取決於另外一個表中主鍵已有的數據 檢查性: 索引:將表中的一個或多個字段中的數據複製一份另存,而且此些數據須要按特定次序存儲 關係運算: 選擇 :挑選出符合條件的行,部分 投影 :挑選出須要的字段, 連接 : 數據抽象: 物理層:決定數據的存儲格式,及RDBMS 在磁盤上如何組織文件 邏輯層:描述DB 中存儲什麼數據,以及數據間存在什麼關係 視圖層: 描述DB 中的部分數據 關係模型分類; 關係模型 實體-關係模型 基於對象的關係模型 半結構化的關係模型 MariaDB : Mysql AB --> Mysql 安裝Mysql : 源代碼: 編譯安裝 二進制格式的程序包 :展開至特定路徑,並通過簡單的配置及可以使用 程序包管理的的數據包: rpm : OS Verdor, 官方 deb : MariaDB 的特性: 插件式的存儲引擎:存儲管理器有多種實現版本,功能和特定也有區別 存儲引擎也稱爲」表類型" (1) 更多的存儲引擎 MyISAM >Aria ,InnoDB InnoDB--> XtraDB (2) 諸多擴展和新特性 (3) 提供了較多的測試組件 (4) true open source 安裝和使用Mariadb centos 7 直接提供使用, Centos 6 :通用二進制格式安裝過程 1.準備數據庫 以 /mydata/data 爲列 2.安裝配置 mariadb #groupadd -r -g 306 mysql #useradd -r -g 306 -u 306 mysql #tar xf mariadb-version.tar.gz -C /usr/local/ #ln -sv mairdb mysql #cd /usr/lcoal/mysql #chown -r root:mysql ./* #sripts/mysql_install_db --datadir=/mydata/data --usermysql #cp support-file/mysql.server /etc/rc.d/init.d/mysqld #chkconfig --add mysqld 3. 準備配置文件 配置格式:類ini 格式, 爲各程序均經過單個配置文件提供配置信息 [prog_name] 配置文件查找次序: /etc/my.cnf -->/etc/mysql/my.cnf --> --default-extra-file=/path/to/file --> ~./my.cnf #cp support-files/my-large.cnf /etc/mysql/my.cnf 添加三個選項: datadir = /mydata/data innodb_file_per_table = on skip_name_resolve = on Mariadb的程序組成: C : mysql CLI 交互式程序客戶端程序 mysqldump,mysqladmin... S : mysqld_safe mysqld mysqld_multi 服務器監聽的兩種socket 地址: ip socket ;監聽在TCP 的3306 端口 ,支持遠程通訊 unix sock :監聽在sock 文件上(/tmp/mysql.sock ,/var/lib/mysql/mysql.sock)僅支持本地通訊 server ip : localhost ,127.0.0.1 命令行交互式客戶端: mysql mysql -uUSERNAME ;指明用戶名 默認爲root -hHost : 服務地址 默認127.0.0.1 -pPASSWORD ;用戶密碼 默認爲 空密碼 注意: mysql 的用戶名和用戶帳號有兩部分組成 'USERNAME'@'HOST' ,其中HOST 限制此用戶可經過哪些主機遠程鏈接本服務器 支持使用通配符: % :匹配任意長度的任意字符 172.16.0.0、16 _ : 任意單個字符 完成安全初始化: /usr/local/mysql/bin/mysql_secure_installation 命令: 客戶端命令: 本地執行 mysql > help 每一個命令都有完整形式和簡寫格式 status ,\s 服務端命令: 經過mysql 命令發送至服務器返回結果 每一個命令都須要 ';' 結束,命令結束符 關係型數據庫的基本組件: 數據庫: database 表: table 行:row 列:column 索引 :index 視圖: view 用戶: user 權限: privileges 存儲過程: procedure 存儲函數: function 觸發器: trigger 事件調度器: event scheduler SQL 語言: DDL :Data Defination Language CREATE ,DROP ,ALTER DML :Data Manipulation Language INSERT ,DELETE ,UPDATE ,SELECT GRANT ,REVOKE 數據庫: CREATE DATABASE|SCHEMA "db_NAME"; CREATE DATABASE|SCHEMA [IF NOT EXISTS] "db_NAME"; DROP DATABASE|SCHEMA "DB_NAME"; [DEFAULT] CHARACTER SET [=] charset_name [DEFAULT] COLLATE [=] collation_name SHOW CHARACTER SET; show character set; #查看支持的字符編碼 SHOW COLLATION; 查看字符集排序規則 SHOW DATABASES; #查看數據庫, 表: CREATE TABLE tb_name (col1 datatype 修飾符 ,col2 datatype 修飾符) ENGINE '' 查看錶: SHOW TABLES [from db_name] 查看錶結構:DESC [db_name.]tb_name 查看支持的搜索引擎 :SHOW ENGINES; 刪除表: DROP TABLE tb_name ; 獲取命令幫助: mysql> HELP CREATE DATABASE; 對象存儲: TEXT :不區分大小寫 BLOG :區分字符大小寫 內置類型: ENUM SET 數據類型: 字符型: 定長字符型 CHAR(#), BINARY(#) 變長字符型 VARVCHAR(#), VARBINARY(#) 數值型: 精確數值型; 整型 :int tinyint:1byte smallint :2byter mediumint :3byter int :4byter bigint: 8byter 十進制 近似數值型 單精度浮點型 float 雙精度浮點型 double 修飾符: NOT NULL ; 非空約束 DEFAULT VALUE; 設定默認值 回顧:Mariadb 的基礎 關係:二維關係 ,表,(行,列) 設計範式: 第一範式: 字段是原子性 第二範式; 存在可用主鍵 第三範式: 任何表都不該該有依賴於其餘表非主鍵的字段; 約束:主鍵,惟一性,外鍵,(檢查性約束); Mariadb 安裝方式; 源碼編譯安裝 通用二進制格式 包管理器 (RPM ,deb) OS Vendor ,程序官方; SQL : 數據庫組件: 數據庫 ,表,索引,視圖,用戶,權限 存儲過程 ,存儲函數,觸發器,事件調度器 建立數據庫, 設計數據表 字段:字段名,數據類型,約束 DDL ,DML ,DCL DDL :CREATE ,DROP ,ALTER , DML :INSERT (REPLACE) ,DELETE,UPDATE ,SELECT DCL :GRANT ,REVOKE , 數據類型: 字符: 變長字符 定長字符 內建類型 對象:TEXT,BLOG 數值: 精確數值 整型 十進制 近似類型 修飾符: NOT NULL DEFAULT 字段修飾符: UNIOUE KEY PRIMARY KEY 日期時間型: 日期: DATE 時間: TIME 日期時間:DATETIME 時間戳: TIMESTAMP 年份: YEAR 數據庫: CREATE DATABASE [IF NOT EXISTS] 'DB_NAME' CHARACTER SET [=] collate SHOW CHARACTER SET ; SHOW COLLATIONS; DROP DATABASE [IF EXISTS] 'DB_NAME'; 表: CREATE TABLE [IF NOT EXISTS] 'tb1_name' (col1 type1,col2 type2,....) col type1 PRIMARY KEY (col1,....) UNIQUE KEY (col1,...) 表選項: ENGINE [=] engine_name SHOW ENGINES; 獲取幫助: HELP CREATE TABLE ; 查看建立的命令: SHOW CREATE TABLE tab_NAME; 查看錶狀態: SHOW TABLE STATUS LIKE 'tb1_name'\G DROP TABLE [IF EXISTS]'tb1_name' ; ALTER TABLE 'tb1_name'; ALTER TABLE 'tb1_name' 字段: 添加字段 :add 刪除字段:drop 修改字段:alter,change ,modify 索引 : 添加索引,add 刪除索引,drop 表選項: 修改 查看錶上的索引: SHOW INDEXEX FROM [DB_NAME.]TAB_NAME; 索引: 索引是特殊的數據結構:定義在查找時做爲查找條件的字段; 索引:能夠有索引名稱: DML : INSERT .DELETE ,SELECT ,UPDATE WHERE class : 操做符: 條件邏輯操做: 用戶帳號及權限管理: 用戶帳號: 'user'@'host' user : 登陸用戶名 host: 此用戶訪問 mysqld 服務器時容許的遠程主機 IP ,網絡地址 ,主機名,通配符 (%和_) 建立用戶帳號: CREATE USER 'username'@'host' [IDENTIFIDE BY 'password'] 刪除用戶: DROP USER 'username'@'host' 受權: 權限,管理權限,數據庫,表,字段 GRANT priv_type,..... ON [object_type] db_name.tb_name TO 'user'@'host' [IDENTIFIDE BY 'password']; priv_type: ALL [PRIVILEGES] db_name.tb_name : *.*: 全部庫的全部表 db_name.* :指定全部表 db_name.tb_name :指定庫的表 db_name。routine_name :指定庫的存儲過程 查看指定用戶得到的s受權: SHOW GRANTS FOR 'root'@'localhost'; 撤回受權: REVOKE MariaDB 服務啓動時會讀取mysql 庫中的全部受權表 LAMP 組合的編譯安裝: http+php modules : 把php 編譯成httpd DSO 對象 prefork :libphp5 event,worker :libphp5-zts cgi : fastcgi{fpm} :php 做爲獨立服務 httpd 對fastCGI 協議的支持: httpd-2.2 :須要額外安裝 fcgi 模塊 httpd-2.4 :自帶fcgi 模塊 安裝: httpd , MariaDB ,php httpd 2.4.9 + mysql-5.5.33 + php-5.4.26編譯安裝過程: 1、編譯安裝apache 一、解決依賴關係 httpd-2.4.9須要較新版本的apr和apr-util,所以須要事先對其進行升級。升級方式有兩種,一種是經過源代碼編譯安裝,一種是直接升級rpm包。這裏選擇使用編譯源代碼的方式進行,它們的下載路徑爲ftp://172.16.0.1/pub/Sources/new_lamp。 (1) 編譯安裝apr # tar xf apr-1.5.0.tar.bz2 # cd apr-1.5.0 # ./configure --prefix=/usr/local/apr # make && make install (2) 編譯安裝apr-util # tar xf apr-util-1.5.3.tar.bz2 # cd apr-util-1.5.3 # ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr # make && make install 附:apache官方對APR的介紹: The mission of the Apache Portable Runtime (APR) project is to create and maintain software libraries that provide a predictable and consistent interface to underlying platform-specific implementations. The primary goal is to provide an API to which software developers may code and be assured of predictable if not identical behaviour regardless of the platform on which their software is built, relieving them of the need to code special-case conditions to work around or take advantage of platform-specific deficiencies or features. (3) httpd-2.4.9編譯過程也要依賴於pcre-devel軟件包,須要事先安裝。此軟件包系統光盤自帶,所以,找到並安裝便可。 二、編譯安裝httpd-2.4.9 首先下載httpd-2.4.9到本地,下載路徑爲ftp://172.16.0.1/pub/Sources/new_lamp。然後執行以下命令進行編譯安裝過程: # tar xf httpd-2.4.9.tar.bz2 # cd httpd-2.4.9 # ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=event # make && make install 補充: (1)構建MPM爲靜態模塊 在所有平臺中,MPM均可以構建爲靜態模塊。在構建時選擇一種MPM,連接到服務器中。若是要改變MPM,必須從新構建。爲了使用指定的MPM,請在執行configure腳本 時,使用參數 --with-mpm=NAME。NAME是指定的MPM名稱。編譯完成後,能夠使用 ./httpd -l 來肯定選擇的MPM。 此命令會列出編譯到服務器程序中的全部模塊,包括 MPM。 (2)構建 MPM 爲動態模塊 在Unix或相似平臺中,MPM能夠構建爲動態模塊,與其它動態模塊同樣在運行時加載。 構建 MPM 爲動態模塊容許經過修改LoadModule指令內容來改變MPM,而不用從新構建服務器程序。在執行configure腳本時,使用--enable-mpms-shared選項便可啓用此特性。當給出的參數爲all時,全部此平臺支持的MPM模塊都會被安裝。還能夠在參數中給出模塊列表。默認MPM,能夠自動選擇或者在執行configure腳本時經過--with-mpm選項來指定,而後出如今生成的服務器配置文件中。編輯LoadModule指令內容能夠選擇不一樣的MPM。 三、修改httpd的主配置文件,設置其Pid文件的路徑 編輯/etc/httpd/httpd.conf,添加以下行便可: PidFile "/var/run/httpd.pid" 四、提供SysV服務腳本/etc/rc.d/init.d/httpd,內容以下: #!/bin/bash # # httpd Startup script for the Apache HTTP Server # # chkconfig: - 85 15 # description: Apache is a World Wide Web server. It is used to serve \ # HTML files and CGI. # processname: httpd # config: /etc/httpd/conf/httpd.conf # config: /etc/sysconfig/httpd # pidfile: /var/run/httpd.pid # Source function library. . /etc/rc.d/init.d/functions if [ -f /etc/sysconfig/httpd ]; then . /etc/sysconfig/httpd fi # Start httpd in the C locale by default. HTTPD_LANG=${HTTPD_LANG-"C"} # This will prevent initlog from swallowing up a pass-phrase prompt if # mod_ssl needs a pass-phrase from the user. INITLOG_ARGS="" # Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server # with the thread-based "worker" MPM; BE WARNED that some modules may not # work correctly with a thread-based MPM; notably PHP will refuse to start. # Path to the apachectl script, server binary, and short-form for messages. apachectl=/usr/local/apache/bin/apachectl httpd=${HTTPD-/usr/local/apache/bin/httpd} prog=httpd pidfile=${PIDFILE-/var/run/httpd.pid} lockfile=${LOCKFILE-/var/lock/subsys/httpd} RETVAL=0 start() { echo -n $"Starting $prog: " LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS RETVAL=$? echo [ $RETVAL = 0 ] && touch ${lockfile} return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc -p ${pidfile} -d 10 $httpd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile} } reload() { echo -n $"Reloading $prog: " if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then RETVAL=$? echo $"not reloading due to configuration syntax error" failure $"not reloading $httpd due to configuration syntax error" else killproc -p ${pidfile} $httpd -HUP RETVAL=$? fi echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status -p ${pidfile} $httpd RETVAL=$? ;; restart) stop start ;; condrestart) if [ -f ${pidfile} ] ; then stop start fi ;; reload) reload ;; graceful|help|configtest|fullstatus) $apachectl $@ RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}" exit 1 esac exit $RETVAL 然後爲此腳本賦予執行權限: # chmod +x /etc/rc.d/init.d/httpd 加入服務列表: # chkconfig --add httpd 接下來就能夠啓動服務進行測試了。 2、安裝mysql-5.5.33 一、準備數據存放的文件系統 新建一個邏輯卷,並將其掛載至特定目錄便可。這裏再也不給出過程。 這裏假設其邏輯卷的掛載目錄爲/mydata,然後須要建立/mydata/data目錄作爲mysql數據的存放目錄。 二、新建用戶以安全方式運行進程: # groupadd -r mysql # useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql # chown -R mysql:mysql /mydata/data 三、安裝並初始化mysql-5.5.33 首先下載平臺對應的mysql版本至本地,這裏是32位平臺,所以,選擇的爲mysql-5.5.33-linux2.6-i686.tar.gz,其下載位置爲ftp://172.16.0.1/pub/Sources/mysql-5.5。 # tar xf mysql-5.5.33-linux2.6-i686.tar.gz -C /usr/local # cd /usr/local/ # ln -sv mysql-5.5.33-linux2.6-i686 mysql # cd mysql # chown -R mysql:mysql . # scripts/mysql_install_db --user=mysql --datadir=/mydata/data # chown -R root . 四、爲mysql提供主配置文件: # cd /usr/local/mysql # cp support-files/my-large.cnf /etc/my.cnf 並修改此文件中thread_concurrency的值爲你的CPU個數乘以2,好比這裏使用以下行: thread_concurrency = 2 另外還須要添加以下行指定mysql數據文件的存放位置: datadir = /mydata/data 五、爲mysql提供sysv服務腳本: # cd /usr/local/mysql # cp support-files/mysql.server /etc/rc.d/init.d/mysqld # chmod +x /etc/rc.d/init.d/mysqld 添加至服務列表: # chkconfig --add mysqld # chkconfig mysqld on 然後就能夠啓動服務測試使用了。 爲了使用mysql的安裝符合系統使用規範,並將其開發組件導出給系統使用,這裏還須要進行以下步驟: 六、輸出mysql的man手冊至man命令的查找路徑: 編輯/etc/man.config,添加以下行便可: MANPATH /usr/local/mysql/man 七、輸出mysql的頭文件至系統頭文件路徑/usr/include: 這能夠經過簡單的建立連接實現: # ln -sv /usr/local/mysql/include /usr/include/mysql 八、輸出mysql的庫文件給系統庫查找路徑: # echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf 然後讓系統從新載入系統庫: # ldconfig 九、修改PATH環境變量,讓系統能夠直接使用mysql的相關命令。具體實現過程這裏再也不給出。 3、編譯安裝php-5.4.26 一、解決依賴關係: 請配置好yum源(系統安裝源及epel源)後執行以下命令: # yum -y groupinstall "Desktop Platform Development" # yum -y install bzip2-devel libmcrypt-devel libxml2-devel 二、編譯安裝php-5.4.26 首先下載源碼包至本地目錄,下載位置ftp://172.16.0.1/pub/Sources/new_lamp。 # tar xf php-5.4.26.tar.bz2 # cd php-5.4.26 # ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --with-apxs2=/usr/local/apache/bin/apxs --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --enable-maintainer-zts 說明: 一、這裏爲了支持apache的worker或event這兩個MPM,編譯時使用了--enable-maintainer-zts選項。 二、若是使用PHP5.3以上版本,爲了連接MySQL數據庫,能夠指定mysqlnd,這樣在本機就不須要先安裝MySQL或MySQL開發包了。mysqlnd從php 5.3開始可用,能夠編譯時綁定到它(而不用和具體的MySQL客戶端庫綁定造成依賴),但從PHP 5.4開始它就是默認設置了。 # ./configure --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd # make # make test # make intall 爲php提供配置文件: # cp php.ini-production /etc/php.ini 三、 編輯apache配置文件httpd.conf,以apache支持php # vim /etc/httpd/httpd.conf 一、添加以下二行 AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps 二、定位至DirectoryIndex index.html 修改成: DirectoryIndex index.php index.html 然後從新啓動httpd,或讓其從新載入配置文件便可測試php是否已經能夠正常使用。 測試頁面index.php示例以下: <?php $link = mysql_connect('127.0.0.1','root','mageedu'); if ($link) echo "Success..."; else echo "Failure..."; mysql_close(); ?> 4、安裝xcache,爲php加速: 一、安裝 # tar xf xcache-3.0.3.tar.gz # cd xcache-3.0.3 # /usr/local/php/bin/phpize # ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config # make && make install 安裝結束時,會出現相似以下行: Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-zts-20100525/ 二、編輯php.ini,整合php和xcache: 首先將xcache提供的樣例配置導入php.ini # mkdir /etc/php.d # cp xcache.ini /etc/php.d 說明:xcache.ini文件在xcache的源碼目錄中。 接下來編輯/etc/php.d/xcache.ini,找到zend_extension開頭的行,修改成以下行: zend_extension = /usr/local/php/lib/php/extensions/no-debug-zts-20100525/xcache.so 注意:若是php.ini文件中有多條zend_extension指令行,要確保此新增的行排在第一位。 5、啓用服務器狀態 mod_status模塊可讓管理員查看服務器的執行狀態,它經過一個HTML頁面展現了當前服務器的統計數據。這些數據一般包括但不限於: (1) 處於工做狀態的worker進程數; (2) 空閒狀態的worker進程數; (3) 每一個worker的狀態,包括此worker已經響應的請求數,及由此worker發送的內容的字節數; (4) 當前服務器總共發送的字節數; (5) 服務器自上次啓動或重啓以來至當前的時長; (6) 平均每秒鐘響應的請求數、平均每秒鐘發送的字節數、平均每一個請求所請求內容的字節數; 啓用狀態頁面的方法很簡單,只須要在主配置文件中添加以下內容便可: <Location /server-status> SetHandler server-status Require all granted </Location> 須要提醒的是,這裏的狀態信息不該該被全部人隨意訪問,所以,應該限制僅容許某些特定地址的客戶端查看。好比使用Require ip 172.16.0.0/16來限制僅容許指定網段的主機查看此頁面。 ab測試示例:未啓用xcache和啓用xcache後,對phpMyAdmin的主而面進行請求測試的結果以下所示: 測試環境: 主機CPU:Core 2 Duo i3-3210 內存大小:734MB Requests per second: 36.38 [#/sec] (mean) Time per request: 274.871 [ms] (mean) Time per request: 27.487 [ms] (mean, across all concurrent requests) Requests per second: 144.23 [#/sec] (mean) Time per request: 69.332 [ms] (mean) Time per request: 6.933 [ms] (mean, across all concurrent requests) 第二部分、配置apache-2.4.9以fpm方式的php-5.4.26 1、apache、MySQL的安裝與前一部分相同;請根據其進行安裝; 2、編譯安裝php-5.4.26 一、解決依賴關係: 請配置好yum源(能夠是本地系統光盤)後執行以下命令: # yum -y groupinstall "X Software Development" 若是想讓編譯的php支持mcrypt擴展,此處還須要下載ftp://172.16.0.1/pub/Sources/ngnix目錄中的以下兩個rpm包並安裝之: libmcrypt-2.5.7-5.el5.i386.rpm libmcrypt-devel-2.5.7-5.el5.i386.rpm mhash-0.9.9-1.el5.centos.i386.rpm mhash-devel-0.9.9-1.el5.centos.i386.rpm 二、編譯安裝php-5.4.26 首先下載源碼包至本地目錄,下載位置ftp://172.16.0.1/pub/Sources/new_lamp。 # tar xf php-5.4.26.tar.bz2 # cd php-5.4.26 # ./configure --prefix=/usr/local/php5 --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --enable-fpm --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 說明:若是使用PHP5.3以上版本,爲了連接MySQL數據庫,能夠指定mysqlnd,這樣在本機就不須要先安裝MySQL或MySQL開發包了。mysqlnd從php 5.3開始可用,能夠編譯時綁定到它(而不用和具體的MySQL客戶端庫綁定造成依賴),但從PHP 5.4開始它就是默認設置了。 # ./configure --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd # make # make intall 爲php提供配置文件: # cp php.ini-production /etc/php.ini 三、配置php-fpm 爲php-fpm提供SysV init腳本,並將其添加至服務列表: # cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm # chmod +x /etc/rc.d/init.d/php-fpm # chkconfig --add php-fpm # chkconfig php-fpm on 爲php-fpm提供配置文件: # cp /usr/local/php5/etc/php-fpm.conf.default /usr/local/php5/etc/php-fpm.conf 編輯php-fpm的配置文件: # vim /usr/local/php5/etc/php-fpm.conf 配置fpm的相關選項爲你所須要的值,並啓用pid文件(以下最後一行): pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 2 pm.max_spare_servers = 8 pid = /usr/local/php5/var/run/php-fpm.pid 接下來就能夠啓動php-fpm了: # service php-fpm start 使用以下命令來驗正(若是此命令輸出有中幾個php-fpm進程就說明啓動成功了): # ps aux | grep php-fpm 默認狀況下,fpm監聽在127.0.0.1的9000端口,也能夠使用以下命令驗正其是否已經監聽在相應的套接字。 # netstat -tnlp | grep php-fpm tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 689/php-fpm 3、配置httpd-2.4.9 一、啓用httpd的相關模塊 在Apache httpd 2.4之後已經專門有一個模塊針對FastCGI的實現,此模塊爲mod_proxy_fcgi.so,它實際上是做爲mod_proxy.so模塊的擴充,所以,這兩個模塊都要加載 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so 二、配置虛擬主機支持使用fcgi 在相應的虛擬主機中添加相似以下兩行。 ProxyRequests Off ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/PATH/TO/DOCUMENT_ROOT/$1 http://www.magedu.com/admin/index.php /web/host1/admin/index.php fcgi://127.0.0.1:9000/web/hosts/admin/index.php 例如: <VirtualHost *:80> DocumentRoot "/www/magedu.com" ServerName magedu.com ServerAlias www.magedu.com ProxyRequests Off ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/www/magedu.com/$1 <Directory "/www/magedu.com"> Options none AllowOverride none Require all granted </Directory> </VirtualHost> ProxyRequests Off:關閉正向代理 ProxyPassMatch:把以.php結尾的文件請求發送到php-fpm進程,php-fpm至少須要知道運行的目錄和URI,因此這裏直接在fcgi://127.0.0.1:9000後指明瞭這兩個參數,其它的參數的傳遞已經被mod_proxy_fcgi.so進行了封裝,不須要手動指定。 三、編輯apache配置文件httpd.conf,讓apache能識別php格式的頁面,並支持php格式的主頁 # vim /etc/httpd/httpd.conf 一、添加以下二行 AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps 二、定位至DirectoryIndex index.html 修改成: DirectoryIndex index.php index.html 補充:Apache httpd 2.4之前的版本中,要麼把PHP做爲Apache的模塊運行,要麼添加一個第三方模塊支持PHP-FPM實現。 CentOS 7上實現LAMP: 解決依賴關係: yum -y install @"Development Tools" libxml2-devel mariadb-devel bzip2-devel sudo : su :Switch user su -l user -c 'command' #臨時切換身份,執行命令 sudo : sudo命令用來以其餘身份來執行命令,預設的身份爲root,受權機制 配置文件:/etc/sudoers sudo command root ALL=(ALL) ALL root 用戶能夠在任何設備執行任何命令 %wheel ALL=(ALL) ALL 此組內的用戶能夠執行任何命令 visudo : 配置文件四個字段: who : 運行命令的身份 user where:經過那個主機 host whom :以哪一個用戶的身份,runas which : 運行哪些命令: command user hosts=(runas) commands user : username #uid user_alias %group_name %#gid host : ip subnet Cmnd_List ::= Cmnd | Cmnd ',' Cmnd_List command name ::= file name | file name args | file name '""' man sudoers : 查看配置文件編寫格式 sudo [-u user ] COMMAND -u user :默認爲root -k :清除此前記錄的用戶密碼 文件共享服務: 應用層: ftp 內核 : nfs (sun 研發) 跨平臺文件系統: samba 在linux 實現 CIFS協議 ftp :file transfer protocol 應用層:tcp, C/S : client :程序 Server :程序 數據: 命令連接:文件管理命令 ,始終在線 數據連接:數據傳輸 ,按需建立或者關閉 數據傳輸格式: 文本傳輸 二進制傳輸 主動:由服務器主動建立連接 命令: client :port 50000 --> server :21 數據:server 20/tcp ---> client 50000+1 的端口 被動:有客戶端主動建立連接,PASV 命令:client:port 50000 --> server ;21 PASV 命令:121,23 :121*256+23 數據:client :port 50000+1 --> server :N 隨機端口 connection track :連接追蹤 C/S : Server : wu-ftpd proftpd pureftp vsftpd SerU Client : ftp lftp,lftpget wget ,curl filezilla gftp (linux GUI) cuteftp flashfxp 響應碼: 1xx :信息 2xx :成功類狀態 3xx :提示按需進一步提供補充類信息的狀態碼 4xx :客戶端錯誤 5xx :服務端錯誤 用戶認證: 虛擬用戶: ftp 本身定義的用戶,僅用於訪問特定服務的資源 系統用戶:Linux系統本地用戶 nsswitch :名稱解析框架 配置文件: /etc/nsswitch.conf 模塊: /lib64/libnss* ,/usr/lib64/libnss* pam : pluggable authentication module ,插入式認證模塊,用戶認證框架 /lib64/security/ 配置文件: /etc/pam.conf , /etc/pam.d/* 匿名用戶: anonymous或ftp 本地用戶: 帳號名稱、密碼等信息保存在passwd、shadow文件中 虛擬用戶: 使用獨立的帳號和密碼數據文 FTP數字代碼的意義 110 從新啓動標記應答。 120 服務在多久時間內ready。 125 數據鏈路端口開啓,準備傳送。 150 文件狀態正常,開啓數據鏈接端口。 200 命令執行成功。 202 命令執行失敗。 211 系統狀態或是系統求助響應。 212 目錄的狀態。 213 文件的狀態。 214 求助的訊息。 215 名稱系統類型。 220 新的聯機服務ready。 221 服務的控制鏈接端口關閉,能夠註銷。 225 數據連結開啓,但無傳輸動做。 226 關閉數據鏈接端口,請求的文件操做成功。 227 進入passive mode。 230 使用者登入。 250 請求的文件操做完成。 257 顯示目前的路徑名稱。 331 用戶名稱正確,須要密碼。 332 登入時須要帳號信息。 350 請求的操做須要進一部的命令。 421 沒法提供服務,關閉控制連結。 425 沒法開啓數據鏈路。 426 關閉聯機,終止傳輸。 450 請求的操做未執行。 451 命令終止:有本地的錯誤。 452 未執行命令:磁盤空間不足。 500 格式錯誤,沒法識別命令。 501 參數語法錯誤。 502 命令執行失敗。 503 命令順序錯誤。 504 命令所接的參數不正確。 530 未登入。 532 儲存文件須要帳戶登入。 550 未執行請求的操做。 551 請求的命令終止,類型未知。 552 請求的文件終止,儲存位溢出。 553 未執行請求的的命令,名稱不正確。 vsftpd 的簡介: vsftpd 是一個 UNIX 類操做系統上運行的服務器的名字,它能夠運行在諸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面。它支持不少其餘的 FTP 服務器不支持的特徵。好比: 很是高的安全性需求 帶寬限制 良好的可伸縮性 建立虛擬用戶的可能性 IPv6支持 中等偏上的性能 分配虛擬 IP 的可能性 高速 ******************************************************* vsftpd 配置文件詳解: /etc/vsftpd/vsftpd.conf 主配置文件 /usr/sbin/vsftpd Vsftpd的主程序 /etc/rc.d/init.d/vsftpd 啓動腳本 /etc/pam.d/vsftpd PAM認證文件(此文件中file=/etc/vsftpd/ftpusers字段,指明阻止訪問的用戶來自/etc/vsftpd/ftpusers文件中的用戶) /etc/vsftpd/ftpusers 禁止使用vsftpd的用戶列表文件。記錄不容許訪問FTP服務器的用戶名單,管理員能夠把一些對系統安全有威脅的用戶帳號記錄在此文件中,以避免用戶從FTP登陸後得到大於上傳下載操做的權利,而對系統形成損壞。(注意:linux-4中此文件在/etc/目錄下) /etc/vsftpd/user_list 禁止或容許使用vsftpd的用戶列表文件。這個文件中指定的用戶缺省狀況(即在/etc/vsftpd/vsftpd.conf中設置userlist_deny=YES)下也不能訪問FTP服務器,在設置了userlist_deny=NO時,僅容許user_list中指定的用戶訪問FTP服務器。(注意:linux-4中此文件在/etc/目錄下) /var/ftp 匿名用戶主目錄;本地用戶主目錄爲:/home/用戶主目錄,即登陸後進入本身家目錄 /var/ftp/pub 匿名用戶的下載目錄,此目錄需賦權根chmod 1777 pub(1爲特殊權限,使上載後沒法刪除) /etc/logrotate.d/vsftpd.log Vsftpd的日誌文件 ************************************************************************ 匿名用戶 {映射爲ftp 用戶} 共享資源位置 : /var/ftp 系統用戶經過ftp 訪問的資源位置 : 用戶本身的家目錄 虛擬用戶經過ftp 訪問的資源位置 :給虛擬用戶指定的映射資源位置 finger命令用於查找並顯示用戶信息 finger 用戶名 : finger ftp # 是否容許匿名登陸FTP服務器,默認設置爲YES容許 # 用戶可以使用用戶名ftp或anonymous進行ftp登陸,口令爲用戶的E-mail地址。 # 如不容許匿名訪問則設置爲NO anonymous_enable=YES # 是否容許本地用戶(即linux系統中的用戶賬號)登陸FTP服務器,默認設置爲YES容許 # 本地用戶登陸後會進入用戶主目錄,而匿名用戶登陸後進入匿名用戶的下載目錄/var/ftp/pub # 若只容許匿名用戶訪問,前面加上#註釋掉便可阻止本地用戶訪問FTP服務器 local_enable=YES # 是否容許本地用戶對FTP服務器文件具備寫權限,默認設置爲YES容許 write_enable=YES # 掩碼,本地用戶默認掩碼爲077 # 你能夠設置本地用戶的文件掩碼爲缺省022,也可根據我的喜愛將其設置爲其餘值 #local_umask=022 # 是否容許匿名用戶上傳文件,須將全局的write_enable=YES。默認爲YES #anon_upload_enable=YES # 是否容許匿名用戶建立新文件夾 #anon_mkdir_write_enable=YES # 是否激活目錄歡迎信息功能 # 當用戶用CMD模式首次訪問服務器上某個目錄時,FTP服務器將顯示歡迎信息 # 默認狀況下,歡迎信息是經過該目錄下的.message文件得到的 # 此文件保存自定義的歡迎信息,由用戶本身創建 #dirmessage_enable=YES # 是否讓系統自動維護上傳和下載的日誌文件 # 默認狀況該日誌文件爲/var/log/vsftpd.log,也能夠經過下面的xferlog_file選項對其進行設定 # 默認值爲NO xferlog_enable=YES # Make sure PORT transfer connections originate from port 20 (ftp-data). # 是否設定FTP服務器將啓用FTP數據端口的鏈接請求 # ftp-data數據傳輸,21爲鏈接控制端口 connect_from_port_20=YES # 設定是否容許改變上傳文件的屬主,與下面一個設定項配合使用 # 注意,不推薦使用root用戶上傳文件 #chown_uploads=YES # 設置想要改變的上傳文件的屬主,若是須要,則輸入一個系統用戶名 # 能夠把上傳的文件都改爲root屬主。whoever:任何人 #chown_username=whoever # 設定系統維護記錄FTP服務器上傳和下載狀況的日誌文件 # /var/log/vsftpd.log是默認的,也能夠另設其它 #xferlog_file=/var/log/vsftpd.log # 是否以標準xferlog的格式書寫傳輸日誌文件 # 默認爲/var/log/xferlog,也能夠經過xferlog_file選項對其進行設定 # 默認值爲NO #xferlog_std_format=YES # 如下是附加配置,添加相應的選項將啓用相應的設置 # 是否生成兩個類似的日誌文件 # 默認在/var/log/xferlog和/var/log/vsftpd.log目錄下 # 前者是wu_ftpd類型的傳輸日誌,能夠利用標準日誌工具對其進行分析;後者是vsftpd類型的日誌 #dual_log_enable # 是否將本來輸出到/var/log/vsftpd.log中的日誌,輸出到系統日誌 #syslog_enable # 設置數據傳輸中斷間隔時間,此語句表示空閒的用戶會話中斷時間爲600秒 # 即當數據傳輸結束後,用戶鏈接FTP服務器的時間不該超過600秒。能夠根據實際狀況對該值進行修改 #idle_session_timeout=600 # 設置數據鏈接超時時間,該語句表示數據鏈接超時時間爲120秒,可根據實際狀況對其個修改 #data_connection_timeout=120 # 運行vsftpd須要的非特權系統用戶,缺省是nobody #nopriv_user=ftpsecure # 是否識別異步ABOR請求。 # 若是FTP client會下達「async ABOR」這個指令時,這個設定才須要啓用 # 而通常此設定並不安全,因此一般將其取消 #async_abor_enable=YES # 是否以ASCII方式傳輸數據。默認狀況下,服務器會忽略ASCII方式的請求。 # 啓用此選項將容許服務器以ASCII方式傳輸數據 # 不過,這樣可能會致使由"SIZE /big/file"方式引發的DoS攻擊 #ascii_upload_enable=YES #ascii_download_enable=YES # 登陸FTP服務器時顯示的歡迎信息 # 若有須要,可在更改目錄歡迎信息的目錄下建立名爲.message的文件,並寫入歡迎信息保存後 #ftpd_banner=Welcome to blah FTP service. # 黑名單設置。若是很討厭某些email address,就能夠使用此設定來取消他的登陸權限 # 能夠將某些特殊的email address抵擋住。 #deny_email_enable=YES # 當上面的deny_email_enable=YES時,能夠利用這個設定項來規定哪些郵件地址不可登陸vsftpd服務器 # 此文件需用戶本身建立,一行一個email address便可 #banned_email_file=/etc/vsftpd/banned_emails # 用戶登陸FTP服務器後是否具備訪問本身目錄之外的其餘文件的權限 # 設置爲YES時,用戶被鎖定在本身的home目錄中,vsftpd將在下面chroot_list_file選項值的位置尋找chroot_list文件 # 必須與下面的設置項配合 #chroot_list_enable=YES # 被列入此文件的用戶,在登陸後將不能切換到本身目錄之外的其餘目錄 # 從而有利於FTP服務器的安全管理和隱私保護。此文件需本身創建 #chroot_list_file=/etc/vsftpd/chroot_list # 是否容許遞歸查詢。默認爲關閉,以防止遠程用戶形成過量的I/O #ls_recurse_enable=YES # 是否容許監聽。 # 若是設置爲YES,則vsftpd將以獨立模式運行,由vsftpd本身監聽和處理IPv4端口的鏈接請求 listen=YES # 設定是否支持IPV6。如要同時監聽IPv4和IPv6端口, # 則必須運行兩套vsftpd,採用兩套配置文件 # 同時確保其中有一個監聽選項是被註釋掉的 #listen_ipv6=YES # 設置PAM外掛模塊提供的認證服務所使用的配置文件名,即/etc/pam.d/vsftpd文件 # 此文件中file=/etc/vsftpd/ftpusers字段,說明了PAM模塊能抵擋的賬號內容來自文件/etc/vsftpd/ftpusers中 #pam_service_name=vsftpd # 是否容許ftpusers文件中的用戶登陸FTP服務器,默認爲NO # 若此項設爲YES,則user_list文件中的用戶容許登陸FTP服務器 # 而若是同時設置了userlist_deny=YES,則user_list文件中的用戶將不容許登陸FTP服務器,甚至連輸入密碼提示信息都沒有 #userlist_enable=YES/NO # 設置是否阻扯user_list文件中的用戶登陸FTP服務器,默認爲YES #userlist_deny=YES/NO # 是否使用tcp_wrappers做爲主機訪問控制方式。 # tcp_wrappers能夠實現linux系統中網絡服務的基於主機地址的訪問控制 # 在/etc目錄中的hosts.allow和hosts.deny兩個文件用於設置tcp_wrappers的訪問控制 # 前者設置容許訪問記錄,後者設置拒絕訪問記錄。 # 如想限制某些主機對FTP服務器192.168.57.2的匿名訪問,編緝/etc/hosts.allow文件,如在下面增長兩行命令: # vsftpd:192.168.57.1:DENY 和vsftpd:192.168.57.9:DENY # 代表限制IP爲192.168.57.1/192.168.57.9主機訪問IP爲192.168.57.2的FTP服務器 # 此時FTP服務器雖能夠PING通,但沒法鏈接 tcp_wrappers=YES 匿名用戶配置: anonymous_enable=YES 容許匿名 anon_upload_enable=YES 容許上傳 anon_mkdir_write_enable=YES 容許建立 anon_other_write_enable=YES 容許刪除 系統用戶配置: local_enable=YES #默認路徑家目錄,其餘目錄也能夠訪問 write_enable=YES #本地用戶的寫權限 local_umask=022 #上傳後的文件權限 鎖定: chroot_local_user=YES #系統用戶登陸只能在家目錄 chroot_list_enable=YES #指定用戶不須要鎖定在家目錄 ,寫在下面的配置文件中 chroot_list_file=/etc/vsftpd/chroot_list 日誌: xferlog_enable=YES #開啓日誌 xferlog_std_format=YES #格式 xferlog_file=/var/log/xferlog #日誌文件位置 上傳:改變上傳文件的屬主 chown_uploads=YES chown_username=whoever timeout : idle_session_timeout=600 #定義空閒會話超時時長 data_connection_timeout=120 # vsftpd 使用pam 進行用戶認證: pam_service_name=vsftpd 是否啓用用戶登陸的列表文件 userlist_enable=YES userlist_deny=YES|NO #開啓功能後user_lsit 文件進行控制 默認配置文件: /etc/vsftpd/user_list 連接限制: max_clients:最大併發連接數 max_per_ip :每一個ip 可同時發起的併發請求 傳輸速率: anon_max_rate :匿名用戶的最大傳輸速率,單位是字節/s local_max_rate : 本地用戶 虛擬用戶: 非系統帳號 全部虛擬用戶會被統一映射爲一個指定的系統帳號,訪問的共享位置爲系統帳號的家目錄 各虛擬用戶可被賦予不一樣的訪問權限 經過匿名用戶的權限控制參數進行指定。 虛擬用戶帳號的存儲方式: 文件,編輯文件 奇數行爲用戶名 偶數行爲密碼 此文件須要被編碼爲hash 格式 關係型數據庫的表中 即時查找數據庫完成用戶認證。 mysql 庫: pam 要依賴與pam-mysql pam_mysql 在epel 源中 yum -y install pam_mysql 1、安裝所須要程序 一、安裝mysql和pam_mysql # yum -y install mysql-server mysql-devel pam_mysql 注意:pam_mysql由epel源提供。 2、建立虛擬用戶帳號 1.準備數據庫及相關表 首先請確保mysql服務已經正常啓動。然後,按須要創建存儲虛擬用戶的數據庫便可,這裏將其建立爲vsftpd數據庫。 mysql> create database vsftpd; mysql> grant select on vsftpd.* to vsftpd@localhost identified by 'www.magedu.com'; mysql> grant select on vsftpd.* to vsftpd@127.0.0.1 identified by 'www.magedu.com'; mysql> flush privileges; mysql> use vsftpd; mysql> create table users ( id int AUTO_INCREMENT NOT NULL, name char(20) binary NOT NULL, password char(48) binary NOT NULL, primary key(id) ); 二、添加測試的虛擬用戶 根據須要添加所須要的用戶,須要說明的是,這裏將其密碼爲了安全起見應該使用PASSWORD函數加密後存儲。 mysql> insert into users(name,password) values('magedu1',password('magedu')); mysql> insert into users(name,password) values('magedu2',password('magedu')); 3、配置vsftpd 1.創建pam認證所需文件 #vi /etc/pam.d/vsftpd.mysql 添加以下兩行 auth required /lib/security/pam_mysql.so user=vsftpd passwd=www.magedu.com host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 account required /lib/security/pam_mysql.so user=vsftpd passwd=www.magedu.com host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 注意:因爲mysql的安裝方式不一樣,pam_mysql.so基於unix sock鏈接mysql服務器時可能會出問題,此時,建議受權一個可遠程鏈接的mysql並訪問vsftpd數據庫的用戶。 2.修改vsftpd的配置文件,使其適應mysql認證 創建虛擬用戶映射的系統用戶及對應的目錄 # useradd -s /sbin/nologin -d /var/ftproot vuser # chmod go+rwx /var/ftproot 請確保/etc/vsftpd.conf中已經啓用瞭如下選項 anonymous_enable=NO local_enable=YES write_enable=YES anon_upload_enable=NO anon_mkdir_write_enable=NO chroot_local_user=YES 然後添加如下選項 guest_enable=YES guest_username=vuser 並確保pam_service_name選項的值以下所示 pam_service_name=vsftpd.mysql 4、啓動vsftpd服務 # service vsftpd start # chkconfig vsftpd on 查看端口開啓狀況 # netstat -tnlp |grep :21 tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 23286/vsftpd 使用虛擬用戶登陸,驗正配置結果,如下爲本機的命令方式測試,你也能夠在其它Win Box上用IE或者FTP客戶端工具登陸驗正 # ftp localhost 5、配置虛擬用戶具備不一樣的訪問權限 vsftpd能夠在配置文件目錄中爲每一個用戶提供單獨的配置文件以定義其ftp服務訪問權限,每一個虛擬用戶的配置文件名同虛擬用戶的用戶名。配置文件目錄能夠是任意未使用目錄,只須要在vsftpd.conf指定其路徑及名稱便可。 一、配置vsftpd爲虛擬用戶使用配置文件目錄 # vim vsftpd.conf 添加以下選項 user_config_dir=/etc/vsftpd/vusers_config 二、建立所須要目錄,併爲虛擬用戶提供配置文件 # mkdir /etc/vsftpd/vusers_config/ # cd /etc/vsftpd/vusers_config/ # touch tom jerry 三、配置虛擬用戶的訪問權限 虛擬用戶對vsftpd服務的訪問權限是經過匿名用戶的相關指令進行的。好比,若是須要讓tom用戶具備上傳文件的權限,能夠修改/etc/vsftpd/vusers_config/tom文件,在裏面添加以下選項便可。 anon_upload_enable={YES|NO} anon_mkdir_write_enable={YES|NO} anon_other_write_enable={YES|NO} DNS : Incremental Zone Transfer {IXFR} 增量區域傳送 Full Zone Transfer ,AXFR 全量區域傳送 NFS :network file system 文件系統在內核中實現,NFS RPC :函數調用,(遠程主機調用) 一部分功能由本地程序完成 一部分由遠程函數完成 RPC(Remote Procedure Call)——遠程過程調用, 它是一種經過網絡從遠程計算機程序上請求服務, 而不須要了解底層網絡技術的協議。 RPC協議假定某些傳輸協議的存在,如TCP或UDP,爲通訊程序之間攜帶信息數據 。在OSI網絡通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分佈式多程序在內的應用程序更加容易。 RPC採用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。 首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,而後等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達爲止。當一個調用信息到達,服務器得到進程參數,計算結果,發送答覆信息,而後等待下一個調用信息,最後,客戶端調用進程接收答覆信息,得到進程結果,而後調用執行繼續進行。 半結構化數據: XML :extended mark language 可擴展標記語言 JSON: (JavaScript Object Notation, JS 對象標記) 是一種輕量級的數據交換格式 RESTful :http NFS :sun 研發 NFSv1 NFSv2,udp NFSv3 NFSv4 NFSv4.1 NFSv4.2 pNFS :分佈式存儲 NIS ;network infomation system 身份認證,集中於在遠端認證 (不多用) NFS :基於IP 作認證 RPC ;公共的共享功能 NFS ;2049/tcp, 2049/udp nfs 服務器:nfsd ,mountd ,imapd rpcinfo -p #查看當前監聽端口 查看nfs 服務器端共享的文件系統: showmount -e server_ip /etc/exports #NFS 主配置文件 服務器環境:CentOS6.9 Linux 2.6.32-696.el6.x86_64 安裝NFS服務 nfs客戶端和服務端都只須要安裝nfs-utils包便可,而且yum安裝時會連帶安裝rpcbind服務 掛載NFS 文件系統: mount -t nfs SERVER:/path/to/shardfs /local/path /etc/exports : 文件系統 客戶端(選項) 客戶端(選項) /shared/nfs 192.168.100.150(ro) 經常使用選項 有幾個經常使用的選項能夠對 NFS 實現進行定製。這些選項包括: secure: 這個選項是缺省選項,它使用了 1024 如下的 TCP/IP 端口實現 NFS 的鏈接。指定 insecure 能夠禁用這個選項。 rw: 這個選項容許 NFS 客戶機進行讀/寫訪問。缺省選項是隻讀的。 async: 這個選項能夠改進性能,可是若是沒有徹底關閉 NFS 守護進程就從新啓動了 NFS 服務器,這也可能會形成數據丟失。 no_wdelay: 這個選項關閉寫延時。若是設置了 async,那麼 NFS 就會忽略這個選項。 nohide: 若是將一個目錄掛載到另一個目錄之上,那麼原來的目錄一般就被隱藏起來或看起來像空的同樣。要禁用這種行爲,需啓用 hide 選項。 no_subtree_check: 這個選項關閉子樹檢查,子樹檢查會執行一些不想忽略的安全性檢查。缺省選項是啓用子樹檢查。 no_auth_nlm: 這個選項也能夠做爲 insecure_locks 指定,它告訴 NFS 守護進程不要對加鎖請求進行認證。若是關心安全性問題,就要避免使用這個選項。缺省選項是 auth_nlm 或 secure_locks。 mp (mountpoint=path): 經過顯式地聲明這個選項,NFS 要求掛載所導出的目錄。 fsid=num: 這個選項一般都在 NFS 故障恢復的狀況中使用。若是但願實現 NFS 的故障恢復,請參考 NFS 文檔。 用戶映射 經過 NFS 中的用戶映射,能夠將僞或實際用戶和組的標識賦給一個正在對 NFS 捲進行操做的用戶。這個 NFS 用戶具備映射所容許的用戶和組的許可權限。對 NFS 卷使用一個通用的用戶/組能夠提供必定的安全性和靈活性,而不會帶來不少管理負荷。 在使用 NFS 掛載的文件系統上的文件時,用戶的訪問一般都會受到限制,這就是說用戶都是以匿名用戶的身份來對文件進行訪問的,這些用戶缺省狀況下對這些文件只有只讀權限。這種行爲對於 root 用戶來講尤爲重要。然而,實際上的確存在這種狀況:但願用戶以 root 用戶或所定義的其餘用戶的身份訪問遠程文件系統上的文件。NFS 容許指定訪問遠程文件的用戶——經過用戶標識號(UID)和組標識號(GID),能夠禁用正常的 squash 行爲。 用戶映射的選項包括: root_squash: 這個選項不容許 root 用戶訪問掛載上來的 NFS 卷。 no_root_squash: 這個選項容許 root 用戶訪問掛載上來的 NFS 卷。 all_squash: 這個選項對於公共訪問的 NFS 捲來講很是有用,它會限制全部的 UID 和 GID,只使用匿名用戶。缺省設置是 no_all_squash。 anonuid 和 anongid: 這兩個選項將匿名 UID 和 GID 修改爲特定用戶和組賬號。 客戶端掛載時能夠使用的特殊選項: Client Mounting remote directories Before mounting remote directories 2 daemons should be be started first: rpcbind rpc.statd rsize 的值是從服務器讀取的字節數。wsize 是寫入到服務器的字節數。默認都是1024, 若是使用比較高的值,如8192,能夠提升傳輸速度。 The timeo value is the amount of time, in tenths of a second, to wait before resending a transmission after an RPC timeout. After the first timeout, the timeout value is doubled for each retry for a maximum of 60 seconds or until a major timeout occurs. If connecting to a slow server or over a busy network, better performance can be achieved by increasing this timeout value. The intr option allows signals to interrupt the file operation if a major timeout occurs for a hard-mounted share. 總結: 一、客戶端表示方式 二、導出選項: rw, async, sync, root_squash, no_root_squash, all_squash, anonuid, anongid 三、exportfs和showmount Samba : smb :service message BLock CIFS :common internet file system smb--> samba 137/udp ,138/udp .139/tcp .445/tcp netBIOS :Windows 基於主機實現互相通訊的機制 samba : nmbd ; netbios smbd : cifs winbindd : Windows 路徑: \\path #探測服務所提供的共享 smbclient -L 192.168.100.100 -U administrator 連接共享目錄:交互式 smbclient //192.168.100.100/samba_test -U administrator 基於掛載的方式訪問: mount -t CIFS //server/shared_name /mount_point -o username=USERNAME,password=PASSWORD yum install cifs-utils -y #須要安裝協議工具 mount -t cifs //192.168.100.100/samba_test /mnt/samba/ -o username=Administrator #服務腳本 /etc/rc.d/init.d/nmb /etc/rc.d/init.d/smb 主配置文件 /etc/samba/sam.conf samba 用戶: 帳號:都是系統用戶 密碼:samba服務本身維護的密碼文件 將系統用戶轉換爲samba 用戶的命令 ,smbpasswd smbpasswd -a samba1 -a :添加系統用戶爲samba 用戶 -d :禁用指定用戶 -e ;啓用用戶帳號 配置文件: smb.conf 全局設定 特定共享的設定 私有家目錄 打印機共享 自定義共享 自定義共享: [shared_name] path = /path/to/share_directory comment = Comment String guest ok = {yes|no} public = {yes|no} writable = {yes|no} read only = {yes|no} write list = +GROUP_NAME 測試配置文件是否有語法錯誤,以及顯示最終生效的配置: # testparm samba-swat #是samba 的圖形管理工具 yum install samba-swat 依託於: xinetd 超級守護進程 創建samba共享,共享目錄爲/data,要求: 1)共享名爲shared,工做組爲magedu; 2)添加組develop,添加用戶gentoo,centos和ubuntu,其中gentoo和centos以develop爲附加組,ubuntu不屬於develop組;密碼均爲用戶名; 3)添加samba用戶gentoo,centos和ubuntu,密碼均爲「mageedu」; 4)此samba共享shared僅容許develop組具備寫權限,其餘用戶只能以只讀方式訪問; 5)此samba共享服務僅容許來自於172.16.0.0/16網絡的主機訪問; mini linux : *****後面有時間充電關注 centos 6: POST ---> bootSequence (BIOS)--->bootloader --->kernal(ramdisk) --->rootfs-->/sbin/init(啓動進程) centos 7: POST ---> bootSequence (BIOS)--->bootloader --->kernal(ramdisk) --->rootfs-->/sbin/systemd(啓動進程) 編寫服務腳本 systemd unit 文件 bootloader : lilo grub legacy grub2 stage1:mbr stage1_5: 識別文件系統 stage2 ;啓動菜單 rsyslog :日誌 歷史事件: 時間,事件 日誌級別:事件的關鍵性程度:loglevel 系統日誌服務: centos 5: syslog: syslogd :system klogd :kernel centos 6:rsyslog syslogd klogd rsyslog 特性: 多線程: UDP,TCP ,SSL , TLS Mysql ,PGsql ,關係型數據庫 強大的過濾器功能,可實現過濾日誌信息中的任何部分 自定義輸出格式 日誌收集方:將某一類日誌收集在一個管道中,這個管道稱爲 facility facility:設施,從功能或者程序上對日誌進行分類 auth ,authpriv ,cron ,daemon ,kern ,lpr ,mail, mark ,news ,security ,user ,uucp , local0-local7, authpriv 認證 priority 級別 facility.priority /var/log/messages priority :級別 debug :調試,全部 info :信息 notice :提示 warn :警告 err(error );錯誤 critical :藍色警報 alert :橙色警報 emerg :紅色警報 級別指定: * :全部級別 none: 沒有級別,禁止記錄 priority :此級別及更高級別 =priority : 指定此級別 程序環境: 主程序: rsyslog 配置文件: /etc/rsyslog.conf 服務腳本: /etc/rc.d/init.d/rsyslog rsyslog.conf RULES : facility.priority target target : 文件路徑: 記錄與指定日誌文件中,一般在/var/log 目錄下 - :表示異步寫入 * :也能夠表明當前多有登陸用戶 日誌服務器: @host host :必須監聽在tcp或者udp 協議的指定端口 默認514 管道: |COMMAND 文件記錄時日誌的格式: 時間產生的日期時間 主機 進程(pid);事件內容 有些日誌記錄爲二進制格式; /var/log/wtmp ./var/log/btmp /var/log/wtmp :當前系統上成功登錄的日誌 last /var/log/btmp :當前系統上失敗登錄嘗試 lastb lastlog :顯示系統中全部用戶最近一次的登陸信息 rsyslog 服務器: # Provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 # Provides TCP syslog reception $ModLoad imtcp $InputTCPServerRun 514 配置基於mysql 存儲日誌信息: 1.準備好mysql ,建立用戶,受權對rsyslog 數據庫的所有訪問權限 2.安裝 rsyslog-mysql 程序包 3.建立rsyslog-mysql 依賴的數據庫 #mysql -uUSERNAME -hHOST -pPASSWORD < /usr/share/doc/rsyslog-mysql-Version/createDB.sql 4.配置rsyslog 使用ommysql 模塊 #### MODULES ### $Modload ommysql #### RULES #### facility.priority :ommysql:DBHOST,DB,DBUSER,USERPASS 重啓 rsyslog 服務 5.安裝 loganalyzer a.配置webserver ,支持 php #yum install httpd php php-mysql php-gd #service httpd start b. loganalyzer #cp -r loganalyzer-version/src /var/www/html/loganalyzer #cp loganalyzer-version/contrib/*.sh /var/www/html/loganalyzer #cd /var/www/html/loganalyzer #chmod +x *.sh #./configure.sh #./secure.sh #chmod 666 config.php iptables : 包過濾性防火牆 iptables 是一個規則管理工具,工做在用戶空間,netfilter 工做在內核空間 iptables/netfilter framework : netfilter hooks :function 這五個位置也被稱爲五個鉤子函數(hook functions),也叫五個規則鏈。 1.PREROUTING (路由前) 2.INPUT (數據包流入口) 3.FORWARD (轉發管卡) 4.OUTPUT(數據包出口) 5.POSTROUTING(路由後) 這是NetFilter規定的五個規則鏈,任何一個數據包,只要通過本機, 必將通過這五個鏈中的其中一個鏈。 功能: filter :過濾,防火牆 nat ;網絡地址轉換 mangle ;數據包重構 raw ;關閉nat 表上啓用的連接追蹤功能 鏈 (內置)的: 1.PREROUTING (路由前) 2.INPUT (數據包流入口) 3.FORWARD (轉發管卡) 4.OUTPUT(數據包出口) 5.POSTROUTING(路由後) 流入:PREROUTING ----INPUT 流出:OUTPUT-----> POSTROUTING 轉發: PREROUTING ---> FORWARD ----POSTOUTING 各功能分別實現位置: filter ;INPUT ,OUTPUT ,FORWARD nat :PREROUTING(DNAT) ,OUTPUT ,POSTROUTING (SNAT) mangle ;PREROUTING ,INPUT ,OUTPUT ,FORWARD ,POSTROUTING raw :PREROUTING ,OUTPUT ,POSTROUTING 路由發生的時刻: 報文進入本機後 判斷目標主機 報文發出以前 判斷經由那個接口送往下一跳 iptables ; 四表五鏈 添加規則時的考量點: 1.實現哪一種功能:判斷添加在那個表上 2.報文流經的路徑:判斷在哪一個鏈上 鏈: 鏈上規則的次序,即爲檢查的次序,所以隱含必定的法則 1.同類規則(訪問同一應用),匹配範圍小的放上面 2.不一樣規則(訪問不一樣應用) 匹配到報文頻率大的放上面 3.合併能夠由一條規則描述的多個規則 4.設置默認策略 功能的優先級次序: raw -->mangle --> nat--> filter 規則; 組成部分: 報文匹配條件,匹配後的處理動做 匹配條件: IP ,PORT ,協議 基本匹配條件: 擴展匹配條件: 處理動做: 內建處理機制 自定義處理機制 注意: 報文不會進過自定義鏈,只能在內置鏈上經過規則引用後生效 iptables :規則管理工具 添加, 刪除,修改,顯示等; 規則和鏈有計數器: pkts;有規則或鏈所匹配到的報文個數 bytes: 由規則或鏈匹配到的全部報文大小之和 iptables 命令: iptables [-t table] {-A|-C|-D} chain rule-specification iptables [-t table] -I chain [rulenum] rule-specification iptables [-t table] -R chain rulenum rule-specification iptables [-t table] -D chain rulenum iptables [-t table] -S [chain [rulenum]] iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...] iptables [-t table] -N chain iptables [-t table] -X [chain] iptables [-t table] -P chain target iptables [-t table] -E old-chain-name new-chain-name iptables [-t table] SUBCOMMAND CHAIN CRETERIA -j TARGET -t table: 默認爲 filter filter ,nat ,mangle ,raw chain ; -F:flush ,清空規則鏈,省略鏈,表示清空指定表上的全部鏈 -N: new, 建立新的自定義規則鏈, -X:drop ,刪除用戶自定義的空的規則鏈; -Z:zero ,置零,置零規則計數器 -P:policy ,設置默認策略,對filter 表中的鏈而言,默認一般ACCEPT,DROP ,REJECT -E: 重命名自定義鏈 ,應用計數不爲0 的自定義鏈,沒法更名,也沒法刪除 規則管理: -A ;append ,將新規則追加至指定鏈的尾部 -I ;insert ,將新規則追加至指定鏈的指定位置 -D :delete ,刪除指定鏈上的指定規則 兩種指定方式: 指定匹配條件 指定規則編號 -R:replace,替換指定鏈上的指定規則 查看: -L :list ,列出指定鏈上的全部規則 -n :numberic ,以數字格式顯示地址和端口 -v :verbose ,顯示詳細信息 -vv ,-vvv --line-numbers;顯示規則編號 -x :exactly,顯示計數器結果的精確值 匹配條件: 基本匹配: [!] -s ,--src ,--source IP |NETaddr #匹配源地址 [!] -d ,--dst ,--destination IP|netaddr #匹配目的地址 [!] -p --protocal {tcp|udp|icmp}: 檢查報文中的協議,及IP 首部中的protocal 中的控制 -i ,--in-interface IFACE :數據報文的流入接口,僅能用於INPUT ,PREROUTING ,FORWARD -o ,--out-interface IFACE:數據流出接口,FORWARD ,OUTPUT ,POSTROUTING 擴展匹配:-m match_name --spec_options 列入: -m tcp --dport 22 隱式擴展; d對 -p protocol 指明協議進行的擴展,可省略-m 選項 -p tcp --dport PORT [-PORT];目標端口匹配 --sport PORT [-PORT] :源端口 --tcp-flags: SYN ,ACK ,FIN ,RST ,PSH ,URG --syn : -p udp --dport --sport -p icmp --icmp-type 0: echo-reply 8: echo-request #z只容許本機ping ,不響應 ping 包 iptables -I INPUT -d 192.168.100.230 -p icmp --icmp-type 0 -j ACCEPT 顯示擴展; 必須使用 -m 選項指定的擴展 目標; -j ;TARGET ,jump ,跳轉 指定的 TARGET ACCEPT :接受 DROP :丟棄 REJECT :拒絕 RETURN :返回調用鏈 REDIRECT :端口重定向 LOG :記錄日誌 MARK ;作防火牆標記 DNAT :目標地址轉換 MASQUERADE ;地址假裝 ..... 自定義鏈;由自定義鏈上的規則進行匹配檢查 centos 6: man iptables centos 7: man iptables-extensions 1.multiport 擴展 以離散方式定義多端口匹配,最後15 個端口 [!] --source-ports,--sports port[,port|,port:port]...#指明多個源端口 [!] --destination-ports,--dports port[,port|,port:port]...#指明多個目標端口 [!] --ports port[,port|,port:port]... #同時匹配源和目的端口 列子: 同時限制22,80 端口 iptables -I INPUT -s 192.168.0.0/16 -d 192.168.100.230 -p tcp -m multiport --dports 80,22 -j ACCEPT 2.iprange 擴展 指明連續的IP 地址範圍 ,通常不能擴展爲整個網絡 [!] --src-range from[-to] #連續的源地址範圍 [!] --dst-range from[-to] #連續的目的地址範圍 iptables -I INPUT -d 192.168.100.230 -p tcp -m multiport --dports 22:23,25,80 -m iprange --src-range 192.168.100.2-192.168.100.199 -j ACCEPT iptables -I OUTPUT -s 192.168.100.230 -p tcp -m multiport --sports 22:23,25,80 -m iprange --dst-range 192.168.100.2-192.168.100.199 -j ACCEPT 3.string 擴展 檢查報文中出現的字符串 --algo {bm|kmp} bm = Boyer-Moore, kmp = Knuth-Pratt-Morris --from offset #左偏移 --from offset #右偏移 [!] --string pattern iptables -I OUTPUT -m string --algo bm --string 'test' -j LOG iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string 'GET /index.html' -j LOG iptables -I OUTPUT -s 192.168.100.150 -m string --algo bm --string 'test' -j REJECT 4.time 擴展 :定時執行策略 --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] #起始日期 --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] #結束日期 #限制在某個時間段內拒絕某些請求 iptables -IINPUT -d 192.168.100.230 -p tcp --dport 80 -m time --timestart 14:00 --timestop 16:00 -j REJECT #一週內固定時間限制 iptables -I FORWARD -s 172.17.1.132 -d 192.168.1.119 -m time --timestart 09:40 --timestop 09:59 --weekdays Wed,Thu -j DROP 5.connlimit #併發鏈接限制 ,單個地址或者地址塊 [!] --connlimit-above n #連接上限 --connlimit-upto n #連接數量小於 n iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 2 -j REJECT iptables -I INPUT -d 192.168.100.230 -p tcp --syn --dport 22 -m connlimit --connlimit-above 4 -j REJECT 6.limit 擴展 基於收發報文的速率作檢查 令牌桶過濾器: --limit rate[/second|/minute|/hour|/day] --limit-burst number iptables -A INPUT -d 192.168.100.230 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT 7.state 擴展 根據連接追蹤機制檢查連接的狀態 調整連接追蹤功能所能容納的最大連接數量 /proc/sys/net/nf_conntrack_max #追蹤連接的最大限制 cat /proc/net/nf_conntrack #追蹤信息 #不一樣協議或連接的追蹤時長 /proc/sys/net/netfilter/ 可追蹤的連接狀態: NEW :新發出的請求,連接追蹤模板中不存在此連接的相關信息,所以識別爲第一次發起的請求 ESTABLISHED :NEW 狀態後,連接追蹤模板中爲其創建的條目失效前期間所進行的通訊狀態 RELATED :相關的連接,如ftp 協議的命令連接和數據連接的關係叫作相關連接 INVALIDE :沒法識別的連接 --state state --state STATE1,STATE2 iptables -I INPUT -p tcp -d 192.168.100.230 --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT FTP 問題: 裝載FTP 追蹤是的專用模塊 #iptables 擴展模塊 /lib/modules/2.6.32-696.16.1.el6.x86_64/kernel/net/netfilter/nf_conntrack_ftp.ko 1. 裝載 modprobe nf_conntrack_ftp 2. 放行請求報文 命令連接: NEW ,ESTABLISHED iptables -A INPUT -d 192.168.100.230 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 數據連接: RELATED ,ESTABLISHED iptables -A INPUT -d 192.168.100.230 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT 3.放行響應報文 ESTABLISHED iptables -A OUTPUT -s 192.168.100.230 -p tcp -m state --state ESTABLISHED -j ACCEPT 如何保存和重載規則: 保存規則至指定文件: iptables-save > /path/to/somefile 從指定文件重載規則: iptables-restore < /path/to/somefile CENTOS 6: service iptables save 至關於 iptables-save /etc/sysconfig/iptables service iptables restart 至關於 iptables-restore < /etc/sysconfig/iptables /etc/init.d/iptables 腳本文件目錄 CENTOS 7: 引入了新的iptables 前端管理工具:firewalld firewalld-cmd firewalld-config IPTABLES_MODULES="" 啓動自動裝載模塊 Chain FORWARD 開啓網卡轉發功能: /proc/sys/net/ipv4/ip_forward #使用sysctl 開啓內核轉發功能 sysctl -w net.ipv4.ip_forward=1 核心轉發: /proc/sys/net/ipv4/ip_forward /etc/sysctl.conf net.ipv4.ip_forward = 1 iptables : 顯示擴展 ,網絡防火牆 顯示擴展 : multiport ,iprange ,string ,time ,connlimit ,limit ,state state ; /proc/net/nf_conntrack /proc/sys/net/nf_conntrack_max iptables : nat :網絡層+傳輸層 ,安全性 , proxy : 代理,應用層 nat : SNAT:源地址 DNAT:目標地址 Nat表——三個鏈: PREROUTING :DNAT 必需要在路由發生以前完成DNAT POSTROUTING :SNAT OUTPUT : local 產生信息的nat SNAT : iptables -t nat -A POSTROUTING -s 192.168.100.0/24 ! -d 192.168.100.0/24 -j SNAT --to-source 172.16.100.100 DNAT : iptables -t nat -A PREROUTING -d 192.168.100.150 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.4:8080 MASQUERADE: 地址假裝,算是snat中的一種特例,能夠實現自動化的snat。 iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE iptables的連接跟蹤表最大容量爲/proc/sys/net/ipv4/ip_conntrack_max,連接碰到各類狀態的超時後就會從表中刪除。 因此解決方法通常有兩個: (1) 加大 ip_conntrack_max 值 vi /etc/sysctl.conf net.ipv4.ip_conntrack_max = 393216 net.ipv4.netfilter.ip_conntrack_max = 393216 (2): 下降 ip_conntrack timeout時間 vi /etc/sysctl.conf net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300 net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120 net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60 net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120 #指定網卡限制 iptables -A INPUT -i eth0 -m multiport -p tcp --dport 555,643,678,444 -j DROP tcp_wrapper :tcp 包裝器 對基於tcp 協議開發並提供服務的應用程序,提供的一層訪問控制 基於庫調用實現其功能: libwrap 判斷服務是否可以由tcp_wrapper進行訪問控制: (1) 動態編譯:ldd命令; ldd命令用於打印程序或者庫文件所依賴的共享庫列表 (2) 靜態編譯:strings命令查看應用程序文件,其結果中若是出現 hosts.allow hosts.deny 在配置文件在爲各服務分別定義訪問控制規則實現訪問控制: /etc/hosts.allow /etc/hosts.deny 配置文件語法: daemon_list: client_list [:options] daemon_list: 應用程序的文件名稱,而非服務名; 應用程序文件名稱列表,彼此間使用逗號分隔; 例如:sshd, vsftpd: ALL表示全部服務; client_list: IP地址; 主機名; 網絡地址:必須使用完整格式的掩碼,不使用前綴格式掩碼;因此相似於172.16.0.0/16不合法; 簡短格式的網絡地址:例如172.16. 表示 172.16.0.0/255.255.0.0; ALL:全部主機; KNOWN: UNKNOWN PARANOID 例如:vsftpd服務不容許172.16.100.1訪問 EXCEPT: 除了 hosts.allow vsftpd: 172.16. EXCEPT 172.16.100.0/255.255.255.0 EXCEPT 172.16.100.1 sshd :ALL : spawn echo `date` login attempt from %c to %s >> /var/log/tcp_wrapper.log [:options] deny: 拒絕,主要用於hosts.allow文件中 allow:容許,用於hosts.deny文件,實現allow的功能 spawn: 啓動額外應用程序: vsftpd: ALL :spawn /bin/echo `date` login attempt from %c to %s, %d >> /var/log/vsftpd.deny.log %c: client ip %s: server ip %d: daemon name nginx 高效web 服務器和反向代理服務器 http 常見的實現方式: HTML , php ,jsp , python pv :page view 一次頁面的訪問,指靜態頁面 uv :user view 單個用戶訪問的次數 active connection qps :每秒的新建連接數 , I/O 網絡模型: 阻塞 blocking IO 非阻塞 nonblocking IO 多路IO multiplexing 異步 asychronous IO 事件驅動 sinnal driven IO apache 多進程或多線程模型 nginx 採用epoll 模型, 異步非阻塞模型 http 協議 ,超文本協議 html :hypertxt mark language 文本 :htm/l.0 ,MIME 機制 認證 : basic digest 資源映射: alias DocumentRoot http :MPM prefork : 主進程 生成多個子進程,每一個子進程處理一個請求 worker :主進程 ,生成多個子進程,每一個子進程生成多個我線程,每一個線程響應一個請求 event: 主進程,生成多個子進程,每一個子進程響應多個請求 I/O 類型: 阻塞和非阻塞; block ,nonblock ,調用着調用時的中間狀態, 阻塞:調用結果返回以前,調用被掛起,調用者只有獲得返回結果以後才能繼續 非阻塞:調用者在結果返回以前,不會被掛起,及調用不會阻塞調用者 同步和異步 : 同步調用發出後等待響應返回 異步調用後結束不等待返回,被調用者後進行通知返回 一次read 操做: 1.等待數據準備好,從磁盤到內核內存 2.從內核內存複製到進程內存 同步IO : 阻塞,非阻塞,複用 異步IO : 事件驅動,異步 nginx ; engine x tengine registry ibevent :高性能網路服務程序庫 epoll : 基於事件驅動 event 模型的庫 Nginx : 模塊化設計, 較好的擴展性 高可靠 #一個主控進程和多個子進程, master---> worker 低內存消耗: 一個線程響應多個請求 10000 個keep-alive 模式下的connection ,僅須要2.5 MB 內存 支持熱部署 不停機更新配置文件,日誌文件滾動 支持事件驅動,AIO ,mmap 基本功能: 靜態資源的web 服務器,能緩存打開的文件描述符 http ,smtp ,pop3 協議的反向代理服務器 緩存加速,負載均衡 支持 fastCGI(fpm ,LNMP) uwDGI, python 應用 模塊化(非DSO 機制) ,過濾器zip ,SSI ,圖像的大小調整 支持ssl 擴展功能: 基於名稱和IP 的虛擬主機 支持keep-live 支持平滑升級 定製訪問日誌,支持使用日誌緩衝區 支持 URL rewrite 支持路徑別名 支持基於IP 及用戶的訪問控制 支持速率限制,支持併發限制 nginx 基本架構特性: 一個master 進程,生成一個或者多個worker 進程 事件驅動,epoll (邊緣觸發linux ),keqeue(unix), 複用器:select ,poll ,rt singal 支持sendfile,sendfile64 支持 AIO 支持 mmap nginx 工做模式: 非阻塞, 事件驅動,由一個master進程生成多個線程,每一個worker 響應 n 個請求 併發 :worker * n 模塊類型: 核心模塊 standard HTTP module optional HTTP module mail module 3rd party module 安裝方法: 源碼:編譯安裝 製做好的程序包,rpm 包, 編譯安裝: #groupadd -r nginx #useradd -r nginx ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --add-module=/usr/local/nginx/nginx-sticky-module-1.1 #make && make install #mkdir -pv /var/tmp/nginx{client,proxy,fastcgi,uwsgi} 配置文件: /etc/nginx/nginx.conf main 配置段,全局配置段 event : 定義event 模型工做特性 http { } #定義http 協議相關配置 配置指令: 要以分號結尾; directive value1 [value2 ,,,,] 支持使用變量: 內置變量: 模塊會提供內建變量 自定義變量; set var_name value 主配置段指令: 用於調試,定位問題 正常運行必備的指令 優化性能配置 事件相關的配置 主配置段指定: 正常運行的必備配置: #指定運行worker 進程的用戶和組 1.user USERNAME GROUPNAME user nginx nginx; #指定nginx 守護進程pid 文件 2. pid /path/to/pid_file; pid /var/run/nginx/nginx.pid #指定全部worker 能打開的最大文件數 3.worker_rlimt_nofile #; 性能優化相關的配置: 1.worker_processes #; # worker 進程的個數,一般應該少於CPU 物理數 2.worker_cpu_affinity cpumask ...; #提高緩存命中率 #cpumask :CPU 掩碼 #worker 進程與CPU 綁定 #worker_processes 4; #worker_cpu_affinity 0001 0010 0100 1000; 3.timer_resolution interval; #下降解析度,減輕系統調用 4.worker_priority number; #指定worker 進程的nice 值 -20 ,19 100, 139 事件相關的配置: 1. accept_mutex on | off; # 調用用戶請求至各worker 進程時使用負載均衡 ,on表示開啓,off表示隨機 2.Syntax: lock_file file; Default: lock_file logs/nginx.lock; #鎖文件 3.use method; #指定使用的模型 #use [epoll|select|poll] 4. worker_connection; #設定單個worker 進程能處理的最大併發鏈接數量 worker_connection*worker_processes 用戶用於調試,定位問題; 1.daemon {on|off}; #是否以守護進程運行nginx 2.master_process on | off; #是否使用worker 模型來運行nginx 3.Syntax: error_log file [level]; #Default: error_log logs/error.log error; #定義error log ,定義文件和級別 #error_log syslog:server=192.168.1.1 debug; #若要使用debug 級別,須要編譯debug 模塊 總結:須要進行調整的參數 worker_processes,worker_connections,worker_cpu_affinity,worker_priority 新改動配置生效方案: nginx -s reload stop ,quit , reload *************************************** #查看CPU信息 物理CPU個數: cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l 每一個CPU物理核數: cat /proc/cpuinfo |grep "cpu cores"|uniq 每一個CPU邏輯核數: cat /proc/cpuinfo |grep "siblings"|uniq 總CPU邏輯核數: cat /proc/cpuinfo |grep -c "processor" ************************************************************************* nginx 做爲web 服務器使用的配置: http { http 配置段 } #由 ngx_http_core_module 模塊來引用 配置框架: http { upstream { ..... } server { location { root "/path/to/somedir"; ..... }#相似 httpd 中的<location>,用於定義 URI 與本地文件的映射關係 location URI { if .. { } } .... } #每一個server 相似於httpd 中的virtualHost ; server { } } 注意: http 相關的指定僅能放置於http,server,location,upstream,if 上下文中,但有些指令只能在某一個裏面使用 配置指令: 1. server {} 定義一個虛擬主機 # server { # listen 8090; # server_name zy.test; # root "/var/www/nginx"; # } 2. listen 指定監聽的地址和接口 listen address[:port]; listen port; 3.server_name # 指定server name # server_name example.com www.example.com; (1).先作精確匹配檢查 (2). 左側統配符檢查 *.zy.test; (3).右側統配符檢查 (4).正則表達式匹配 (6). default_server ; 4.root path ; #設置資源映射路徑 5.location # location [ = | ~ | ~* | ^~ ] uri { ... } #功能 :容許根據用戶請求的URI 來匹配定義的各location, #此請求將相應的location 配置塊中的配置所處理,訪問控制等 server { listen 80; server_name test.com; location / { root "/var/www/web" #將用戶訪問的根目錄映射到/var/www/web } } = :精確匹配檢查 ~ :正則表達式匹配,區分大小寫 ~*: 正則表達式匹配, 不區分大小寫 ^~:URI 前半部分匹配,不支持正則表達式 #配置優先級 從上往下 6. alias path ; #用於實現定義路徑別名 注意: root 表示指明路徑爲對應的 location "/" URI alias 表示路徑映射,及location 指定後面定義的URI 是相對於alias 所指明的路徑 7.index file ; #定義默認主頁面 index index.php index.html ; 8.error_page #錯誤返回頁面 # error_page 404 /404.html; # error_page 404 =200 /empty.gif; #[=code] 以指定的響應碼進行相應 9.基於 IP 地址的訪問控制 deny IP/network ; allow ; # location / { # root html; # index index.html index.htm; # error_page 404 =200 /404.html; # deny all; # } 10. 基於用戶的訪問控制 basic ,digest ; auth_basic ; auth_basic_user_file #帳號密碼建議使用htppawd 建立 ; #auth_basic "AUTH_USER"; #auth_basic_user_file /etc/nginx/.htpaswd; #htpasswd -c -m .htpasswd tom #首次建立文本加 -c #htpasswd -m .htpasswd tom #後面不用加 -c 11.ssl 證書加密文件 ****************************** 創建私有CA openCA openssl 證書申請及簽署步驟 1.生成證書申請請求 2.RA 效驗 3.CA 簽署 4. 獲取證書 openssl 默認配置文件:/etc/pki/tls/openssl.cnf 1.建立所須要的文件 touch index.txt echo 01 > serial 2.CA 自簽發證書 生成私鑰: (umask 077; openssl genrsa -out private/cakey.pem 2048) 生成新證書: openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out cacert.pem -new :生成新的證書籤署文件 -x509 :專用於CA 自簽發證書 -key :私鑰 -days :有效期 -out : 證書的保存路徑 而後根據信息填完能夠生成新的證書了 3.發證 1.主機生成證書請求文件 2.將請求文件發給CA 3.CA 效驗請求文件 4.簽發 給httpd 服務器簽發證書。 建立私鑰: (umask 077;openssl genrsa -out httpd.key 2048) 建立證書請求文件 openssl req -new -key httpd.key -days 365 -out httpd.csr 簽發證書 openssl ca -in /etc/httpd/ssl/httpd.csr -out httpd.crt -days 365 查看證書中的信息: openssl x509 -in /path/cert_file -noout -text ************************************************************ #ssl nginx 配置位置 ,上面是nginx 建立CA 和 nginx 證書步驟 server { listen 443 ssl; server_name www.nginx-zy.com; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } } ***************************************************** 12.stub_status {on|off}; #僅能用於location 上下文 #展現nginx 的狀態展現頁面 # location /status { # stub_status on; # allow 192.168.100.0/24; # deny all; # # } 結果展現: Active connections: 3 #當前全部打開的連接 server accepts handled requests #1.已經接受 2.已經處理 3.已經處理的請求 30 30 53 Reading: 0 Writing: 1 Waiting: 2 Reading :正處於接受請求狀態的鏈接數 Writing :請求已經接收,正處於處理請求的過程當中 Waiting :保持連接模式,且處於活動狀態的連接數 13.rewrite regex replacement [flag] #URI 重寫 server { ... rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; #$1 或者$2 表明後向引用 return 403; ... } flag : last : 持續匹配規則,此 rewrite 規則重寫完成後,從頭開始匹配新的rewrite 規則 break: 匹配規則後,直接跳出匹配規則,進行後續處理 redirect: 以302 響應碼返回新的URL ,臨時重定向 permanent: 以301 響應碼返回新的URL ,永久重定向 #列子: #以 /bbs/ 開頭的uri 重定向爲https rewrite ^/bbs/(.*)$ https://www.nginx-zy.com/ redirect; 14. if (condition) { ... } # if 條件判斷 #應用環境 server, location condition (1)變量名: 變量值爲空串,或者以"0" 開頭爲false ,其餘均爲 trun ; (2)以變量爲操做數構成的比較表達式 可以使用 = 。!= 相似的操做符 (3) 正則表達式的模式匹配 ~;區分大小寫 ~*:不區分大小寫 !~ ,!~* ,取反 (4)測試文件是否存在 -f : 是否存在 !-f :是否不存在 (5)測試指定路徑爲目錄的可能性 -d ,!-d (6) 測試文件的存在性 -額。!-e (7) 檢查文件是否有執行權限 :-x !-x **************************************** if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } if ($request_method = POST) { return 405; } if ($slow) { limit_rate 10k; } if ($invalid_referer) { return 403; } ************************************************* 15. 定製訪問日誌格式 log_format log_format name [escape=default|json] string ...; #啓用此功能須要開啓access_log 功能 #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; 此處可用變量爲nginx 各模塊內建變量 網絡鏈接相關配置: 1. keepalive_timeout #; 長鏈接的超時時長 ,默認 75 秒; 2.keepalive_requests #; 在一個長鏈接上所可以容許的最大資源數; 3. keepalive_disable [msie6|none|safar]; 爲指定類型的User Agent 禁用長鏈接 4.tcp_nodelay on|off ; 是否對長鏈接使用nodelay 5. client_header_timeout #讀取http 報文首部的超時時長 6. client_body_timeout 讀取http 報文請求 body 的超時時長 7. send_timeout #; #發送響應報文的時長; fastCGI 相關配置: LNMP :PHP 啓用fpm 模型; Cluster : LB 集羣: 系統擴展方式: scale up :向上擴展 scale out : 橫向擴展 LB :負載均衡集羣 HA :高可靠集羣 HP :高性能集羣 系統: 可擴展性: 可用性 容量 性能 系統運維:可用 --> 標準化--> 自動化 構建高可用可擴展系統重要原則:在系統內部儘可能避免串行和交互 GSLB : 全局負載均衡 總結: 分層設計: 分割設計: 分佈式應用 分佈式數據和存儲 分佈式計算 http :stateless session 綁定: source ip hash cookie session 集羣: session 服務器: lvs scheduler : 靜態方法; 根據算法本省進行調度 RR ;round robin ,輪訓 WRR : weighted rr ;按照權重輪訓 SH ;源地址散列(Source Hashing),session 保持,LVS 維護一個hash 表 ,基於源地址的會話保持吧 DH ; 目標地址散列(Destination Hashing),基於目的地址hash , 動態算法: 根據算法和各 RS 當前的負載均衡方法進行調度 LC :最小連接,least connections overhead= active*256+inactive WLC :weighted least connection ,基於權重的最小連接負載 overhead= active*256+inactive/weighted SED ;最短延遲調度(Shortest Expected Delay ) Overhead = (ACTIVE+1)*256/加權 NQ :NQ永不排隊/最少隊列調度(Never Queue Scheduling NQ) LBLC :基於局部性的最少連接(locality-Based Least Connections) LBLCR :帶複製的基於局部性最少鏈接(Locality-Based Least Connections with Replication) 負載調度器可以支持絕大多數的TCP和UDP協議: 協議: 內 容 TCP :HTTP,FTP,PROXY,SMTP,POP3,IMAP4,DNS,LDAP,HTTPS,SSMTP等 UDP : DNS,NTP,ICP,視頻、音頻流播放協議等 ipvsadm 的用法:基於lvs 的管理工具 管理集羣服務 ipvsadm -A|E -t|u|f service-address [-s scheduler] ipvsadm -D -t|u|f service-address ipvsadm -L|l [options] ipvsadm -C server-addr : tcp : -t ip:port udp : -u ip:port fwm : -f mark -s schedule ; 默認爲 wlc 管理集羣服務中的RS ipvsadm -a|e -t|u|f service-address -r server-address ipvsadm -d -t|u|f service-address -r server-address ipvsadm -L|l [options] server-addr : ip:port lvs-type ; -g :gateway .,dr -i : ipip -m :masquerade ,nat 保存和重載: ipvsadm -R ipvsadm -S [-n] 置零計數器: ipvsadm -Z [-t|u|f service-address] tcp : -t ip:port udp : -u ip:port fwm : -f mark 重點: 1.一個IPvs 主機能夠定義多個cluster server tcp ,udp 2.一個 cluster service 至少有一個 real server 定義時指明 lvs-type ,schedule LVS-NAT 測試: 1.開啓網卡轉發功能: /proc/sys/net/ipv4/ip_forward 2.建立 vip: ipvsadm -A -t 192.168.100.150:8090 -s rr 建立負載 : ipvsadm -a -t 192.168.100.150:8090 -r 6.6.6.230:8000 -m ipvsadm -a -t 192.168.100.150:8090 -r 6.6.6.231:8000 -m #路由重點 ,虛擬機測試路由須要研究 ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm" ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm" 保存配置: ipvsadm --save > /etc/sysconfig/ipvsadm 加載配置: ipvsadm-restore < /etc/sysconfig/ipvsadm ipvsadm -R < /etc/sysconfig/ipvsadm 清空規則: ipvsadm -C 查看規則: -n numeric :基於數字格式顯示 -c conn : 顯示鏈接 --stats :統計數據 --rate :速率 --exact :精確值 修改VIP: -E 刪除 : ipvsadm -d -t 192.168.100.150:8090 -r 6.6.6.220:80 LVS DR 模式: #兩個重要內核參數 arp_ignore 和 arp_announce arp_ignore : 是否響應arp 請求 0 - (默認值): 迴應任何網絡接口上對任何本地IP地址的arp查詢請求 1 - 只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求 2 -只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求,且來訪IP必須在該網絡接口的子網段內 3 - 不迴應該網絡界面的arp請求,而只對設置的惟一和鏈接地址作出迴應 4-7 - 保留未使用 8 -不迴應全部(本地地址)的arp查詢 arp_announce : 主機多個地址 是否在不一樣網絡中響應arp 0 - (默認) 在任意網絡接口(eth0,eth1,lo)上的任何本地地址 1 -儘可能避免不在該網絡接口子網段的本地地址作出arp迴應. 當發起ARP請求的源IP地址是被設置應該經由路由達到此網絡接口的時候頗有用.此時會檢查來訪IP是否爲全部接口上的子網段內ip之一.若是改來訪IP不屬於各個網絡接口上的子網段內,那麼將採用級別2的方式來進行處理. 2 - 對查詢目標使用最適當的本地地址.在此模式下將忽略這個IP數據包的源地址並嘗試選擇與能與該地址通訊的本地地址.首要是選擇全部的網絡接口的子網中外出訪問子網中包含該目標IP地址的本地地址. 若是沒有合適的地址被發現,將選擇當前的發送網絡接口或其餘的有可能接受到該ARP迴應的網絡接口來進行發送. 配置子接口地址: 配置vip : ifconfig eth0:0 6.6.6.221/32 broadcast 6.6.6.221 up #只對本身進行廣播 定義只對應接口進行響應: route add -host 6.6.6.221 dev ens37:0 配置 arp_ignore: 路徑: /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore arp_announce : echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce real server :配置VIP ifconfig lo:0 6.6.6.221/32 broadcast 6.6.6.221 up route add -host 6.6.6.221 dev lo:0 dr 配置: ipvsadm -A -t 6.6.6.221:80 -s rr ipvsadm -a -t 6.6.6.221:80 -r 6.6.6.6.220:80 -g ipvsadm -a -t 6.6.6.221:80 -r 6.6.6.6.230:80 -g ipvs 基於防火牆標記的策略: #先在iptables 上進行進行標記 iptables -t mangle -A PREROUTING -d 6.6.6.221 -p tcp --dport 80 -j MARK --set-mark 10 #ipvs 進行配置 ipvsadm -A -f 10 -s rr ipvsadm -a -f 10 -r 6.6.6.230:80 -g ipvsadm -a -f 10 -r 6.6.6.220:80 -g 經過FWM 定義集羣的方式: 1.在 director 上的netfilter mangle 表上定義prerouting 用於達標的的規則 功能: 共享一個RS 集羣服務 session 保持: session 綁定 session 複製 session 服務器 session 綁定: lvs sh 算法 只能針對一個 VIP ,沒法跨VIP lvs persistence :lvs 持久鏈接 功能: 不管 IPvs 使用任何調度算法,都在單位時間內將一個鏈接使用保持在第一次訪問的server 跨VIP 的持久鏈接須要持久鏈接模板 ,獨立算法 -p :指定會話保持時間 #將當前策略修改成使用會話保持策略 ipvsadm -E -t 6.6.6.221:80 -s rr -p 支持鏈接的實現方式: 每端口持久: PPC ,但服務調度 每FWM持久: PFWMC :單FWM 持久鏈接 每客戶端持久: PCC :單客戶端持久 VIP 端口定義爲全 0 的服務 lvs HA 高可用集羣: 1.健康檢查 基於協議的檢查 分層次 2.檢查頻度 3.狀態判斷 列入判斷成功三次,將節點加入負載均衡池 nginx server proxy : qps :Queries Per Second意思是「每秒查詢率」 tps :是TransactionsPerSecond的縮寫,也就是事務數/秒。 session 保持方法: session 綁定:sh session 複製: session 服務器: key value 方式存儲在第三方 I/O : 同步/異步 :被調用者收到請求當即返回仍是等待 阻塞/非阻塞: 調用者被掛起或不被掛起 nginx 配置: man ,event, http man :定義全局屬性 event : 定義I/O 模型 http :定義 http 協議 http { directive server { listen server_name location { if { } } } server { } } nginx 版本: Stable version :穩定版本 Legacy versions :舊的版本 hdparm: 命令提供了一個命令行的接口用於讀取和設置IDE或SCSI硬盤參數 hdparm -I /dev/sdb 正向代理模塊: #Module ngx_http_proxy_module # proxy_pass 將請求轉發至其餘服務器 location / { 是Ricky } 負載均衡模塊:upstream 能夠定義一個負載均衡池實現負載算法完成負載均衡 ngx_http_upstream_module ############################### weight 指定權重 upstream pool_test { server 192.168.100.150 weight=5 ; server 192.168.100.220; } ip_hash 源地址hash ,源地址會話保持 max_fails :檢測兩次,間隔fail_timeout 2 秒 upstream pool_test { #ip_hash; server 192.168.100.150 max_fails=2 fail_timeout=2; server 192.168.100.220 max_fails=2 fail_timeout=2; } 回顧: nginx nginx_http_proxy_module ,ngx_http_upstream_module ngx_http_proxy_module :實現反向代理及緩存功能 proxy_pass http://{server_ip|upstream_name}/uri proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] ; proxy_cache zone_name; proxy_cache_valid [code] time ; proxy_cache_method []; proxy_cache_use_state_error timeout .... proxy_cache_min_usses proxy_cache_path 緩存文件路徑 levels 設置緩存文件目錄層次;levels=1:2 表示兩級目錄 keys_zone 設置緩存名字和共享內存大小 inactive 在指定時間內沒人訪問則被刪除 max_size 最大緩存空間,若是緩存空間滿,默認覆蓋掉緩存時間最長的資源 ################################################################################### ################################################################################### 學習: ngx_http_upstream_module; proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, and memcached_pass 定義服務器組: upstream name { ip_hash; #基於源地址的保持 server test1 down; server test2; } down :將節點標記爲不可用 server test_name down ; backup :備用節點 server backup1.example.com:8080 backup; 基於sticky 實現session 綁定; #sticky 須要編譯第三方插件 #因爲版本不同中間須要多個參數進行修改 #參考百度 cookie route learn cookie : sticky cookie name [expires=time] [domain=domain] [httponly] [secure] [path=path]; 調度方法: ip_hash; 源地址會話保持 least_conn : 最小連接數 keepalive connections; 限制nginx 和後端的持久連接,當連接大於設定的值,將關閉最好使用的連接 health_check; #在location 中定義,建議關閉health_check 日誌 #此功能須要添加ngx_http_upstream_hc_module 模塊 對於fail_timeout和max_fails的默認值分別爲10s和1次。 也就是說,當Nginx向一臺應用服務器發送請求,若是失敗則認爲該應用服務器不可訪問。接下來的10s中請求再也不分發給該應用服務器。 直到10s之後會再次將請求分發給該應用服務器。 $upstream_addr #nginx 內建變量,爲後端服務器地址和端口, $upstream_cache_status 緩存狀態碼 ngx_http_headers_module 模塊中: add_header name value [always]; #添加響應報文以下: add_header X_zy $upstream_addr; #在響應報文中插入服務器地址 ngx_http_fastcgi_module LNMP ,fpm ############################################################################### ab apache 的壓力測試命令: ab -c 200 -n 1000 http://192.168.100.230/test.php 解析: 請求鏈接總數1000 ,一次併發200 ,因此會分5次請求完 Server Software表示被測試的Web服務器軟件名稱。 Server Hostname表示請求的URL主機名。 Server Port表示被測試的Web服務器軟件的監聽端口。 Document Path表示請求的URL中的根絕對路徑,經過該文件的後綴名,咱們通常能夠了解該請求的類型。 Document Length表示HTTP響應數據的正文長度。 Concurrency Level表示併發用戶數,這是咱們設置的參數之一。 Time taken for tests表示全部這些請求被處理完成所花費的總時間。 Complete requests表示總請求數量,這是咱們設置的參數之一。 Failed requests表示失敗的請求數量,這裏的失敗是指請求在鏈接服務器、發送數據等環節發生異常,以及無響應後超時的狀況。若是接收到的HTTP響應數據的頭信息中含有2XX之外的狀態碼,則會在測試結果中顯示另外一個名爲「Non-2xx responses」的統計項,用於統計這部分請求數,這些請求並不算在失敗的請求中。 Total transferred表示全部請求的響應數據長度總和,包括每一個HTTP響應數據的頭信息和正文數據的長度。注意這裏不包括HTTP請求數據的長度,僅僅爲web服務器流向用戶PC的應用層數據總長度。 HTML transferred表示全部請求的響應數據中正文數據的總和,也就是減去了Total transferred中HTTP響應數據中的頭信息的長度。 Requests per second吞吐率,計算公式:Complete requests/Time taken for tests Time per request用戶平均請求等待時間,計算公式:Time token for tests/(Complete requests/Concurrency Level)。 Time per requet(across all concurrent request)服務器平均請求等待時間,計算公式:Time taken for tests/Complete requests,正好是吞吐率的倒數。也能夠這麼統計:Time per request/Concurrency Level。 Transfer rate表示這些請求在單位時間內從服務器獲取的數據長度,計算公式:Total trnasferred/ Time taken for tests,這個統計很好的說明服務器的處理能力達到極限時,其出口寬帶的需求量。 Percentage of requests served within a certain time(ms)這部分數據用於描述每一個請求處理時間的分佈狀況,好比以上測試,80%的請求處理時間都不超過6ms,這個處理時間是指前面的Time per request,即對於單個用戶而言,平均每一個請求的處理時間。 ######################################################################################### ######################################### 安裝LAMP ,wordpress ,phpmyadmin phpmyadmin : yum 安裝: 編輯: vim /etc/httpd/conf.d/phpMyAdmin.conf 將 : 下面改成all 容許全部 <RequireAny> # Require ip 127.0.0.1 # Require ip ::1 Require all granted 編輯: vim /etc/phpMyAdmin/config.inc.php #改成生成的隨機數 #使用 openssl rand -base64 11 $cfg['blowfish_secret'] = 'bWTzrKC1oy0AjRo='; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */ #指定用戶名: $cfg['Servers'][$i]['user'] = 'root'; 修改mysql root 密碼 : mysql -u root 進入 設置密碼: SET PASSWORD FOR 'root'@'localhost' = PASSWORD('default_zy'); # 檢查nginx 配置文件是否語法 nginx -t -c /etc/nginx/nginx.conf keepalived : linux Cluster LB ,lvs ,nginx HA #keepalived 使用vrrp 實現主備的LVS ,nginx ,haproxy keepalived : vrrp 協議在Linux 主機上以守護進程的方式實現 可以根據配置文件自動生成ipvs 規則 對各 RS 作健康檢查 組件: vrrp stack checkers ipvs wrapper--> ipvs 配置文件的組成部分: GLOBAL CONFIGURATION :全局配置段 VRRPD CONFIGURATION :vrrp 配置段 vrrp instance :vrrp 虛擬路由器 vrrp synchonization group :vrrp 同步組 LVS CONFIGURATION :lvs 配置 HA Cluster-配置前提: 1.本機的主機名與hosts 中定義的主機保持一致,要與hostname (uname -n )獲取的名稱一致 CENTOS 6 :/etc/sysconfig/network 7: hostnamectl set-hostname HOSTNAME 各節點要互相解析主機名,經過hosts 文件進行解析 2.各節點時間同步: 3.確保iptables 和selinux 開放 #非搶佔模式,默認搶佔模式 nopreempt #多行添加註釋 :起始行號,結束行號s/^/註釋符/g vrrp_sync_group VG_1 { group { inside_network # name of the vrrp_instance (see below) outside_network # One for each movable IP ... } vrrp_instance inside_network { eth1 dip } ansible 運維工具學習: 模塊化:調用特定模塊,完成特定任務 基於python 語言實現,由 paramiko ,pyYAML ,Jinja2 三個關鍵模塊實現 主從模式 配置文件: /etc/ansible agent : ssh 服務 格式: ansible <host-pattern> [-f forks] [-m module_name] [-a args] 1:ssh-keygen -t rsa 生成密鑰 2:ssh-copy-id -i ~/.ssh/id_rsa.pub jifeng@jifeng02 把本機的公鑰追到jifeng02的 .ssh/authorized_keys 裏 linux HA cluster : LB , HA ,HP ,hadoop LB : 傳輸: LVS 應用層: nginx ,haproxy , httpd ,perlbal ,ats ,varnish HA : vrrp :keepalived AIS :heartbeat ,OpenAIS , corosync/pacemaker , AIS HA messaging layer : heartbeat v1, ,v2, v3 corosync openAIS CRM :集羣資源管理器 讓自己不具有高可用功能的服務使用高可用功能 配置集羣工做特性, pacemaker 配置接口:crmsh 用來配置pacemaker,agentless ,pssh pcs (c/s)架構 ,pcsd centos 6: 只能集羣配置 centos 7 ;全生命週期管理 conga (ricci/luci) rgmanager (cman) resource group : filover domain RA ;集羣代理 ,讓運行在個集羣節點的CRM LRM 管理本地資源 腳本文件 LSB ;/etc/rc.d/init.d/ systemd : /etc/systemd/system/ /usr/lib/systemd/system 處於enable 狀態的服務 OCF :格式腳本 provider heartbeat pacemaker linbit service 通用服務類型 stonith 配置: 全局屬性:property,stonith-enable 等等: 高可用服務:資源,經過RA 高可用集羣方案: heartbeat V1 :有CRM 功能 heartbeat V2 : 有CRM 功能 heartbeat v3 + pacemaker X :CRM 功能獨立出來了pacemaker corosync + pacemaker centos6 : 還能夠使用: cman + rgmanager corosync + cman + pacemaker centos 7 : corosync + pacemaker 能夠使用PCS 全生命週期安裝 使用比較多的 keepalived 通用 1. 集羣傳遞心跳 串口心跳 ,集羣數量不夠 網絡心跳 unicast 單播 ddpu mutlicast 組播 udp Broadcast 廣播 組播地址:用於標識一個IP 組播域,IANA 吧D 類地址用於組播224.0.0.0-239.255.255.255 永久組播地址:224.0.0.0-224.0.0.255 臨時組播地址: 224.0.0.0-238.255.255.255 本地組播地址: 239.0.0.0-239.255.255.255 全部主機使用一個地址

 

命令提示符:
  管理員:#
  普通用戶:$
     
常見Linux目錄名稱
/ 虛擬目錄的根目錄。一般不會在這裏存儲文件
/bin 二進制目錄,存放許多用戶級的GNU工具
/boot 啓動目錄,存放啓動文件
/dev 設備目錄,Linux在這裏建立設備節點
/etc 系統配置文件目錄
/home 主目錄,Linux在這裏建立用戶目錄
/lib 庫目錄,存放系統和應用程序的庫文件
/media 媒體目錄,可移動媒體設備的經常使用掛載點
/mnt 掛載目錄,另外一個可移動媒體設備的經常使用掛載點
/opt 可選目錄,經常使用於存放第三方軟件包和數據文件
/proc 進程目錄,存放現有硬件及當前進程的相關信息
/root root用戶的主目錄
/sbin 系統二進制目錄,存放許多GNU管理員級工具
/run 運行目錄,存放系統運做時的運行時數據
/srv 服務目錄,存放本地服務的相關文件
/sys 系統目錄,存放系統硬件信息的相關文件
/tmp 臨時目錄,能夠在該目錄中建立和刪除臨時工做文件
/usr 用戶二進制目錄,大量用戶級的GNU工具和數據文件都存儲在這裏
/var 可變目錄,用以存放常常變化的文件,好比日誌文件
pwd 命令: 以絕對路徑顯示當前工做目錄
ls 命令:
    -l 長格式
        文件類型:
        - :普通文件
        d : 目錄文件
        b : 塊設備文件
        c : 字符設備文件
        l : 符號連接文件
        p : 命令管道
        s :套接字文件
     
     
-rw-r--r-- 1 root root        36 Jun 29 14:31 user.txt
         
            - :文件類型
            rw-r--r-- : 讀寫執行
            1 : 文件硬連接的次數
            root: 文件的擁有者 {owner}
            root: 文件的屬組 {group}
            36 :文件大小 {size} 默認單位字節
            Jun 29 14:31 :時間戳 {timestamp} 最近一次被修改的時間{訪問時間,修改時間,改變時間}             
            訪問:access
            修改:modify
            改變:change
            user.txt : 文件名或目錄名             
    -h : 單位換算
     
問號(?)表明一個字符;
  星號(*)表明零個或多個字符。
問號可用於過濾器字符串中替代任意位置的單個字符。例如:
$ ls -l my_scr?pt
-rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt
-rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script
     
     
    -A:顯示除影藏文件「.」和「..」之外的全部文件列表
    -d :顯示目錄自身屬性
     
    -i :顯示index node,簡寫inode
     
    -r :逆序顯示文件
相關文章
相關標籤/搜索