Linux學習筆記——進階命令篇
**Linux進階命令
*重定向 > 或 >>
將輸出的屏幕的數(shù)據(jù),重定向到一個指定位置(一般是指定一個文件),不管指定的文件是否存在,
都會創(chuàng)建新文件保存數(shù)據(jù)。(上面寫的新建文件type nul > 1.txt 就是這個原理)
e.g:?
ls > 1.txt —— 把ls的內容輸出到1.txt文件上(再次執(zhí)行會覆蓋,相當于python的open('w'))
ls >> 1.txt —— 在1.txt中追加ls的內容(相當于open('a'))
合并文件:
cat 1.txt 2.txt > 3.txt 把1.txt和2.txt內容合并到3.txt中
*管道(|)命令
一個命令的輸出可以通過管道作為另一個命令的輸入,可以理解成是一個容器,存放在終端顯示的內容
e.g:?
ls -l | more 把ls -l顯示的數(shù)據(jù)放到管道里,再用more作用于管道里的這些數(shù)據(jù)
*軟鏈接與硬鏈接
類似于Windows下的快捷方式,當一個源文件的目錄層級比較深,要想方便使用它可以給源文件一個鏈接
軟連接:
a. 軟鏈接無論更改源文件還是鏈接文件內容,都會更改文件內容
b. 軟鏈接是鏈接文件鏈接到某個文件的絕對路徑,而不管是不是這個文件,只要是這個名即可(如1.txt連接到2.txt,此時刪了2.txt,再新建一個2.txt,這個1.txt一樣能鏈接到新的2.txt)
c.軟鏈接的原文件最好寫絕對路徑(不要寫類似./xx/xx的相對路徑,應把.換成.再往上的路徑一直到根寫下來才算絕對路徑),防止鏈接失效
e.g :
ln -s (待鏈接(原)文件絕對路徑)(鏈接文件文件名(不寫絕對路徑默認鏈接到當前目錄))————同理,文件夾也可鏈接
硬鏈接 —— 指向同一塊磁盤上數(shù)據(jù)的文件的引用
a. 硬鏈接只能鏈接文件,不允許對目錄做硬鏈接
b. 硬鏈接不受路徑影響
c. 硬鏈接會保持數(shù)據(jù)同步
d. 硬鏈接會改變文件屬性信息中的鏈接數(shù)(文件屬性信息即ls -l可以查看(文件權限和user中間的數(shù)字即為硬鏈接數(shù)))
e.目錄的文件信息中的鏈接數(shù)表示當前目錄下包含多少子目錄
*文件內容搜索命令:grep(內含正則表達式詳解)
grep '(要查找的內容)' (被查找的文件) —— 與查找內容完全一致
grep -i '' file —— 忽略大小寫查找
grep -n '' file —— 顯示匹配行號
grep -v '' file —— 顯示不包含匹配文本的所有行
其中,指令前的-和要查找的內容兩邊的''可省略
-i、-n、-v可以混合使用,e.g : -in —— 忽略大小寫且匹配行號查找
用正則表達式匹配查找:
^ —— 以指定字符串開頭
$ —— 以指定字符串結尾
. —— 匹配任意一個字符(除換行符外)
e.g:
grep -in '^h' a.txt —— 把在a.txt以h開頭的行忽略h大小寫且匹配行號查找出來(^寫在h前面)
grep -in 'h$' a.txt —— 以h結尾的查找出來(注意$寫在h后面)
grep -in 'he.llo' a.txt —— 假如a.txt里有he1llo、he2llo、he3llo,那么都能打印出來
grep -in 'abc.' a.txt —— 若一行中包含abc.(.可以是任意字符)這個字符串,就把它打印出來
綜合使用:設有a.txt內有6行字符串(12, a1, a1a1, a2, adsd, basd)
1.想查找一行只有兩個字符且開頭結尾為a.的
grep -in '^a.$' a.txt --- a1、a2
2.想查找一行只有兩個字符的
grep -in '^..$' a.txt --- 12、a1、a2
所以,^$中間夾著多少個字符就規(guī)定了查找以多少個字符為一行的
進階使用 —— grep 與 管道 結合
e.g1:查看某進程是否已開啟
先了解一個命令:ps aux —— 查看當前Linux所有進程(若以后學習了mysql后,如果運行了mysql程序,ps aux會顯示出mysql正在進程中,所以若要快速查看是否已經運行了mysql程序,則可用grep與管道結合來查找)
ps aux | grep mysql ('mysql'的''可以省略寫,上面也說過)
其實這就相當于:
ps aux > b.txt
grep mysql b.txt
e.g2:查找某個在控制臺敲過的命令歷史
history | grep find —— 查找所有已執(zhí)行過的find命令歷史記錄
*查找文件命令:find —— 在指定目錄下查找文件(包括目錄)
格式:
find 被查找的文件(這樣默認當前目錄,且查找結果不以./開頭)
find 查找路徑 -name 被查找的文件(查找結果以/開頭)
Tips:在查找時,查找的范圍包含“查找路徑”及其下的子目錄
通配符:* —— 可包含多個字符、? —— 只包含一個字符(使用通配符時最好加上'')
e.g:
find . -name '*基礎*.txt' —— 查找當前目錄及其子目錄下的含“基礎”的txt文件(可找到1.基礎班.txt)
find . -name 'a?.txt' —— 查找a?的txt文件,可能是a1.txt、a2.txt……反正問號只代表一個字符
find . -name '?.txt' —— 查找以一個字符命名的所有txt文件
find / -name '*.txt' —— 從根目錄下(全盤搜索)查找所有txt文件
其他用法:
find xxxxxxx -delete —— 查找到某些后,全部刪除 e.g:find -name '?.txt' -delete
find . -size +4k —— 查找當前目錄下大于4k的文件(換成-4k就是查找小于4k的文件)
find . -regex '^.$'.txt —— 運用正則表達式(正則在grep一節(jié)已詳解)查找以一個字符命名的文件
*壓縮(.zip、.gz、.bz2)和打包(tar) —— (其中.bz2的“2”讀two)
壓縮與解壓縮:
zip:
zip (壓縮包文件名) (要壓縮的文件)—— 壓縮成.zip格式文件
e.g:?
壓縮:zip sql.zip *.sql
解壓縮:unzip sql.zip
.gz:
e.g:
壓縮:gzip 1.txt -> 1.txt.gz
解壓縮:gzip -d 1.txt.gz -> 1.txt
.bz2:
壓縮:bzip2 1.txt -> 1.txt.bz2
解壓縮:bzip2 -d 1.txt.bz2 -> 1.txt
打包與解包:
格式:tar 參數(shù) 包名 被打包的文件
-c 創(chuàng)建.tar打包文件
-v 打印打包或解包的詳細信息到控制臺
-z 壓縮或解壓縮(.gz)
-j 壓縮或解壓縮(.bz2)
-x 解包
-f 指定文件名稱,必須放到所有選項的后面,后面跟的是包名
-C 解包/解壓縮到指定目錄 —— 此參數(shù)解包/解壓縮時用才奏效,壓縮時不能用
e.g:
打包:tar cvf 1.tar 1.txt 2.txt -> 1.tar
(f參數(shù)必須放到所有參數(shù)后面)
(由于有v參數(shù),故在控制臺顯示1.txt、2.txt這樣的信息)
(打包不是壓縮,文件大小大約是1.txt和2.txt的字節(jié)數(shù)之和)
(打包后,可以用以上學的gz、bz2壓縮命令進行壓縮得到1.tar.gz或1.tar.bz2)
解包:tar xvf 1.tar(-C 解包到指定目錄) -> 1.txt 2.txt?
(其中-C不寫默認解包到當前文件夾)
(若該文件夾下已有1.tar所打包的文件,如已有1.txt(與1.tar中的1.txt內容不一致),那么執(zhí)行此命令會覆蓋該1.txt,只會保留1.tar解包出來的1.txt)
tar zcvf 1.tar.gz
打包加壓縮:tar czvf 1.tar.gz 1.txt 2.txt
(tar cjvf 1.tar.bz2 1.txt 2.txt)—— 用bzip2壓縮
解包加解壓縮:tar xzvf 1.tar.gz -C 指定解壓縮目錄
(tar xjvf 1.tar.bz2 -C 指定解壓縮目錄)—— 用bzip2解壓
(其中-C不寫默認解壓到當前文件夾)
*權限與權限管理
字母法權限管理 —— rwx
按順序為:-文件類型 (d代表文件夾)rwx文件所有者權限(u(user))r-x文件所有者所屬組用戶權限(g(group))r-x其他用戶權限(o(other))
id 用戶名 —— 查看當前用戶所屬用戶編號、主組且主組編號、(主組, 次組1, 次組2)
r ——? read 讀取權限(可讀)
w —— write 寫入權限(可寫)
x —— exeute 執(zhí)行權限(可執(zhí)行)
- —— 占位符? 無權限
a —— all 表示所有用戶
chmod —— 修改權限
+ —— 增加權限
- —— 撤銷權限
= —— 設置權限
用ls -l 可以查看文件權限
e.g:-rw-r--r-- 1 Vh 197121 16 Mar? 3 22:40 1.txt
詳解如下:
-rwxr-xr-x(文件權限(代表user擁有所有權限,group和other沒有寫入權限)) 1(硬鏈接數(shù)) Vh(user) 197121(組編號) 16(文件大小16字節(jié)) Mar 3 22:40(3月3日22:40) 1.txt(文件名)
修改權限:
e.g:
chmod g-x,o-x,u-w 1.txt —— 為group和other撤銷執(zhí)行權限,user撤銷寫入權限(注意,要連著寫時,逗號后不能習慣性地加一個空格)
于是以上變成-r--r--r--,都只能讀,不能寫
但是user還是可以寫入,因為有一個:wq!強制保存功能,但是group和other:wq!也不能保存了
chmod a+x 1.txt —— user、group、other都加上權限x
chmod a=--- 1.txt —— 所有權限撤銷 —— ----------
chmod a=rx 1.txt —— 所有加上r和x權限 —— -r-xr-xr-x
數(shù)字法權限管理 —— rwx可以用數(shù)字代替
r —— 4 —— 2**2
w —— 2 —— 2**1
x —— 1 —— 2**0
- —— 0
rwx —— 7 —— 4+2+1
r-x —— 5 —— 4+1
e.g:
chmod 6 1.txt —— -------rw-
chmod 66 1.txt —— ----rw-rw-
chmod 666 1.txt —— -rw-rw-rw
chmod 777 1.txt —— -rwxrwxrwx
chmod 000 1.txt —— ----------
chmod 700 1.txt —— -rwx------
對文件夾的權限限制:
chmod 111 folder —— 只能執(zhí)行cd folder,但不能讀寫
chmod 555 folder —— 可讀可執(zhí)行cd folder 后還可用ls讀,但不能touch或rm之類的寫操作
文件和目錄的默認權限:
文件默認權限是755
目錄默認權限:775
(可能不同的版本linux有差別)
*獲取管理員權限
一般來說,程序員在操作Linux都是用一個權限比較低的用戶去操作的,避免寫錯命令直接誤刪系統(tǒng)文件
如果使用這個低權限用戶時,有些操作權限不夠(提示Permission denied或xx權限不夠),可臨時借用管理員權限
e.g:
sudo find / -name *.sql
如果大量操作都需要管理員權限,懶得寫sudo,則可切換到管理員root身份
sudo -s —— 切換后操作需謹慎!
退出管理員身份,切換回原身份
exit
已經在原身份,再次執(zhí)行exit,會退出控制臺
如果不知道現(xiàn)在自己是什么身份,可用whoami命令查看(一般這個在sh環(huán)境中運行才要用到,在bash中則會自動顯示 —— vh@ubantu:)
whoami應用場景舉例:
假如小明今天上班在機房維護電腦,下班了忘了退出登陸,第二天小明休息,換小亮維護電腦,那么小亮可以用whoami查詢現(xiàn)在登陸的是哪個用戶,若發(fā)現(xiàn)不是自己的用戶,退出他的登自己的即可
*用戶管理
先學基礎:
①新建用戶的主目錄在/home默認(使用了-m選項)在下,其內容是原封不動拷貝/etc/skel目錄的(skel即skeleton(框架、骨架))
這種機制的應用場景:
如果我是多用戶系統(tǒng)管理員,那么可在skel目錄下寫一個ReadMe.txt的介紹,那么以后的新建用戶都可看到我的自我介紹?;蛘咴?bashrc文件中加入一些方便的環(huán)境變量或者命令別名,這樣每個新建用戶都可以使用這些功能。不過,更好的選擇是把這些設置放到全局的 /etc/profile 中, skel 目錄下的文件是拷貝過去的,如果你修改或者增加了新的文件,只有新建的用戶才能使用,老用戶是無法使用的。
②/etc/passwd文件中記錄了所有用戶信息,以
vh:x:1000:1000:Vh,,,:/home/vh:/bin/bash
jack:x:1001:1001::/home/jack:/bin/sh? ? 為例
可見,每條信息都用:隔開。格式如下:
用戶名:密碼的占位符x:用戶uid:所屬組gid:備注(全名,房間號碼,工作電話,家庭電話,其他):用戶登錄所使用的shell(用戶的命令環(huán)境)(有bash和sh兩種)
③/etc/shadow(要用sudo權限查看)文件中記錄了所有用戶的密碼,密碼用md5加密(md5是一種不可逆的加密方式,即使明文相同,但每次加密結果也不同)
④/etc/group文件中記錄了所有組的名字與組編號(所屬該組的用戶不會在內)格式如下:
用戶組名:用戶組密碼占位符(一般Linux系統(tǒng)的用戶組都沒有密碼):組id
⑤/etc/gshadow(要用sudo權限查看)文件中記錄了各個組的一些基本信息介紹
以上的文件都可以用vi進行修改,運用命令只是一種幫我們快速把這些信息寫進相應的文件的一個快捷方式
添加用戶:
adduser —— 傻瓜式添加用戶,以提示信息誘導添加用戶密碼、備注等,shell默認/bin/bash
useradd —— 以可選命令的方式添加用戶
(假設useradd添加用戶A,那么會自動編一個組命名為A,且用戶A加入了A組(即在/etc/group文件寫入一個組名為A的組,然后用戶A加了進去,那么用戶A的主組就是A組)) —— 主組次組會在用戶組管理談到
以下是useradd的常用選項介紹:(更多請查看useradd -h)
-M 強制不創(chuàng)建用戶主文件夾(家目錄)
(不寫-m時默認也是不創(chuàng)建用戶主文件夾)
(若創(chuàng)建的用戶沒有家目錄,則會以HOME=/登錄)
-m 在/home創(chuàng)建一個以該用戶名命名的文件夾,其中內容拷貝的是/etc/skel的內容
-d 設置該用戶主文件夾路徑(格式:-m 用戶名 -d /路徑/主文件夾名)(與-m一起使用才有效)
-c 為用戶加上備注(會將此備注文字加在/etc/passwd中的第5項字段中)
-s 指定用戶登錄所使用的shell —— 不寫默認/bin/sh(sh的shell非常不方便,上下鍵似乎不能自動填充執(zhí)行過的命令且其終端只有一個$,不能顯示vh@ubantu:/etc這樣的字樣,所以最好設置為/bin/bash,或在/etc/passwd文件把該用戶/bin/sh修改為/bin/bash也行)
-g 設定主組。指定用戶所屬的主要組,默認不指定會自動創(chuàng)建一個同名的組,且其所屬主組就是這個同名的組
-G 設定次組。設置用戶所屬的次要組(可設置多個,格式:useradd -G cizu1,cizu2,cizu3)
-p 設置密碼
(還未摸清這個參數(shù)的用法,這個直接設是一個明文密碼且無效,所以不建議用這個設置密碼,而是用以下說的方法)
-e 有效期限。指定帳號的有效期限。格式為YYYY-MM-DD,將存儲在/etc/shadow
-f 緩沖天數(shù)。限定密碼過期后多少天,將該用戶帳號停用
查看用戶信息:
id 用戶名 —— 查看當前用戶所屬用戶編號、主組且主組編號、(主組, 次組1, 次組2)
(系統(tǒng)用戶編號一般在1000以內,自己創(chuàng)建的一般在1000以上)
設置密碼:
設置他人用戶密碼:
創(chuàng)建用戶后,用“sudo passwd (用戶名)”的命令來設置或更改該用戶的密碼(若密碼太短或太簡單,會有報錯提示,但不管他,正常輸兩次密碼即可設置成功)
設置自己的密碼:
passwd即可
設置root的密碼:
sudo passwd
切換用戶:
格式:su - 目標用戶?
(若寫-,切換后就到目標用戶的家目錄,若省略-,則切換后還是在切換前的目錄)
(回車后會提示輸入密碼,輸入的是目標用戶的密碼)
(這種切換是在當前用戶臨時進入目標用戶,不是真正進入,所以切換后再exit會回到當前用戶)
(若目標用戶沒有設置密碼,則不能切換,會顯示su:認證失?。?/p>
(在實驗中發(fā)現(xiàn),su - root提示su:認證失敗,然后sudo passwd設置密碼后發(fā)現(xiàn)可以切換,所以root應該是默認無密碼的)
(su - root切換過去后pwd顯示/root說明/root就是root的家目錄,而用su root切換過去的效果與sudo -s的效果一致,只不過sudo -s不需要每次都輸入密碼(有一個緩存時間,可能輸過一次后10分鐘內就不需要再輸,可直接切換過去)
(若切換了多次,則exit是一層層退出來。e.g:vh切到rose再切到jack,那么exit一次是回到rose,再exit才回到vh)
刪除用戶:
userdel -r 用戶名(假設是jack)
(不加-r的話只刪除用戶,不刪除主目錄,則會導致/home中多了一個jack的垃圾文件夾)
(運行-r可能會有報錯,說郵件池未找到或者其他的什么,沒關系的,因為userdel只是幫我們走了一遍刪除流程,所謂的刪除流程就是上面“先學基礎”中說的那幾個文件,若在某文件中找不到關于這個用戶的信息(可能手動刪了,可能未生成),就會報錯,但-r是肯定能把用戶刪除干凈的)
*用戶組管理
先學基礎:
主組與次組:
每個用戶都必須有一個主組,假如創(chuàng)建用戶A沒有用-g設定主組,那就會以自己的名字創(chuàng)建一個新組A,然后自己加入這個A組。假如已經存在了某些組,那么創(chuàng)建用戶時使用-g參數(shù)可以指定這個用戶的主組,使用-G參數(shù)可以指定這個用戶的次組,次組可設定多個,格式上面已說
創(chuàng)建組:
sudo groupadd 組名
刪除組:
sudo groupdel 組名
(注意刪除組時不能有任何一個用戶的主組是這個組,否則會報錯,要刪除相關的用戶后才能刪除這個組,但是若這個組只是某些用戶的次組,則無所謂,可以直接刪除)
*遠程操作ssh和scp
通過ssh可以讓客戶端電腦遠程操作Linux服務器
方法:
1.服務器端下載一個ssh服務端軟件,sudo apt-get install penssh-server
(需在線安裝,如果Linux虛擬機不能聯(lián)網,可查看Else_Notes的“運行”筆記)
2.客戶端如果是windows系統(tǒng),則需安裝OpenSSH for Windows這個軟件(可以先查看C:\Windows\System32\OpenSSH是否存在,若存在則不用再下載),mac電腦默認已經下載。
3.然后Linux服務端(假設用戶名為vh)打開終端輸入ifconfig查看ip地址
(ip地址看的是inet6的,可能寫成fe80::1cf4:cc55...的樣子,也可復制下來使用,或它下一行那個inet 192.168.13.54也可以復制使用)
(如果Linux是虛擬機,則需把NAT模式改為橋接模式,因為NAT模式是虛擬的ip,橋接模式才是一臺真正的電腦ip)
4.客戶端打開終端輸入ssh vh@ip地址,然后等待兩秒再輸入yes即可連接成功,就可以在客戶端電腦操作Linux服務器了
通過scp可以在客戶端和服務器端互傳文件:
客戶端傳文件給服務器端:(上傳)
scp a.txt vh@ip地址:/服務器的某路徑
服務器端傳文件給客戶端:(下載)
sudo scp vh@ip地址:/a.txt .(這個點是下載到客戶端的當前位置)
(要輸入兩次密碼,第一次輸入的是客戶端的密碼,第二次輸入的是服務器端的密碼)
FileZilla軟件的使用:
FileZilla是一個免費開源的FTP軟件,使用可視化方式進行上傳和下載文件,以后可以通過FileZilla來代替scp命令
(是一個可視化的軟件,粘貼ip和密碼連接好了就可以直接拖動文件的方式進行上傳和下載了)
(要注意的是,這個軟件顯示的服務器端的/不是真正服務器端的/,而是在/var/ftp/shared)
*軟件安裝和卸載
學習目標:能夠使用apt-get命令安裝軟件
軟件安裝介紹:
Ubuntu軟件安裝有兩種方式:
1.離線安裝(deb文件格式安裝)
dpkg -i 包名 —— 安裝deb安裝包(i指install)
dpkg -r 包名 —— 卸載deb安裝包(r指remove)
2.在線安裝(apt-get方式安裝)—— 主要用于在線從互聯(lián)網的軟件倉庫中搜索、安裝、升級、卸載軟件。
命令格式:
sudo apt-get(現(xiàn)在已經整合為直接apt也行了) install 安裝包名(大概記得即可,有則會提示),表示在線安裝deb安裝包
更改鏡像源:—— 鏡像源就是下載軟件來源的服務器
因為使用apt-get命令默認是從國外的服務器下載安裝軟件的,會導致下載安裝速度很惶,所以需要更改成國內的鏡像源服務器
鏡像源更改方式:
1.圖形界面操作更改:打開設置,打開軟件和更新,選擇主服務器為阿里或清華源,然后要輸密碼,然后輸完了會彈出可用軟件的列表信息已過時,按重新載入即可。
2.命令操作更改:打開清華軟件鏡像源mirrors.tuna.tsinghua.edu.cn網頁,找到ubuntu然后點擊它旁邊的小問號,進入后選擇想要的版本,然后復制下面框框中的所有文本,然后到終端把/etc/apt/sources.list文件內容全部更改為剛復制的(最好先備份一下sources.list),然后sudo apt update更新以下源(這個命令相當于上面圖形界面處理的“重新載入”)。然后就可以使用sudo apt install 安裝包名安裝軟件了
apt-get命令匯總:(以下apt-get均省略為apt)
sudo apt update —— 更新軟件源
sudo apt upgrade —— 更新升級所有軟件包
sudo apt upgrade 包名 —— 更新某個軟件包
sudo apt list --upgradable —— 列出可更新的軟件
sudo dist-upgrade —— 升級系統(tǒng)版本(Ubuntu的升級)
sudo apt install 包名 —— 安裝一個軟件包
sudo apt remove 包名 —— 刪除一個軟件包
sudo apt help —— 列舉其他apt-get命令