linux學習

魯鵬發表於2015-06-06

主要就是對前一段時間學習Linux的筆記的一個整理,不過也會陸續分享今後學習Linux的一些感想和技巧,當然也歡迎其他關於Linux的好文章的加入。

Linux命令列學習筆記

摘要

前段時間看了幾章《Linux命令列與Shell指令碼程式設計大全》一書,針對自己不太瞭解的地方記錄筆記如下,方便以後自己查閱。

1、兩個環境變數

  • PS1:控制預設命令列提示符格式
  • PS2:控制後續命令列提示符格式
  • 就是這個:PS

2、檢視bash shell相關資訊

  • 通過man bash命令可以檢視

3、cp命令

  • -p 保留原始檔的訪問時間和修改時間
  • -R 遞迴複製

4、連結檔案

  • 軟連線
  • 硬連線

軟連結可以通過cp -s來建立,也可以使用ln -s來建立;而硬連線就是建立一個獨立的檔案,通過cp -l或是預設的ln命令來建立。

5、stat,file命令

  • stat 檢視檔案的統計資訊
  • file 檢視檔案的型別

6、tail,head命令

  • 兩者均是無需載入全部檔案,適合檢視大檔案的首尾部分
  • tail -f 保持活動狀態檢視,通常應用於檢視log資訊

7、PS命令的三種風格

  1. Unix風格引數,常用:ps -ef
  2. BSD風格引數,常用:ps l
  3. GNU全字引數,最好用的功能是--forest(層級)

8、kill命令

  • kill PID,例如,kill 3940
  • killall http*,殺掉所有http程式

9、mount命令

  • mount -t type(型別) device(裝置名) directory(目錄)

例如:mount -t vfat /dev/sdb1 /media/a,其中vfat(windows的檔案格式),也可以替換成ntfs(windows的檔案格式)、iso9660(CD-ROM)

  • -o引數

ro:read-only rw:read-write user:允許普通使用者掛載檔案系統 cheak=name:掛載檔案系統時不進行完整性檢驗 loop:掛載一個檔案

例如:mount -t iso9660 -o loop KDE4-LIVE-DVD_32.iso mnt,把檔案掛載到mnt目錄下。

10、du 命令

  • -c:顯示所有已列出的檔案總大小
  • -h:按人類可讀格式
  • -s:顯示每個輸出引數的總計

11、sort排序命令

  • -n:將數字識別成數字而不是字元
  • -M:按月排序
  • -k:排序從pos1位置開始,如果指定了pos2的話,到pos2位置結束。(--key=pos1[,pos2])
  • -t:指定一個用來區分鍵位置的字元

eg1. 對/etc/passwd檔案根據使用者ID進行數值排序 sort -t ':' -k 3 -n /etc/passwd eg2.檢視目錄下哪些檔案佔用空間最多 du -sh * | sort -nr

12、bzip2工具

  • bzip2:用來壓縮檔案
  • bzcat:用來顯示壓縮的文字檔案內容
  • bunzip2:用來解壓
  • bzip2recover:用來嘗試恢復損毀檔案

13、tar命令

列舉幾個例子:

  1. 建立一個歸檔檔案
    tar -cvf test.tar test1/ test2/
  2. 列出歸檔檔案中的內容
    tar -tf test.tar
  3. 解開歸檔檔案
    tar -xvf test.tar
  4. 解壓gz檔案(非常常用)
    tar -zxvf test.tar.gz

14、printenv命令

檢視全域性變數,系統環境變數一律使用大寫字母。

15、bash命令

  • 啟動一個新的shell。

16、set命令

  • set 顯示某個特定程式設定的所有環境變數
  • printenv 顯示的環境變數均包含在了set顯示中

17、建立全域性變數方法

  1. 首先建立一個區域性環境變數
  2. 用export命令申明變數

18、刪除環境變數

  • 刪除區域性環境變數 unset
  • 刪除全域性環境變數
    • 如果在子程式中刪除了一個全域性環境變數,只對子程式有效。

19、啟動bash shell有3種方式

  1. 登陸是當作預設的登陸shell
    • 依次會處理以下檔案
      • /etc/profile
      • $HOME/.bash_profile
      • $HOME/.bash_login
      • $HOME/.profile
    • 作為非登入shell的互動式shell
    • 不是登陸時啟動的,而是手動啟動的shell稱作互動式shell
    • 作為執行指令碼的非互動shell

20、useradd命令

useradd命令用於新增新使用者,當然不是講這個功能。
useradd -D 檢視你的Linux系統中系統預設值。

資訊中有一項內容為:SKEL=/etc/skel
允許管理員建立一份預設的HOME目錄配置,然後把它作為建立新使用者HOME目錄的模版。
預設情況下,useradd不會建立HOME目錄,useradd -m建立HOME目錄,並將/etc/skel複製過來。

21、userdel命令

  • userdel -r test 同時刪除test使用者的HOME目錄

22、修改使用者賬戶資訊

  • passwd 修改密碼
  • chpasswd 從檔案中讀取登陸名密碼
  • chage 修改密碼的過期日期
  • chfn 修改使用者賬戶的備註資訊
  • chsh 修改使用者賬戶的預設登陸shell
  • usermod -l 用來修改使用者賬戶的登陸名
  • usermod -L 鎖定使用者名稱
  • usermod -p 修改賬戶密碼
  • usermod -U 解除鎖定
  • “注意大小寫哦”

23、umask命令

用於設定預設檔案許可權,設定使用者建立檔案和目錄的預設許可權。
umask 022表示從物件的全許可權值中減去022許可權,則表示新建立的檔案的預設許可權為666-022=644(-rw-r-r),新建立的目錄許可權為777-022=755(drwx-rx-rx)。

24、設定組ID

  • 設定組ID(SGID)實現檔案共享,將共享目錄設定SGID位,這樣目錄中的檔案將均用目錄的所屬組。

25、減少grub預設的引導時間

  • sudo vim /etc/default/grub修改TIMEOUT值,然後sudo update-grub生效

26、加速應用程式載入時間

  • sudo apt-get install preload裝完重啟電腦,完成。

27、加速更新

#用官方apt-fast代替apt-get加速更新
sudo add-apt-repository ppa:apt-fast/stable
sudo apt-get update
sudo apt-get install apt-fast

28、網路相關

  • hostname
    • hostname -d顯示所屬域名;
    • hostname -f顯示完整的主機名和域名;
    • hostname -i顯示IP地址
  • ping命令不作介紹了
  • iwconfig 一般用於無線網路卡
  • nslookup 在有IP地址時,可以用這個命令來顯示主機名,可以找到給定域內所有的IP地址。
  • traceroute 檢視資料包在提交到遠端系統或是網站的時候所經過的路由器IP地址、跳數和響應時間。
  • finger 檢視使用者資訊
  • telnet 連線目標主機
  • ethtool 顯示網路卡資訊
    • ethtool -i 顯示一個特定網路卡的驅動資訊(在檢查軟體相容性時尤其有用)
    • ethtool -p 啟動一個介面卡指定行為
    • ethtool -s 顯示網路統計資訊
  • netstat 發現主機連線
    • netstat -g 查詢該主機訂閱的所有多播組(網路)
    • netstat -nap | grep port 顯示使用該埠的應用程式id
    • netstat -tcp 顯示所有的TCP連線
    • netstat -udp 顯示所有的UDP連線
    • netstat -a 顯示所有的連線

Linux學習筆記-Shell指令碼程式設計

Shell程式設計

基礎

  • #!指定執行指令碼的shell
  • # 註釋行
  • 使用變數時,要在前面加上$,如echo $PATH,列印PATH變數的值
  • 將命令執行結果的值賦給變數

    TIME=`date`
    
  • unset 刪除變數
  • 位置變數,ls -l file1 file2 file3

    • $0 表示程式的檔名ls -l
    • $1 表示第1個引數值,也就是file1
    • $2 表示第2個引數值,也就是file2
    • $3 表示第3個引數值,也就是file3
    • ...
    • $9 表示第9個引數值
  • 特殊變數

    • $* 表示這個程式的所有引數
    • $# 表示這個程式引數的個數
    • $? 執行上一個命令的返回值(0為執行正常,非0為執行錯誤)
    • $$ 這個程式的PID
    • $! 執行上一個後臺命令的PID
  • 執行指令碼

    • sh filename.sh 執行指令碼
    • sh -x filename.sh 可以顯示指令碼執行過程
    • sh -n filename.sh 不執行,只檢查語法錯誤

Shell命令

  • read 從鍵盤讀入資料後,賦給變數
  • expr 對整數型變數進行算術運算
    • expr 3 + 5 注:加號前後有空格
    • expr $var1 - 5
    • expr $var1 / $var2
    • expr $var3 \* 10
  • test 變數測試語句

    • test str1=str2 測試是否相等
    • test str1 測試是否非空
    • test -n str1 測試是否非空
    • test -z str1 測試是否為空
  • test 檔案測試語句

    • test -d file 指定檔案是否為目錄
    • test -f file 指定檔案是否為常規檔案
    • test -x file 指定檔案是否可執行
    • test -r file 指定檔案是否可讀
    • test -w file 指定檔案是否可寫
    • test -a file 指定檔案是否存在
    • test -s file 指定檔案大小是否為0
  • test 變數對比語句

    • test int1 -eq int2 判斷int1 == int2
    • test int1 -ge int2 判斷int1 >= int2
    • test int1 -gt int2 判斷int1 > int2
    • test int1 -lt int2 判斷int1 < int2
    • test int1 -le int2 判斷int1 <= int2
    • test int1 -ne int2 判斷int1 != int2
  • exit 退出語句

    • 0 為正常退出
    • 非0 為不正常退出
  • awk 命令

    • 這個命令非常強大,這裡只介紹一個用法。
    • 格式:awk -F 分隔符 '命令'
    • 例項:
      1. awk -F : '$3==0 {print $1}' /etc/passwd 檢測系統中UID為0的使用者
      2. awk -F : 'length($2)==0 {print $1}' /etc/shadow 檢測系統中密碼為空的使用者
  • if ... then 語句

    if test 1 -lt 2
    then
        echo "YES"
    else
        echo "NO Possible"
    fi
    
  • For ... done語句

    格式:

    for 變數 in 名字表
    do
        命令列表
    done
    
  • select 迴圈語句

    格式:

    select 變數 in 關鍵詞
    do
        command1
        ...
        commandn
    done
    
  • case ... esac

格式:

    case $var in
    c)
        echo "your selection is C"
        ;;
    d)
        echo "your selection is d"
        ;;
    e)
        echo "your selection is e"
        ;;
    *)
        echo
    esac
  • While 迴圈

格式:

    while 條件
    do
        command
    done
  • shift命令,引數向左移一位,$#值減一

示例練習

  1. 測試Apache服務是否啟動,若沒有啟動,則啟動Apache服務
  2. 判斷某個檔案屬於什麼型別的檔案
  3. 踢出使用者的指令碼
  4. 顯示使用者的資訊
  5. 加減乘除的指令碼
  6. 列印出1到10之間的平方數
  7. 批量增加使用者,同時設定密碼
  8. 批量刪除使用者
  9. 累加求和(使用shift命令)

後續再貼上shell指令碼...

Linux學習筆記-使用者賬戶

前提

對前一段時間學習Linux做一個總結,主要是整理筆記,寫的可能比較亂,但是內容比較豐富,還是值得一看的。內容總共分為:使用者賬戶、程式管理、計劃任務、檔案系統構成、磁碟管理、備份、Shell程式設計。內容都是比較基礎,比較常用的,過一遍會加深你的印象。

本想是總結在一篇文章上的, 可是感覺內容太長了,不方便瀏覽和複習,故改為一個合集,拆成6部分

使用者賬戶

Linux使用者基本上分為下面三類:

  • 超級使用者(root , UID=0)
  • 普通使用者(UID=[500,60000])
  • 偽使用者(UID=[1,499])

/etc/passwd & /etc/shadow

使用者配置檔案儲存在/etc/passwd檔案下,檔案中每一行代表一個使用者,每一列代表使用者的基本資訊,第一列代表使用者的使用者名稱,第二列代表使用者的密碼,密碼使用*代替。

因為密碼是通過加密後儲存在/etc/shadow檔案下了,這個檔案的許可權只有root使用者才能訪問。

pwunconv命令可以將密碼回寫到/etc/passwd檔案中,執行了這個密碼後,再次進入/etc/passwd檔案中,就會發現第二列的*被一串字串所替代,這就是加密後的密碼。

pwconv命令正好與上面的命令意思相反,它將密碼從passwd中寫入到shadow中,這個命令一般是在我們建立使用者後就會自動執行。

同樣的道理,使用者組檔案、使用者組密碼檔案分別是/etc/group/etc/gshadow

預設使用者配置

使用者配置檔案:/etc/login.defs/etc/default/useradd

新使用者資訊檔案:/etc/skel,在建立新使用者後,會自動將此資料夾中的內容拷貝到新使用者的HOME目錄下,作為新使用者的配置檔案。

登入顯示資訊:/etc/motd成功後、/etc/issue登入時。

普通使用者為什麼可以改密碼?

上面說過密碼存放在/etc/passwd以及/etc/shadow中,而這兩個檔案對其他使用者均沒有寫許可權。

普通使用者用passwd命令改密碼,該命令的全路徑是/usr/bin/passwd,你可以通過ls -l /usr/bin/passwd檢視到該命令的許可權,為-rwsr-xr-x,可以看到有個s許可權位。
這個s許可權位的意思就是當其他使用者在使用這個命令的時候,將暫時獲得這個命令的所屬使用者的許可權。換句話就是說當普通使用者在使用passwd命令的時候,會暫時獲取root許可權,從而可以改變/etc/passwd裡的密碼值,達到改密碼的效果。

特殊許可權位

那麼,像上面那樣的特殊許可權位有哪些呢?又如何設定呢?

  • setUID:就是上面的s許可權位,可以通過以下命令進行設定
    • chmod u+s filename
    • chmod 4755 filename
  • setGID: 大概意思同setUID,就是執行行預設獲取命令所屬組的許可權,同樣,可以通過下面命令進行設定
    • chmod g+s filename
    • chmod 2755 filename
  • 粘著位:用t表示,你可以通過檢視/tmp目錄的許可權就知道了,那麼,它的作用是什麼呢?

/tmp目錄的許可權代表什麼意思? 粘著位只是針對目錄進行設定,大家知道/tmp目錄的許可權為drwxrwxrwt,意思就是什麼人都具有讀、寫、執行的許可權,那麼,如果我建的檔案或者目錄被別人刪了怎麼辦?所以,粘著位的作用就是:每個人在目錄裡都有讀、寫、執行的許可權,但是隻有自己可以刪除自己建立的檔案。

很神奇是不是?來看看怎麼設定? 同樣兩種方式,chmod o+t dir&chmod 1777 dir,dir代表目錄。

新增使用者

useradd -D 其實就是根據/etc/default/useradd預設配置來建立的
default

使用者組管理命令

  • usermod -G 組名 使用者名稱 將使用者加入使用者組
  • gpasswd -a 使用者名稱 組名 將使用者加入使用者組
  • groups檢視使用者隸屬那些使用者組
  • newgrp 切換使用者組
  • grpck 使用者組配置檔案檢查
  • chgrp修改檔案所屬使用者組
  • vigr 編輯/etc/group檔案

使用者管理命令

  • pwck 檢測/etc/passwd檔案
  • vipw 編輯/etc/passwd檔案
  • id 檢視使用者詳細資訊
  • finger 檢視使用者詳細資訊,有些Linux發行版預設不帶此命令
  • passwd -S 檢視使用者密碼狀態
  • who or w檢視當前登入使用者資訊

例項

  • 新增使用者組:groupadd -g 888 webadmin
  • 刪除使用者組:groupdel webadmin
  • 修改使用者資訊:groupmod -n apache webadmin(將webadmin組名修改為apache)
  • 檢測使用者:passwd -S username
  • 鎖定使用者:passwd -l username

sudo

使普通使用者以root的方式執行命令。
配置檔案/etc/sudoers
格式:使用者名稱(組名) 主體地址=命令(絕對路徑);
例項:sudoer檔案中有編寫規則說明,具體參照下圖。
sudoer

Linux學習筆記-程式管理

程式管理

程式管理不得不介紹的四個命令,pskillnice/renicetop.

PS

檢視程式的命令,非常強大哦。它有三種表達方式,具體可以參照man文件的description部分。
ps_des

  • a 顯示所有的使用者
  • u 顯示使用者名稱和啟動時間
  • x 顯示沒有控制終端程式
  • -e 顯示所有程式
  • -f 顯示完整格式

常用命令

  • ps aux or ps -ef都是顯示所有使用者程式,只是不一樣的表達方式
  • ps -uU username檢視系統中指定使用者執行的程式

很有必要看一下ps命令的man說明文件,下面圖片貼出文件中example部分內容。
ps_example

Kill

這個命令也很常用的,殺死程式.

  • kill PID根據程式號,直接終止程式
  • kill -9 PID強行關閉
  • kill -1 PID重啟程式
  • xkill關閉圖形程式
  • killall 程式名結束該程式

nice/renice

改變程式的優先順序,每一個程式都有一個優先順序(也稱nice值),其範圍為[-20,19],最高到最低,注意-20是最高的哦,預設情況下,程式的優先順序都是0,優先順序高的程式會比較頻繁的被呼叫執行。

  1. nice設定程式的優先順序。格式:nice -n command,eg. nice -n 19 dd if=/dev/cdrom of=~/mdk.iso利用最低優先順序建立一張cd的映象,防止複製操作阻礙其他程式。

  2. renice更改使用者的優先順序。格式:renice -n pid , eg. renice -5 777提高777程式的優先順序。

top

知道Windows下的工作管理員吧,這個命令就是命令列下的工作管理員。
top

很強大的命令,介紹下簡要用法。

  • d:指定重新整理間隔
  • c:顯示整個命令列
  • u:檢視指定使用者程式
  • k:終止執行程式
  • h:幫助

Linux學習筆記-計劃任務&檔案系統構成

計劃任務

計劃任務最常用的兩個命令就是atcrontabat命令是一次性執行任務;crontab是週期性執行作業。

at

格式:at [-f filename] time。這裡的time也就是時間分為兩類:

  • 絕對計時
    • hh:mm MM/DD/YY
  • 相對計時
    • now + n minutes
    • now + n hours
    • now + n days

例項

  • at 5:30pm
  • at now + 18minutes
  • at 17:30 1/11/11

    接下來輸入命令,輸入完後Ctrl+D儲存任務。注意:命令一定要是絕對路徑。

  • at -l列舉任務

  • at -d刪除任務

配置檔案

  • /etc/at.allow允許使用者列表
  • /etc/at.deny不允許使用者列表

crontab

作用:用於生成cron程式所需要的crontab檔案。
格式:crontab {-l|-r|-e}

  • -l顯示當前的crontab
  • -r刪除
  • -e編輯

編輯規則,將知道的具體時間填上,不知道的填*。

分鐘 小時 星期 命令/指令碼
30 17 * * 1-5 /usr/bin/wall
45 17 * * 1-5 /sbin/shutdown -r now
*/2 12-14 * 3-6, 9-12 1-5 檢測指令碼

上面第一例,每個週一到週五的17:30進行廣播操作;第二例,每週一到週五17:45進行重啟操作;第三例,3-6月和9-12月,每週一到週五,每隔2分鐘進行指令碼檢測。

檔案系統構成

  • /usr/bin & /bin 可執行的命令
  • /usr/sbin & /sbin root可執行的的命令
  • /proc 虛擬檔案系統,存放當前內容映象
  • /dev 存放裝置檔案
  • /lib 存放系統程式執行所需的共享庫
  • /lost+found 存放一些系統出錯的檢查結果
  • /tmp 臨時檔案
  • /etc 系統配置檔案
  • /var 存放經常發生變動的檔案,比如郵件、日誌等
  • /usr 存放所有的命令、庫、手冊頁等
  • /mnt 臨時檔案系統的安裝點
  • /boot 核心檔案及自帶程式檔案儲存位置
  • /usr/local 安裝第三方軟體預設路徑

    Linux學習筆記-磁碟管理&備份

磁碟管理

關於dudf之類的命令這裡就不介紹了,這裡主要介紹的是如何新增磁碟和分割槽、如何新增swap分割槽以及磁碟配額的內容。

新增磁碟或分割槽

總共分為4大步。

  1. fdisk,劃分分割槽。

    • fdisk -l /dev/sdb,檢視磁碟分割槽情況
    • fdisk /dev/sdb,對磁碟進行操作,見下面基本操作
      • m 幫助
      • p 列印分割槽表
      • n 增加新的分割槽
      • t 改變分割槽檔案系統ID
      • L 檢視檔案系統ID
      • d 刪除分割槽
      • w 儲存分割槽表
      • q 退出(不儲存)
  2. mkfs,建立檔案系統。

    • mkfs.ext3 /dev/sdb 將分割槽格式化為ext3檔案系統型別
  3. mount,掛載分割槽。

    • mount /dev/sdb /mnt 將sdb分割槽掛載到mnt目錄下
  4. df -h 檢視系統磁碟,可以看到mnt分割槽
    fdisk_sdb
    注意:我這是在虛擬機器中測試的

  5. 寫入配置檔案,編輯/etc/fstab。檔案的內容資訊格式如下;

    物理分割槽名 掛載點 檔案系統 預設設定 是否檢測(1:檢測;2:檢測) 檢測順序(0:是否檢測;1:優先檢測;2:期後檢測)
    LABEL=1 / ext3 default 1 2
    /dev/sda1 / ext3 default 0 0
    /dev/sdb1 /web ext3 default 1 1
    • e2label /dev/sdb1 檢測是否有卷標
    • e2label /dev/sdb1 name新增捲標

新增Swap分割槽

兩種方法擴大swap分割槽

  • 新建磁碟,分swap分割槽
  • 在已有磁碟上使用swapfile檔案增大swap分割槽

第一種方法可以根據上面增加分割槽的步驟一樣進行操作,這裡主要記錄一下使用swapfile檔案增大swap分割槽的步驟。

  1. mkdir /var/swap 新建swap目錄
  2. chmod 700 /var/swap 設定目錄許可權
  3. dd if=/dev/zero of=/var/swap/file.swp bs=1024 count=3000 建立swp檔案
  4. mkswap /var/swap/file.swp 使檔案可用
  5. vim /etc/fstab 寫入配置檔案
  6. free 檢視分割槽
  7. swapon /var/swap/file.swp 啟用swap分割槽
  8. free 再次檢視分割槽
    swap
    之前和之後的swap分割槽大小

磁碟配額(針對分割槽)

磁碟配額就是管理員可以為使用者所能使用的磁碟空間進行配額限制,每一使用者只能使用最大配額範圍內的磁碟空間。

可分為三類限制:

  • 軟限制(Soft limit):定義使用者可以佔用的磁碟空間數。當使用者超過該限制後會收到已超過配額的警告。
  • 硬限制(Hard limit):當使用者試圖將檔案存放在其已經超過該限制目錄時,報告檔案系統錯誤。
  • 寬限制(Grace period):定義使用者在軟限制下可以使用其檔案系統的期限。

操作步驟

  1. 開啟分割槽配額功能,vim /etc/fstab,編輯配置檔案,在掛載屬性上加上標誌userquota或grpquota,然後重新掛載mount -o remount /home,或重新啟動系統sudo init 6
  2. 建立配額資料庫,quotacheck -Cvuga,會生成aquota.user、aquota.group兩檔案。
  3. 啟動配額功能,quotaon 分割槽名稱;關閉配額功能,quotaoff 分割槽名稱
  4. 編輯配額
    • edquota username 編輯使用者配額
    • edquota -g groupname 編輯使用者組配額
    • edquota -t 設定寬期限 設定寬期限
    • edquota -p 模版使用者 複製使用者1 複製使用者2
    • quota username 檢視使用者的配額使用情況
    • repquota -a 管理員檢視配額資訊

備份

備份幾乎是Linux系統運維最頻繁的工作了,不過大部分情況下,都是通過自動化指令碼進行自動備份。

備份策略

  • 完全備份
  • 增量備份:通常是這種情況

備份分類

  • 系統備份:/etc , /boot , /usr/local , /var , /log...
  • 使用者備份:/home

備份相關命令

其實主要就是通過cptar命令

  • cp -Rpu 複製檔案
    • -p 保持檔案原本屬性
    • -u 增量備份
    • -R 迴圈複製
  • scp 遠端備份,類似cp命令
  • tar -zcf /backup/sys.tar.gz /etc /boot 備份/etc , /boot
  • tar -ztf /backup/sys.tar.gz 檢視備份包中的檔案(不解包)
  • tar -zxf /backup/sys.tar.gz 還原備份目錄,其實就是解包
  • tar -zxf /backup/sys.tar.gz -C ./backup 解壓到指定目錄backup
  • tar -zxf /backup/sys.tar.gz etc/group 恢復指定檔案
  • tar -rf /backup/sys.tar /etc/file1 /etc/file2 追加檔案到備份包中
  • tar -uf /backup/sys.tar /etc/file 將修改過的檔案做備份

Linux學習筆記-Shell指令碼程式設計例項

下面的例子基本上都是上面的知識點,比較擴充套件一點的就是awk命令的用法,下面程式碼僅作參考,寫的不好,請見諒;錯誤的地方煩請指出,不勝感激!

1、測試Apache服務是否啟動,若沒有啟動,則啟動Apache服務

#! /bin/sh
# 測試Apache服務是否啟動,若沒有啟動,則啟動Apache服務

web=`/usr/bin/pgrep httpd`
if [ "ABC$web" = "ABC" ] 
then
    /etc/init.d/httpd start
fi

2、判斷某個檔案屬於什麼型別的檔案

#! /bin/sh
# 判斷一個檔案屬於什麼型別

if [ -d $1 ]
then
    echo "這是一個目錄";
elif [ -f $1 ]
then
    echo "這是個普通檔案"
elif [ -c $1 ]
then
    echo "這是字元特殊檔案"
elif [ -b $1 ]
then
    echo "這是塊特殊檔案"
else
    echo "我也不知道這是啥玩意"
fi

3、踢出使用者的指令碼

#! /bin/sh
# 判斷使用者是否線上,存在的話踢出使用者

username=$1
/usr/bin/w > whoIsOnline

userString=`/usr/bin/awk -v user=$username '{if($1 == user) print $1}' ./whoIsOnline`
if [ "ABC$userString" = "ABC" ]
then
    echo "$1 is not online"
else
    killId=`/usr/bin/ps aux | /usr/bin/grep $username | /usr/bin/eprep -v grep | /usr/bin/awk {print $2}`
    kill $killId
fi

4、顯示使用者的資訊

#! /bin/sh
# 顯示使用者的相關資訊

user=$1
if [ "ABC$user" = "ABC" ]
then
    echo "請在命令列後面輸入要查詢的使用者名稱!"
else
    /usr/bin/grep ^$1: /etc/passwd | /usr/bin/awk -F ":" '{print "使用者ID為"$3 ; print "使用者組ID為"$4 ; print "你其實是"$5 ; print "你的主目錄為"$6 ; print "你的預設Shell為"$7}'
fi

5、加減乘除的指令碼

#! /bin/sh
# 加減乘除的小指令碼,主要練習case語句

case $2 in
+)
    echo "$1 + $3 = `expr $1 + $3` " 
    ;;
-)
    echo "$1 - $3 = `expr $1 - $3`"
    ;;
\*)
    echo "$1 * $3 = `expr $1 \* $3`"
    ;;
/)
    if [ $3 = 0 ]
    then
        echo "除數不能為0"
        exit
    else
        echo "$1 / $3 = `expr $1 / $3`"   
    fi
    ;;
*)
    echo "您的輸入不符合規範,請重新輸入"
esac

示例:sh calc.sh 9 + 10執行。

6、列印出1到10之間的平方數

#! /bin/sh
# 列印1-10之間的平方數,主要練習while語句

#賦值的時候注意不要加空格
i=1
while [ $i -le 10 ]
do
    echo "$i 的平方為:`expr $i \* $i`"
    i=`expr $i + 1`
done

#! /bin/sh
# 列印1-10之間的平方數,主要練習for語句

for i in {1..10}
do
    echo "$i 的平方為:`expr $i \* $i`"
done

7、累加求和(使用shift命令)

#! /bin/sh
# 使用shift命令累加求和

sum=0
while [ $# -gt 0 ]
do
    sum=`expr $sum + $1`
    shift
done
echo "總和為:$sum"

示例:sh shift.sh 8 9 10 11 12執行。

Linux-RPM&YUM軟體管理器

RPM

  • rmp -vih packageName.rpm 安裝rpm軟體包
  • rmp -e ftp 解除安裝ftp軟體(具體版本號可以不用寫)
  • rpm -U packageName 升級功能(刪除舊版本,安裝新版本)
  • rpm -q 查詢已安裝軟體功能
    • rpm -qa 查詢系統中已經安裝的所有軟體
    • rpm -qi 查詢指定安裝軟體包詳細資訊,eg.rpm -qi bash
    • rpm -ql 查詢指定軟體安裝路勁與檔案列表,eg.rpm -ql bash
    • rpm -qc 查詢指定軟體的配置檔案,eg.rpm -qc bash
    • rpm -qf 查詢指定檔案為哪個軟體所安裝,eg.rpm -qf /etc/inittab
  • rpm -qpi 查詢尚未安裝軟體資訊,eg. rpm -qpi packageName
  • rpm -V packageName 檢視軟體哪些狀態被修改,未被修改的軟體將沒有任何提示。出現的字元及其意義如下:
    • 5 MD5值被改變
    • S 檔案大小改變
    • L 連結檔案的源已經被改變
    • T 檔案最後修改時間已經改變
    • D 裝置改變
    • U 使用者發生改變
    • G 組發生改變
    • M 包括許可權與型別在內的模式已經被改變
    • ? 不可讀檔案

YUM

YUM-Yellow dog Update Modified,YUM是RPM軟體管理器的改進版,可以很好的解決RPM所面領的軟體包依賴問題。

YUM源

CentOS6 yum的源定義檔案存放在/etc/yum.repos.d,檢視repo檔案的格式如下圖。

name為yum源名稱;mirrorlist為映象站點目錄;bashurl為yum源指定的URL地址;enable是否啟用該yum源(0:禁用;1:啟用;預設為啟用);gpgcheck安裝軟體是否檢查簽名(0:禁用;1:啟用);gpgkey檢查簽名的金鑰檔案。

從上圖中,看到$releaserver的變數,它指的是系統髮型版本號。還有其他的如arch代表CPU架構;如basearch代表系統架構;YUM0-9使用Shell對應的0-9個同名變數替換

YUM命令

  • yum check-update 列出可更新的軟體清單
  • yum update 安裝所有更新軟體
  • yum install PackageName 安裝指定軟體
  • yum remove PackageName 解除安裝指定軟體
  • yum update PackageName 更新指定軟體
  • yum search PackageName 查詢某個軟體

  • yum list

    • yum list updates 列出可更新的軟體
    • yum list installed 列出已安裝的軟體包
    • yum list extras 列出已安裝但是不在Repository內的軟體包
  • yum info

    • yum info PackageName 獲取軟體包資訊
    • yum info updates 列出可更新的軟體包資訊
    • yum info installed列出已安裝的軟體包資訊
    • yum info extras 列出已安裝但不在Repository內的軟體包的資訊
  • yum provides列出軟體包提供了哪些文件

  • yum clean
    • yum clean packages 清除快取目錄(/var/cache/yum)下的軟體包
    • yum clean headers 清除快取目錄(/var/cache/yum)下的Headers
    • yum clean oldheaders 清除快取目錄(/var/cache/yum)下舊的Headers
    • yum clean , yum clean all 清除所有快取

建立YUM源

當我們收集軟體包越來越多的時候,有必要建立自己的YUM源,實現軟體集中管理,下面三步幫你實現。

  1. 安裝createrepo軟體
  2. 將所有的軟體包儲存在某個目錄下,如/softkit
  3. 執行createrepo /softkit即可

《Linux運維之道》筆記一

  • 忘記root登入密碼

    1. 開機出現GRUB載入程式時,按e編輯GRUB引導引數
    2. 選擇以kernel開始的行按e進行編輯
    3. 在kernel行末尾加上single後回車,按b啟動系統進入單使用者模式
    4. 在單使用者模式下輸入命令passwd root,輸入兩次密碼
    5. 修改成功,shutdown -r now重啟系統
    6. 新密碼登入,成功。
  • history命令顯示所有命令記錄,然後通過!命令編號呼叫該命令

  • 清屏命令大家都知道clear,還有一個快捷鍵更方便——ctrl+l
  • Vim普通模式下輸入ZZ,可以實現儲存並退出文件
  • echo "hello123" | passwd --stdin jack 通過管道為使用者jack設定密碼
  • uptime 監控CPU使用情況

一、ACL訪問控制許可權

兩個命令:getfaclsetfacl

  • getfacl 檢視文件的ACL許可權
  • setfacl 設定文件ACL許可權

    • -b 刪除所有附加的ACL條目
    • -k 刪除預設的ACL
    • -m 新增ACL許可權
    • -x 刪除指定的ACL條目
    • -R 遞迴處理所有的子檔案與子目錄
  • 例項

    • getfacl 2.log 檢視文件2.log的ACL許可權
    • setfacl -m u:user01:rw 2.log 新增ACL條目,使使用者user01對2.log檔案可讀可寫
    • setfacl -m g:group01:r 2.log 使使用者組group01對檔案2.log有可寫許可權
    • setfacl -x u:user01 2.log 刪除使用者user01的ACL條目
    • setfacl -x g:group01 2.log 刪除組的許可權
    • setfacl -b 2.log 清除檔案2.log所有ACL許可權

二、磁碟分割槽

之前在一篇筆記裡已經介紹了fdisk命令的用法,這裡就不重複了,這裡說一下另外兩個命令partprobeparted

  • partprobe

    • partprobe /dev/sdb 讓核心立即讀取新的分割槽表,無需重啟電腦就可以識別新建立的分割槽
  • parted GPT分割槽方式,不同與傳統的MBR分割槽(使用fdisk

三、開機啟動

學習開機啟動命令,先要了解Linux的6種執行級別。

  • 0 關機模式
  • 1 單使用者模式
  • 2 無NFS(共享服務)網路的字元介面模式
  • 3 全功能字元介面模式
  • 4 暫時未定義使用
  • 5 圖形模式
  • 6 重啟模式

通過runlevel命令可以檢視當前所處的執行級別。伺服器版本的Linux一般都是3級別,通過init命令可以改變當前的執行級別,如init 0命令可以直接關機.

好了,可以進入正題了,如何設定開機啟動呢?使用命令chkconfig,用法如下:

  • chkconfig --list 查詢系統服務執行級別資訊
  • chkconfig --level 指定操作的執行級別,不指定級別時預設為2,3,4,5級別
  • 例項:
    • chkconfig --list sshd 檢視sshd命令的執行級別
      enter image description here
    • chkconfig sshd on 設定sshd服務在2.3.4.5級別開機啟動
      enter image description here

四、記憶體和硬碟使用情況

1、記憶體使用

記憶體的使用情況檢視命令,應該很熟悉了,那就是free,但是你真的知道顯示出來的各個資料都代表的是什麼意思嗎?至少之前我是沒怎麼去了解。

enter image description here

每次看的時候,也就掃了一眼,總共498M,用了263M,還剩235M,就完事了。其他的資料就沒怎麼看了,這裡簡單介紹一下其他數是什麼含義。

在Linux開機後就會預先提取一部分記憶體,並劃為buffer與cache以供程式隨時使用。第一行的used就是這部分記憶體數263,而後面的buffers代表的是buffer使用剩餘的記憶體數65,cached就是cache剩餘的記憶體數145。那麼buffer和cache用了多少呢?第二行中used就是buffer和cache使用的記憶體數51,那麼就有等式263=65+145+51,接下來446系統總剩餘的記憶體數,為分配的有235,分配了但是沒有用完的有65+145,那麼446=65+145+235

細心的讀者也許一眼就看出了,等式根本不等嘛!彆著急,換成位元組單位,你再算算!至於原因就很明瞭了

enter image description here

2、硬碟使用

這裡就補充兩點。

  • df -hTT的引數代表顯示檔案系統 enter image description here
  • df -ii代表的是磁碟inode使用量資訊 enter image description here
    這裡可以看出根分割槽還剩下313077個inode節點,也就是說如果在更分割槽下建立313077個空檔案,那麼就算該磁碟還有容量也再也容不下新增檔案了。

五、網路

1、網路引數設定

有兩種方式設定網路引數,一是通過命令列設定;二是通過修改引數檔案。

命令列設定不外乎ifconfigroute這兩個命令,具體使用可以自行查詢幫助文件,這裡介紹一下修改引數檔案來設定網路。

網路的引數檔案在/etc/sysconfig/network-scripts/ifcfg-<iface>,其中iface為網路卡介面名稱。如果只有一塊乙太網網路卡,則一般為ifcfg-eth0,檔案有一下欄位:

  • DEVICE 裝置名稱 eh0,eth1...
  • TYPE 裝置型別 ethernet
  • BOOTPROTO 啟動協議 none|dhcp|static
  • HWADDR 硬體地址 MAC地址
  • NM_CONTROLLED 網路卡是否可以被NetworkManager控制 yes|no
  • ONBOOT 開機是否啟動該網路卡 yes|no
  • ONPARENT 真實介面啟動後虛擬介面是否啟動 yes|no
  • IPADDR IP地址
  • PREFIX 網路位掩碼個數
  • NETMASK 子網掩碼
  • GATEWAY 預設閘道器
  • DNS{1,2} DNS伺服器

如我網路卡eth1設定靜態IP,配置如下圖
enter image description here

2、網路故障排錯

這塊主要介紹5個命令,pingtraceroutenslookupdignetstat

  • ping 非常常用的命令,測試基本就是4步

    1. ping 127.0.0.1 ping本地迴環,測試本地網路協議是否正常
    2. ping 192.168.1.101 ping本地IP,測試本地網路介面是否正常
    3. ping 192.168.1.1 ping本地閘道器,測試閘道器是否正常工作
    4. ping 61.135.169.121 ping外部網路,測試服務商網路是否正常工作
    5. ping www.baidu.com ping網址,如果上述都正常,而這步ping不通,那麼肯定是DNS的問題了
  • traceroute 跟蹤資料包的路由過程,可以檢視資料包在網際網路中哪個節點出現問題,如圖
    enter image description here

  • nslookup 檢測本地設定的DNS伺服器工作是否正常

    • nslookup www.baidu.com 檢測本地DNS伺服器是否能解析到百度,如圖
      enter image description here
      本地設定的DNS伺服器是8.8.8.8,檢測到百度對應的兩個IP地址
  • dig 檢視更多關於DNS記錄的資訊

    • dig www.baidu.com 顯示比nslookup更詳細的資訊
  • netstat 網路監控命令,該命令比較強大,可以自行檢視幫助文件學習

    • netstat -nutlp 檢視當前系統開啟埠資訊 enter image description here

轉載儲存:Linux | LP's Blog

《Linux運維之道》筆記二

{}花括號的用法

  • 逗號,分隔多個專案

    echo {a,b,c} #列印出a b c  
    echo user{01,02,03} #列印出user01 user02 user03  
    mkdir a{1,2,3} #建立資料夾a1,a2,a3
    
  • 連續兩點..建立連續序列

    echo a{1..10} #列印出a1 a2 a3 a4 a5 a6 a7 a8 a9 a10  
    mkdir b{1..5} #建立資料夾b1 b2 b3 b4 b5
    

一、變數

  • typeset 為變數新增只讀屬性,防止誤操作,當你想改值的時候,會報錯。

    NAME=pengloo53
    typeset -r NAME
    NAME=pengloo
    

  • read -p "Please input your name:" NAME 提示符後輸入值賦值給變數

  • export NAME 將普通變數轉換成環境變數

1、變數的展開替換

  • ${varname:-word} 若varname存在且非null,則返回其值,否則返回word
  • ${varname:=word} 若varname存在且非null,則返回其值,否則設定為word
  • ${varname:?message} 若varname存在且非null,則返回其值,否則顯示varname:message
  • ${varname:+word}若varname存在且非null,則返回word,否則返回null
  • ${variable#key} 從頭開始刪除關鍵詞,執行最短匹配
  • ${variable##key} 從頭開始刪除關鍵詞,執行最長匹配
  • ${variable%key} 從尾開始刪除關鍵詞,執行最短匹配
  • ${variable%%key} 從尾開始刪除關鍵詞,執行最長匹配
  • ${variable/old/new}將old替換成new,僅替換第一個出現的old
  • ${variable//old/new}將old替換成new,替換所有的old

2、陣列

  • ${name[subscript]}呼叫陣列變數的值,如果subscript為@*則呼叫所有的陣列成員。

    A=(11 22 33)
    echo ${A[0]}  #顯示11
    echo ${A[@]}  #顯示11 22 33
    echo ${A[*]}  #顯示11 22 33
    
  • ${ #name[subscript]}返回${name[subscript]}的長度。

    B=(aa bbb cccc)
    echo ${ #B[2]} #顯示4(cccc字串的長度)
    echo ${ #B[@]} #顯示3(陣列成員個數)
    

3、算數運算

expr命令工具大部分應該都知道,如下:

  • expr 8 + 4 加法
  • expr 8 - 4 減法
  • expr 8 \* 4 乘法
  • expr 8 / 4 除法

然而你也可以通過變數表示式來進行算術運算,語法為:$((expression)),例如:

  • $((x+y))
  • $((x-y))
  • $((x*y))
  • $((x/y))
  • $((x%y)) 取餘
  • $((x++)) 自加
  • $((x--)) 自減
  • $((x**y)) 冪運算

4、測試運算

命令列工具test ,應該不陌生,這裡舉幾個例子就清楚了。

  • test -d /etc/ && echo "yes" || echo "no"/etc/是目錄就顯示yes,不是就顯示no,它等價與[ -d /etc/ ] && echo "yes" || echo "no"

一對中括號就替代了test,這裡注意的是,中括號左右都要留有空格。

二、正規表示式

1、基本正規表示式(grep)

  • . 任意單個字元
  • * 匹配前一個字元出現零次或者多次
  • [] 匹配集合中任意單個字元
  • [x-y] 匹配連續的字串範圍
  • ^ 匹配字串的開頭
  • $ 匹配字串的結尾
  • [^] 集合取反
  • \ 轉義後的字串
  • \{n,m\} 匹配前一個字元重複n到m次
  • \{n,\} 匹配前一個字元重複至少n次
  • \{n\} 匹配前一個字元重複n次
  • \(\)\(\)之間的內容儲存在『保留空間』,最大儲存9個
  • \n 通過\1\9呼叫保留空間中的內容

除了最後兩個,其他的都比較好理解,針對最後兩個舉個例子:grep --color "\(root\)\(:\).*\2\1" /etc/passwd 篩選出以root:開頭,以:root結尾的行。

2、擴充套件的正規表示式(egrep)

  • + 匹配前一個字元出現一次或者多次
  • ? 匹配前一個字元出現零次或者一次
  • | 匹配邏輯or
  • () 匹配正則集合

egrep --color '(root|admin)' /etc/passwd 找出包含root或者admin的行。

3、Others

除了上述的一些表示式,還有基於其他規範的正規表示式,例如POSIX規範以及GNU規範。這裡不列舉了,可以自行搜尋瞭解。

轉載儲存:Linux | LP's Blog

相關文章