網頁

2013年3月9日 星期六

grep指令


  • 查找文本工具grep
    • grep是global regular expression print(全局正則表達式打印)的縮寫。
    • grep工作時,總是以行為單位查找。首先將文本的第1行讀入緩陣區并執行查找,如果找到到匹配的字符串,則輸出整行。
    • 常用的選項
      • i:忽略大小寫。
      • n:將結果輸出的同時,也輸出該行的行號。
      • s:在沒有查找到匹配的內容時,不顯示錯誤信息。
      • l:從多個文件中查找時,只輸出找到匹配內容的文件名稱。
      • h:從多個文件中查找時,只輸出匹配的內容,不顯示文件名稱。
      • c:只輸出匹配內容的總行數
      • v:反轉查找,即輸出匹配內容以外的行。
    • 範例:
      • grep "canred" students
      • grep -n "canred" students
      • grep -c "canred" students
      • grep -i "CanRed" students
      • grep -vi "canred" students | grep -vi "eva"
      • 多文件查找
        • grep -l "root" /etc/*
          • 顯示/etc目錄中所有包含有root的文件名
        • grep -h "root" /etc/passwd /etc/shadow
      • 使用grep在命令輸出中查找
        • echo "Welcome to Taiwan" | grep "Taiwan"
      • 使用grep在變量中查找
        • A="Welcome to Taiwan"
        • echo $A | grep "Taiwan"
      • 行首,行尾匹配查找
        • grep '^canred' students
        • grep 'canred$' students
      • 正則表達式查找
        • grep '/9[0-9]' students
        • grep 'c\{3,\}' students
        • grep 'canred\{2\}p$' students
        • ls -l | grep '\.txt$'
      • 使用或、與多匹配模式查找
        • grep -E 'Canred|Eva' students
          • 上面是 或
        • grep 'Canred' students | grep "Eva"
          • 上面是 and ;2者是不一樣的結果
    • grep工具有一個很多的類似的方法如egrep、fgrep、agrep…etc


find 指令


  • find的基本格式
    • find [path] [expressioin]
    • 常用的選項
      • path:find 查找路徑。如果未指定,則默認為當前工作目錄。
      • Expression:用于定義find查找的表達式,表達式通常由選項、測式和動作3類參數組成。
      • 常用的選項說明
        • help:獲得幫助信息
        • depth:先從當前目錄中查找,然后再從當目錄的子目錄中查找
        • maxdepth LEVELS:向下搜索到第LEVELS層目錄,當LEVELS=0時表示只在當前目錄查找。
        • mindepth LEVELS:至少向下搜索LEVELS層目錄
        • mount:不搜索遠程文件系統
        • follow:搜索如果遇到鏈接文件就連鏈接所指向的文件一並檢查。
      • 常用的測試參數
        • name:按文件名查找
        • perm:按文件權限查找
        • type:查找某一類型的文件
        • mtime+n-n:按文件的修改的時間查找,+n表示修改時間距現在n天以前,-n表示修改時間距現在n天以內。
        • atime+n-n:按文件的訪問時間找文件(使用方法同上)
        • size n[c]:查找文件長度為n塊的文件,c表示文件大小為n字節的文件
        • User:按文件屬主查找
        • group:按文件的群組查找
        • nouser:查找沒有有效屬主的文件
        • nogroup:查找沒有有效群組的文件
      • 動作參數指定find命令如何查找和處理查找到的文件,常用的動作有如下4種
        • prune:不在指定目錄中查找
        • print:將查找到的文件輸出到標準輸出
        • exec:對查找到的文件執行exec動作後附帶的shell命令
        • ok:對查找到的文件執行ok動作後附帶的shell命令,在每次執行前將提示用戶是否執行。
    • find有許屬參,大多數情況下,使用該命令都至少要包含一個測式和一個動作,才能完成整個查找任務。
    • 範例:
      • 按文件名稱查找
        • find /etc -name "smb.conf" -print
        • find /etc -name "*.conf" -print
        • find -name "message" -print
          • 上行是在當前的目錄中查找
        • 查找前2個字符是小寫字母,第3個字符是數字,最後.d的文件
          • find /etc -name "[a-z][a-z][0-9].d" -print
        • 使用find命令查找文件時,使用操作符&將其放到後台運行
          • find / -name "*.conf" -print & 
      • 按文件權限查找
        • perm參數可以按照文件的權限進行查,使用此參數時,需要使用8進制表示權限。
          • 8進制的基本說明:4讀的權限;2寫的權限;1執行的權限
        • 查找權限為644的文件
          • find / -perm 644 -print
          • 在當前目錄的file子中查找權限中包點其他用戶可讀、寫、執行的文件
            • find ./file -perm -007 -print
      • 按文件類型查找
        • 查找/dev目錄中的字符設備,其中c很示字符設備
          • find /dev -type c -print
        • 查找目錄/dev中的塊設備文件,其中b表示塊設備文件
          • find /dev -type b -print
        • 查找目錄/etc中除了鏈接文件以外的文件
          • find /etc ! -type l -print
        • 其他的type,其實於ls命令的格式中的文件類型標識一致,d-->目錄;l-->鏈接文件
      • 按文件的時間和大小查找
        • 使用+n限定時間在n天以前;使用-n限定時間在n天以內。
        • 使用-7指定修改時間在7天以內的文件
          • find /etc -mtime -7 -print
        • 使用+1指定修改時間在1天以前的文件
          • find /etc -mtime +1 -print
        • 使用atime -10 指定訪問時間在10天以內的文件
          • find /etc -atime -10 -print
      • 按長度查找文件
        • 當前目錄下查找文件長度大於10MB的文件
          • find . -size +10000000c -print
        • 使用-30 表示文件長度小於30塊(512*30=15kb)的文件
          • find . -size -30 -print
      • 按文件屬主或屬組查找
        • 使用user參查找屬主為canred的文件
          • find / -user canred -print
        • 使用nouser的參數查找沒有有效屬主的文件
          • find / -nouser -print
        • 使用group的參數查找屬組為admin的文件
          • find / -group admin -print
        • 使用nogroup的參數查找沒有有效屬組的文件
          • find / -nogroup -print
      • 忽略目錄參數prune
        • 使用path,prune和name參數指定在除了/etc以外的整個目錄中查找以.conf結尾的配置文件
          • find / -path "/etc" -prune -o -name "*.conf" -print
            • -o是說:將2個不同的參數連接起來
      • 忽略遠程文件系統參數mount
        • 如果系統上掛載有遠程文件系統,搜索視程文件系統不僅要花費大量的網絡資源及時間,這時可以使用mount參數忽略掛載的遠程文件系統
          • 使用mount參數忽略遠程文件系統
            • find / -name "file" -mount -print
            • 注意:在使用prune參數查找文件時,如果同恃使用了depth參數,find會將prune參數忽略
      • 使用exec和ok處理查找到的文件
        • exec、ok參數執行shell命令的格式如下:
          • -exec [shell命令] {} \;
          • -ok [Shell] {} \;
        • 在當前目錄的backup_sys子目錄中,查找修改時間在一周以前,以message開頭的文件然後將找到的文件交給ls -l命令
          • find ./backup_sys -name "message*" -mtime +7 -exec ls -l {} \;
        • 查找修改時間在2週以前的文件,並使用exec參數將找到的文件交給rm命令刪除
          • find ./backup_sys -name "message*" -mtime +14 -exec rm {} \;
          • 也可以把上例改成ok如下
          • find ./backup_sys -name "message*" -mtime +14 -ok rm {} \;
    • 使用xargs命令處理查找到的文件
      • 利用exec 、 ok參數處理查找到的文件時,存在了一些缺陷
        • 系統對參數exec、ok傳遞給shell命令的文件列表長度有一定的限制。當find命令查找到的文件數量很多時,會出現參數列表溢出錯誤。
        • 參數對find命令找到的每一個文件發起一個相應的處理進程,當find命令查找到的文件數量很多時,可能會影響整個系統性能
      • xargs命令的作用是構造一個參數列表並交給命令執行。與參數exec、ok相比,xargs不會一次獲取並處理find找到的所有文件,而是每次只獲取並處理其中的一部份。處理完後再獲取下一部分,直至結束。整個過程xargs都只發起一個處理進程,對系統性能的影響很小。
        • 使用管道將找到的文件列表交給xargs命令分割之後使用rm命令刪除
          • find ./backup_sys -name "message*" -mtime +14 -print | xargs rm
    • find工具應用實例
      • 1.使用find查找需要備份的文件
        • 第一次完成備份
          • tar -czf /backup/file_backup_20130309.tgz /file
        • 第二次之後就是差異備份
          • find /file -type f -mtime -1 -print > /backup/file_list
          • 使用tar命令備份/backup/file_list中記錄的文件
            • tar -czT /backup/file_list -f /backup/file_backup_20130310.tgz
          • 刪除使用過的文件列表
            • rm /backup/file_list
      • 2.刪除過期文件
        • find . -mtime +14 -exec rm {} \;

2013年3月6日 星期三

/etc/security/*目錄的介紹


  • /etc/security/*
    • /etc/security/access.conf
      • 登入權限的控制表
        • 當某人登入時(無論是網路、本機登入),這裡頭的內容就會被檢查,權限這個欄位會決定使用者是否可以登入。
          • 格式   (權限:使用者:來源)
            • 權限只有2種:"+"(允許);"-"(拒絕)
            • 使用者的部份可以是單一使用者,或是多個使用者,或是群組名稱,或是ALL(全部)的字段。
            • 來源的部份,可以是tty(本機),IP address, domain name , 或是ALL(全部),如果要表示一個class C 的IP address,可以用10.1.1. 來表10.1.1.1~10.1.1.254,如果使用NIS,可以以@開頭表示。
          • 範例1:除了帳號supermain,shutown以及sync之外,不允許任何人在本機登入。
            • -:ALL EXCEPT superman shutdown sync:LOCAL
          • 範例2:除了本機以及domain name為.test.com結尾的位址外,不允許擁有特殊權限的群組super登入
            • -:super:ALL EXCEPT LOCAL .test.com
          • 範例3:不允許某些使用者登入
            • -:guest1 guest2 guest3:ALL
    • /etc/security/limits.conf
      • 格式 ( domain type item value )
        • domain:可以是帳號、群組名稱(@群組名稱)、*表示預設值
        • type:有2種可能
          • soft:達到此設定值時,降低優先使用壦
          • hard:達到此設定值時,強制停止
        • item:可以是以下選項
          • core:可使用最大的核心檔案
          • data:可使用最大的資料區段
          • fsize:可建立最大的檔案大小
          • memlock:可鎖定的最大記記憶體
          • nofile:最多可同時開啟的檔案
          • rss:最大的常駐程式
          • stack:最多可做stack的大小
          • cpu:最大可以使用的CPU時間
          • nproc:最多可執行的process
          • as:同時間可開啟的file descriptors
          • maxlogins:同時登入的最多數目
          • priority:執行程序的優先權
          • locks:可鎖定的檔案數目
      • 範例:
        • 受限制的使用者,建立一個limited群組
          • @limited hard core 10240
          • ....
        • 一般使用者
          • * hard cord 10240

2013年3月2日 星期六

顯示並保存文本命令tee


  • tee是一個比較常用的指令,它的作用是將獲取到的數據(tee指令通常是自管道而來的)分為兩個copy,1個copy輸出到標准輸出,另一個copy寫入到指定的文件中。
    • 常用的選項
      • a:以追加的形式將數據寫入文件的結尾
      • i:寫入數據時,不寫入標凖錯誤。
    • 範例
      • ifconfig eth2 | tee eth2_info
      • date + '%Y%m%d %T' | tee -a date_log
      • ls -l ab | tee -ia a.txt


接收用戶輸入指令read

read指令
  • read [[option]parameter] name
    • 常用選項
      • a:將輸入的文本按字段放入數組中(default的分隔符為空格或制表符tab)
      • d:指定結束符,當輸入中出現指定的結束符時,read命令將認為專入已經結束(default的結束符以enter)
      • e:從標凖輸入取時,使用Readline庫獲取輸入(此時用戶可以使退格鍵、方向箭簡單的行編輯操作)
      • n:指定讀取的字符數n,也就是輸入與輸出之間不斷行。
      • p:字符串輸出到標准錯誤,並讀取輸入
      • r:將讀取到的字符串按字段放到不同的變量中
      • s:先鎖住屏幕,然后再從標准輸入中讀取字符;就像是輸入 password的模式。
      • t:指定時間內要輸入完成,不然就結束讀取狀態
      • u:從指定的文件描述符中讀取。
    • 範例
      • echo -n "Please enter your name:";read NAME;echo "Hello $NAME";
      • echo -n "Please enter your friend's name:";read -a NAME;echo "Your friends:${NAME[*]}"
        • Please enter your friend's name: GM Eva Edmund
        • Your friends: GM Eva Edmund
      • echo -n "Please enter your name:";read -d "$" NAME; echo "Hello $NAME"!
      • echo -n "Please enter your message:"; read -e MESS;echo "your message is : $MESS";
      • echo -n "Please enter the four string:";read -r V1 V2 V3 V4;echo -e "first:$V1\nsecond:$V2\nthird:$V3\nfourth:$V4"
      • 如果字段分隔符不是空格,可以通過修改變量IFS的方法重新設置分隔符。下例設定新的分隔符為#,並接收用戶的輸入
        • IFS="#";echo -n "Please enter the four variables:" ;read -r V1 V2 V3 V4;echo -e "first:$V1\nsecond:$V2\nthird:$V3\nfourth:$V4";
          • 注意在修改分隔符時要注意把原的的分隔符保留下來,然後在你的程式執行完後,要把分隔符修改回去。



定位和查找


  • 有時需要快速搜索文件、文檔、命令等,linux為不同的內容提供了不同的快速搜索命令,使用這些快速搜索命令可以幫助使用者在最短時間內找到需要的內容。
    • 搜索指令 which
      • 查找一個命令文件的位置(如需要知道一個軟件啟動命令的具體位置,以便于確定軟件安裝位置),which指令的功能是在當前的環境變量path保存的目錄中,查找參數指定的命令位置并以絕對路徑的方式輸出
        • 查找指令文件ifconfig的位置
          • which ifconfig
        • 查看環境變量path的包含的目錄
          • echo $PATH
    • 文件搜索命令locate
      • locate命令用於快速搜索文件和檔案,其搜尋工作依賴于一個事先建立的索引資料庫,這個索引資料庫每天會自動更新一次,以便于搜集新的文檔。
      • locate指令原自於軟體slocate,不能正常使用此命令的系統可能需要手動安裝此軟件。
      • 由于locate命令並非使用遍歷所有目錄的方法查找文檔,因此可能查找到的結果並不是非常准確。如果要使搜索到的結果更加准確,可以先手動更新索引資料庫,然后再查找文件。
        • 手動更新索引資料庫
          • updatedb
      • 範例
        • 查找一個名為iptables的文件
          • locate iptables
          • locate canre*
    • 特殊文件搜索命令whereis
      • 與前面幾個查找命令相比,whereis更加擅長于查找一些特殊的文件,這些特殊的文件包括2進制文件,這明文件和源代碼等。同locate命令一樣,whereis指令也是通過查詢索引資料庫的方法來搜索文件。
        • whereis iptables
    • 關鍵字搜索命令apropos
      • 在使用linux系統的過程中,許多時侯可能想要完成某個特定的任務,而又不知道應該如何才能完成。這是許多初學者經常遇到的問題。他的功能與man指令的k選項類似,者是從man手冊中查找關鍵字,並將找到的結果顯示出來。
        • 例如要查找與進程相關的內容
          • apropos process

2013年3月1日 星期五

su,sudo 指令,用來切換身份


  • 臨時切換用戶命令 su
    • 指令 : su canred
    • 注意:
      • 在使用su切換身份時,你的環境path是不會自動切換的哦。
      • 在RHEL5.3中,使用su指令雖然可以切換到root的用戶身份,但切換之后使用的環境變量仍然沒有改變(有些系統也可以獲得root用戶的環境變量,但如fedora),因此執行一些管命令時,可能會提示沒有找到指令,此時可以使用輸入指令的全路徑的方式來執行相關命令(例如使用/sbin/ifconfg 替代 ifconfig)

  • whoami指令:用於查看當前的帳號

  • 以root用戶身份運行命令sudo
    • sudo命令工作時,先切換到root用戶,並以root用戶身份執行命令,然后返回當前戶。當前戶使用sudo命令執行的操作取決于root用戶在/etc/sudoers文件中的授權,任何管理命令都需要root授權,否則不能使用sudo執行。
    • sudo命令不提供root用戶的登錄環境,因此上面的命令仍然使用全路徑的方法運行ifconfig命令。