操做系統的功能:
存儲管理、進程和處理機管理、文件管理、設備管理、用戶接口linux
[mengqc@localhost ~]$ 是shell主提示符。其中正則表達式
linux操做系統經常使用命令shell
ls:查看當前目錄下的文件夾數據庫
data:顯示時間apache
cal:顯示日曆windows
passwd:更改密碼數組
cp -f file1 file2:複製文件安全
who:顯示誰在登陸以及時間bash
pwd:查看當前路徑。網絡
man ls :ls的幫助文檔。
>;輸出重定向,若是一個文件存在,刪除後從新創建一個文件。
>>:輸出重定向,若是一個文件存在,則追加到原文件末尾。
cat:打開一個文件
history:打開鍵入的命令列表。
打開後用!+ 編號 便可執行;!!:運行上一個命令;!-n:運行倒數第n個個命令;!cmd:運行cmd開頭的命令。
當敲長命令時,輸入幾個字母+tab鍵,能夠實現移動補充。
linux用戶和組
介紹:登陸用戶是進入Linux的途徑,系統中將用戶看做是32位的二進制數,便是一個userID,用戶信息存儲在/etc/passwd中,root的ID是0;出於安全考慮,顯示密碼的第二個字段顯示爲X,密碼存儲在/etc/shadow文件中。
passwd文件:
用戶名|x|用戶id|用戶2所在組id|備註信息|家|登陸shell
shadow文件:
用戶名:加密密碼:最近更改密碼的日期:密碼不可更改的天數:密碼更改期限前的警告時間:密碼過時的寬限時間:帳號失效日期:保留字段
注:數字是距離1970.1.1多少天到如今
添加用戶useradd、adduser
注:此命令實現了1.給用戶分配最大的id號 二、在passwd文件中添加一行 三、在/home/下建立用戶的家 四、在/etc/group/下添加用戶的組
修改用戶usermod
用戶組:用戶組文件的路徑在/etc/group/下,用戶組也有/etc/gpasswd
group文件內容:groupname:密碼:groupID:用戶列表
gshadow文件內容:gname:password:管路員列表:成員列表
添加用戶組 groupadd
-n 修改用戶組名
groups 注:顯示用戶所屬的用戶組
grpck grpconv 注:經過/etc/group和/etc/gshadow 的文件內容來同步或建立/etc/gshadow ,若是/etc/gshadow 不存在則建立;
grpunconv 注:經過/etc/group 和/etc/gshadow 文件內容來同步或建立/etc/group ,而後刪除gshadow文件;
gpasswd -a 向名爲 group 的組中添加用戶 user
-d 從名爲 group 的組中移除用戶 user。
注:這裏有關組安全的問題須要注意,組密碼是當組中大於一個用戶時,在組安全問題中被提出的,細節以後本身好好看看。
文件和目錄:
普通文件:文本文件 二進制文件 數據文件
目錄文件:I結點/文件名成對存在
i結點:存儲文件相關的屬性
文件名:存儲的是一個字符串,標識該文件
如此作的目的是文件瘦身
設備文件:Linux把設備看做文件,實現設備無關性
符號連接文件:快捷方式
文件控制塊:FCB,在linux中就是I結點
Linux樹狀目錄結構
絕對路徑名:從/下開始,即root目錄下實現絕對目錄
相對路徑名:./表示當前目錄下 ../表示父目錄
工做目錄:用戶的當前目錄
主目錄:註冊用戶是建立的文件時的總目錄,在/home下
改變工做目錄
① 將當前目錄改到/home/liuzh:
$ cd /home/liuzh
② 將當前目錄改到用戶的主目錄:
$ cd 或 cd ~
③ 將當前目錄向上移動兩級:
$ cd ../..
④ 進入cauc的主目錄:
$ cd ~cauc
⑤ 返回剛纔的目錄,即上一個工做目錄
$ cd —
ls命令列出指定目錄的內容
chmod命令
只有文件主或超級用戶root纔有權用chmod命令改變文件或目錄的存取權限。
umask命令:
文件的權限是由666-掩碼實現的
cp
-a:保留組信息
-r :複製子目錄下的文件
-i:交互式複製
-s:複製爲符號連接文件,注意,這裏是賦值爲符號連接文件
rm
-i:交互式刪除
-rf:所有刪除
mv 文件或目錄 文件或目錄
mkdir
-m 700 directory
-p 若是上層目錄不存在也進行建立
rmdir
-p :刪除此目錄以上的全部空目錄
cat
-n 顯示行號
more
-c 清屏
-10 顯示10行
-d 顯示百分比
/字符串:向下搜索字符串
less 分屏顯示文件
group
-g:添加用戶到用戶組
-ag:追加用戶
head
-5 :顯示前5行
-v:顯示文件名
--bytes=-100 :顯示最後一百個字節其餘的全部內容
tail
-5 :顯示最後5行
-n +10 :顯示第10行開始後的全部內容
-c 100 :顯示最後一百個字符
gzip
-r:遞歸壓縮
-dv :解壓文件而且顯示百分比
uzip :解壓zip文件
tar:
-cvzf 歸檔名.tgz 被歸檔的文件
-xvzf .tgz 解壓
注:硬連接和軟連接的區別是什麼???
硬鏈接:建立一個文件的時候,首先在磁盤上申請一塊空間,而後在目錄文件下建立一個文件,這裏面存儲的是文件名+I結點號,這個文件指向內存中建立的i結點,硬鏈接的話,在目錄上新建了一個文件,可是他們指向了同一個i結點,因此她們的i結點號是相同的。
軟連接:建立了一個連接文件,是實實在在的一個屬性爲l的文件,系統分配新的節點號,磁盤中建立一個文件,文件內容是被連接文件的文件目錄,這時候,若是刪除被連接文件,是刪除了文件目錄下的文件名,而軟連接的內容就是定向到這個文件下,因此刪除文件後,軟連接就找不到了。軟鏈接的權限是777。
eval:
將後面的命令,進行相應的變量替換和命令替換,替換的結果做爲一個新的命令行輸出,並執行
例:
[root@localhost etc]# echo $cmd
echo a
[root@localhost etc]# eval $cmd
a
expr
例子: `expr $1 + 1` 注意:運算符先後有空格
[root@localhost /]# set 1
[root@localhost /]# `expr $1 + 1`
bash: 2: command not found
[root@localhost /]# echo `expr $1 + 1`
2
awk
模式:awk 'BEGIN { command } Pattern{ command } END{ command }'
每一行的數據複製給$0 ;一行內空格分開的值從$1開始一次
echo -e "1\n2" | sort -rn | awk '{ x+=$0 ;} END{ print x}'
echo
-e:激活轉義字符
mkfs
進程管理
對於併發的程序,經過fork();生成子進程後,資源是兩個進程之間各賦值了一份,因此兩個進程之間並不影響各進程值的結果。
Linux shell腳本變量的使用
shell有兩種執行命令的方式:
咱們要知道bash和sh不是一個東西,咱們須要瞭解,bash徹底兼容sh,也就是說,用sh寫的腳本能夠不加修改的在bash中執行
編寫shell的通常習慣:
功能;做者;版本信息;歷史記錄;特殊的命令用絕對路勁表示;預先申明和設置腳本運行時的環境變量;
sheel的變量類型:
shell用$來解析shell變量;
變量賦值 :=;=兩邊不能有空格
建立變量:shell變量直接定義;環境變量是先定義一個shell變量,而後將export轉換爲環境變量
列出環境變量:set
列出已經被導出爲環境變量的變量:env
export:實現了將父進程的私有數據轉到公有區,當運行一個腳本的時候,其實是進入了一個新的shell環境,也能夠說是一個新的進程,這個進程由父進程建立。當export後,就能夠將公有區的數據給子進程再複製一份了,注意這不是fork。
shell中一些比較特殊的變量:
特殊變量含義
$0
當前腳本的文件名
$n
傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。
$#
傳遞給腳本或函數的參數個數。
$*
傳遞給腳本或函數的全部參數。
$@
傳遞給腳本或函數的全部參數。被雙引號(" ")包含時,與 $* 稍有不一樣,下面將會講到。
$?
上個命令的退出狀態,或函數的返回值。
$$
當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID。
注:這些變量咱們留在這裏備份,有用到就能夠查。
HOME:用戶主目錄的全路徑名。如/home/myname
LOGNAME:即用戶註冊名
PWD:當前工做目錄的路徑。
PATH:shell查找命令的路徑(目錄)列表,各個目錄用冒號(:)隔開。 用戶能夠設置它: $ PATH=$PATH:$PWD
PS1:shell的主提示符。 $ PS1="$LOGNAME> "
SHELL:當前使用的shell。一般,它的值是/bin/bash。
TERM:終端類型。
MAIL:系統信箱的路徑。
wc [選項] 文件…
說明:該命令統計給定文件中的字節數、字數、行數。若是沒有給出文件名,則從標準輸入讀取。wc同時也給出全部指定文件的總統計數。字是由空格字符區分開的最大字符串。
該命令各選項含義以下:
- c 統計字節數。
- l 統計行數。
- w 統計字數。
vi
進入文本編輯的方式
光標移動
右移 方向鍵、l
左移 h、方向鍵
上移:
-:上移到行開頭
k
Ctrl+P
方向鍵
移動到當前行的第一個字符:
移動到行尾:$
光標移動到第幾行 :
Ctrl + G:顯示行數
行號 G
移動那到下一個詞的開頭:w W
移動到前一個詞的開頭:b B
若是光標在一個詞上,就移動到詞尾:e E
文本修改
d0:刪到行首
d3l:又刪三個字符
d$:刪到行尾
d5G:刪到第5行
dw:刪到詞末尾
dL
dH
復員命令
回到插入或刪除得上一個狀態:u
恢復到剛開始編輯狀態:U
修改命令:
取代命令:
r:用隨後輸入的字符取代光標所在的位置
R:至關於r的重複使用
替換命令:
s:用隨後輸入的字符取代光標所在的位置
S:用隨後輸入的字符替代整行
文本行合成 :J:把當前行與下一行和成一行
文本移動命令:
>:
>>
<
<<
!+光標移動命令+linux命令
編輯文件
字符串搜索:
字符串替換:
通常格式:g/模式/命令
g/s1/p:打印包含全部s1的行
g/s1/s//s2
shell使用
成組命令:
字符串匹配
grep:標準的正則表達式匹配
egrep:擴展的正則表達式匹配 至關與 -F
fgrep:快速對字符串進行匹配 至關與 -E
shell語言能夠說是文本處理語言,可是它應該具有必定的運算能力
變量
環境變量:全局變量,會繼承
普通變量:局部變量,不會繼承
常量
對變量的管理有 readonly 和 export
shell變量的建立沒有啥要求,是一種邊定義邊賦值的變量,須要的時候直接變量等於什麼就行了,例如a=sdad
由於咱們說sheel變量就是給一個信息片建立的名字,它沒有說什麼浮點數之類的,因此說算術運算咱們須要在(())中實現,
他對變量的類型只有環境變量等,並且建立環境變量還須要export 普通變量
數組的建立
對於數組的建立一種辦法直接就是
a[0]=1
a[1]=2
引用的時候是${a[0]},${a[1]}
或者你能夠實現用declare
root@kali:/mnt/bdshare# declare -a c
root@kali:/mnt/bdshare# echo $c
root@kali:/mnt/bdshare# echo ${c[0]}
root@kali:/mnt/bdshare# c[0]=1
root@kali:/mnt/bdshare# echo ${c[0]}
1
root@kali:/mnt/bdshare# echo ${c[1]}
其實不必declare,想讓他是數組就直接寫成數組的形式就能夠了
或者用圓括號 c=(e1 e2 e3),引用時c[0]
set命令
不加參數:顯示已經定義的所有變量
設置指定位置參數
set 1 2 3:表示$1=1,$2=2,$3=3
env能夠顯示環境變量:後面還有
unset 用於刪除變量和函數
替換運算符
echo ${d:-word}:若是變量存在且非空,返回值,不然返回word,use to test the varible exists or null
echo ${d:+word}:若是存在and非空,返回word,to test the exist of varible
echo ${d:=word}:若是存在且非空,返回值,不然,賦值爲word,return word
echo ${d:?word}:if exist or is null,print word,and exit the script or command
above all,":" could is choosed or is not choosed,if not is choosed,cancel the option of null or not null
若是一個變量賦值是一個文件夾或者是一個目錄,你去cat 或者cd的話是能夠實現的,由於他會解析字符串,其實就和咱們輸入的字符串是一個道理,你把它看成你的文件或目錄就好了。
環境變量和普通變量的區別我來好好說一下
1,變量就是給一個信息片建立的名字,那就像是一片空間的數據,引用他就能夠了
2,咱們說操做系統中的用戶環境是怎麼構成的?在用戶註冊過程當中,系統首先作的是建立用戶環境,全部的進程都有獨立且不一樣與程序自己的環境,linux環境是由許多變量以及這些變量的值構成的,
在操做系統中進程是怎麼構成的呢?程序+進程控制塊+數據,一個用戶環境其實就是一個進程,當你建立多個用戶的時候,在不一樣用戶之間切換,其實就是進程之間的切換了。這些變量和變量的值決定了用戶環境的外觀,shell環境包括shell類型,主目錄。
輸入輸出命令
read:從標準鍵盤上輸入數據
read -p 提示變量名
root@kali:~# read -p "hahaha" x
hahahadsd
echo:直接顯示後面的變量名和字符串
條件測試:$1是指輸入的第一個參數
三種形式:
文件方面的測試
字符串方面的測試:注意:符號先後有空格
-z s1:空爲真
-n s1:>0 true
s1 = s2 :true
s1 != s2
s1 < s2
s1 > s2
數值方面的測試
n1 -eq n2:==
n1 -ne n2: !=
n1 -le n2: <=
n1 -lt n2: <
n1 -ge n2: >=
n1 -gt n2: >
邏輯運算符
!,-a, -o
\(表達式\):總體判斷
算術運算
(( 算術表達式)):對於這個,只有加入$((算術表達式))才能輸出值
let "算術表達式"
例子:
root@kali:~# read x y
1 2
root@kali:~# echo $((x+y))
3
root@kali:~# echo $((z=x+y))
3
root@kali:~# echo z
z
root@kali:~# echo $z
3
root@kali:~# let "z=x*y+y"
root@kali:~# echo $z
4
雙引號:除$,"",\,以外均做爲普通字符對待
單引號:將全部獲得字符都看作普通字符對待
到引號:將其中的內容解析爲shell命令,有兩種形式
x=`pwd`;將pwd解析的值做爲變量x的值
x=$(pwd);和上面是一個道理
順序執行:;
邏輯與:&&:這個邏輯與是命令之間的與,上一個與是條件測試的與
邏輯或:||
if控制結構
style1:
if 測試條件
then
command1
else
command2
fi
style2:
if 測試條件
then
command1
elif 測試條件
then
command2
else
command3
fi
while語句
while 測試條件
do
command
done
shift命令:將位置參數右移一位
until語句(測試條件爲假時,才循環,爲真是才終止循環)
until 測試條件
do
command
done
for語句
for 變量 in 值表
do
command
done
for((i=1;i<$1;i++))
do
command
done
$#——除腳本名外,命令行上參數的個數。
$? ——上一條前臺命令執行後的返回值(也稱「退出碼」等)。
$$——當前進程的進程號。
$! ——上一個後臺命令對應的進程號。
$*——表示在命令行上實際給出的全部實參。
gcc編譯系統
三個過程:
preprocessing
gcc -E :分析僞指令,頭文件 條件編譯:生成.i
compiling :進行語法分析
gcc -S:生成.s的彙編文件
Assembler:將彙編代碼翻譯爲機器代碼
gcc -c :生成.o文件
linking
gcc -o :生成.out3文件
rpm
Linux控制檯的使用
六個字符控制檯
ctrl+alt+f1-f6,是六個字符控制檯
Ctrl+alt+f7是圖形界面即x+windows
在字符控制檯下,Linux使用startx命令進行進入圖形界面
linux外在設備的使用
首先咱們先來介紹一下分區和掛載的概念
分區是對硬盤進行格式化分區,只有按相應的格式進行分區才能將數據寫入磁盤
而掛載呢,就是將邏輯位置的物理位置映射到該分區上,咱們說的文件系統類型是什麼呢?就是分區的格式,只有肯定知道硬盤分區的格式才能寫入數據呀。
接下來是設備文件和硬件
Linux中,設備do都是以設備文件的形式存在,那固然,不一樣的設備類型就有不一樣獲得文件類型了
設備文件的命名方式是主設備號+次設備號,
好比說:
sd:scsi硬盤,sda:scsi硬盤的第一塊硬盤,sda1:scsi硬盤的第一塊硬盤的第一個分區(u盤被認爲是sd類型)
fd是軟盤。
經常使用的文件系統格式
瞭解這些以後,咱們就能夠掛載使用了,當掛載好後,咱們訪問這個掛在目錄,就能夠訪問這個設備文件了
掛載方式
mount -t 文件系統類型 設備名就是設備文件 掛載點
例如 mount -t vfat /dev/sda1 /mnt/usb
設備的下載
unmount 掛載目錄
Linux操做系統的內核獲得功能有
內存管理
進程管理
進程間通訊
虛擬文件系統
Linux支持許多種文件系統,它用通用的文件系統模型表示各類不一樣的文件系統,屏蔽了具體的文件系統之間的差別
能夠分爲邏輯文件系統和設備驅動程序
邏輯文件系統就是各類文件系統的格式
設備驅動程序就是每一種設備控制器所編寫的設備驅動程序模塊
網絡接口:提供了對各類網絡1標準的實現和各類網絡硬件的支持
再講一下linux初始化init系統
從BIOS開始,加載系統鏡像到內存,進行內核初始化,內和初始化結束後建立PID=1的進程,而後須要一個系統去初始化init進程的行爲,這個系統就是init系統。
這裏要介紹一個系統服務管理工具
systemd,它是一個用戶級別的管理工具
# 重啓系統
$ sudo systemctl reboot
# 關閉系統,切斷電源
$ sudo systemctl poweroff
# CPU中止工做
$ sudo systemctl halt
# 暫停系統
$ sudo systemctl suspend
# 讓系統進入冬眠狀態
$ sudo systemctl hibernate
# 讓系統進入交互式休眠狀態
$ sudo systemctl hybrid-sleep
# 啓動進入救援狀態(單用戶狀態)
$ sudo systemctl rescue
# 當即啓動一個服務
$ sudo systemctl start apache.service
# 當即中止一個服務
$ sudo systemctl stop apache.service
# 重啓一個服務
$ sudo systemctl restart apache.service
# 殺死一個服務的全部子進程
$ sudo systemctl kill apache.service
# 從新加載一個服務的配置文件
$ sudo systemctl reload apache.service
# 重載全部修改過的配置文件
$ sudo systemctl daemon-reload
# 顯示某個 Unit 的全部底層參數
$ systemctl show httpd.service
# 顯示某個 Unit 的指定屬性的值
$ systemctl show -p CPUShares httpd.service
# 設置某個 Unit 的指定屬性
$ sudo systemctl set-property httpd.service CPUShares=500
顯示操做系統相關參數
root@kali:~# uname
Linux
root@kali:~# uname -a
Linux kali 4.9.0-kali3-amd64 #1 SMP Debian 4.9.16-1kali1 (2017-03-24) x86_64 GNU/Linux
root@kali:~# uname -m
x86_64
root@kali:~# uname -n
kali
root@kali:~# uname -r
4.9.0-kali3-amd64
root@kali:~#
last:顯示過去登錄過系統的用戶相關信息
讀的是/var/log文件
top:至關於windows的任務管理器
split命令:切割文件
telnet 遠程鏈接 Telnet 主機名+端口號
wget:下載軟件
stty 用來控制終端的各類設置
好比
root@kali:~# stty -echo
用來關閉自動打印輸入字符的功能,一旦關閉,輸入的字符就看不到了
這時候就能夠在人工輸入密碼的時候用到了
read pass < /dev/tty
經過這種方式錄入密碼從終端,當打開tty這個文件時,linux會自動將他定向到終端。
固然最後要將自動打印輸入字符的功能打開
stty echo
MAKEFILE
下載源代碼包後解壓發現一個configur文件,運行它,它是用來檢查當前機器的環境的,而後收集環境信息,若是環境檢查經過,會生成一個Makefile文件,這個文件是用來編譯的,和configur是同一個文件夾下,這個Makefile文件由make開發工具所能識別的,因此,經過make 編譯Makefile文件。插入一個點:Makefile文件是一個文本形式的數據庫文件,記錄了一系列文件之間的依賴關係上所應執行的命令序列,即那但願文件須要先編譯,那些文件從新編譯,一旦調用這個make命令,他就會自動查找Makefile文件而且去調用它。當肯定好依賴關係後,你就能夠經過make install 安裝這個源文件了。