Linux Basic學習筆記01


介紹課程:
中級:
初級:系統基礎
中級:系統管理、服務安全及服務管理、Shell腳本;
高級:
MySQL數據庫;
cache & storage
集羣:
Clusterphp

lb:
4layer
7layer
ha:
分佈式:
zookeeper
分佈式文件系統
虛擬化技術:
xen
kvmjava

Openstack:IAAS雲;node

運維工具:
ansible
puppet(ruby), saltstack(python)python

監控工具:
zabbixlinux

大數據處理:
hadoop
spark, stormnginx

elk: elasticsearch, logstash, kibanagit

docker:程序員

Python:正則表達式

一萬小時定律:算法

認證:
RedHat:
RHCSA
RHCE
RHCA

培訓:
加速知識獲取過程;
有人監督,有環境;

紀律:
一、遲到
1分鐘:2個;

請假一晌:60個;

二、教室使用
全天開放;
拒絕玩遊戲:

三、上課期間
手機鈴聲關閉;
一次:30個;

做業和考試:
做業:
課前提問
博客做業
5w1h:
what, why, when, where, who
how

考試:
機試、筆試
及格:80分
一分:5個


上課環境:
172.16.0.0/16
Windows: 172.16.250.X
Linux: 172.16.249.X
X: 1-254

網關:172.16.0.1
DNS: 172.16.0.1

每位同窗:172.16.Y.1-254
172.16.100+Y.1-254

Server: 172.16.0.1, 192.168.0.254, 192.168.1.254
容許核心轉發;

DHCP、ftp、http、cobbler


VMware Workstation的使用:

現代計算機設備的組成部分:
運算器、控制器、存儲器、輸入設備、輸出設備
CPU
bus:總線
memory: 編址存儲設備

read ahead

IO: 與外部部件交互
磁盤:
網卡:

虛擬機:虛擬計算機


CPU:運算器、控制器
CPU指令,指令集;
特權指令:OS運行特權指令;
普通指令:
程序員:

OS: Operating System
軟件程序
通用目的
硬件驅動
進程管理
內存管理
網絡管理
安全管理

System Call
Syscall:系統調用

編程層次:
硬件規格:hardware specifiacation
系統調用:
庫調用:library call

UI:
GUI: Graphic User Interface
CLI: Command Line Interface

ABI: Application Binary Interface
API:Application Programming Interface

CPU架構類型:
x86
x64
arm

m68000, m68k
power
powerpc
ultrasparc
alpha
安騰

Windows
Linux:
Linus --> Linux

GNU/Linux

Unix:
System (Bell Lab)
AIX (IBM)
Solaris (SUN)
HP-UX (HP)
BSD: (BSRG)Berkeley System Distribution
NetBSD
OpenBSD
FreeBSD

MIT:Richard Stallman
GNU: GNU is Not Unix;
GPL:General Public License


計算機的基礎知識:
CPU, memory, I/O

程序運行模式:
用戶空間:user space, us
內核空間:system space

POS: Portable Operating System
POSIX

API: 編程接口;

運行程序格式:
Windows: EXE, dll(dynamic link library)
Linux: ELF, so(shared object)

程序:指令+數據
指令:只讀
數據:讀寫

程序:算法+數據結構

庫調用,系統調用:容許被調用的程序;

malloc(), free()

編程語言:
彙編語言:微碼編程
系統中某些與硬件相關的特有代碼、驅動程序開發;
高級語言C, C++:
系統級應用、驅動程序
高級應用java, python, php:
應用程序

unix-like

Linux的發行版:
slackware:
suse
opensuse
debian:
ubuntu
mint
redhat:
rhel: redhat enterprise linux
每18個月發行一個新版本
CentOS:兼容rhel的格式
fedora:每6個月發行一個新版本

ArchLinux
Gentoo
LFS: Linux From scratch

Android: kernel+busybox+java虛擬機

GNU: GPLv2, GPLv3, LGPL(lesser)
Apache: apache
BSD: bsd

A: 1000, GPL,
B: 20000, 20

問題1:CentOS和Linux是什麼關係?CentOS和RHEL是什麼關係?
問題2:各類開源協議的具體細節?
GPL, LGPL, Apache, BSD

程序包管理器:
rpm:
RHEL, Fedora, S.u.S.E, CentOS
dpt:
Debian, Ubuntu

自由軟件:
自由使用;自由學習和修改;自由分發;自由建立衍生版;

Linux的哲學思想:
一、一切皆文件;
把幾乎全部資源,包括硬件設備都組織爲文件格式;
二、由衆多單一目的小程序組成;一個程序只實現一個功能,並且要作好;
組合小程序完成複雜任務;
三、儘可能避免跟用戶交互;
目標:實現腳本編程,以自動完成某些功能;
四、使用純文本文件保存配置信息;
目標:一款使用的文本編程器即能完成系統配置工做;

如何獲取CentOS的發行版:
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com

登陸:
root/mageedu

# startx &

終端:
用戶與主機交互,必然用到的設備;

物理終端:直接接入本機的顯示器和鍵盤設備;/dev/console

虛擬終端:附加在物理終端之上的以軟件方式虛擬實現的終端,CentOS 6默認啓動6個虛擬終端
Ctrl+Alt+F#: [1,6]
圖形終端:附加在物理終端之上的以軟件方式虛擬實現的終端,但額外會提供桌面環境;

設備文件路徑:/dev/tty#
模擬終端:
圖形界面下打開的命令行接口,基於ssh協議或telnet協議等遠程打開的界面

設備文件:/dev/pts/# [0,oo)

查看當前的終端設備:tty

交互式接口:啓動終端後,在終端設備附加一個交互式應用程序
GUI:
X protocol, window manager, desktop

Desktop:
GNOME (C, gtk)
KDE (C++, qt)
XFCE (輕量級桌面)
CLI:
shell程序:
sh (bourn)
csh
tcsh
ksh (korn)
bash (bourn again shell), GPL
zsh

顯示當前使用的shell:
# echo ${SHELL}

顯示當前系統使用的全部shell:
# cat /etc/shells

命令提示符:prompt
[root@localhost ~]#
[root@localhost ~]:PS1
prompt:
管理員:#
普通用戶:$

命令:
輸入命令,回車:
提請shell程序找到鍵入命令所對應的可執行程序或代碼,並由其分析後提交給內核分配資源將其運行起來;
表現爲一個或多個進程;

在shell中可執行的命令有兩類:
內建命令:由shell自帶的,並且經過某命令形式提供;
外部命令:在當前系統的某文件系統路徑下有對應的可執行程序文件;
which,whereis

區別內部或外部命令:
# type COMMAND

運行命令:
命令格式:
COMMAND [OPTIONS...] [ARGUMENTS...]
選項:用於啓用或關閉命令的某個或某些功能;
短選項:-c, 例如:-l, -h
多個短選項可命令使用,例如-l -h, 可寫做-lh;
長選項:--word,例如:--long, --human-readable
參數:命令的做用對象
向命令提供數據;

注意:
一、多選項,以及多參數和命令之間都應該使用空白字符分隔
二、取消命令執行:Ctrl+c

文件系統:
C:\Program files\office11\word\word.exe

/etc/sysconfig/network-scripts/ifcfg-eth0

文件有兩類數據:
元數據:metadata
數據:data

一、文件名嚴格區分字符大小寫;file1, File1, FILE1是不一樣的文件;
二、文件名可以使用除/之外的任意字符,不建議使用特殊字符;
/: 根目錄,路徑分隔符;
三、文件名長度最長不能超過255個字符;
四、因此.開頭的文件,均爲隱藏文件;

路徑:
絕對路徑:從根目錄起始的路徑;
相對路徑:對當前位置起始的路徑;
當前位置的表示方式:
(1) ./: ./sysconfig/network-scripts
(2) 省略上述符號: sysconfig/network-scripts

..:表示當前目錄的上一級目錄

當前目錄:current directory, 也稱做working directory;
pwd: printing working directory

LSB: Linux Standard Base

命令總結:ls, cd, type, tty, cat, which, whereis, pwd, echo

命令:
(1) 文件系統相關:
目錄管理
文件管理
文件查看
文件編輯
(2) 系統管理相關:

Linux命令幫助的獲取

外部命令:都有一個可執行程序,位於文件系統某目錄下;
which, whereis

shell程序搜尋可執行程序文件的路徑定義在PATH環境變量中;
# echo $PATH

注意:自左至右

格式:COMMAND [OPTIONS...] [ARGUMENTS...]

內部命令:
# help COMMAND
外部命令:
(1) # COMMAND --help
# COMMAND -h
(2) 使用手冊(manual)
# man COMMAND
(3) 信息頁
# info COMMAND
(4) 程序自身的幫助文檔
README
INSTALL
ChangeLog
(5) 程序官方文檔
官方站點:Documentation
(6) 發行版的官方文檔
(7) Google

內部命令幫助:
# help COMMAND

hash命令:
shell搜尋到的外部命令的路徑結果會緩存至kv(key-value)存儲中;

history命令:
做用是什麼?相關的環境變量是什麼?有用的選項?

管理命令歷史;
登陸shell時,會讀取命令歷史文件中記錄下的命令:~/.bash_history
登陸進shell後新執行的命令只會記錄在緩存中;這些命令會用戶退出時「追加」至命令歷史文件中;

history:
-a: 追加本次會話新執行的命令歷史列表至歷史文件中;
-d: 刪除歷史中指定的命令;
-c: 清空命令歷史;

快捷操做:
!#: 調用歷史中第#條命令;
!string:調用歷史中最近一個以string開頭的命令;
!!: 上一條命令

外部命令幫助獲取:
(2) man COMMAND
手冊頁:/usr/share/man
man1 ... man8
man1: 用戶命令
man2: 系統調用
man3: C庫調用
man4: 設備文件及特殊文件
man5: 配置文件格式
man6: 遊戲
man7: 雜項
man8: 管理類的命令

注意:有些關鍵在不止一個章節中存在幫助手冊;
要查看指定章節中的手冊:man # COMMAND

man命令的配置文件:/etc/man.config
MANPATH /PATH/TO/SOMEWHERE: 指明新的手冊文件搜索位置

# man -M /PATH/TO/SOMEWHERE COMMAND: 到指定位置下搜索COMMAND命令的手冊頁並顯示之;

幫助手冊中的段落說明:
NAME
SYNOPSIS
DESCRIPTION
OPTIONS
EXAMPLES
AUTHOR
REPORTING BUGS
SEE ALSO

SYNOPSIS:
[]:可選內容
<>: 必選內容
a|b:二選一
...: 同一內容可出現屢次

man命令的操做方法:
Space, ^V, ^f, ^F: 向文件尾翻屏;
b, ^B: 向文件首部翻屏;
d, ^D: 向文件尾部翻半屏;
u, ^U: 向文件首部翻半屏;
RETURN, ^N, e, ^E or j or ^J: 向文件尾部翻一行;
y or ^Y or ^P or k or ^K:向文件首部翻一行;
q: 退出;

#:跳轉至第#行;
1G: 回到文件首部
G:翻至文件尾部

文本搜索:
/KEYWORD:
以KEYWORD指定的字符串爲關鍵字,從當前位置向文件尾部搜索;不區分字符大小寫;
n: 下一個
N:上一個
?KEYWORD:
以KEYWORD指定的字符串爲關鍵字,從當前位置向文件首部搜索;不區分字符大小寫;
n: 跟搜索命令同方向,下一個
N:跟搜索命令反方向,上一個

練習:date命令
顯示今天爲周幾?
設定當前系統時間?
顯示今天的日期,形如:08/15/15?
顯示當前的時間,形如: 16:01:21?

(3) info
info COMMAND

(4) 程序自身的幫助文檔
/usr/share/doc/COMMAND-VERSION

(5) 程序官方文檔

(6) 發行版的官方文檔
http://www.redhat.com/docs

(7) Google

(8) slideshare
http://www.slideshare.net/

基礎命令:
date:
date [OPTION]... [+FORMAT]:顯示
FORMAT: 格式符號
%D
%F
%T
date [MMDDhhmm[[CC]YY][.ss]]:設置
MM: 月分
DD:幾號
hh: 小時
mm: 分鐘
YY: 兩位年份
CCYY: 四位年份
.ss: 秒鐘

Linux的兩種時鐘:
系統時鐘:由Linux內核經過CPU的工做頻率進行的計時;
硬件時鐘:

hwclock: 顯示硬件時鐘
-s, --hctosys
-w, --systohc

cal:日曆

目錄相關的命令:
當前目錄或工做目錄
主目錄,家目錄:HOME
root: /root
普通用戶:/home/USERNAME
/home/tom

~:用戶的主目錄

cd:
cd 或 cd ~: 回當前用戶的主目錄
cd ~USERNAME: 切換至指定用戶的主目錄
cd -: 在上一個目錄和當前目錄之間來回切換

.
..

相關的環境變量:
PWD:保存了當前目錄路徑;
OLDPWD:上一次所在目錄路徑;

pwd: 顯示當前目錄

ls: list
顯示指定路徑下的文件列表;

ls [OPTION]... [DIR]...
-a, --all: 顯示全部文件,包括隱藏文件;
-l: 長格式
-rw-r--r-- 1 root root 44800 Aug 14 14:32 install.log
-rw-r--r--:
最左側的第一位:文件類型
-, d, l, b, c, p, s
後面的9位:訪問權限,perm
數字:文件被硬連接的次數;
左root: 文件的owner
右root: 文件的group
44800:文件的size
Aug 14 14:32 : 文件的最近一次被修改的時間
install.log: 文件名
-h, --human-readable:單位換算
-d: 顯示目錄自身的相關屬性;一般要與-l一塊兒使用;
-r, --reverse: 逆序顯示
-R, --recursive: 遞歸

 

stat /PATH/TO/SOMEFILE:獲取指定文件的元數據

文件查看命令:cat, tac
cat [OPTION]... [FILE]...
-E: 顯示行結束符$
-n: 對顯示出的每一行進行編號

文件內容類型查看命令:file
file /PATH/TO/SOMEWHERE

回顯命令:echo
-n: 禁止自動添加換行符號;
-e: 容許使用轉義符;
\n: 換行
\t: 製表符

echo "$VAR_NAME": 變量會替換,雙引號表弱引用
echo '$VAR_NAME': 變量不會替換,強引用

which:顯示命令對應的程序文件路徑
which [OPTION] COMMAND
--skip-alias:禁止顯示別名

whatis:
使用mkwhatis命令可將當前系統上全部的幫助手冊及與之對應的關鍵字建立爲一個數據庫;

系統管理類命令:
關機:
halt, poweroff, shutdown, init 0
重啓:
reboot, shutdown, init 6
跟用戶登陸相關:
who, whoami, w


Linux的文件系統:
根文件系統(rootfs):
root filesystem

LSB, FHS: (FileSystem Heirache Standard)
/etc, /usr, /var, /root, /home, /dev

/boot:引導文件存放目錄,內核文件(vmlinuz)、引導加載器(bootloader, grub)都存放於此目錄;
/bin:供全部用戶使用的基本命令;不能關聯至獨立分區,OS啓動即會用到的程序;
/sbin:管理類的基本命令;不能關聯至獨立分區,OS啓動即會用到的程序;
/lib:基本共享庫文件,以及內核模塊文件(/lib/modules);
/lib64:專用於x86_64系統上的輔助共享庫文件存放位置;
/etc:配置文件目錄(純文本文件);
/home/USERNAME:普通用戶家目錄;
/root:管理員的家目錄;
/media:便攜式移動設備掛載點;
cdrom
usb
/mnt:臨時文件系統掛載點;
/dev:設備文件及特殊文件存儲位置;
b: block device,隨機訪問
c: character device,線性訪問
/opt:第三方應用程序的安裝位置;
/srv:系統上運行的服務用到的數據;
/tmp:臨時文件存儲位置;
/usr: universal shared, read-only data;
bin: 保證系統擁有完整功能而提供的應用程序;
sbin:
lib:
lib64:
include: C程序的頭文件(header files);
share:結構化獨立的數據,例如doc, man等;
local:第三方應用程序的安裝位置;
bin, sbin, lib, lib64, etc, share

/var: variable data files
cache: 應用程序緩存數據目錄;
lib: 應用程序狀態信息數據;
local:專用於爲/usr/local下的應用程序存儲可變數據;
lock: 鎖文件
log: 日誌目錄及文件;
opt: 專用於爲/opt下的應用程序存儲可變數據;
run: 運行中的進程相關的數據;一般用於存儲進程的pid文件;
spool: 應用程序數據池;
tmp: 保存系統兩次重啓之間產生的臨時數據;

/proc: 用於輸出內核與進程信息相關的虛擬文件系統;
/sys:用於輸出當前系統上硬件設備相關信息的虛擬文件系統;
/selinux: security enhanced Linux,selinux相關的安全策略等信息的存儲位置;

Linux上的應用程序的組成部分:
二進制程序:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin
庫文件:/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64
配置文件:/etc, /etc/DIRECTORY, /usr/local/etc
幫助文件:/usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/doc

Linux下的文件類型:
- (f):普通文件;
d: 目錄文件;
b: 塊設備;
c: 字符設備;
l: 符號連接文件;
p: 管道文件;
s: 套接字文件;socket;


系統管理類命令:
關機:
halt, poweroff, shutdown, init 0
重啓:
reboot, shutdown, init 6
跟用戶登陸相關:
who, whoami, w

關機或重啓:
halt, poweroff
reboot

-f: 強制,不調用shutdown
-p: 切斷電源

shutdown:
shutdown [OPTION]... TIME [MESSAGE]

-r: reboot
-h: halt

-c:cancel

TIME:
now: 馬上
+m: 相對時間表示法,從命令提交開始多久以後;例如 +3;
hh:mm: 絕對時間表示,指明具體時間;

用戶登陸信息查看命令:
whoami: 顯示當前登陸有效用戶;
who: 系統當前全部的登陸會話;
w: 系統當前全部的登陸會話及所作的操做;

bash的基礎特性(1):

(1) 命令歷史
history
環境變量:
HISTSIZE:命令歷史記錄的條數;
HISTFILE:~/.bash_history;
HISTFILESIZE:命令歷史文件記錄歷史的條數;

history -d OFFSET
-c
history #: 顯示歷史中最近的#條命令;
-a: 手動追加當前會話緩衝區的命令歷史至歷史文件中;

調用歷史中的命令:
!#: 重複執行第#條指令;
!!:
!string

調用上一條命令的最後一個參數:
!$:
ESC, .
Alt+.

控制命令歷史的記錄方式:
環境變量:HISTCONTROL
ignoredups:忽略重複的命令;連續且相同方爲「重複」;
ignorespace:忽略全部以空白開頭的命令;
ignoreboth:ignoredups, ignorespace;

修改環境變量值的方式:export 變量名="值"
變量賦值:把賦值符號後面的數據存儲於變量名指向內存空間;

(2) 命令補全
bash執行命令:
內部命令:
外部命令:bash根據PATH環境變量定義的路徑,自左而右在每一個路徑搜尋以給定命令名命名的文件,第一次找到即爲要執行的命令;

直接補全:Tab,用戶給定的字符串只有一條唯一對應的命令;
以用戶給定的字符串爲開頭對應的命令不唯一,則再次Tab會給出列表;

(3) 路徑補全
把用戶給出的字符串當作路徑開頭,並在其指定上級目錄下搜索以指定的字符串開頭的文件名;
若是唯一:則直接補全;
不然:再次Tab,給出列表;

(4) 命令行展開
~: 展開爲用戶的主目錄
~USERNAME:展開爲指定用戶的主目錄
{}:可承載一個以逗號分隔的列表,並將其展開爲多個路徑
/tmp/{a,b} = /tmp/a, /tmp/b
/tmp/{tom,jerry}/hi = /tmp/tom/hi, /tmp/jerry/hi

(5) 命令的執行結果狀態
成功
失敗

bash使用特殊變量$?保存最近一條命令的執行狀態結果:
0:成功
1-255:失敗

程序執行有兩類結果:
程序的返回值;
程序的執行狀態結果;


目錄管理類命令:
cd, pwd, ls

mkdir, rmdir, tree

mkdir [options] /path/to/somewhere
-p: 存在於不報錯,且可自動建立所需的各目錄;
-v: 顯示詳細信息
-m MODE: 建立目錄時直接指定權限;

tree:
-d: 只顯示目錄
-L level:指定顯示的層級數目
-P pattern: 只顯示由指定pattern匹配到的路徑;

rmdir:刪除空目錄
rmdir [OPTION]... DIRECTORY...
-v: 顯示過程;

練習:
(1) 如何建立/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b, /tmp/x/y2/a, /tmp/x/y2/b
mkdir /tmp/x/{y1,y2}/{a,b}

(2) 如何建立x_m, y_m, x_n, y_n
mkdir {x,y}_{m,n}

(3) 如何建立/tmp/bin, /tmp/sbin, /tmp/usr, /tmp/usr/bin, /tmp/usr/sbin
mkdir -p /tmp/{bin,sbin,usr/{bin,sbin}}

文本文件查看類命令:
cat, tac
more, less, tail, head

more
more [OPTIONS...] FILE...
-d: 顯示翻頁及退出提示

less
less [OPTIONS...] FILE...

head
head [OPTION]... [FILE]...
-c #: 指定獲取前#字節
-n #: 指定獲取前#行
-#:

tail
tail [OPTION]... [FILE]...
-c #: 指定獲取後#字節
-n #: 指定獲取後#行
-#:
-f: 跟蹤顯示文件新追加的內容;

文件的時間戳管理工具:
touch

文件:metadata, data
查看文件狀態:stat

三個時間戳:
access time:訪問時間,簡寫爲atime,讀取文件內容
modify time: 修改時間, mtime,改變文件內容(數據)
change time: 改變時間, ctime,元數據發生改變

touch命令:
touch [OPTION]... FILE...
-a: only atime
-m: only mtime
-t STAMP:
[[CC]YY]MMDDhhmm[.ss]
-c: 若是文件不存,則不予建立

回顧:
文件系統、bash的基礎特性、目錄管理及文件查看

文件系統:
boot, bin, sbin, lib, lib64, dev, home, root, mnt, media, etc, proc, sys
usr
var

bash的基礎特性:
命令補全
路徑補全
命令歷史
命令行展開:
~, {}
命令的狀態結果
成功:0
失敗:1-255

目錄管理:mkdir, rmdir

文件查看:more, less, tail, head

時間戳管理:touch
-a, -m, -t
-c

文件管理:
cp, mv, rm

複製命令:cp
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...

cp SRC DEST
SRC是文件:
若是目標不存在:新建DEST,並將SRC中內容填充至DEST中;
若是目錄存在:
若是DEST是文件:將SRC中的內容覆蓋至DEST中;
此時建議爲cp命令使用-i選項;
若是DEST是目錄:在DEST下新建與原文件同名的文件,並將SRC中內容填充至新文件中;

cp SRC... DEST
SRC...:多個文件
DEST必須存在,且爲目錄,其它情形均會出錯;

cp SRC DEST
SRC是目錄:
此時使用選項:-r

若是DEST不存在:則建立指定目錄,複製SRC目錄中全部文件至DEST中;
若是DEST存在:
若是DEST是文件:報錯
若是DEST是目錄:

經常使用選項:
-i:交互式
-r, -R: 遞歸複製目錄及內部的全部內容;
-a: 歸檔,至關於-dR --preserv=all
-d:--no-dereference --preserv=links
--preserv[=ATTR_LIST]
mode: 權限
ownership: 屬主屬組
timestamp:
links
xattr
context
all
-p: --preserv=mode,ownership,timestamp
-v: --verbose
-f: --force

mv: move,移動文件
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...

經常使用選項:
-i: 交互式
-f: 強制

rm: remove,刪除
rm [OPTION]... FILE...

經常使用選項:
-i: 交互式
-f: 強制刪除
-r: 遞歸

rm -rf

文本編輯器:nano
全屏編輯器

bash的基礎特性(2):

一、命令別名(alias)
經過alias命令實現:
(1) alias
顯示當前shell進程全部可用的命令別名;
(2) alias NAME='VALUE'
定義別名NAME,其至關於執行命令VALUE;

注意:在命令行中定義的別名,僅對當前shell進程有效;若是想永久有效,要定義在配置文件中;
僅對當前用戶:~/.bashrc
對全部用戶有效:/etc/bashrc

Note: 編輯配置給出的新配置不會當即生效;

bash進程從新讀取配置文件:
source /path/to/config_file
. /path/to/config_file

撤消別名:unalias
unalias [-a] name [name ...]

Note: 若是別名同原命令的名稱,則若是要執行原命令,可以使用"\COMMAND";

二、glob (globbing)
bash中用於實現文件名「通配」

通配符:*, ?, []

(1) *
任意長度的任意字符
a*b:
aab, ab, a123b,
abc
(2) ?
任意單個字符
a?b:
aab
ab, a12b, abc

(3) []
匹配指定範圍內的任意單個字符
[0-9]
[a-z]:不區分字符大小寫

(4) [^]
匹配指定範圍外的任意單個字符
[^0-9]

專用字符集合:
[:digit:]:任意數字,至關於0-9
[:lower:]:任意小寫字母
[:upper:]: 任意大寫字母
[:alpha:]: 任意大小寫字母
[:alnum:]:任意數字或字母
[:space:]:
[:punct:]:標點符號

練習:
一、顯示/var目錄下全部以l開頭,以一個小寫字母結尾,且中間出現至少一位數字的文件或目錄;
# ls -d /var/l*[0-9]*[[:lower:]]

二、顯示/etc目錄下,以任意一位數字開頭,且以非數字結尾的文件或目錄;
# ls -d /etc/[0-9]*[^0-9]

三、顯示/etc/目錄下,以非字母開頭,後面跟了一個字母及其它任意長度任意字符的文件或目錄;
# ls /etc/[^[:alpha:]][[:alpha:]]*

四、複製/etc目錄下,全部以m開頭,以非數字結尾的文件或目錄至/tmp/mageedu目錄中;
# cp -a /etc/m*[^0-9] /tmp/mageedu

五、複製/etc目錄下,全部以.d結尾的文件或目錄至/tmp/magedu.com目錄中;
# cp -a /etc/*.d /tmp/magedu.com

六、複製/etc目錄下,因此有.conf結尾,且以m,n,r,p開頭的文件或目錄至/tmp/mageedu.com目錄中;
# cp -a /etc/[mnrp]*.conf /tmp/mageedu.com

三、bash的快捷鍵

Ctrl+l: 清屏,至關於clear命令;

Ctrl+a:跳轉至命令開始處;
Ctrl+e:跳轉至命令結尾處;

Ctrl+c:取消命令的執行;

Ctrl+u: 刪除命令行首至光村所在處的全部內容;
Ctrl+k: 刪除光標所在處至命令行尾部的全部內容;

四、bash的的I/O重定向及管道

程序:指令+數據
讀入數據:Input
輸出數據:Output

打開的文件都有一個fd: file descriptor (文件描述符)

標準輸入:keyborad, 0
標準輸出:monitor, 1
標準錯誤輸出:monitor, 2

I/O重定向:改變標準位置

輸出重定向:COMMAND > NEW_POS, COMMAND >> NEW_POS
>:覆蓋重定向,目標文件中的原有內容會被清除;
>>: 追加劇定向,新內容會追加至目標文件尾部;

# set -C: 禁止將內容覆蓋輸出至已有文件中;
強制覆蓋:>|
# set +C:

2>: 覆蓋重定向錯誤輸出數據流;
2>>: 追加劇定向錯誤輸出數據流;

標準輸出和錯誤輸出各自定向至不一樣位置:
COMMAND > /path/to/file.out 2> /path/to/error.out

合併標準輸出和錯誤輸出爲同一個數據流進行重定向:
&>:覆蓋重定向
&>>:追加劇定向

COMMAND > /path/to/file.out 2> &1
COMMAND >> /path/to/file.out 2>> &1

輸入重定向:<

tr命令:轉換或刪除字符
tr [OPTION]... SET1 [SET2]

HERE Documentation:<<
# cat << EOF
# cat > /path/to/somefile << EOF

管道:
COMMAND1 | COMMAND2 | COMMAND3 |...

Note:最後一個命令會在當前shell進程的子shell進程中執行;

tee命令:
tee [OPTION]... [FILE]...

練習:
一、將/etc/passwd文件中的前5行內容轉換爲大寫後保存至/tmp/passwd.out文件中;

二、將登陸至將前系統上用戶信息中的後3行的信息轉換爲大寫後保存至/tmp/who.out文件中;
# who | tail -n 3 | tr 'a-z' 'A-Z' > /tmp/who.out

文本處理工具:wc, cut, sort, uniq

wc命令:
wc [OPTION]... [FILE]...
-l: lines
-w: words
-c: characters

cut命令:
cut [OPTION]... [FILE]...
-d DELIMITER: 指明分隔符
-f FILEDS:
#: 第#個字段
#,#[,#]:離散的多個字段,例如1,3,6
#-#:連續的多個字段, 例如1-6

混合使用:1-3,7
--output-delimiter=STRING

sort命令:
sort [OPTION]... [FILE]...
-f: 忽略字符大小寫
-r: 逆序
-t DELIMITER: 字段分隔符
-k #:以指定字段爲標準排序
-n: 以數值大小進行排序
-u: uniq,排序後去重

uniq命令:
uniq [OPTION]... [FILE]...
-c: 顯示每行重複出現的次數;
-d: 僅顯示重複過的行;
-u: 僅顯示未曾重複的行;

Note: 連續且徹底相同方爲重複

練習:以冒號分隔,取出/etc/passwd文件的第6至第10行,並將這些信息按第3個字段的數值大小進行排序;最後僅顯示的各自的第1個字段;

回顧:
文件管理命令、bash的基礎特性、文件本管理命令

文件管理命令:cp, mv, rm

bash基礎特性:alias/unalias, glob (*, ?, [], [^]), 快捷鍵

IO重定向、管道:
標準輸出重定向:>, >>
標準錯誤重定向:2>, 2>>

&>, &>>
COMMAND > /path/to/somefile.out 2> &1

輸入重定向:<
顯式使用:tr
隱式使用:...

管道:COMMAND1 | COMMAND2 | ...

文本處理命令:wc, cut, sort, uniq


用戶和組管理
資源分派:
Authentication:認證
Authorization:受權
Accouting:審計
Audition

token, identity(username/password)

Linux用戶:Username/UID
管理員:root, 0
普通用戶:1-65535
系統用戶:1-499, 1-999
對守護進程獲取資源進行權限分配;
登陸用戶:500+, 1000+
交互式登陸;

Linux組:Groupname/GID
管理員組:root, 0
普通組:
系統組:1-499, 1-999
普通組:500+, 1000+

Linux安全上下文:
運行中的程序:進程 (process)

以進程發起者的身份運行:
root: cat
tom: cat

進程所可以訪問的全部資源的權限取決於進程的發起者的身份;

Linux組的類別:
用戶的基本組(主組):
組名同用戶名,且僅包含一個用戶:私有組
用戶的附加組(額外組):

Linux用戶和組相關的配置文件:
/etc/passwd:用戶及其屬性信息(名稱、UID、基本組ID等等);
/etc/group:組及其屬性信息;
/etc/shadow:用戶密碼及其相關屬性;
/etc/gshadow:組密碼及其相關屬性;

/etc/passwd:
name:password:UID:GID:GECOS:directory:shell

用戶名:密碼:UID:GID:GECOS:主目錄:默認shell

/etc/group:
group_name:password:GID:user_list

組名:組密碼:GID:以當前組爲附加組的用戶列表(分隔符爲逗號)

/etc/shadow
用戶名:加密了的密碼:最近一次更改密碼的日期:密碼的最小使用期限:最大密碼使用期限:密碼警告時間段:密碼禁用期:帳戶過時日期:保留字段

加密機制:
加密:明文--> 密文
解密:密文--> 明文

單向加密:提取數據指紋
md5: message digest, 128bits
sha1: secure hash algorithm, 160bits
sha224: 224bits
sha256: 256bits
sha384: 384bits
sha512: 512bits

雪崩效應:初始的條件的微小改變,將會引發結果的巨大改變;
定長輸出:

密碼的複雜性策略:
一、使用數字、大寫字母、小寫字母及特殊字符中至少3種;
二、足夠長;
三、使用隨機密碼;
四、按期更換;不要使用最近曾經使用過的密碼;

用戶和組相關的管理命令:
用戶建立:useradd
useradd [options] LOGIN
-u UID: [UID_MIN, UID_MAX], 定義在/etc/login.defs
-g GID:指明用戶所屬基本組,可爲組名,也能夠GID;
-c "COMMENT":用戶的註釋信息;
-d /PATH/TO/HOME_DIR: 以指定的路徑爲家目錄;
-s SHELL: 指明用戶的默認shell程序,可用列表在/etc/shells文件中;
-G GROUP1[,GROUP2,...[,GROUPN]]]:爲用戶指明附加組;組必須事先存在;
-r: 建立系統用戶
CentOS 6: ID<500
CentOS 7: ID<1000

默認值設定:/etc/default/useradd文件中
useradd -D
-s SHELL

練習:建立用戶gentoo,附加組爲distro和linux,默認shell爲/bin/csh,註釋信息爲"Gentoo Distribution";

組建立:groupadd
groupadd [OPTION]... group_name

-g GID: 指明GID號;[GID_MIN, GID_MAX]
-r: 建立系統組;
CentOS 6: ID<500
CentOS 7: ID<1000

查看用戶相關的ID信息:id
id [OPTION]... [USER]
-u: UID
-g: GID
-G: Groups
-n: Name

切換用戶或以其餘用戶身份執行命令:su
su [options...] [-] [user [args...]]

切換用戶的方式:
su UserName:非登陸式切換,即不會讀取目標用戶的配置文件;
su - UserName:登陸式切換,會讀取目標用戶的配置文件;徹底切換;

Note:root su至其餘用戶無須密碼;非root用戶切換時須要密碼;

換個身份執行命令:
su [-] UserName -c 'COMMAND'

選項:
-l:「su -l UserName」至關於「su - UserName」

用戶屬性修改:usermod
usermod [OPTION] login

-u UID: 新UID
-g GID: 新基本組
-G GROUP1[,GROUP2,...[,GROUPN]]]:新附加組,原來的附加組將會被覆蓋;若保留原有,則要同時使用-a選項,表示append;
-s SHELL:新的默認SHELL;
-c 'COMMENT':新的註釋信息;
-d HOME: 新的家目錄;原有家目錄中的文件不會同時移動至新的家目錄;若要移動,則同時使用-m選項;
-l login_name: 新的名字;

-L: lock指定用戶
-U: unlock指定用戶

-e YYYY-MM-DD: 指明用戶帳號過時日期;
-f INACTIVE: 設定非活動期限;

給用戶添加密碼:passwd
passwd [OPTIONS] UserName: 修改指定用戶的密碼,僅root用戶權限
passwd: 修改本身的密碼;

經常使用選項:
-l: 鎖定指定用戶
-u: 解鎖指定用戶

-n mindays: 指定最短使用期限
-x maxdays:最大使用期限
-w warndays:提早多少天開始警告
-i inactivedays:非活動期限;

--stdin:從標準輸入接收用戶密碼;
echo "PASSWORD" | passwd --stdin USERNAME

Note: /dev/null, bit buckets
/dev/zero,

刪除用戶:userdel
userdel [OPTION]... login
-r: 刪除用戶家目錄;

組屬性修改:groupmod
groupmod [OPTION]... group
-n group_name: 新名字
-g GID: 新的GID;

組刪除:groupdel
groupdel GROUP

組密碼:gpasswd
gpasswd [OPTION] GROUP

-a user: 將user添加至指定組中;
-d user: 刪除用戶user的以當前組爲組名的附加組

-A user1,user2,...: 設置有管理權限的用戶列表

newgrp命令:臨時切換基本組;
若是用戶本不屬於此組,則須要組密碼;

修改用戶屬性:chage
chage [OPTION]... LOGIN
-d LAST_DAY
-E, --expiredate EXPIRE_DATE
-I, --inactive INACTIVE
-m, --mindays MIN_DAYS
-M, --maxdays MAX_DAYS
-W, --warndays WARN_DAYS

其它命令:chfn, chsh, finger

命令總結:useradd, groupadd, su, id, usermod, userdel, groupmod, groupdel, passwd, newgrp, pwck, gpasswd, chage, chsh, chfn, finger

權限管理:

文件的權限主要針對三類對象進行定義:
owner: 屬主, u
group: 屬組, g
other: 其餘, o

每一個文件針對每類訪問者都定義了三種權限:
r: Readable
w: Writable
x: eXcutable

文件:
r: 可以使用文件查看類工具獲取其內容;
w: 可修改其內容;
x: 能夠把此文件提請內核啓動爲一個進程;

目錄:
r: 可使用ls查看此目錄中文件列表;
w: 可在此目錄中建立文件,也可刪除此目錄中的文件;
x: 可使用ls -l查看此目錄中文件列表,能夠cd進入此目錄;

--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7

例如:
640: rw-r-----
rwxr-xr-x: 755

修改文件權限:chmod
chmod [OPTION]... OCTAL-MODE FILE...

-R: 遞歸修改權限

chmod [OPTION]... MODE[,MODE]... FILE...
MODE:
修改一類用戶的全部權限:
u=
g=
o=
ug=
a=
u=,g=

修改一類用戶某位或某些位權限
u+
u-

chmod [OPTION]... --reference=RFILE FILE...
參考RFILE文件的權限,將FILE的修改成同RFILE;

修改文件的屬主和屬組:
僅root可用;

修改文件的屬主:chown
chown [OPTION]... [OWNER][:[GROUP]] FILE...

用法:
OWNER
OWNER:GROUP
:GROUP

Note: 命令中的冒號可用.替換;

-R: 遞歸

chown [OPTION]... --reference=RFILE FILE...

修改文件的屬組:chgrp
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...

-R

文件或目錄建立時的遮罩碼:umask
FILE: 666-umask
Note: 若是某類的用戶的權限減得的結果中存在x權限,則將其權限+1
DIR: 777-umask

umask: 查看
umask #: 設定

命令總結:chmod, chown, chgrp, umask

回顧:
文件管理、用戶管理、權限管理、bash的基礎特性
文件管理:cp, mv, rm
用戶管理:
useradd, usermod, chsh, chfn, chage, userdel
groupad, groupmod, groupdel
passwd, gpasswd, pwck
id, finger, who, whoami, w
su
配置文件:/etc/passwd, /etc/shadow, /etc/group, /etc/gshadow
權限管理:
perm: mode(rwxrwxrwx), ownership
chmod
chown
chgrp
-R, --reference=RFILE

FILE: 666-umask
DIR: 777-umask

umask [UMASK]

bash基礎特性:
命令行展開:~, {}
命令別名:alias/unalias
命令歷史:history
命令和路徑補全:$PATH
glob: *, ?, [], [^]
快捷鍵:Ctrl+{a,e,l,c,u,k}
命令hash:hash

bash的基礎特性(3)
一、提供了編程環境

程序:指令+數據

程序編程風格:
過程式:以指令爲中心,數據服務於指令
對象式:以數據爲中心,指令服務於數據

shell程序:提供了編程能力,解釋執行

程序的執行方式:
計算機:運行二進制指令;
編程語言:
低級:彙編
高級:
編譯:高級語言-->編譯器-->目標代碼
C、C++, java
解釋:高級語言-->解釋器-->機器代碼
shell, perl, python

過程式編程:
順序執行
循環執行
選擇執行

shell編程:過程式、解釋執行
編程語言的基本結構:
數據存儲:變量、數組
表達式
語句

shell腳本:文本文件
shebang:
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl

magic number: 魔數

運行腳本:
一、給予執行權限,經過具體的文件路徑指定文件執行;
二、直接運行解釋器,將腳本做爲解釋器程序的參數運行;

變量:
命名的內存空間;

數據存儲方式:ASCII
字符:110:24
數值:110 --> 8
整型
浮點型

變量:變量類型
做用:
一、數據存儲格式;
二、參與的運算;
三、表示的數據範圍;

類型:
字符
數值:
整型
浮點型

編程程序語言:
強類型:
弱類型:bash
把全部要存儲的數據通通看成字符進行
不支持浮點數;

邏輯運算:
true, false
1, 0

與:
1 && 1 = 1
1 && 0 = 0
0 && 1 = 0
0 && 0 = 0
或:
1 || 1 = 1
1 || 0 = 1
0 || 1 = 1
0 || 0 = 0
非:
! 1 = 0
! 0 = 1

短路運算:
與:
第一個爲0,結果一定爲0;
第一個爲1,第二個必需要參與運算;
或:
第一個爲1,結果一定爲1;
第一個爲0,第二個必需要參與運算;

grep:
Linux上文本處理三劍客
grep:文本過濾(模式:pattern)工具;
grep, egrep, fgrep
sed:stream editor,文本編輯工具;
awk:Linux上的實現gawk,文本報告生成器;

grep: Global search REgular expression and Print out the line.
做用:文本搜索工具,根據用戶指定的「模式」對目標文本逐行進行匹配檢查;打印匹配到的行;
模式:由正則表達式字符及文本字符所編寫的過濾條件;
REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有些字符不表示字符字面意義,而表示控制或通配的功能;
分兩類:
基本正則表達式:BRE
擴展正則表達式:ERE
grep -E, egrep

正則表達式引擎

grep [OPTIONS] PATTERN [FILE...]

選項:
--color=auto: 對匹配到的文本着色顯示;
-v: 顯示不可以被pattern匹配到的行;
-i: 忽略字符大小寫;
-o: 僅顯示匹配到的字符串;
-q: 靜默模式,不輸出任何信息;
-A #:after, 後#行
-B #: before, 前#行
-C #:context, 先後各#行

-E:使用ERE;

基本正則表達式元字符:
字符匹配:
.: 匹配任意單個字符;
[]: 匹配指定範圍內的任意單個字符
[^]:匹配指定範圍外的任意單個字符
[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]

匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數;
*:匹配前面的字符任意次;
例如: grep "x*y"
abxy
xay
xxxxxxy

貪婪模式
.*:任意長度的任意字符;
\?:匹配其前面的字符0或1次;即前面的無關緊要;
\+:匹配其前面的字符至少1次;
\{m\}:匹配前面的字符m次;
\{m,n\}:匹配前面的字符至少m次,至多n次;
\{0,n\}:匹配前面的字符至多n次;
\{m,\}:匹配前面的字符至少m次;

位置錨定:
^:行首錨定;用於模式的最左側;
$:行尾錨定;用於模式的最右側;
^PATTERN$: 用於模式匹配整行;
^$: 空行;
^[[:space:]]*$

\< 或 \b:詞首錨定;用於單詞模式的左側;
\> 或 \b:詞尾錨定;用於單詞模式的右側;
\<PATTERN\>:匹配整個單詞;

分組:
\(\):將一個或多個字符捆綁在一塊兒,看成一個總體進行處理;
\(xy\)*ab

Note: 分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些變量的命名方式爲: \1, \2, \3, ...
\1: 從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符;
\(ab\+\(xy\)*\):
\1: ab\+\(xy\)*
\2: xy

後向引用:引用前面的分組括號中的模式所匹配字符,(而非模式自己)

練習:
一、顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式)


二、顯示/etc/passwd文件中不以/bin/bash結尾的行;


三、顯示/etc/passwd文件中ID號最大的用戶的用戶名;


四、若是用戶root存在,顯示其默認的shell程序;
# id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7

五、找出/etc/passwd中的兩位或三位數;
# grep "\<[0-9]\{2,3\}\>" /etc/passwd

六、顯示/etc/rc.d/rc.sysinit文件中,至少以一個空白字符開頭的且後面存非空白字符的行;
# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg

七、找出"netstat -tan"命令的結果中以'LISTEN'後跟0、1或多個空白字符結尾的行;
# netstat -tan | grep "LISTEN[[:space:]]*$"

八、添加用戶bash、testbash、basher以及nologin(其shell爲/sbin/nologin);然後找出/etc/passwd文件中用戶名同shell名的行;
# grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd


練習:
一、寫一個腳本,實現以下功能
若是user1用戶存在,就顯示其存在,不然添加之;
顯示添加的用戶的id號等信息;
#!/bin/bash
id user1 &> /dev/null && echo "user1 exists." || useradd user1
id user1

二、寫一個腳本,完成以下功能
若是root用戶登陸了當前系統,就顯示root用戶在線;不然說明其未登陸;

回顧:shell的基礎特性、grep

shell:
#!/bin/bash

過程式:以指令爲中心
對象式:以數據爲中心

grep:文本過濾器
PATTERN

REGEXP:
BRE、ERE

BRE:
字符匹配:., [], [^]
次數匹配:*, \?, \+, \{m\}, \{m,n\}
位置錨定:^, $, \<, \b, \>, \b
分組:\(\)
後向引用:\1, \2, ...

vim, sed, awk, nginx,

egrep及擴展的正則表達式

egrep = grep -E

egrep [OPTIONS] PATTERN [FILE...]

擴展正則表達式的元字符:
字符匹配:
.
[]
[^]
次數匹配:
*
?: 0或1次;
+:1次或屢次;
{m}:匹配m次;
{m,n}:至少m,至多n次;
錨定:
^
$
\<, \b
\>, \b
分組:
()

後向引用:\1, \2, ...
或者:
a|b
C|cat: C或cat

練習:
一、顯示當前系統root、centos或user1用戶的默認shell和UID;
# grep -E '^(root|centos|user1)\>' /etc/passwd | cut -d: -f1,3,7

二、找出/etc/rc.d/init.d/functions文件(centos6)中某單詞後面跟一個小括號的行;
# grep -E -o "^[_[:alpha:]]+\(\)" /etc/rc.d/init.d/functions

三、使用echo輸出一絕對路徑,使用egrep取出其基名;
# echo "/mnt/sdc" | grep -E -o "[^/]+/?$" | cut -d"/" -f1

進一步地:使用egrep取出路徑的目錄名,相似於dirname命令的結果;

四、找出ifconfig命令結果中1-255之間的數值;

五、找出ifconfig命令結果中的IP地址;

fgrep:不支持正則表達式搜索;

 

bash的基礎特性(4)

變量類型:
數據存儲格式、存儲空間大小、參與運算種類;

字符型
數值型:
整型
浮點型

強類型:定義變量時必須指定類型、參與運算必須符合類型要求;調用未聲明變量會產生錯誤;
弱類型:無須指定類型,默認均爲字符型;參與運算會自動進行隱式類型轉換;變量無須事先定義可直接調用;
bash

bash中的變量的種類:
根據變量的生效範圍等標準:
本地變量:生效範圍爲當前shell進程;對當前shell以外的其它shell進程,包括當前shell的子shell進程均無效;
環境變量:生效範圍爲當前shell進程及其子進程;
局部變量:生效範圍爲當前shell進程中某代碼片段(一般指函數);
位置變量:$1, $2, ...來表示,用於讓腳本在腳本代碼中調用經過命令行傳遞給它的參數;
特殊變量:$?, $0, $*, $@, $#

本地變量:
變量賦值:name='value'
可使用引用:
value:
(1) 能夠是直接字串; name="username"
(2) 變量引用:name="$username"
(3) 命令引用:name=`COMMAND`, name=$(COMMAND)
變量引用:${name}, $name
"":弱引用,其中的變量引用會被替換爲變量值;
'':強引用,其中的變量引用不會被替換爲變量值,而保持原字符串;
顯示已定義的全部變量
set
銷燬變量:
unset name

環境變量:
變量聲明、賦值:
export name=VALUE
declare -x name=VALUE
變量引用:$name, ${name}
顯示全部環境變量:
export
env
printenv
銷燬:
unset name

bash有許多內建的環境變量:PATH, SHELL, UID, HISTSIZE, HOME, PWD, OLD, HISTFILE, PS1

變量命名法則:
一、不能使程序中的保留字:例如if, for;
二、只能使用數字、字母及下劃線,且不能以數字開頭;
三、見名知義,

只讀變量:
readonly name
declare -r name

位置變量:
在腳本代碼中調用經過命令行傳遞給腳本的參數;
$1, $2, ...:對應調用第一、第2等參數;

shift [n]

$0: 命令自己;

$*: 傳遞給腳本的全部參數;
$@: 傳遞給腳本的全部參數;
$#: 傳遞給腳本的參數的個數;

示例:判斷給出的文件的行數
#!/bin/bash
linecount="$(wc -l $1| cut -d' ' -f1)"
echo "$1 has $linecount lines."

bash的配置文件:

按生效範圍劃分,存在兩類:
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
我的配置:
~/.bash_profile
~/.bashrc

按功能劃分,存在兩類:
profile類:爲交互式登陸的shell提供配置
全局:/etc/profile, /etc/profile.d/*.sh
我的:~/.bash_profile
功用:
(1) 用於定義環境變量;
(2) 運行命令或腳本;

bashrc類:爲非交互式登陸的shell提供配置
全局:/etc/bashrc
我的:~/.bashrc

功用:
(1) 定義命令別名;
(2) 定義本地變量;

shell登陸:
交互式登陸:
直接經過終端輸入帳號密碼登陸;
使用「su - UserName」或「su -l UserName」切換的用戶

/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非交互式登陸:
su UserName
圖形界面下打開的終端
執行腳本

~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

編輯配置文件定義的新配置的生效方式:
(1) 從新啓動shell進程;
(2) 使用source或.命令進程;

問題:
一、定義對全部用戶都生效的別名?
二、讓用戶的PATH環境變量的值多出一個路徑,例如多如/usr/local/apache2/bin
管理員?
全部?

bash中的算術運算
+, -, *, /, %, **

實現算術運算:
(1) let var=算術表達式
(2) var=$[算術表達式]
(3) var=$((算術表達式))
(4) var=$(expr arg1 arg2 arg3 ...)

乘法符號有些場景中須要轉義;

bash有內建的隨機數生成器:$RANDOM

加強型賦值:
+=, -=, *=, /=, %=

let varOPERvalue
例如:let count+=1

自增,自減:
let var+=1
let var++

let var-=1
let var--

練習1:寫一個腳本
計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和;

#!/bin/bash
userid1=$(head -n 10 /etc/passwd | tail -n 1 | cut -d: -f3)
userid2=$(head -n 20 /etc/passwd | tail -n 1 | cut -d: -f3)

useridsum=$[$userid1+$userid2]

echo "uid sum: $useridsum"

練習2:寫一個腳本
傳遞兩個文件路徑做爲參數給腳本,計算這兩個文件中全部空白行之和;

#!/bin/bash

spaceline1=$(grep "^[[:space:]]*$" $1 | wc -l)
spaceline2=$(grep "^[[:space:]]*$" $2 | wc -l)

echo "The sum of space line: $[$spaceline1+$spaceline2]"

練習3:統計/etc, /var, /usr目錄共有多少個一級子目錄和文件;


條件測試:
判斷某需求是否知足,須要由測試機制來實現;

Note: 專用的測試表達式須要由測試命令輔助完成測試過程;

測試命令:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]

Note: EXPRESSION先後必須有空白字符;

bash的測試類型:
數值測試:
-gt: 是否大於;
-ge: 是否大於等於;
-eq: 是否等於;
-ne: 是否不等於;
-lt: 是否小於;
-le: 是否小於等於;
字符串測試:
==:是否等於;
>: 是否大於;
<: 是否小於;
!=: 是否不等於;
=~: 左側字符串是否可以被右側的PATTERN所匹配;
Note: 此表達式通常用於[[ ]]中;
-z "STRING":測試字符串是否爲空,空則爲真,不空則爲假;
-n "STRING":測試字符串是否不空,不空則爲真,空則爲假;

Note:用於字符串比較時的用到的操做數都應該使用引號;

文件測試

bash自定義退出狀態碼
exit [n]:自定義退出狀態碼;
注意:腳本中一旦遇到exit命令,腳本會當即終止;終止退出狀態取決於exit命令後面的數字;

注意:若是未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決於腳本中執行的最後一條命令的狀態碼;

練習:寫一個腳本
接受一個文件路徑做爲參數;
若是參數個數小於1,則提示用戶「至少應該給一個參數」,並當即退出;
若是參數個數不小於1,則顯示第一個參數所指向的文件中的空白行數;

回顧:egrep, 擴展的正則表達式, 變量, 配置文件, 算術運算, 條件測試, 退出狀態碼

ERE:
字符匹配:., [], [^]
次數匹配:*, ?, +, {m,n}
位置錨定:^, $, \<, \>, \b
分組:(), \1, \2, ..
或者: a|b

變量:
本地變量
環境變量
局部變量
位置變量
特殊變量

不能使用保留字;

命令:unset, export, declare -x, set, env, printenv, readonly

配置文件:
profile, bashrc

算術運算:
let, $[], $(()), expr

+=, -=, *=, /=

++, --

條件測試:
test, [], [[]]

三種:
數值:-lt, -le, -gt, -ge, -ne, -eq
字符串:==, !=, >, <, =~, -z, -n
文件

自定義退出碼:
exit [n]

[ $# -lt 1 ] && echo "At least one argument." && exit 1

vim編輯器

簡介
vi: Visual Interface,文本編輯器

文本:ASCII, Unicode

文本編輯種類:
行編輯器: sed
全屏編輯器:nano, vi

VIM - Vi IMproved

使用
vim:模式化的編輯

基本模式:
編輯模式,命令模式
輸入模式
末行模式:
內置的命令行接口

打開文件:
# vim [OPTION]... FILE...
+#: 打開文件後,直接讓光標處於第#行的行首;
+/PATTERN:打開文件後,直接讓光標處於第一個被PATTERN匹配到的行的行首;

模式轉換:
編輯模式 --> 輸入模式
i: insert, 在光標所在處輸入;
a: append, 在光標所在處後面輸入;
o: 在當前光標所在行的下方打開一個新行;
I:在當前光標所在行的行首輸入;
A:在當前光標所在行的行尾輸入;
O:在當前光標所在行的上方打開一個新行;
c
C

輸入模式 --> 編輯模式
ESC

編輯模式 --> 末行模式
:

末行模式 --> 編輯模式
ESC

關閉文件:
:q 退出
:q! 強制退出,丟棄作出的修改;
:wq 保存退出
:x 保存退出
:w /PATH/TO/SOMEWHERE

ZZ: 保存退出;

光標跳轉:

字符間跳轉:
h, j, k, l
h: 左
l: 右
j: 下
k: 上

#COMMAND:跳轉由#指定的個數的字符;

單詞間跳轉:
w:下一個單詞的詞首
e:當前或下一單詞的詞尾
b:當前或前一個單詞的詞首

#COMMAND:由#指定一次跳轉的單詞數

行首行尾跳轉:
^: 跳轉至行首的第一個非空白字符;
0: 跳轉至行首;
$: 跳轉至行尾;

行間移動:
#G:跳轉至由#指定行;
G:最後一行;
1G, gg: 第一行;

句間移動:
)
(

段落間移動:
}
{

vim的編輯命令:

字符編輯:
x: 刪除光標處的字符;
#x: 刪除光標處起始的#個字符;

xp: 交換光標所在處的字符及其後面字符的位置;

替換命令(r, replace)
r: 替換光標所在處的字符

刪除命令:
d: 刪除命令,可結合光標跳轉字符,實現範圍刪除;
d$:
d^:
d0:

dw
de
db

#COMMAND

dd: 刪除光標所在的行;
#dd:多行刪除;

粘貼命令(p, put, paste):
p:緩衝區存的若是爲整行,則粘貼當前光標所在行的下方;不然,則粘貼至當前光標所在處的後面;
P:緩衝區存的若是爲整行,則粘貼當前光標所在行的上方;不然,則粘貼至當前光標所在處的前面;

複製命令(y, yank):
y: 複製,工做行爲類似於d命令;
y$
y0
y^

ye
yw
yb

#COMMAND

yy:複製行
#yy: 複製多行;

改變命令(c, change)
c: 修改
編輯模式 --> 輸入模式

c$
c^
c0

cb
ce
cw
#COMMAND

cc:刪除並輸入新內容
#cc:

其它編輯操做

可視化模式:
v: 按字符選定
V:按行行定

Note:常常結合編輯命令;
d, c, y

撤消此前的編輯:
u(undo):撤消此前的操做;
#u: 撤消指定次數的操做;

撤消此前的撤消:
Ctrl+r

重複前一個編輯操做:
.

翻屏操做:
Ctrl+f: 向文件尾部翻一屏;
Ctrl+b: 向文件首部翻一屏;

Ctrl+d: 向文件尾部翻半屏;
Ctrl+u:向文件首部翻半屏;

vim自帶的練習教程:
vimtutor

vim中的末行模式:
內建的命令行接口

(1) 地址定界
:start_pos,end_pos
#: 具體第#行,例如2表示第2行;
#,#: 從左側#表示行起始,到右側#表示行結尾;
#,+#: 從左側#表示的行起始,加上右側#表示的行數;
.: 當前行
$: 最後一行
.,$-1
%:全文, 至關於1,$

/pat1/,/pat2/:
從第一次被pat1模式匹配到的行開始,一直到第一次被pat2匹配到的行結束;
#,/pat/
/pat/,$

使用方式:
後跟一個編輯命令
d
y
w /PATH/TO/SOMEWHERE: 將範圍內的行另存至指定文件中;
r /PATH/FROM/SOMEFILE:在指定位置插入指定文件中的全部內容;

(2) 查找
/PATTERN:從當前光標所在處向文件尾部查找;
?PATTERN:從當前光標所在處向文件首部查找;
n:與命令同方向;
N:與命令反方向;

(3) 查找並替換
s: 在末行模式下完成查找替換操做
s/要查找的內容/替換爲的內容/修飾符
要查找的內容:可以使用模式
替換爲的內容:不能使用模式,但可使用\1, \2, ...等後向引用符號;還可使用「&」引用前面查找時查找到的整個內容;
修飾符:
i: 忽略大小寫
g: 全局替換;默認狀況下,每一行只替換第一次出現;

查找替換中的分隔符/可替換爲其它字符,例如
s@@@
s###

練習:
一、複製/etc/grub2.cfg至/tmp/目錄,用查找替換命令刪除/tmp/grub2.cfg文件中的行首的空白字符;
%s/^[[:space:]]\+//g

二、複製/etc/rc.d/init.d/functions文件至/tmp目錄,用查找替換命令爲/tmp/functions的每行開頭爲空白字符的行的行首添加一個#號;
:%s/^[[:space:]]/#&/

多文件模式:
vim FILE1 FILE2 FILE3 ...
:next 下一個
:prev 前一個
:first 第一個
:last 最後一個

:wall 保存全部
:qall 退出全部

窗口分隔模式:
vim -o|-O FILE1 FILE2 ...
-o: 水平分割
-O: 垂直分割

在窗口間切換:Ctrl+w, Arrow

單文件窗口分割:
Ctrl+w,s: split, 水平分割
Ctrl+w,v: vertical, 垂直分割

定製vim的工做特性:
配置文件:永久有效
全局:/etc/vimrc
我的:~/.vimrc

末行:當前vim進程有效

(1) 行號
顯示:set number, 簡寫爲set nu
取消顯示:set nonumber, 簡寫爲set nonu
(2) 括號匹配
匹配:set showmatch, 簡寫爲set sm
取消:set nosm
(3) 自動縮進
啓用:set ai
禁用:set noai
(4) 高亮搜索
啓用:set hlsearch
禁用:set nohlsearch
(5) 語法高亮
啓用:syntax on
禁用:syntax off
(6) 忽略字符的大小寫
啓用:set ic
不忽略:set noic

獲取幫助:
:help
:help subject

問題:如何設置tab縮進爲4個字符?

練習:
一、複製/etc/rc.d/init.d/functions文件至/tmp目錄;替換/tmp/functions文件中的/etc/sysconfig/init爲/var/log;
二、刪除/tmp/functions文件中全部以#開頭,且#後面至少有一個空白字符的行的行首的#號;

bash條件測試:

測試方式:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]

測試表達式的類別:
數值比較
字符串測試
文件測試:
存在性測試
-a FILE
-e FILE: 文件存在性測試,存在爲真,不然爲假;
存在性及類別測試
-b FILE:是否存在且爲塊設備文件;
-c FILE:是否存在且爲字符設備文件;
-d FILE:是否存在且爲目錄文件;
-f FILE:是否存在且爲普通文件;
-h FILE 或 -L FILE:存在且爲符號連接文件;
-p FILE:是否存在且爲命名管道文件;
-S FILE:是否存在且爲套接字文件;
文件權限測試:
-r FILE:是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執行
文件特殊權限測試:
-g FILE:是否存在且擁有sgid權限;
-u FILE:是否存在且擁有suid權限;
-k FILE:是否存在且擁有sticky權限;
文件大小測試:
-s FILE: 是否存且非空;
文件是否打開:
-t fd: fd表示文件描述符是否已經打開且與某終端相關


-N FILE:文件自動上一次被讀取以後是否被修改過;
-O FILE:當前有效用戶是否爲文件屬主;
-G FILE:當前有效用戶是否爲文件屬組;

雙目測試:
FILE1 -ef FILE2: FILE1與FILE2是否指向同一個設備上的相同inode

FILE1 -nt FILE2: FILE1是否新於FILE2;
FILE1 -ot FILE2: FILE1是否舊於FILE2;

組合測試條件:
邏輯運算:
第一種方式:
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
! COMMAND

[ -e FILE ] && [ -r FILE ]

第二種方式:
EXPRESSION1 -a EXPRESSION2
EXPRESSION1 -o EXPRESSION2
! EXPRESSION

必須使用測試命令進行;

# [ -z "$hostName" -o "$hostName"=="localhost.localdomain" ] && hostname www.magedu.com
# [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

回顧:
vim編輯器、條件測試之文件測試、組合測試條件

vim:
編輯模式、輸入模式、末行模式、可視化模式

跳轉:h,j,k,l,w,b,e,),(,},{, G, ^, 0, $
編輯:x, r, c, d, y, p, u, ctrl+r
查找: /, ?, n, N
查找替換: s
s///
g:
i:
末行定界:
#
m,n
m,+#
.
$
/pat1/
/pat1/,/pat2/
%

文件測試:
單目:-e, -f, -d, -b, -c, -L, -P, -S, -r, -w, -x, -s
雙目:-nt, -ot

組合測試:-a, -o, !


文件查找:
在文件系統上查找符合條件的文件;

文件查找:locate, find
非實時查找(數據庫查找):locate
實時查找:find

locate:
依賴於事先構建的索引;索引的構建是在系統較爲空閒時自動進行(週期性任務);手動更新數據庫(updatedb);

索引構建過程須要遍歷整個根文件系統,極消耗資源;

工做特色:
查找速度快;
模糊查找;
非實時查找;

locate KEYWORD

find:
實時查找工具,經過遍歷指定路徑下的文件系統完成文件查找;

工做特色:
查找速度略慢;
精確查找;
實時查找;

語法:
find [OPTION]... [查找路徑] [查找條件] [處理動做]
查找路徑:指定具體目標路徑;默認爲當前目錄;
查找條件:指定的查找標準,能夠文件名、大小、類型、權限等標準進行;默認爲找出指定路徑下的全部文件;
處理動做:對符合條件的文件作什麼操做;默認輸出至屏幕;

查找條件:
根據文件名查找:
-name "文件名稱":支持使用glob
*, ?, [], [^]
-iname "文件名稱":不區分字母大小寫

-regex "PATTERN":以PATTERN匹配整個文件路徑字符串,而不只僅是文件名稱;

根據屬主、屬組查找:
-user USERNAME:查找屬主爲指定用戶的文件;
group GRPNAME: 查找屬組爲指定組的文件;

-uid UserID:查找屬主爲指定的UID號的文件;
-gid GroupID:查找屬組爲指定的GID號的文件;

-nouser:查找沒有屬主的文件;
-nogroup:查找沒有屬組的文件;

根據文件類型查找:
-type TYPE:
f: 普通文件
d: 目錄文件
l: 符號連接文件
s:套接字文件
b: 塊設備文件
c: 字符設備文件
p: 管道文件

組合條件:
與:-a
或:-o
非:-not, !

!A -a !B = !(A -o B)
!A -o !B = !(A -a B)

找出/tmp目錄下,屬主不是root,且文件名不是fstab的文件;
find /tmp \( -not -user root -a -not -name 'fstab' \) -ls
find /tmp -not \( -user root -o -name 'fstab' \) -ls

根據文件大小來查找:
-size [+|-]#UNIT
經常使用單位:k, M, G

#UNIT: (#-1, #]
-#UNIT:[0,#-1]
+#UNIT:(#,oo)

根據時間戳:
以「天」爲單位;
-atime [+|-]#,
#: [#,#+1)
+#: [#+1,oo]
-#: [0,#)
-mtime
-ctime

以「分鐘」爲單位:
-amin
-mmin
-cmin

根據權限查找:
-perm [/|-]MODE
MODE: 精確權限匹配
/MODE:任何一類(u,g,o)對象的權限中只要能一位匹配便可;
-MODE:每一類對象都必須同時擁有爲其指定的權限標準;

處理動做:
-print:默認的處理動做,顯示至屏幕;
-ls:相似於對查找到的文件執行「ls -l」命令;
-delete:刪除查找到的文件;
-fls /path/to/somefile:查找到的全部文件的長格式信息保存至指定文件中;
-ok COMMAND {} \; 對查找到的每一個文件執行由COMMAND指定的命令;
對於每一個文件執行命令以前,都會交互式要求用戶確認;
-exec COMMAND {} \; 對查找到的每一個文件執行由COMMAND指定的命令;
{}: 用於引用查找到的文件名稱自身;

注意:find傳遞查找到的文件至後面指定的命令時,查找到全部符合條件的文件一次性傳遞給後面的命令;
有些命令不能接受過多參數,此時命令執行可能會失敗;另外一種方式可規避此問題:
find | xargs COMMAND

練習:
一、查找/var目錄下屬主爲root,且屬組爲mail的全部文件或目錄;
# find /var -user root -group mail

二、查找/usr目錄下不屬於root、bin或hadoop的全部文件或目錄;
# find /usr -not -user root -a -not -user bin -a -not -user hadoop
# find /usr -not \( -user root -o -user bin -o -user hadoop \)

三、查找/etc目錄下最週一周內其內容修改過,同時屬主不爲root,也不是hadoop的文件或目錄;
# find /etc -mtime -7 -a -not -user root -a -not -user hadoop
# find /etc/ -mtime -7 -a -not \( -user root -o -user hadoop \)

四、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件或目錄;
# find / -nouser -a -nogroup -a -atime -7

五、查找/etc目錄下大於1M且類型爲普通文件的全部文件;
# find /etc -size +1M -type f


六、查找/etc目錄下全部用戶都沒有寫權限的文件;
# find /etc -not -perm /222

七、查找/etc目錄下至少有一類用戶沒有執行權限的文件;
# find /etc -not -perm -111

八、查找/etc/init.d目錄下,全部用戶都有執行權限,且其它用戶有寫權限的文件;
# find /etc/init.d -perm -113

Linux文件系統上的特殊權限

SUID, SGID, Sticky

1 權限
r, w, x

user, group, other

2 安全上下文
前提:進程有屬主和屬組;文件有屬主和屬組;
(1) 任何一個可執行程序文件能不能啓動爲進程:取決發起者對程序文件是否擁有執行權限;
(2) 啓動爲進程以後,其進程的屬主爲發起者;進程的屬組爲發起者所屬的組;
(3) 進程訪問文件時的權限,取決於進程的發起者:
(a) 進程的發起者,同文件的屬主:則應用文件屬主權限;
(b) 進程的發起者,屬於文件的屬組;則應用文件屬組權限;
(c) 應用文件「其它」權限;

3 SUID
(1) 任何一個可執行程序文件能不能啓動爲進程:取決發起者對程序文件是否擁有執行權限;
(2) 啓動爲進程以後,其進程的屬主爲原程序文件的屬主;

權限設定:
chmod u+s FILE...
chmod u-s FILE...

4 SGID
默認狀況下,用戶建立文件時,其屬組爲此用戶所屬的基本組;
一旦某目錄被設定了SGID,則對此目錄有寫權限的用戶在此目錄中建立的文件所屬的組爲此目錄的屬組;

權限設定:
chmod g+s DIR...
chmod g-s DIR...

5 Sticky
對於一個多人可寫的目錄,若是設置了sticky,則每一個用戶僅能刪除本身的文件;

權限設定:
chmod o+t DIR...
chmod o-t DIR...

SUID SGID STICKY
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7

chmod 4777 /tmp/a.txt

幾個權限位映射:
SUID: user, 佔據屬主的執行權限位;
s: 屬主擁有x權限
S:屬主沒有x權限
SGID: group, 佔據group的執行權限位;
s: group擁有x權限
S:group沒有x權限
Sticky: other, 佔據ohter的執行權限位;
t: other擁有x權限
T:other沒有x權限


bash腳本編程:
過程式編程語言:
順序執行
選擇執行
循環執行

選擇執行:
if 判斷條件
then
條件爲真的分支代碼
fi

if 判斷條件; then 條件爲真的分支代碼 else 條件爲假的分支代碼 fi

相關文章
相關標籤/搜索