Linux 基礎
Linux 開始
虛擬機 Linux 準備工作
Linux 安裝步驟
- 選擇稍後安裝
- 網絡類型選擇 NAT
- 修改最大磁盤大小(這裏最大磁盤大小指給虛擬機分配的,但不真正使用不是這麼多)
注意: Linux 版本根據自己的Linux 版本選擇。列如:我這用的是 CentOS-6.5-x86_64-minimal.iso,
所以選擇 Linux 版本時選擇時 Centos 64位
- 添加 ISO 鏡像文件,之後開啓虛擬機即可
- 選擇編輯虛擬機設置
2. 掛載 iso 鏡像文件
-
虛擬機安裝配置(若特殊說明,則選擇默認即可)
-
跳過磁盤檢查,否則磁盤檢查時間會很長
-
語言、鍵盤都選擇英文即可。
-
選擇第一個
-
選擇 yes,discard any data
-
自定義 Linux 虛擬機名稱
-
選擇時區
-
密碼設置要簡單、透明(大家都知道的,不屬於個人重要密碼)
-
自定義磁盤分區
-
注意事項:
- VM 安裝選擇自定義安裝,便於之後的自定義硬件配置(如:磁盤大小等)
- 語言、鍵盤都選擇英文
- 時區選擇亞洲/上海
- 密碼設置要簡單透明
- 磁盤需要手動分區 boot(200MB) swap(2G) /(剩餘所有)
Linux 靜態 IP 設置
# 設置靜態 IP
# 編輯 vi /etc/sysconfig/network-scripts/ifcfg-eth0
[root@node01 network-scripts]# cd /etc/sysconfig/network-scripts/
[root@node01 network-scripts]# vi ifcfg-eth0
# ifcfg-eth0 網卡配置,使用打開後編輯,
# ONBOOT=on 開機自啓
# BOOTPROTO=static 表示 IP 使用靜態IP
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.170.101
NETMASK=255.255.255.0
GATEWAY=192.168.170.2
DNS1=144.144.144.144
DNS2=8.8.8.8
# 刪除 rm -f 70-persistent-net.rules
# 70-persistent-net.rules 該文件的作用是將 IP 地址與 MAC 地址綁定
[root@node01 etc]# cd /etc/udev/rules.d/
[root@node01 rules.d]# ll
total 16
-rw-r--r--. 1 root root 316 Nov 22 2013 60-raw.rules
-rw-r--r--. 1 root root 789 Sep 21 19:33 70-persistent-cd.rules
-rw-r--r--. 1 root root 420 Sep 21 19:28 70-persistent-net.rules
-rw-r--r--. 1 root root 54 Dec 8 2011 99-fuse.rules
[root@node01 rules.d]# rm -f 70-persistent-net.rules
# 關機
poweroff
# 修改主機名
[root@node01 ~]# vi /etc/sysconfig/network
# 編輯 network 文件
NETWORKING=yes
HOSTNAME=node01
Linux 網絡配置文件位置
文件位置 | 文件作用說明 |
---|---|
/etc/sysconfig/network-scripts/ifcfg-eth0 | 配置靜態 IP 地址 |
/etc/udev/rules.d/70-persistent-net.rules | 將 IP 地址與 MAC 地址綁定 |
/etc/sysconfig/network | 配置主機名 |
使用 VM 軟件 記錄快照
Linux 關機和重啓命令
關機 | 重啓 |
---|---|
poweroff | reboot |
init 0 | init 6 |
Linux 常用命令
命令 | 作用 |
---|---|
ls | 顯示目錄內容 ll --i |
pwd | 顯示當前目錄的絕對路徑 |
cd | 切換目錄 |
mkdir | 文件夾 -p {} |
cp | 複製 -r |
mv | 移動 |
touch | 創建文件夾、文件 |
type 命令名 | 查看指定命令的文件的存放位置 外部命令 & 內部命令 |
cat | 查看文件內容 |
file | 查看文件詳細信息 (ELF 表示二進制文件) |
echo | 回聲,打印標椎輸出 echo $PATH 查看環境變量路徑 echo $$ 當前shell的PID |
help | 查看內部命令 |
man | 查看外部命令命令 |
whereis | 定位命令位置 |
hash | 查看 hash 表 |
ps -ef | 查看當前進程信息 |
df -h | 顯示文件系統使用情況[甩鍋] |
du -h | 查看某種文件使用狀況[甩鍋] |
mount/unmout | 掛載/卸載磁盤文件 |
ls 命令
文件類型:
-:普通文件 (f)
d: 目錄文件
b: 塊設備文件 (block)
c: 字符設備文件 (character)
l: 符號鏈接文件(symbolic link file)
p: 命令管道文件(pipe)
s: 套接字文件(socket)
文件權限:9位,每3位一組,3組 權限(U,G,O)每一組:rwx(讀,寫,執行), r–
文件硬鏈接的次數
文件的屬主(owner)
文件的屬組(group)
文件大小(size),單位是字節
時間戳(timestamp):最近一次被修改的時間
訪問:access
修改:modify,文件內容發生了改變
改變:change,metadata,元數據
使用 ls 同時展示多個目錄
[root@node01 god]# ls ~ /usr/local
/root:
anaconda-ks.cfg install.log install.log.syslog
/usr/local:
bin etc games include lib lib64 libexec sbin share src
使用 mkdir 命令同時創建多個文件夾
[root@node01 c]# mkdir Hello/{a,b,c}A -p
[root@node01 c]# ll
total 4
drwxr-xr-x. 5 root root 4096 Sep 22 00:45 Hello
[root@node01 c]# cd Hello
[root@node01 Hello]# ll
total 12
drwxr-xr-x. 2 root root 4096 Sep 22 00:45 aA
drwxr-xr-x. 2 root root 4096 Sep 22 00:45 bA
drwxr-xr-x. 2 root root 4096 Sep 22 00:45 cA
查看文件系統和文件使用情況
[root@node01 /]# du -h /etc/udev
4.0K /etc/udev/makedev.d
20K /etc/udev/rules.d
32K /etc/udev
[root@node01 /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 97G 842M 91G 1% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 194M 28M 157M 15% /boot
/dev/sr0 398M 398M 0 100% /mnt
使用硬鏈接和軟鏈接
- 硬鏈接類似於拷貝,即使原文件被刪除了,硬鏈接生成文件仍可使用
ln --l 原文件名 硬鏈接文件名
- 軟鏈接,原文件刪除了,軟鏈接生成文件不可使用
ln -s 原文件名 軟鏈接文件名
安裝 man 命令
yum install man man-pages
Linux命令執行流程
用戶通過客戶端命令行輸入命令以及命令參數, bash 解釋器會根據空白符切割,得到的第一個元素,作爲命令 command。通過判斷該 command 命令是外部命令還是內部命令,若內部命令,則由 bash 執行器直接執行。若是外部命令,則 根據 $PATH 中給定的目錄中從左向右尋找該命令文件的可執行程序文件,然後由 bash 執行器執行。
[root@node01 ~]# type ls
ls is aliased to `ls --color=auto'
[root@node01 ~]# type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
[root@node01 ~]# type ifconfig
ifconfig is /sbin/ifconfig
[root@node01 ~]# file /sbin/ifconfig
/sbin/ifconfig: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
[root@node01 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@node01 ~]# type yum
yum is hashed (/usr/bin/yum)
[root@node01 ~]# file /usr/bin/yum
/usr/bin/yum: a /usr/bin/python script text executable
小技巧:使用 xshell 登錄 Linux ssh root:[email protected]
ssh 用戶名:密碼@IP地址
Linux 文件系統
boot 目錄的掛載與卸載
[root@node01 /]# umount /boot
[root@node01 /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 97G 842M 91G 1% /
tmpfs 491M 0 491M 0% /dev/shm
[root@node01 /]# mount /dev/sda1 /boot
[root@node01 /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 97G 842M 91G 1% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 194M 28M 157M 15% /boot
File System Hierarchy Standard
文件系統層次化標準
目錄 | |
---|---|
/boot | 系統啓動相關的文件,如內核、initrd,以及grub(bootloader) |
/dev | 設備文件 |
/etc | 配置文件 |
/home | 用戶的家目錄,每一個用戶的家目錄通常默認爲/home/USERNAME |
/root | 管理員的家目錄 |
/lib | 庫文件 |
/media | 掛載點目錄,移動設備 |
/mnt | 掛載點目錄,額外的臨時文件系統 |
/opt | 可選目錄,第三方程序的安裝目錄 |
/proc | 僞文件系統,跟硬件設備相關的屬性映射文件 |
/sys | 臨時文件, /var/tmp |
/tmp | 可變化的文件 |
/bin | 可執行文件, 用戶命令 |
/sbin | 管理命令 |
系統啓動必須:
-
**/boot:**存放的啓動Linux 時使用的內核文件,包括連接文件以及鏡像文件。
-
/etc:存放所有的系統需要的配置文件和**子目錄列表,**更改目錄下的文件可能會導致系統不能啓動。
-
/lib:存放基本代碼庫(比如c++庫),其作用類似於Windows裏的DLL文件。幾乎所有的應用程序都需要用到這些共享庫。
-
/sys: 這是linux2.6內核的一個很大的變化。該目錄下安裝了2.6內核中新出現的一個文件系統 sysfs 。sysfs文件系統集成了下面3種文件系統的信息:針對進程信息的proc文件系統、針對設備的devfs文件系統以及針對僞終端的devpts文件系統。該文件系統是內核設備樹的一個直觀反映。當一個內核對象被創建的時候,對應的文件和目錄也在內核對象子系統中
指令集合:
-
**/bin:**存放着最常用的程序和指令
-
**/sbin:**只有系統管理員能使用的程序和指令。
外部文件管理:
-
**/dev :**Device(設備)的縮寫, 存放的是Linux的外部設備。**注意:**在Linux中訪問設備和訪問文件的方式是相同的。
-
/media:類windows的**其他設備,**例如U盤、光驅等等,識別後linux會把設備放到這個目錄下。
-
/mnt:臨時掛載別的文件系統的,我們可以將光驅掛載在/mnt/上,然後進入該目錄就可以查看光驅裏的內容了。
臨時文件:
-
/run:是一個臨時文件系統,存儲系統啓動以來的信息。當系統重啓時,這個目錄下的文件應該被刪掉或清除。如果你的系統上有 /var/run 目錄,應該讓它指向 run。
-
/lost+found:一般情況下爲空的,系統非法關機後,這裏就存放一些文件。
-
/tmp:這個目錄是用來存放一些臨時文件的。
賬戶:
-
/root:系統管理員的用戶主目錄。
-
/home:用戶的主目錄,以用戶的賬號命名的。
-
/usr:用戶的很多應用程序和文件都放在這個目錄下,類似於windows下的program files目錄。
-
**/usr/bin:**系統用戶使用的應用程序與指令。
-
**/usr/sbin:**超級用戶使用的比較高級的管理程序和系統守護程序。
-
**/usr/src:**內核源代碼默認的放置目錄。
運行過程中要用:
-
/var:存放經常修改的數據,比如程序運行的日誌文件(/var/log 目錄下)。
-
/proc:管理**內存空間!**虛擬的目錄,是系統內存的映射,我們可以直接訪問這個目錄來,獲取系統信息。這個目錄的內容不在硬盤上而是在內存裏,我們也可以直接修改裏面的某些文件來做修改。
擴展用的:
-
/opt:默認是空的,我們安裝額外軟件可以放在這個裏面。
-
/srv:存放服務啓動後需要提取的數據**(不用服務器就是空)**
掛載 cdrom 到 /mnt 目錄下
mount /dev/cdrom /mnt
文本操作命令
command | 作用 |
---|---|
cat | 顯示全部文本文件內容 |
more | 逐頁顯示文本文件內容 |
less | 一次性讀取全部文件內容,相比more,可以往回看 |
head | 顯示前 n 行的內容 |
tail | 顯示後 n 行的內容 |
| | 管道 |
xargs |
使用 head 和 tail 命令遍歷每行
[root@node01 god]# cat profile | head -3 | tail -1
# System wide environment and startup programs, for login setup
xargs 用法
[root@node01 god]# echo "/" |xargs ls -l
total 90
dr-xr-xr-x. 2 root root 4096 Sep 21 19:29 bin
dr-xr-xr-x. 5 root root 1024 Sep 21 19:29 boot
drwxr-xr-x. 18 root root 3680 Sep 21 22:21 dev
# ....
vi 全屏文本編輯器
打開方式
vim /path/to/somefile
vim +# :打開文件,並定位於第#行
vim +:打開文件,定位至最後一行
vim +/PATTERN : 打開文件,定位至第一次被PATTERN匹配到的行的行首
關閉文件
末行模式:
:q 退出 沒有動過文件
:wq 保存並退出 動過了,不後悔
:q! 不保存並退出 動過了,後悔了
:w 保存
:w! 強行保存
:wq --> :x
ZZ: 保存並退出 不需要冒號,編輯模式 # 重點*
三種模式
按鍵具有編輯文本功能:默認打開進入編輯模式
輸入模式:按鍵本身意義
末行模式:接受用戶命令輸入
-
編輯模式
#編輯-->輸入: i: 在當前光標所在字符的前面,轉爲輸入模式;* a: 在當前光標所在字符的後面,轉爲輸入模式;* o: 在當前光標所在行的下方,新建一行,並轉爲輸入模式; O:在當前光標所在行的上方,新建一行,並轉爲輸入模式; I:在當前光標所在行的行首,轉換爲輸入模式 A:在當前光標所在行的行尾,轉換爲輸入模式 輸入-->編輯: ESC #編輯-->末行: : #末行-->編輯: ESC, ESC
#移動光標 字符 h: 左;j: 下;k: 上;l: 右 # 單詞 w: 移至下一個單詞的詞首* e: 跳至當前或下一個單詞的詞尾 b: 跳至當前或前一個單詞的詞首 # 行內 0: 絕對行首 ^: 行首的第一個非空白字符* $: 絕對行尾* # 行間 G:文章末尾 3G:第3行 gg:文章開頭 # 翻屏 ctrl:f,b # 刪除&替換單個字符 x:刪除光標位置字符 3x:刪除光標開始3個字符 r:替換光標位置字符 # 刪除命令 : d dw,dd # 複製粘貼&剪切 yw(複製一個詞),yy(複製一行) p(向下粘貼) P(向上粘貼) # 撤銷&重做 u 撤銷* ctrl+r 重做 撤銷的操作* . 重複上一步的操作
-
末行模式 (進入末行模式 shirt+: )
set:設置 set nu number set nonu nonumber set readonly /:查找 /after n(向下查找),N(向上查找) ?向上查找 !:執行命令 :!ls -l / s查找並替換 s/str1/str2/gi /:臨近s命令的第一個字符爲邊界字符:/,@,# g:一行內全部替換(若沒有選擇,則替換當前行的第一個替換) i:忽略大小寫 範圍 n:行號 .:當前光標行 +n:偏移n行 $:末尾行,$-3 %:全文 # 替換查找從當前光標處,到文件末尾處 eg: .,$s/str1/str2/gi
末行模式小技巧
編輯模式下 :
:Gd 清空內容
:.,$d 刪除從當前光標到末尾所有行
:n,md 刪除從第 n 行到 m 行的所有內容
:n,my 複製從第 n 行到 m 行的所有內容
正則表達式
grep:顯示匹配行
- v:反顯示
- e:使用擴展正則表達式
匹配操作符
\ 轉義字符
. 匹配任意單個字符
[1249a],[^12],[a-k] 字符序列單字符佔位
^ 行首
$ 行尾
\<,\>:\<abc 單詞首尾邊界*
| 連接操作符
(,) 選擇操作符
\n 反向引用
重複操作符:
? 匹配0到1次。
* 匹配0到多次。
+ 匹配1到多次。
{n} 匹配n次。
{n,} 匹配n到多次。
{n,m} 匹配n到m次。
與擴展正則表達式的區別:grep basic
\?, \+, \{, \|, \(, and \)
匹配任意字符
.*
注意:在未擴展正則表達式時,若匹配規則中含有 ?,+,{,},|,(,) ,都需要通過 \ 轉義,否則匹配不到
查詢文章中包括4位整數的行
grep -E "([^0-9][0-9]|^[0-9])([0-9]{2})([0-9][^0-9]|[0-9]$)" grep.txt
查看指定單詞
grep “\<單詞名\>” file
反向引用
[root@node01 god]# grep -E ".*(god).*(good).*\2.*\1" test
asgodssgoodsssagoodssgod
[root@node01 god]# grep -E ".*(god).*(good).*\1.*\2" test
asgodssgoodsssagodssgood
文本處理
cut 命令
cut:顯示切割的行數據
f:選擇顯示的列
s:不顯示沒有分隔符的行
d:自定義分隔符
測試
[root@node01 god]# cut -d' ' -s -f1-3 grep.txt
ooxx 12121212
oox 12121212
1212 ooxx 1212
[root@node01 god]# cut -d' ' -f1,2,3 grep.txt
ooxx12121212ooxx
ooxx 12121212
oox 12121212
1212 ooxx 1212
oo3xx
oo4xx
ooWxx
oomxx
$ooxx
oo1234xx
ooxyzxx
sort命令
sort:排序文件的行
n:按數值排序
r:倒序
t:自定義分隔符
k:選擇排序列
u:合併相同行
f:忽略大小寫
[root@node01 god]# sort -k2 -n -r fruits.txt
orange--27
banana--15
apple--20
apple--20
[root@node01 god]# sort -k2 -n -r fruits.txt
wc 命令
wc 打印每個文件的換行數、單詞數和字節數
[root@node01 god]# wc fruits.txt
4 4 42 fruits.txt
[root@node01 god]# cat fruits.txt | wc
4 4 42
[root@node01 god]# cat fruits.txt | wc -l
4
統計當前目錄中文件的個數
ls ./ | wc
行編輯器
sed 命令
sed [options] 'AddressCommand' file ...
-n: 靜默模式,不再默認顯示模式空間中的內容
-i: 直接修改原文件*
-e SCRIPT -e SCRIPT:可以同時執行多個腳本
-f /PATH/TO/SED_SCRIPT
-r: 表示使用擴展正則表達式*
d: 刪除符合條件的行;
p: 顯示符合條件的行;
a \string: 在指定的行後面追加新行,內容爲string*
\n:可以用於換行
i \string: 在指定的行前面添加新行,內容爲string*
r FILE: 將指定的文件的內容添加至符合條件的行處
w FILE: 將地址指定的範圍內的行另存至指定的文件中;
s/pattern/string/修飾符: 查找並替換,默認只替換每行中第一次被模式匹配到的字符串*
g: 行內全局替換
i: 忽略字符大小寫
s///: s###, s@@@
\(\), \1, \2 *
sed:行編輯器Address
可以沒有
給定範圍
查找指定行/str/
模糊匹配指定行,並替換
# id:9:initdefault:
sed "s/\(id:\)[0-9]\(:initdefault:\)/\19\2/" inittab
模糊匹配 IP 地址,並替換最後的主機號
sed "s/\(IPADDR=\(\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\).*/\1144/" ifcfg-eth0
[root@node01 god]# num=100
[root@node01 god]# sed "s/\(IPADDR=\(\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-4]\|25[0-5]\)\.\)\{3\}\).*/\1$num/" -i ifcfg-eth0
注意: \.
表示真實的點,不作爲正則匹配中任意字符
awk 命令
awk是一個強大的文本分析工具。
相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤爲強大。
簡單來說awk就是把文件逐行的讀入,(空格,製表符)爲默認分隔符將每行切片,切開的部分再進行各種分析處理。
awk -F '{pattern + action}' {filenames}
支持自定義分隔符
支持正則表達式匹配
支持自定義變量,數組 a[1] a[tom] map(key)
支持內置變量
ARGC 命令行參數個數
ARGV 命令行參數排列
ENVIRON 支持隊列中系統環境變量的使用
FILENAME awk瀏覽的文件名
FNR 瀏覽文件的記錄數
FS 設置輸入域分隔符,等價於命令行 -F選項
NF 瀏覽記錄的域的個數*
NR 已讀的記錄數*
OFS 輸出域分隔符
ORS 輸出記錄分隔符
RS 控制記錄分隔符
支持函數
print、split、substr、sub、gsub
支持流程控制語句,類C語言
if、while、do/while、for、break、continue
#--------------------------------------------------------------------------------#
只是顯示/etc/passwd的賬戶:CUT
awk -F':' '{print $1}' passwd
只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以逗號分割,而且在所有行開始前添加列名name,shell,在最後一行添加"blue,/bin/nosh"(cut,sed)
awk -F':' 'BEGIN{print "name,shell"} {print $1 "," $7} END{print "blue,/bin/nosh"}' passwd
搜索/etc/passwd有root關鍵字的所有行
awk '/root/ { print $0}' passwd
注意:
-
$0 表示一整行內容
-
代碼塊{} 外加單引號,不能是雙引號,即
'{}'
-
awk 默認以空白、TAB作爲分隔符 delimiter,即若以空白、TAB爲分隔號,不需要指定
-F
參數
統計/etc/passwd文件中,每行的行號,每行的列數,對應的完整行內容
awk -F":" 'BEGIN{ print "NR\tNF\tContent" } {print NR "\t" NF "\t" $0 }' passwd
# 結果
NR NF Content
1 7 root:x:0:0:root:/root:/bin/bash
2 7 bin:x:1:1:bin:/bin:/sbin/nologin
3 7 daemon:x:2:2:daemon:/sbin:/sbin/nologin
# ....
打印報表功能
# awk.txt
Tom 0 2012-12-11 car 3000
John 1 2013-01-13 bike 1000
vivi 1 2013-01-18 car 2800
Tom 0 2013-01-20 car 2500
John 1 2013-01-28 bike 3500
# awk.sh
{
split($3,date,"-")
if(date[2] == "01"){
name[$1] += $5 #把名字作爲數組下標,對應的value爲工資
}
if($2 == "0"){
role[$1] = "manager"
}else{
role[$1] = "worker"
}
}
END{
for (i in name){
print i "\t" role[i] "\t" name[i]
}
}
# 使用
[root@node01 god]# awk -f awk.sh awk.txt
vivi worker 2800
Tom manager 2500
John worker 4500
Linux 用戶管理
命令 | 說明 |
---|---|
id | 打印輸出有效用戶的自身的ID 和 所在組的 ID |
useradd | 添加用戶 |
userdel | 刪除用戶 |
groupadd | 添加組 |
groupdel | 刪除組 |
passwd | 設置或修改密碼 |
sudo * | 提升權限 |
su | 切換用戶 |
刪除用戶
若要刪除用戶,再創建同名用戶,需要在創建前刪除原 /home 目錄和 /var/mail 目錄下的內容
[root@node01 /]# userdel god
[root@node01 /]# useradd god
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
Creating mailbox file: File exists
[root@node01 /]# rm -rf /home/god/
[root@node01 /]# useradd god
useradd: user 'god' already exists
[root@node01 /]# rm -fr /var/
cache/ empty/ lib/ lock/ mail/ opt/ run/ tmp/
db/ games/ local/ log/ nis/ preserve/ spool/ yp/
[root@node01 /]# rm -fr /var/mail/god
[root@node01 /]# useradd god
權限
命令 | 說明 |
---|---|
r | 讀權限 r=4 |
w | 寫權限 w=2 |
x | 可執行權限 x=1 |
usermod | 修改用戶權限 |
chown | 修改文件的屬主和屬組 |
chmod | 修改文件操作權限 (RWX) augo |
注意:
-
一個文件只能有一個屬主和一個屬組
-
文件夾的執行權限 x ,表示用戶是否可以進入到該文件夾下
useradd sxt01
passwd sxt01
useradd sxt02
passwd sxt02
mkdir /var/swapdata
1,權限修正:
chmod 770 swapdata | chmod o-rwx g+rwx swapdata
2,修正屬組
groupadd sxtswap
usermod -a -G sxtswap sxt01
usermod -a -G sxtswap sxt02
chown root:sxtswap swapdata
chown :sxtswap ooxx.file
chmod 770 ooxx.file
id username
Linux 編譯安裝
執行順 | 說明 |
---|---|
./configure | 生成編譯依賴關係 |
make | 編譯 |
make install | 新建文件夾、拷貝文件 |
1,下載源碼包
2,解壓縮:tar xf filename
3,cd:vi README
4,./configure
檢查操作系統
檢查編譯環境
yum install gcc
pcre 依賴庫
yum search pcre
yum install pcre-devel
openssl
yum install opssl-devel
./configure --help
./configure --prefix=/opt/sxt/nginx #配置安裝路徑
5,Makefile
6,make
7,make install
8,cd /opt/sxt/nginx/sbin ./nginx
9,瀏覽器訪問測試
10,祝君好運~!
Linux RPM 安裝
Redhat提供了rpm管理體系
已經編譯的軟件包:針對不同的平臺系統編譯目標軟件包
操作系統維護安裝信息
軟件包包含依賴檢查,但還需人爲解決
安裝 rpm 軟件
rpm -ivh xxxx.rpm
rpm 命令使用
rpm安裝:
-ivh filename
--prefix
rpm升級:
-Uvh
-Fvh
rpm卸載:
-e PACKAGE_NAME
# rpm查詢
rpm -qa : 查詢已經安裝的所有包
rpm -q PACKAGE_NAME: 查詢指定的包是否已經安裝
rpm -qi PACKAGE_NAME: 查詢指定包的說明信息
rpm -ql PACKAGE_NAME: 查詢指定包安裝後生成的文件列表
rpm -qc PACEAGE_NEME:查詢指定包安裝的配置文件
rpm -qd PACKAGE_NAME: 查詢指定包安裝的幫助文件
rpm -q --scripts PACKAGE_NAME: 查詢指定包中包含的腳本
rpm -qf /path/to/somefile: 查詢文件是由哪個rpm包安裝生成的
如果某rpm包尚未安裝,需查詢其說明信息、安裝以後會生成的文件
rpm -qpi /PATH/TO/PACKAGE_FILE
rpm -qpl
Linux YUM 安裝
yum 命令
yum命令:
yum repolist
yum clean all
yum makecache
yum update
查詢:
yum list
yum search
yum info
安裝&卸載:
yum install
remove|erase
yum命令:分組
yum grouplist
yum groupinfo
yum groupinstall
yum groupremove
yum groupupdate
更換安裝爲阿里源
# 備份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 下載阿里 yum 源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
# 更新緩存
yum makecache
本地 yum 源
- 爲當前虛擬機掛載鏡像文件
- 操作
# 掛載 cdrom
mount /dev/cdrom /mnt
repo:
/etc/yum.repos.d/
[repoID]
baseurl=
http://
file://
ftp://
#gpgchkeck= 有1和0兩個選擇,分別代表是否是否進行gpg校驗,如果沒有這一項,默認是檢查的。
gpgcheck=1/0
#當某個軟件倉庫被配置成 enabled=0 時,yum 在安裝或升級軟件包時不會將該倉庫做爲軟件包提供源。使用這個選項,可以啓用或禁用軟件倉庫。
enable=0/1
#[base]
name=local
failovermethod=priority
baseurl=file:///mnt
gpgcheck=1
enable=1
注意: 若包名中間包括空格,一定使用雙引號括起來
中文顯示,查看中文文檔
# yum 的 repo 變成aliyun || 本地DVD
yum grouplist
yum groupinstall "Chinese Support"
echo $LANG
en_US.UTF-8
LANG=zh_CN.UTF-8
#增加epel的repo:
http://mirrors.aliyun.com
epel>>>>>help
wget centos6.......
yum clean all
yum makecache
yum search man-pages
yum install man man-pages man-pages-zh-CN
【【【【 man bash 】】】】
文本流
變量
引用&命令替換
退出狀態&邏輯判斷
表達式
流程控制
重定向:不是命令
程序自身都有I/O
0:標準輸入
1:標準輸出
2:錯誤輸出
控制程序I/O位置
一切皆文件
/proc/$$/fd
程序是否處理I/O?
綁定順序:從左到右
輸出重定向
輸出重定向 | 說明 |
---|---|
1>xxx |
標準輸出覆蓋重定向 |
1>>xxx |
標準輸出追加重定向 |
2>xxx |
錯誤覆蓋重定向 |
2>>xxx |
錯誤追加重定向 |
>& 或者&> xxx |
向 xxx 文件添加錯誤和標準輸出信息 |
注意: 重定向符號左邊都不能包括空格
[root@node01 god]# ls /yy 2>error
[root@node01 god]# ll
total 8
-rw-r--r--. 1 root root 140 Sep 22 22:39 a
-rw-r--r--. 1 root root 49 Sep 22 22:40 error
[root@node01 god]# cat error
ls: cannot access /yy: No such file or directory
[root@node01 god]# ls /123 2>>error
[root@node01 god]# cat error
ls: cannot access /yy: No such file or directory
ls: cannot access /123: No such file or directory
[root@node01 god]# ls / /suibian 1>ls02.out 2>&1
[root@node01 god]# cat ls02.out
ls: cannot access /suibian: No such file or directory
/:
abc
bin
# ... 省略
[root@node01 god]# ls / /suibian >& ls01.out
[root@node01 god]# cat ls01.out
ls: cannot access /suibian: No such file or directory
/:
abc
bin
boot
# ... 省略
注意: 若一條命令中既包括錯誤輸出,也包括正確輸出,則先輸出錯誤輸出
輸入重定向
輸入重定向 | 說明 |
---|---|
<<< |
從字符串中讀取輸入 |
<<E |
從鍵盤中讀取輸入,E表示結束符 |
< |
從文件中讀取輸入 |
[root@node01 god]# read aaa <<<"HelloWord"
[root@node01 god]# echo $aaa
HelloWord
[root@node01 god]# read aaa<<GG
> ljasf
> ajlsdfj;la
> ;ajdfkl
> GG #跟 GG 一樣,表示輸入退出
[root@node01 god]# echo $aaa
ljasf
# input.sh 腳本
cat <<AABB
print error info
AABB
echo "you know me .."
# 執行
source input.sh
[root@node01 god]# cat 0< /etc/in
init/ init.d/ inittab inputrc
[root@node01 god]# cat 0< /etc/inittab
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
全重定向
exec 8<> /dev/tcp/www.baidu.com/80
echo -e "GET / HTTP/1.0\n" >& 8
cat <& 8
Shell 編程
bash
shell bash
解釋器,啓動器
解釋器:
用戶交互輸入
文本文件輸入*
腳本本質:
#! /bin/bash
#! /usr/bin/python
讀取方式:
當前shell:source/.
新建子shell:/bin/bash file / ./file.sh 《chmod +x file.sh》
執行方式 | 說明 |
---|---|
source xxx.sh | 在當前 bash 中執行腳本 |
./xxx.sh | 開啓一個子 bash 執行腳本 |
注意:在不同 bash 中執行的結果有可能不相同,即要理清父子 bash 之間的關係
[root@node01 sh]# echo $$
1132
[root@node01 sh]# source sh01.sh
abc boot etc lib lost+found mnt proc sbin share sys usr
bin dev home lib64 media opt root selinux srv tmp var
Hello World
1132
init─┬─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─master─┬─pickup
│ └─qmgr
├─6*[mingetty]
├─rsyslogd───3*[{rsyslogd}]
├─sshd───sshd───bash───pstree
└─udevd───2*[udevd]
[root@node01 sh]# ./sh01.sh
abc boot etc lib lost+found mnt proc sbin share sys usr
bin dev home lib64 media opt root selinux srv tmp var
Hello World
1296
init─┬─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─master─┬─pickup
│ └─qmgr
├─6*[mingetty]
├─rsyslogd───3*[{rsyslogd}]
├─sshd───sshd───bash───bash───pstree
└─udevd───2*[udevd]
變量
類型 | 作用 |
---|---|
本地變量 | 作用於當前 bash 中 |
局部變量 | local,只作用於當前代碼塊 |
位置變量 | $1 ,$2, ,從腳本文件後,讀取參數 |
特殊變量 | $# : 位置參數個數$* : 參數列表,雙引號引用爲一個字符串$@ : 參數列表,雙引號引用爲單獨的字符串$$ :當前 shell 的 PID:接收者$BASHPID :真實管道 * $?:上一個命令退出狀態 - 0 成功 -other: 失敗 |
環境變量 | - export 定義變量 - 導出到子 shell - fork() Copy On Write 時間複雜度 O(1) 適用用於函數 unset: 取消變量 set: 查看shell 的變量 |
[root@node01 sh]# num=1
[root@node01 sh]# myfunc(){
> echo $num
> echo HelloWorld
> }
[root@node01 sh]# myfunc
1
HelloWorld
# 本地變量 local
[root@node01 sh]# myfunc(){
> local fun=1
> echo $fun
> echo ok
> }
[root@node01 sh]# myfunc
1
ok
[root@node01 sh]# echo $fun
# -------------------------------
# 位置參數
[root@node01 sh]# cat sh02.sh
echo $1
echo $2
[root@node01 sh]# vi sh02.sh
[root@node01 sh]# source sh02.sh 1 2
1
2
# 特殊參數
[root@node01 sh]# cat sh02.sh
echo $1
echo $2
echo ${11}
echo "---------"
echo {'position parameters:'}$#
echo $@
[root@node01 sh]# source sh02.sh a b c d e f j h k m n o
a
b
n
---------
{position parameters:}12
a b c d e f j h k m n o
#查看上一個命令的執行狀態
[root@node01 sh]# ls /
abc bin boot dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux share srv sys tmp usr var
[root@node01 sh]# echo $?
0
[root@node01 sh]# ls /asf
ls: cannot access /asf: No such file or directory
[root@node01 sh]# echo $?
2
# 數組使用
[root@node01 sh]# arr=(1 2 3)
[root@node01 sh]# echo $arr[1]
1[1]
[root@node01 sh]# echo ${arr[1]}
2
[root@node01 sh]# echo ${arr[0]}
1
[root@node01 sh]# echo ${arr[2]}
3
# 變量與其他字符串的拼接,需要使用花括號 {},標識爲變量
[root@node01 sh]# num=1
[root@node01 sh]# echo $num1231
[root@node01 sh]# echo ${num}111
1111
# 管道--管道兩邊分爲在兩個子 bash 中, 子 bash 可以使用父 bash 中的引用
[root@node01 sh]# dd=1
[root@node01 sh]# dd=10 | echo $dd
1
# export 導入不共享
[root@node01 sh]# cat sh04.sh
echo $k
echo "-------------"
sleep 10
echo $k
[root@node01 sh]# export k=5
[root@node01 sh]# ./sh04.sh & # $ 表示在後臺運行
[1] 1729
[root@node01 sh]# 5
-------------
^C
[root@node01 sh]# k=8
[root@node01 sh]# 5
^C
[1]+ Done ./sh04.sh
注意:
- 數組元素之間通過空格分隔,使用逗號分號,bash 會把數組整體當做字符串使用
- export 導出非共享
引用
雙引號:弱引用,參數擴展
單引號:強引用,不可嵌套
花括號擴展不能被引用
命令執行前刪除引用
[root@node01 sh]# kk=12
[root@node01 sh]# echo "$kk"
12
[root@node01 sh]# echo '$kk'
$kk
# 花括號擴展不能被引用
[root@node01 b]# cp "/etc/{passwd,inittab}" ./
cp: cannot stat `/etc/{passwd,inittab}': No such file or directory
命令替換
反引號:`ls -l /`
$(ls -l /)
可以嵌套
[root@node01 sh]# echo "`echo 123`"
123
[root@node01 sh]# abc=$(echo $(echo "sxt"))
[root@node01 sh]# echo $abc
sxt
[root@node01 sh]# abc=$(ls -l /)
[root@node01 sh]# echo $abc
total 98 drwxrw-r-x. 3 root root 4096 Sep 22 13:53 abc dr-xr-xr-x. 2 root root 4096 Sep 22 21:34 bin dr-xr-xr-x. 5 root root 1024 Sep 21 19:29 boot drwxr-xr-x. 18 root root 3680 Sep 22 21:45 dev drwxr-xr-x. 76 root root 4096 Sep 22 21:45 etc drwxr-xr-x. 4 root root 4096 Sep 22 13:04 home dr-xr-xr-x. 8 root root 4096 Sep 22 14:16 lib dr-xr-xr-x. 10 root root 12288 Sep 22 21:34 lib64 drwx------. 2 root root 16384 Sep 21 19:28 lost+found drwxr-xr-x. 2 root root 4096 Sep 23 2011 media drwxr-xr-x. 2 root root 4096 Sep 23 2011 mnt drwxr-xr-x. 2 root root 4096 Sep 23 2011 opt dr-xr-xr-x. 87 root root 0 Sep 22 21:45 proc dr-xr-x---. 5 root root 4096 Sep 23 03:26 root dr-xr-xr-x. 2 root root 12288 Sep 22 17:58 sbin drwxr-xr-x. 7 root root 0 Sep 22 21:45 selinux drwxrwx---. 2 root share 4096 Sep 22 13:51 share drwxr-xr-x. 2 root root 4096 Sep 23 2011 srv drwxr-xr-x. 13 root root 0 Sep 22 21:45 sys drwxrwxrwt. 3 root root 4096 Sep 23 02:02 tmp drwxr-xr-x. 14 root root 4096 Sep 22 17:50 usr drwxr-xr-x. 17 root root 4096 Sep 21 19:28 var
邏輯判斷*
退出狀態
echo $?
邏輯判斷
command1 && command2
command1 || command2
表達式
算術表達式
let 算術運算表達式
let C=$A+$B
$[算術表達式]
C =$[$A+$B]
$((算術表達式))
C=$(($A+$B))
expr 算術表達式
注意:表達式中各操作數及運算符之間要有空格。而且要使用命令引用
C=`expr $A + $B`
help let
[root@node01 sh]# a=1
[root@node01 sh]# b=2
[root@node01 sh]# let c=$a+$b
[root@node01 sh]# echo $c
3
[root@node01 sh]# c=3
[root@node01 sh]# d=4
[root@node01 sh]# e=$(($c+$d))
[root@node01 sh]# echo $e
7
[root@node01 sh]# j=1
[root@node01 sh]# k=2
[root@node01 sh]# c=$((j+k))
[root@node01 sh]# echo $c
3
[root@node01 sh]# echo $a
2
[root@node01 sh]# ((a++))
[root@node01 sh]# echo $a
3
條件表達式
[ expression ]
test expression
[[ expression ]]
help test
[root@node01 sh]# test -a /etc/adf
[root@node01 sh]# echo $?
1
[root@node01 sh]# test -a /etc/password
[root@node01 sh]# echo $?
1
[root@node01 sh]# [ $a -gt $b ]
[root@node01 sh]# echo $?
0
[root@node01 sh]# [3 -gt 2]
-bash: [3: command not found
[root@node01 sh]# [ 3 -gt 2 ]
[root@node01 sh]# echo $?
0
注意: 靠近 [] ,需要有空格間隔
添加用戶腳本
#添加用戶
#用戶密碼同用戶名
#靜默運行腳本
#避免捕獲用戶接口
#程序自定義輸出
#! /bin/bash
[ ! $# -eq 1 ] && echo "args error ! " && exit 3
id $1 >&/dev/null && echo "user exits" && exit 4
useradd $1 >& /dev/null && echo $1 | passwd --stdin $1 >& /dev/null && echo "useradd user success!" && exit 0
echo "don't know, user add error!"
流程控制
if
[test06@node01 sh]$ if [ 3 -gt 1 ]; then echo ok; fi
ok
[test06@node01 sh]$ a=1
[test06@node01 sh]$ b=2
[test06@node01 sh]$ if [ $b -lt $a ];then echo ok;elif [ $b -gt $a ];then echo ojbk;fi
ojbk
[test06@node01 sh]$ if [ $b -lt $a ];then echo lt;else echo gt;fi
gt
while
[test06@node01 sh]$ while ls /;do echo ok;break;done
abc boot etc lib lost+found mnt proc sbin share sys usr
bin dev home lib64 media opt root selinux srv tmp var
ok
[test06@node01 sh]$ a=1
[test06@node01 sh]$ while [ $a -le 5 ];do echo $a;((a++));done
1
2
3
4
5
for
[test06@node01 sh]$ for ((ab=1;ab<5;ab++));do echo ab=$ab;done
ab=1
ab=2
ab=3
ab=4
[test06@node01 sh]$ for i in 1 2 3 4 5;do echo $i;done
1
2
3
4
5
# 用戶給定路徑
# 輸出文件大小最大的文件
# 遞歸子目錄
#! /bin/bash
oldIFS=$IFS
IFS=$'\n'
for i in `du -a $1 | sort -nr`;do
filename=`echo $i | awk '{print $2}'`
if [ -f $filename ];then
echo $filename
break;
fi
done
IFS=$oldIFS
注意: 變量的賦值等於號前面兩邊不能有空格,bash 對空格敏感
循環遍歷文件輸出
#! /bin/bash
oldIFS=$IFS
IFS=$'\n'
num=0
for i in `cat file.txt`;do
echo $i
((num++));
done
#! /bin/bash
oldIFS=$IFS
IFS=$'\n'
num=0
for i in `cat file.txt`;do
echo $i
((num++));
done
echo "num:$num"
IFS=$oldIFS
echo "---------------"
lines=`cat file.txt | wc -l`
for ((i=1;i<=lines;i++));do
echo `head -$i file.txt | tail -1`
((line++))
done
echo "line:$line"
echo "---------------"
num=0
while read line ;do
echo $line
((num++ ))
done < file.txt
echo "num:$num"
echo "-----------------"
num=0
cat file.txt | while read line;do
echo $line
((num++))
done
echo "num:$num"
#### while ####
[test06@node01 sh]$ while ls /;do echo ok;break;done
abc boot etc lib lost+found mnt proc sbin share sys usr
bin dev home lib64 media opt root selinux srv tmp var
ok
[test06@node01 sh]$ a=1
[test06@node01 sh]$ while [ $a -le 5 ];do echo $a;((a++));done
1
2
3
4
5
#### for ####
```shell
[test06@node01 sh]$ for ((ab=1;ab<5;ab++));do echo ab=$ab;done
ab=1
ab=2
ab=3
ab=4
[test06@node01 sh]$ for i in 1 2 3 4 5;do echo $i;done
1
2
3
4
5
# 用戶給定路徑
# 輸出文件大小最大的文件
# 遞歸子目錄
#! /bin/bash
oldIFS=$IFS
IFS=$'\n'
for i in `du -a $1 | sort -nr`;do
filename=`echo $i | awk '{print $2}'`
if [ -f $filename ];then
echo $filename
break;
fi
done
IFS=$oldIFS
注意: 變量的賦值等於號前面兩邊不能有空格,bash 對空格敏感
循環遍歷文件輸出
#! /bin/bash
oldIFS=$IFS
IFS=$'\n'
num=0
for i in `cat file.txt`;do
echo $i
((num++));
done
#! /bin/bash
oldIFS=$IFS
IFS=$'\n'
num=0
for i in `cat file.txt`;do
echo $i
((num++));
done
echo "num:$num"
IFS=$oldIFS
echo "---------------"
lines=`cat file.txt | wc -l`
for ((i=1;i<=lines;i++));do
echo `head -$i file.txt | tail -1`
((line++))
done
echo "line:$line"
echo "---------------"
num=0
while read line ;do
echo $line
((num++ ))
done < file.txt
echo "num:$num"
echo "-----------------"
num=0
cat file.txt | while read line;do
echo $line
((num++))
done
echo "num:$num"