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
捆交、h
或a
。
比如使用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ā)生莫名的錯誤時夫否,這個文件是一定要查閱的登錄文件之一。