常用shell命令

echo

-e參數會解釋引號(雙引號和單引號)里面的不可打印字符:

\a:響鈴
\b:退格
\n:換行
\r:回車
\t:制表符

$ echo "Hello\nWorld"
Hello\nWorld
$ echo -e "Hello\nWorld"
Hello
World

一般的轉義不需要-e參數:

$ echo "$date"

$ echo "\$date"
$date

-n參數用于取消回車符(注意第二行$符位置):

$ echo -n hello world
hello world$

{}擴展

$ echo d{a,e,i,u,o}g
dag deg dig dug dog

$ echo {a..c}
a b c

$ echo {0..8..2}
0 2 4 6 8

單引號和雙引號區(qū)別:

美元符號$琉雳、反引號`和反斜杠\赴肚。這三個字符在雙引號之中,依然有特殊含義差油,會被 Bash 自動擴展

$ echo "$SHELL"   #$表示變量
/bin/bash

$ echo "`date`"     #``表示執(zhí)行命令
Mon Jan 27 13:33:18 CST 2020

$ echo "I'd say: \"hello!\""     #\表示轉義
I'd say: "hello!"

#單引號中無效
$ echo '$USER'
$USER

$ echo '\\'
\\

通配符在引號中無效:

$ echo '*'
*

env

顯示所有環(huán)境變量:

$ env
# 或者
$ printenv

set

顯示所有變量(包括環(huán)境變量和自定義變量)殴俱,以及所有的 Bash 函數:

$ set

變量相關

如果變量的值本身也是變量核行,可以使用${!varname}的語法饵蒂,讀取最終的值:

$ myvar=USER
$ echo ${myvar}
USER
$ echo ${!myvar}
ruanyf

export

向子shell輸出變量:

# 輸出變量 $foo
$ export foo=bar

# 新建子 Shell
$ bash

# 讀取 $foo
$ echo $foo
bar

# 修改繼承的變量
$ foo=baz

# 退出子 Shell
$ exit

# 讀取 $foo,子shell不影響父shell
$ echo $foo
bar

history

查看bash命令的歷史:

$ history

其本質是輸出$HISTFILE指向的文件的全部內容:

$ echo $HISTFILE
/home/me/.bash_history

在history命令中顯示時間戳:

$ export HISTTIMEFORMAT='%F %T  '
$ history
1  2013-06-09 10:40:12   cat /etc/issue
2  2013-06-09 10:40:12   clear

如果不希望保存本次操作的歷史脏款,可以設置HISTSIZE等于0:

export HISTSIZE=0

如果HISTSIZE=0寫入用戶主目錄的~/.bashrc文件围苫,那么就不會保留該用戶的操作歷史。如果寫入/etc/profile撤师,整個系統(tǒng)都不會保留操作歷史剂府。

history命令的-c參數可以清除操作歷史:

$ history -c

cd

返回前一次目錄用-

# 當前目錄是 /path/to/foo
$ cd bar

# 重新回到 /path/to/foo
$ cd -

腳本中的特殊變量

$0:腳本文件名,即script.sh剃盾。
$1~$9:對應腳本的第一個參數到第九個參數腺占。
$#:參數的總數。
$@:全部的參數痒谴,參數之間使用空格分隔衰伯。
$*:全部的參數,參數之間使用變量$IFS值的第一個字符分隔积蔚,默認為空格意鲸,但是可以自定義。

getopts

getopts命令用在腳本內部尽爆,用于取出腳本所有的帶有前置連詞線-的參數(配置項參數):

getopts optstring name

第一個參數optstring是字符串怎顾,給出腳本所有的連詞線參數。比如漱贱,某個腳本可以有三個配置項參數-l槐雾、-h-a幅狮,其中只有-a可以帶有參數值募强,而-l-h是開關參數,那么getopts的第一個參數寫成lha:崇摄,順序不重要擎值。注意,a后面有一個冒號配猫,表示該參數帶有參數值幅恋。getopts的第二個參數name是一個變量名,用來保存當前取到的配置項參數泵肄,即l捆交、ha
比如使用getopts命令配合while循環(huán)處理參數:

while getopts 'lha:' OPTION; do
  case "$OPTION" in
    l)
      echo "linuxconfig"
      ;;

    h)
      echo "h stands for h"
      ;;

    a)
      avalue="$OPTARG"   #如果某個連詞線參數帶有參數值腐巢,比如-a foo品追,那么處理a參數的時候,環(huán)境變量$OPTARG保存的就是參數值冯丙。
      echo "The value provided is $OPTARG"
      ;;
    ?)        #如果用戶輸入了沒有指定的參數(比如-x)肉瓦,那么OPTION等于?遭京。
      echo "script usage: $(basename $0) [-l] [-h] [-a somevalue]" >&2
      exit 1
      ;;
  esac
done
shift "$(($OPTIND - 1))"   #變量$OPTIND在getopts開始執(zhí)行前是1,然后每次執(zhí)行就會加1泞莉。

basename命令用于去掉文件名的目錄和后綴哪雕。
變量$OPTIND在getopts開始執(zhí)行前是1,然后每次執(zhí)行就會加1鲫趁。等到退出while循環(huán)斯嚎,就意味著連詞線參數全部處理完畢。這時挨厚,$OPTIND - 1就是已經處理的連詞線參數個數堡僻,使用shift命令將這些參數移除,保證后面的代碼可以用$1疫剃、$2等處理命令的主參數钉疫。

source

正常的執(zhí)行腳本文件,是類似于bash *.sh巢价,其實是調用子shell牲阁。而source命令不會調用子shell,所以常用于加載配置文件:

#!/bin/bash

source ./lib.sh

function_from_lib

source有一個簡寫形式壤躲,可以使用一個點.來表示:

$ . .bashrc

test語句

test語句的三種寫法:

# 寫法一
test expression

# 寫法二
[ expression ]

# 寫法三     
[[ expression ]]   #只有該形式支持正則判斷

文件狀態(tài)判斷語句(以第二種寫法為例):

[ -a file ]:如果 file 存在咨油,則為true
[ -d file ]:如果 file 存在并且是一個目錄,則為true
[ -e file ]:如果 file 存在柒爵,則為true
[ -f file ]:如果 file 存在并且是一個普通文件,則為true

字符串判斷語句:

[ string ]:如果string不為空(長度大于0)赚爵,則判斷為真棉胀。
[ -n string ]:如果字符串string的長度大于零,則判斷為真冀膝。
[ -z string ]:如果字符串string的長度為零唁奢,則判斷為真。
[ string1 = string2 ]:如果string1和string2相同窝剖,則判斷為真麻掸。
[ string1 == string2 ] 等同于[ string1 = string2 ]。
[ string1 != string2 ]:如果string1和string2不相同赐纱,則判斷為真脊奋。
[ string1 '>' string2 ]:如果按照字典順序string1排列在string2之后,則判斷為真疙描。
[ string1 '<' string2 ]:如果按照字典順序string1排列在string2之前诚隙,則判斷為真。

整數關系判斷語句:

[ integer1 -eq integer2 ]:如果integer1等于integer2起胰,則為true久又。
[ integer1 -ne integer2 ]:如果integer1不等于integer2,則為true。
[ integer1 -le integer2 ]:如果integer1小于或等于integer2地消,則為true炉峰。
[ integer1 -lt integer2 ]:如果integer1小于integer2,則為true脉执。
[ integer1 -ge integer2 ]:如果integer1大于或等于integer2疼阔,則為true。
[ integer1 -gt integer2 ]:如果integer1大于integer2适瓦,則為true竿开。

正則判斷語句:

[[ string1 =~ regex ]]

邏輯判斷語句(也需要使用[[...]]):

AND運算:符號&&,也可使用參數-a玻熙。
OR運算:符號||否彩,也可使用參數-o。
NOT運算:符號!嗦随。

算術判斷語句((...))

if ((3 > 2)); then
  echo "true"
fi

w

查看登錄用戶正在使用的進程信息列荔,可以看到root用戶有三個終端進程:

$ w
 17:25:21 up 15 min,  3 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    ****.****.****.****   17:09    0.00s  0.02s  0.00s w
root     pts/1    ****.****.****.****   17:24   11.00s  0.00s  0.00s -bash
root     pts/2    ****.****.****.****   17:24   17.00s  0.01s  0.01s -bash

chgrp

改變文件所屬群組:

[root@www ~]# chgrp [-R] dirname/filename ...
選項與參數:
-R : 進行遞歸(recursive)的持續(xù)變更,亦即連同次目錄下的所有文件枚尼、目錄
     都更新成為這個群組之意贴浙。常常用在變更某一目錄內所有的文件之情況。
范例:
[root@www ~]# chgrp users install.log
[root@www ~]# ls -l
-rw-r--r--  1 root users 68495 Jun 25 08:53 install.log
[root@www ~]# chgrp testing install.log      (在/etc/group中不存在testing群組)
chgrp: invalid group name `testing' <== 發(fā)生錯誤訊息啰~找不到這個群組名~

chown

改變文件擁有者:

[root@www ~]# chown [-R] 賬號名稱 文件或目錄
[root@www ~]# chown [-R] 賬號名稱:組名 文件或目錄
選項與參數:
-R : 進行遞歸(recursive)的持續(xù)變更署恍,亦即連同次目錄下的所有文件都變更

范例:將install.log的擁有者改為bin這個賬號:
[root@www ~]# chown bin install.log   #需要保證在/etc/passwd文件中存在bin用戶
[root@www ~]# ls -l
-rw-r--r--  1 bin  users 68495 Jun 25 08:53 install.log

范例:將install.log的擁有者與群組改回為root:
[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r--r--  1 root root 68495 Jun 25 08:53 install.log

last

我們的Linux在使用者登入時崎溃,都會將登錄的數據記錄在 /var/log/wtmp那個文件內,該文件是一個data file盯质,他能夠透過last這個指令讀出來袁串! 但是使用cat時,會讀出亂碼呼巷。

mv

移動文件(剪切)&&文件更名:

$ mv b.txt test   #把當前目錄下b.txt文件移動到當前目錄下的test目錄中
$ cd test
$ ls
b.txt
$ mv b.txt a.txt   #將當前目錄下的b.txt改名為a.txt
$ ls
a.txt

cp

文件復制:

范例一:用root身份囱修,將家目錄下的 .bashrc 復制到 /tmp 下,并更名為 bashrc
[root@www ~]# cp ~/.bashrc /tmp/bashrc
[root@www ~]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc'? n  <==n不覆蓋王悍,y為覆蓋
# 重復作兩次動作破镰,由於 /tmp 底下已經存在 bashrc 了,加上 -i 選項后压储,
# 則在覆蓋前會詢問使用者是否確定鲜漩!可以按下 n 或者 y 來二次確認呢!

范例二:變換目錄到/tmp集惋,并將/var/log/wtmp復制到/tmp且觀察屬性:
[root@www ~]# cd /tmp
[root@www tmp]# cp /var/log/wtmp . <==想要復制到目前的目錄宇整,最后的 . 不要忘
[root@www tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-r--r-- 1 root root 96384 Sep 24 14:06 wtmp   #通常,目的文件的擁有者就是操作者
# 注意上面的特殊字體芋膘,在不加任何選項的情況下鳞青,文件的某些屬性/權限會改變霸饲;
# 這是個很重要的特性!要注意喔臂拓!還有厚脉,連文件創(chuàng)建的時間也不一樣了!
# 那如果你想要將文件的所有特性都一起復制過來該怎辦胶惰?可以加上 -a 喔傻工!如下所示:

[root@www tmp]# cp -a /var/log/wtmp wtmp_2
[root@www tmp]# ls -l /var/log/wtmp wtmp_2
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 wtmp_2
# 了了吧!整個數據特性完全一模一樣ㄟ孵滞!真是不賴~這就是 -a 的特性中捆!

basename&&dirname

[root@www ~]# basename /etc/sysconfig/network
network         <== 很簡單!就取得最后的檔名~
[root@www ~]# dirname /etc/sysconfig/network
/etc/sysconfig  <== 取得的變成目錄名了坊饶!

查看文件的命令

cat  由第一行開始顯示文件內容
tac  從最后一行開始顯示泄伪,可以看出 tac 是 cat 的倒著寫!
nl   顯示的時候匿级,順道輸出行號蟋滴!
more 一頁一頁的顯示文件內容
less 與 more 類似,但是比 more 更好的是痘绎,他可以往前翻頁津函!
head 只看頭幾行
tail 只看尾巴幾行
od   以二進位的方式讀取文件內容!

umask

目前使用者在創(chuàng)建文件或目錄時候的權限默認值:

[root@www ~]# umask
0022             <==與一般權限有關的是后面三個數字孤页!
[root@www ~]# umask -S
u=rwx,g=rx,o=rx

該用戶一般情況下創(chuàng)建的文件權限為666-022=644
該用戶一般情況下創(chuàng)建的目錄權限為777-022=755:

[root@www ~]# touch test1
[root@www ~]# mkdir test2
[root@www ~]# ll 
-rw-r--r-- 1 root root     0 Sep 27 00:25 test1
drwxr-xr-x 2 root root  4096 Sep 27 00:25 test2

特殊權限:

Setuid權限(僅對文件生效):

[root@www ~]# ls -ld /tmp ; ls -l /usr/bin/passwd
drwxrwxrwt 7 root root 4096 Sep 27 18:23 /tmp
-rwsr-xr-x 1 root root 22984 Jan  7  2007 /usr/bin/passwd

Setgid權限(對文件和目錄均生效):

[root@www ~]# ls -l /usr/bin/locate
-rwx--s--x 1 root slocate 23856 Mar 15  2007 /usr/bin/locate

對于文件而言:

SGID 對二進位程序有用尔苦;
程序運行者對於該程序來說,需具備 x 的權限行施;
運行者在運行的過程中將會獲得該程序群組的支持蕉堰!

對于目錄而言:

使用者若對於此目錄具有 r 與 x 的權限時,該使用者能夠進入此目錄悲龟;
使用者在此目錄下的有效群組(effective group)將會變成該目錄的群組;
用途:若使用者在此目錄下具有 w 的權限(可以新建文件)冰寻,則使用者所創(chuàng)建的新文件须教,該新文件的群組與此目錄的群組相同。

Sticky bit權限(僅對目錄生效):

$ ls -ld /tmp
drwxrwxrwt. 5 root root 4096 Nov  9 11:09 /tmp
當使用者對於此目錄具有 w, x 權限斩芭,亦即具有寫入的權限時轻腺;
當使用者在該目錄下創(chuàng)建文件或目錄時,僅有自己與 root 才有權力刪除該文件

SUID/SGID/SBIT 權限配置:
在3位權限描述符之前添加:

4 為 SUID
2 為 SGID
1 為 SBIT

file

判斷文件格式:

[root@www ~]# file ~/.bashrc
/root/.bashrc: ASCII text  <==告訴我們是 ASCII 的純文字檔盎浴贬养!

which

搜索命令:

[root@www ~]# which [-a] command
選項或參數:
-a :將所有由 PATH 目錄中可以找到的命令均列出,而不止第一個被找到的命令名稱

范例一:分別用root與一般帳號搜尋 ifconfig 這個命令的完整檔名
[root@www ~]# which ifconfig
/sbin/ifconfig            <==用 root 可以找到正確的運行檔名喔琴庵!

find

查找文件命令:

-uid n :n 為數字误算,這個數字是使用者的帳號 ID仰美,亦即 UID ,這個 UID 是記錄在/etc/passwd 里面與帳號名稱對應的數字儿礼。
-gid n :n 為數字咖杂,這個數字是群組名稱的 ID,亦即 GID蚊夫,這個 GID 記錄在/etc/group诉字。
-user name :name 為使用者帳號名稱。
-group name:name 為群組名稱知纷。
-name filename:搜尋文件名稱為 filename 的文件壤圃;
   -type TYPE    :搜尋文件的類型為 TYPE 的,類型主要有:一般正規(guī)文件 (f),
                   裝置文件 (b, c), 目錄 (d), 連結檔 (l), socket (s), 
                   及 FIFO (p) 等屬性琅轧。
   -perm mode  :搜尋文件權限『剛好等於』 mode 的文件伍绳,這個 mode 為類似 chmod
                 的屬性值,舉例來說鹰晨, -rwsr-xr-x 的屬性為 4755 墨叛!
   -perm -mode :搜尋文件權限『必須要全部囊括 mode 的權限』的文件,舉例來說模蜡,
                 我們要搜尋 -rwxr--r-- 漠趁,亦即 0744 的文件,使用 -perm -0744忍疾,
                 當一個文件的權限為 -rwsr-xr-x 闯传,亦即 4755 時,也會被列出來卤妒,
                 因為 -rwsr-xr-x 的屬性已經囊括了 -rwxr--r-- 的屬性了甥绿。
   -perm +mode :搜尋文件權限『包含任一 mode 的權限』的文件,舉例來說则披,我們搜尋
                 -rwxr-xr-x 共缕,亦即 -perm +755 時,但一個文件屬性為 -rw-------
                 也會被列出來士复,因為他有 -rw.... 的屬性存在图谷!

比如查找具有setuid位的root文件:

$ find / -user root -perm -4000 2>/dev/null

mount

將文件系統(tǒng)掛載到某個目錄上:

范例一:用默認的方式,將剛剛創(chuàng)建的 /dev/hdc6 掛載到 /mnt/hdc6 上面阱洪!
[root@www ~]# mkdir /mnt/hdc6
[root@www ~]# mount /dev/hdc6 /mnt/hdc6

也可以把一個目錄掛載到另一個目錄上:

范例七:將 /home 這個目錄暫時掛載到 /mnt/home 底下(需要--bind):
[root@www ~]# mkdir /mnt/home
[root@www ~]# mount --bind /home /mnt/home
[root@www ~]# ls -lid /home/ /mnt/home
2 drwxr-xr-x 6 root root 4096 Sep 29 02:21 /home/
2 drwxr-xr-x 6 root root 4096 Sep 29 02:21 /mnt/home

[root@www ~]# mount -l
/home on /mnt/home type none (rw,bind)      #單純的輸入 mount 會顯示目前掛載的信息便贵。加上 -l 可增列 Label 名稱

gzip

壓縮與解壓縮(-d):

范例一:將 /etc/man.config 復制到 /tmp ,并且以 gzip 壓縮
[root@www ~]# cd /tmp 
[root@www tmp]# cp /etc/man.config .
[root@www tmp]# gzip -v man.config      (-v可以顯示出原文件/壓縮文件的壓縮比等資訊冗荸;)
man.config:      56.1% -- replaced with man.config.gz
[root@www tmp]# ll /etc/man.config /tmp/man*
-rw-r--r-- 1 root root 4617 Jan  6  2007 /etc/man.config
-rw-r--r-- 1 root root 2057 Nov 10 17:14 /tmp/man.config.gz  <==gzip壓縮比較佳

zcat

讀取gzip壓縮文件的內容:

范例二:由於 man.config 是文字檔承璃,請將范例一的壓縮檔的內容讀出來!
[root@www tmp]# zcat man.config.gz
# 由於 man.config 這個原本的文件是是文字檔蚌本,因此我們可以嘗試使用 zcat  去讀瓤狻隘梨!
# 此時螢幕上會顯示 man.config.gz 解壓縮之后的文件內容!

范例三:將范例一的文件解壓縮
[root@www tmp]# gzip -d man.config.gz
# 不要使用 gunzip 這個命令玻佩,不好背出嘹!使用 gzip -d 來進行解壓縮!
# 與 gzip 相反咬崔, gzip -d 會將原本的 .gz 刪除税稼,產生原本的 man.config 文件。

bzip2

壓縮比比gzip好垮斯,格式差不多:

范例一:將剛剛的 /tmp/man.config 以 bzip2 壓縮
[root@www tmp]# bzip2 -z man.config       #與gzip不同郎仆,壓縮需要使用-z參數
# 此時 man.config 會變成 man.config.bz2 !

范例二:將范例一的文件內容讀出來兜蠕!
[root@www tmp]# bzcat man.config.bz2
# 此時螢幕上會顯示 man.config.bz2 解壓縮之后的文件內容H偶 !

范例三:將范例一的文件解壓縮
[root@www tmp]# bzip2 -d man.config.bz2

tar

文件打包命令(配合-j-z參數可以進行壓縮/解壓縮):

[root@www ~]# tar [-j|-z] [cv] [-f 創(chuàng)建的檔名] filename... <==打包與壓縮
[root@www ~]# tar [-j|-z] [tv] [-f 創(chuàng)建的檔名]             <==察看檔名
[root@www ~]# tar [-j|-z] [xv] [-f 創(chuàng)建的檔名] [-C 目錄]   <==解壓縮
選項與參數:
-c  :創(chuàng)建打包文件熊杨,可搭配 -v 來察看過程中被打包的檔名(filename)
-t  :察看打包文件的內容含有哪些檔名曙旭,重點在察看『檔名』就是了;
-x  :解打包或解壓縮的功能晶府,可以搭配 -C (大寫) 在特定目錄解開
      特別留意的是桂躏, -c, -t, -x 不可同時出現(xiàn)在一串命令列中。
-j  :透過 bzip2 的支持進行壓縮/解壓縮:此時檔名最好為 *.tar.bz2
-z  :透過 gzip  的支持進行壓縮/解壓縮:此時檔名最好為 *.tar.gz
-v  :在壓縮/解壓縮的過程中川陆,將正在處理的檔名顯示出來剂习!
-f filename:-f 后面要立刻接要被處理的檔名!建議 -f 單獨寫一個選項羅较沪!
-C 目錄    :這個選項用在解壓縮鳞绕,若要在特定目錄解壓縮,可以使用這個選項尸曼。

其他后續(xù)練習會使用到的選項介紹:
-p  :保留備份數據的原本權限與屬性们何,常用於備份(-c)重要的配置檔
-P  :保留絕對路徑,亦即允許備份數據中含有根目錄存在之意控轿;
--exclude=FILE:在壓縮的過程中冤竹,不要將 FILE 打包! 

比如解幽,打包并壓縮/etc:

[root@www ~]# tar -zpcv -f /root/etc.tar.gz /etc
tar: Removing leading `/' from member names  <==注意這個警告信息,去除根目錄/烘苹,防止解壓縮后為絕對路徑躲株,覆蓋了/etc/下的文件
/etc/
....中間省略....
/etc/esd.conf
/etc/crontab
# 由於加上 -v 這個選項,因此正在作用中的檔名就會顯示在螢幕上镣衡。
# 如果你可以翻到第一頁霜定,會發(fā)現(xiàn)出現(xiàn)上面的錯誤信息档悠!底下會講解。
# 至於 -p 的選項望浩,重點在於『保留原本文件的權限與屬性』之意辖所。

[root@www ~]# tar -jpcv -f /root/etc.tar.bz2 /etc
# 顯示的信息會跟上面一模一樣羅!

常用命令如下:

壓 縮:tar -jcv -f filename.tar.bz2 要被壓縮的文件或目錄名稱
查 詢:tar -jtv -f filename.tar.bz2
解壓縮:tar -jxv -f filename.tar.bz2 -C 欲解壓縮的目錄

vi常用快捷鍵

h 或 向左箭頭鍵(←)    光標向左移動一個字符
j 或 向下箭頭鍵(↓)    光標向下移動一個字符
k 或 向上箭頭鍵(↑)    光標向上移動一個字符
l 或 向右箭頭鍵(→)    光標向右移動一個字符
[Ctrl] + [f]    屏幕『向下』移動一頁赚瘦,相當于 [Page Down]按鍵 (常用)
[Ctrl] + [b]    屏幕『向上』移動一頁杨蛋,相當于 [Page Up] 按鍵 (常用)
0 或功能鍵[Home]    這是數字『 0 』:移動到這一行的最前面字符處 (常用)
$ 或功能鍵[End] 移動到這一行的最后面字符處(常用)
<space>   向后移動一個字符
<enter>   向下移動一行
G   移動到這個檔案的最后一行(常用)
nG  n 為數字起便。移動到這個檔案的第 n 行。例如 20G 則會移動到這個檔案的第 20 行(可配合 :set nu)
x, X    在一行字當中酥宴,x 為向后刪除一個字符 (相當于 [del] 按鍵), X 為向前刪除一個字符(相當于 [backspace] 亦即是退格鍵) (常用)
dd  刪除游標所在的那一整列(常用)
ndd n 為數字您觉。刪除光標所在的向下 n 列拙寡,例如 20dd 則是刪除 20 列 (常用)
yy  復制游標所在的那一行(常用)
nyy n 為數字。復制光標所在的向下 n 列琳水,例如 20yy 則是復制 20 列(常用)
p, P    p 為將已復制的數據在光標下一行貼上肆糕,P 則為貼在游標上一行! 舉例來說在孝,我目前光標在第 20 行诚啃,且已經復制了 10 行數據。則按下 p 后浑玛, 那 10 行數據會貼在原本的 20 行之后绍申,亦即由 21 行開始貼。但如果是按下 P 呢顾彰? 那么原本的第 20 行會被推到變成 30 行极阅。 (常用)
u   復原前一個動作。(常用)
[Ctrl]+r    重做上一個動作涨享。(常用)

~/.bash_history

~/.bash_history 記錄的是前一次登陸以前所運行過的命令筋搏, 而至于這一次登陸所運行的命令都被緩存在內存中,當你成功的注銷系統(tǒng)后厕隧,該命令記憶才會記錄到 .bash_history 當中奔脐。

finger

用來查看用戶信息:

[root@www ~]# finger [-s] username
選項與參數:
-s  :僅列出用戶的賬號、全名吁讨、終端機代號與登陸時間等等髓迎;
-m  :列出與后面接的賬號相同者,而不是利用部分比對 (包括全名部分)

范例一:觀察 vbird1 的用戶相關賬號屬性
[root@www ~]# finger vbird1
Login: vbird1                           Name: (null)
Directory: /home/vbird1                 Shell: /bin/bash
Never logged in.
No mail.
No Plan.

范例三:找出目前在系統(tǒng)上面登陸的用戶與登陸時間
[vbird1@www ~]$ finger
Login     Name       Tty      Idle  Login Time   Office     Office Phone
root      root       tty1           Feb 26 09:53
vbird1               tty2           Feb 26 15:21

id

用于查詢用戶的uid或者gid等信息:

[root@www ~]# id [username]

范例一:查閱 root 自己的相關 ID 信息建丧!
[root@www ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),
10(wheel) context=root:system_r:unconfined_t:SystemLow-SystemHigh
# 上面信息其實是同一行的數據排龄!包括會顯示 UID/GID 以及支持的所有群組!
# 至于后面那個 context=... 則是 SELinux 的內容翎朱,先不要理會他橄维!

范例二:查閱一下 vbird1 吧~
[root@www ~]# id vbird1
uid=504(vbird1) gid=505(vbird1) groups=505(vbird1) context=root:system_r:
unconfined_t:SystemLow-SystemHigh

[root@www ~]# id vbird100
id: vbird100: No such user  <== id 這個命令也可以用來判斷系統(tǒng)上面有無某賬號尺铣!

ACL

ACL 是 Access Control List 的縮寫,主要的目的是在提供傳統(tǒng)的 owner,group,others 的 read,write,execute 權限之外的細部權限配置争舞。ACL 可以針對單一使用者凛忿,單一文件或目錄來進行 r,w,x 的權限規(guī)范,對于需要特殊權限的使用狀況非常有幫助竞川。

setfacl

[root@www ~]# setfacl [-bkRd] [{-m|-x} acl參數] 目標文件名
選項與參數:
-m :配置后續(xù)的 acl 參數給文件使用店溢,不可與 -x 合用;
-x :刪除后續(xù)的 acl 參數流译,不可與 -m 合用逞怨;
-b :移除所有的 ACL 配置參數;
-k :移除默認的 ACL 參數福澡,關于所謂的『默認』參數于后續(xù)范例中介紹叠赦;
-R :遞歸配置 acl ,亦即包括次目錄都會被配置起來革砸;
-d :配置『默認 acl 參數』的意思除秀!只對目錄有效,在該目錄新建的數據會引用此默認值

針對vbird1用戶配置acl:

# 1. 針對特定使用者的方式:
# 配置規(guī)范:『 u:[使用者賬號列表]:[rwx] 』算利,例如針對 vbird1 的權限規(guī)范 rx :
[root@www ~]# touch acl_test1
[root@www ~]# ll acl_test1
-rw-r--r-- 1 root root 0 Feb 27 13:28 acl_test1
[root@www ~]# setfacl -m u:vbird1:rx acl_test1
[root@www ~]# ll acl_test1
-rw-r-xr--+ 1 root root 0 Feb 27 13:28 acl_test1
# 權限部分多了個 + 册踩,且與原本的權限 (644) 看起來差異很大!但要如何查閱呢效拭?

[root@www ~]# setfacl -m u::rwx acl_test1
[root@www ~]# ll acl_test1
-rwxr-xr--+ 1 root root 0 Feb 27 13:28 acl_test1
# 無使用者列表暂吉,代表配置該文件擁有者,所以上面顯示 root 的權限成為 rwx 了缎患!

getfacl

查看設置的ACL:

[root@www ~]# getfacl filename
選項與參數:
getfacl 的選項幾乎與 setfacl 相同慕的!所以鳥哥這里就免去了選項的說明啊挤渔!

# 請列出剛剛我們配置的 acl_test1 的權限內容:
[root@www ~]# getfacl acl_test1
# file: acl_test1   <==說明檔名而已肮街!
# owner: root       <==說明此文件的擁有者,亦即 ll 看到的第三使用者字段
# group: root       <==此文件的所屬群組判导,亦即 ll 看到的第四群組字段
user::rwx           <==使用者列表欄是空的嫉父,代表文件擁有者的權限
user:vbird1:r-x     <==針對 vbird1 的權限配置為 rx ,與擁有者并不同眼刃!
group::r--          <==針對文件群組的權限配置僅有 r 
mask::r-x           <==此文件默認的有效權限 (mask)
other::r--          <==其他人擁有的權限啰绕辖!

mask權限代表使用者或群組所配置的權限必須要存在于 mask 的權限配置范圍內才會生效±藓欤可以設置mask權限:setfacl -m m:r acl_test1

w&&who

查看目前已登陸用戶信息:

[root@www ~]# w
 13:13:56 up 13:00,  1 user,  load average: 0.08, 0.02, 0.01
USER   TTY    FROM            LOGIN@   IDLE   JCPU   PCPU WHAT
root   pts/1  192.168.1.100   11:04    0.00s  0.36s  0.00s -bash
vbird1 pts/2  192.168.1.100   13:15    0.00s  0.06s  0.02s w
# 第一行顯示目前的時間仪际、啟動 (up) 多久,幾個用戶在系統(tǒng)上平均負載等;
# 第二行只是各個項目的說明弟头,
# 第三行以后,每行代表一個使用者涉茧。如上所示赴恨,root 登陸并取得終端機名 pts/1 之意。

[root@www ~]# who
root     pts/1        2009-03-04 11:04 (192.168.1.100)
vbird1   pts/2        2009-03-04 13:15 (192.168.1.100)

lastlog

查看所有賬號最后一次登錄信息(通過/var/log/lastlog文件):

[root@www ~]# lastlog
Username    Port   From           Latest
root        pts/1  192.168.1.100  Wed Mar  4 11:04:22 +0800 2009
bin                                        **Never logged in**
....(中間省略)....
vbird1      pts/2  192.168.1.100  Wed Mar  4 13:15:56 +0800 2009
....(以下省略)....

&

將命令丟到后臺:

[root@www ~]# tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
[1] 8429
[root@www ~]# 

ctrl-z

將『目前』的工作丟到后臺中『暫桶樗ǎ』:

[root@www ~]# vi ~/.bashrc
# 在 vi 的一般模式下伦连,按下 [ctrl]-z 這兩個按鍵
[1]+  Stopped                 vim ~/.bashrc
[root@www ~]#   <==順利取得了前景的操控權!
[root@www ~]# find / -print
....(輸出省略)....
# 此時螢幕會非常的忙碌钳垮!因為螢幕上會顯示所有的檔名惑淳。請按下 [ctrl]-z 暫停
[2]+  Stopped                 find / -print

jobs

查看目前后臺工作情況:

范例一:觀察目前的 bash 當中,所有的工作饺窿,與對應的 PID
[root@www ~]# jobs -l
[1]- 10314 Stopped                 vim ~/.bashrc
[2]+ 10833 Stopped                 find / -print

其中 + 代表最近被放到背景的工作號碼歧焦, - 代表最近最后第二個被放置到背景中的工作號碼。 而超過最后第三個以后的工作肚医,就不會有 +/- 符號存在了绢馍!

fg

將后臺工作拿到前臺來:

[root@www ~]# jobs
[1]- 10314 Stopped                 vim ~/.bashrc
[2]+ 10833 Stopped                 find / -print
[root@www ~]# fg      <==默認取出那個 + 的工作,亦即 [2]肠套。立即按下[ctrl]-z
[root@www ~]# fg %1   <==直接規(guī)定取出的那個工作號碼舰涌!再按下[ctrl]-z

bg

讓工作在后臺下的狀態(tài)變成運行中:

范例二:讓該工作在背景下進行,并且觀察他D阒伞瓷耙!
[root@www ~]# jobs ; bg %3 ; jobs
[1]-  Stopped                 vim ~/.bashrc
[2]   Stopped                 find / -print
[3]+  Stopped                 find / -perm +7000 > /tmp/text.txt
[3]+ find / -perm +7000 > /tmp/text.txt &  <==用 bg%3 的情況!
[1]+  Stopped                 vim ~/.bashrc
[2]   Stopped                 find / -print
[3]-  Running                 find / -perm +7000 > /tmp/text.txt &

nohup

上述用&的方法其實是放到shell的后臺中刁赖,如果這個shell連接斷了搁痛,工作也就沒了。所以如果想把工作放到系統(tǒng)的后臺乾闰,則需要使用nohup...&落追。

ps

-l:僅觀察自己的 bash 相關程序:

范例一:將目前屬於您自己這次登陸的 PID 與相關資訊列示出來(只與自己的 bash 有關)
[root@www ~]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0 13639 13637  0  75   0 -  1287 wait   pts/1    00:00:00 bash
4 R     0 13700 13639  0  77   0 -  1101 -      pts/1    00:00:00 ps

aux:觀察系統(tǒng)所有程序:

范例二:列出目前所有的正在內存當中的程序:
[root@www ~]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   2064   616 ?        Ss   Mar11   0:01 init [5]
root         2  0.0  0.0      0     0 ?        S<   Mar11   0:00 [migration/0]
root         3  0.0  0.0      0     0 ?        SN   Mar11   0:00 [ksoftirqd/0]
.....(中間省略).....
root     13639  0.0  0.2   5148  1508 pts/1    Ss   11:44   0:00 -bash
root     14232  0.0  0.1   4452   876 pts/1    R+   15:52   0:00 ps aux
root     18593  0.0  0.0   2240   476 ?        Ss   Mar14   0:00 /usr/sbin/atd

top

相對于 ps 是截取一個時間點的程序狀態(tài), top 則可以持續(xù)偵測程序運行的狀態(tài):

范例一:每兩秒鐘升級一次 top 涯肩,觀察整體資訊:
[root@www ~]# top -d 2        #下面的數據會兩秒刷新一次
top - 17:03:09 up 7 days, 16:16,  1 user,  load average: 0.00, 0.00, 0.00
Tasks:  80 total,   1 running,  79 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.5%us,  0.5%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    742664k total,   681672k used,    60992k free,   125336k buffers
Swap:  1020088k total,       28k used,  1020060k free,   311156k cached
    <==如果加入 k 或 r 時轿钠,就會有相關的字樣出現(xiàn)在這里喔!
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND     
14398 root      15   0  2188 1012  816 R  0.5  0.1   0:00.05 top
    1 root      15   0  2064  616  528 S  0.0  0.1   0:01.38 init
    2 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 migration/0
    3 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0

-p:通過PID指定觀察某程序病苗。

netstat

[root@www ~]# netstat -[atunlp]
選項與參數:
-a  :將目前系統(tǒng)上所有的連線疗垛、監(jiān)聽、Socket 數據都列出來
-t  :列出 tcp 網絡封包的數據
-u  :列出 udp 網絡封包的數據
-n  :不以程序的服務名稱硫朦,以埠號 (port number) 來顯示贷腕;
-l  :列出目前正在網絡監(jiān)聽 (listen) 的服務;
-p  :列出該網絡服務的程序 PID 

dmesg

分析內核產生的信息。

/proc/*

其中存儲的是內存中的數據:

[root@www ~]# ll /proc
dr-xr-xr-x  5 root      root              0 Mar 11 08:46 1
dr-xr-xr-x  5 root      root              0 Mar 11 00:46 10
dr-xr-xr-x  5 root      root              0 Mar 11 00:46 11
....(中間省略)....
-r--r--r--  1 root      root              0 Mar 20 12:11 uptime
-r--r--r--  1 root      root              0 Mar 20 12:11 version
-r--r--r--  1 root      root              0 Mar 20 12:11 vmstat
-r--r--r--  1 root      root              0 Mar 20 12:11 zoneinfo

各個程序的 PID 都是以目錄的型態(tài)存在于 /proc 當中泽裳。 舉例來說瞒斩,我們啟動所運行的第一支程序 init 他的 PID 是 1 , 這個 PID 的所有相關資訊都寫入在 /proc/1/*當中涮总。

lsof

列出被程序所開啟的文件檔名

[root@www ~]# lsof [-aUu] [+d]
選項與參數:
-a  :多項數據需要『同時成立』才顯示出結果時胸囱!
-U  :僅列出 Unix like 系統(tǒng)的 socket 文件類型;
-u  :后面接 username瀑梗,列出該使用者相關程序所開啟的文件烹笔;
+d  :后面接目錄,亦即找出某個目錄底下已經被開啟的文件抛丽!

范例一:列出目前系統(tǒng)上面所有已經被開啟的文件與裝置:
[root@www ~]# lsof
COMMAND PID  USER   FD  TYPE  DEVICE   SIZE     NODE NAME
init      1  root  cwd   DIR     3,2   4096        2 /
init      1  root  rtd   DIR     3,2   4096        2 /
init      1  root  txt   REG     3,2  38620  1426405 /sbin/init
....(底下省略)....
# 注意到了嗎谤职?是的,在默認的情況下亿鲜, lsof 會將目前系統(tǒng)上面已經開啟的
# 文件全部列出來~所以允蜈,畫面多的嚇人啊蒿柳!您可以注意到陷寝,第一個文件 init 運行的
# 地方就在根目錄,而根目錄其馏,嘿嘿凤跑!所在的 inode 也有顯示出來喔!

/var/log/secure

基本上叛复,只要牽涉到『需要輸入帳號口令』的軟件仔引,那么當登陸時 (不管登陸正確或錯誤) 都會被記錄在此文件中。 包括系統(tǒng)的 login 程序褐奥、圖形介面登陸所使用的 gdm 程序咖耘、 su, sudo 等程序、還有網絡連線的 ssh, telnet 等程序撬码, 登陸資訊都會被記載在這里儿倒。

/var/log/messages

這個文件相當的重要,幾乎系統(tǒng)發(fā)生的錯誤信息 (或者是重要的資訊) 都會記錄在這個文件中呜笑; 如果系統(tǒng)發(fā)生莫名的錯誤時夫否,這個文件是一定要查閱的登錄文件之一。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末叫胁,一起剝皮案震驚了整個濱河市凰慈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驼鹅,老刑警劉巖微谓,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件森篷,死亡現(xiàn)場離奇詭異,居然都是意外死亡豺型,警方通過查閱死者的電腦和手機仲智,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姻氨,“玉大人坎藐,你說我怎么就攤上這事『甙螅” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵碉咆,是天一觀的道長抖韩。 經常有香客問我,道長疫铜,這世上最難降的妖魔是什么茂浮? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮壳咕,結果婚禮上席揽,老公的妹妹穿的比我還像新娘。我一直安慰自己谓厘,他們只是感情好幌羞,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著竟稳,像睡著了一般属桦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上他爸,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天聂宾,我揣著相機與錄音,去河邊找鬼诊笤。 笑死系谐,一個胖子當著我的面吹牛,可吹牛的內容都是我干的讨跟。 我是一名探鬼主播纪他,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晾匠!你這毒婦竟也來了止喷?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤混聊,失蹤者是張志新(化名)和其女友劉穎弹谁,沒想到半個月后乾巧,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡预愤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年沟于,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片植康。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡旷太,死狀恐怖,靈堂內的尸體忽然破棺而出销睁,到底是詐尸還是另有隱情供璧,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布冻记,位于F島的核電站睡毒,受9級特大地震影響,放射性物質發(fā)生泄漏冗栗。R本人自食惡果不足惜演顾,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隅居。 院中可真熱鬧钠至,春花似錦、人聲如沸胎源。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涕蚤。三九已至掰盘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赞季,已是汗流浹背愧捕。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留申钩,地道東北人次绘。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像撒遣,于是被迫代替她去往敵國和親邮偎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內容