Linux基礎命令(四):高階鍵盤操作與許可權控制——history、自動補全、命令列快捷鍵、歷史命令展開、id、chmod、umask、su、sudo、chown、chgrp、passwd
高階鍵盤操作
Linux終端支援各種快捷鍵操作。掌握這些快捷鍵以及命令列互動式編輯特性,基本可以告別滑鼠操作了。
clear - 清空螢幕
history - 顯示歷史列表內容
小技巧:Linux的圖形使用者介面中,非最大化的視窗是預設隱藏頂部選項卡的,可以通過保持按下Alt鍵來顯示它們。
命令列
bash之所以可以編輯命令列,是使用了一個叫做Readline的庫(開源的跨平臺程式庫,提供了互動式的文字編輯功能,如命令補全、搜尋歷史命令、方向鍵可以移動游標、行編輯快捷鍵等等)。
一些命令列的快捷按鍵組合(尤其使用 Alt 鍵的組合),可能會被 GUI 攔截來觸發其它的功能。 當使用幕後控制檯時,所有的按鍵組合都應該能夠正確地工作。
移動命令列游標
快捷鍵 | 作用 |
---|---|
Ctrl-a | 移動游標到行首。 |
Ctrl-e | 移動游標到行尾。 |
Ctrl-f | 游標右移一個字元;和右箭頭作用一樣。 |
Ctrl-b | 游標左移一個字元;和左箭頭作用一樣。 |
Alt-f | 游標前移一個字串。 |
Alt-b | 游標後移一個字串。 |
Ctrl-l | 清空螢幕,移動游標到左上角。clear 命令完成同樣的工作。 |
修改命令列文字
快捷鍵 | 作用 |
---|---|
Ctrl-d | 刪除游標位置的字元。 |
Ctrl-t | 游標位置的字元和游標前面的字元互換位置。 |
Alt-t | 游標位置的字和其前面的字互換位置。 |
Alt-l | 把從游標位置到字尾的字元轉換成小寫字母。 |
Alt-u | 把從游標位置到字尾的字元轉換成大寫字母。 |
剪下和複製
Readline 的文件使用術語 killing 和 yanking 來指我們平常所說的剪下和貼上。 剪下下來的本文被儲存在一個叫做剪下環(kill-ring)的緩衝區中。
快捷鍵 | 作用 |
---|---|
Ctrl-k | 剪下從游標位置到行尾的文字。 |
Ctrl-u | 剪下從游標位置到行首的文字。 |
Alt-d | 剪下從游標位置到詞尾的文字。 |
Alt-Backspace | 剪下從游標位置到詞頭的文字。如果游標在一個單詞的開頭,剪下前一個單詞。 |
Ctrl-y | 把剪下環中的文字貼上到游標位置。 |
自動補全
當你敲入一個命令的一半, 按下 tab 鍵,命令就會自動補全。它能幫助我們完成路徑名、變數、使用者名稱、命令、主機名的自動補全。當然了,只有系統中存在的資源才能夠自動補全。但是要注意的是,如果我們輸入的內容不止能夠匹配一個結果,則自動補全不會生效,如果我們執意按tab鍵,它會給我們列出所有可能的結果。
快捷鍵 | 作用 |
---|---|
Alt-? | 顯示可能的自動補全列表。在大多數系統中,你也可以通過按兩次 tab 鍵完成這個。 |
Alt-* | 插入所有可能的自動補全。當你想要使用多個可能的匹配項時,這個很有幫助。 |
小提示,Alt也可稱作元鍵。
目前的 bash 版本有一個叫做可程式設計自動補全的工具,允許你來加入額外的自動補全規則。可程式設計自動補全是由 shell 函式實現的。
歷史命令
bash 維護著一個已經執行過的命令的歷史列表,預設最多儲存500個命令。儲存在家目錄下,一個叫做 .bash_history 的檔案裡。
搜尋歷史命令
history | less
我們可以通過歷史命令列表中的行號展開該命令。如第6行:
!6
bash 也具有增量搜尋歷史列表的能力。意思是在字元輸入的同時,bash 會去搜索歷史列表(直接出結果,並高亮匹配的第一個字),每多輸入一個字元都會使搜尋結果更接近目標。輸入 Ctrl-r 來啟動增量搜尋, 接著輸入你要尋找的字。找到以後,可以敲入 Enter 來執行命令, 或者輸入 Ctrl-j,從歷史列表中複製這一行到當前命令列。輸入 Ctrl-g 或者 Ctrl-c,退出搜尋。
快捷鍵 | 作用 |
---|---|
Ctrl-p | 移動到上一個歷史條目。類似於上箭頭按鍵。 |
Ctrl-n | 移動到下一個歷史條目。類似於下箭頭按鍵。 |
Alt-< | 移動到歷史列表開頭。 |
Alt-> | 移動到歷史列表結尾,即當前命令列。 |
Ctrl-r | 反向增量搜尋。從當前命令列開始,向上增量搜尋。 |
Alt-p | 反向搜尋,非增量搜尋。(輸入要查詢的字串,按下 Enter來執行搜尋)。 |
Alt-n | 向前搜尋,非增量。 |
Ctrl-o | 執行歷史列表中的當前項,並移到下一個。如果你想要執行歷史列表中一系列的命令,這很方便。 |
歷史命令展開
序列 | 作用 |
---|---|
!! | 重複最後一次執行的命令。可能按下上箭頭按鍵和 enter 鍵更容易些。 |
!number | 重複歷史列表中第 number 行的命令。 |
!string | 重複最近歷史列表中,以這個字串開頭的命令。 |
!?string | 重複最近歷史列表中,包含這個字串的命令。 |
除非確定歷史列表中的條目內容,否則要小心謹慎地使用 “!string” 和 “!?string” 格式。
指令碼
除了 bash 中的命令歷史特性,許多 Linux 發行版包括一個叫做 script 的程式, 這個程式可以記錄整個 shell 會話,並把 shell 會話存在一個檔案裡面。
基本語法為:script filename
filename 是指用來儲存 shell 會話記錄的檔名。如果沒有指定檔名,則使用檔案 typescript。
許可權控制
Unix 傳統中的作業系統不同於 MS-DOS 傳統中的系統,區別在於它們不僅是多工系統,而且也是多使用者系統。意味著多個使用者可以在同一時間使用同一臺計算機。儘管計算機可能只有一個鍵盤和一個監視器,但是可以支援遠端使用者通過ssh登入並操作這臺電腦。遠端使用者也能執行圖形介面應用程式,並且圖形化的輸出結果會出現在遠端的顯示器上。 X 視窗系統把這個作為基本設計理念的一部分,並支援這種功能。
為了支援多使用者特性,必須設計一種避免使用者之間互相影響的機制,即許可權。
擁有者、組成員和其他人
Unix 安全模型中,當一個使用者擁有一個檔案或目錄時, 即擁有對這個檔案或目錄訪問許可權的控制權。一個或多個使用者可以組成使用者組,使用者組成員對檔案和目錄的訪問許可權由所有者授予。除了使用者組成員,檔案所有者也可以給其他所有人操作許可權。
可以用 id 命令,來檢視自己的資訊:
id
使用者帳戶 定義在/etc/passwd 檔案裡面,使用者組定義在/etc/group 檔案裡面。當用戶帳戶和使用者組建立以後, 這些檔案隨著檔案/etc/shadow 的變動而修改,檔案/etc/shadow 包含了關於使用者密碼的資訊。 對於每個使用者帳號,檔案/etc/passwd 定義了使用者(登入)名、uid、gid、帳號的真實姓名、家目錄和登入 shell。其中除了普通使用者帳號之外,還有超級使用者(uid 0)帳號,和各種各樣的系統使用者。
許多類 Unix 的系統會把普通使用者分配到一個公共的使用者組中,例如“users”,現在的 Linux 會建立只有一個成員的與使用者同名的使用者組。這樣使某種型別的許可權分配更容易些。
讀取、寫入和執行
對於檔案和目錄的訪問許可權是根據讀、寫和執行來定義的。
使用 ls 命令的 -l 選項可以輸出一個檔案的操作許可權:
[email protected]:~$ > a.txt
[email protected]:~$ ls -l a.txt
-rw-rw-rw- 1 ldz ldz 0 Sep 27 20:21 a.txt
前十個字元表示檔案的屬性。第一個字元表示檔案型別。
屬 性 | 檔案型別 |
---|---|
- | 一個普通檔案 |
d | 一個目錄 |
l | 一個符號連結。注意對於符號連結檔案,剩餘的檔案屬性總是"rwxrwxrwx",而且都是虛擬值。真正的檔案屬性是指符號連結所指向的檔案的屬性。 |
c | 一個字元裝置檔案。這種檔案型別是指按照位元組流來處理資料的裝置。 比如說終端機或者調變解調器 |
b | 一個塊裝置檔案。這種檔案型別是指按照資料塊來處理資料的裝置,例如一個硬碟或者 CD-ROM 盤。 |
剩下的九個字元叫做檔案模式,代表著檔案所有者、檔案組所有者和其他人的讀、寫和執行許可權。
屬性 | 檔案 | 目錄 |
---|---|---|
r | 允許開啟並讀取檔案內容。 | 允許列出目錄中的內容,前提是目錄必須設定了可執行屬性(x)。 |
w | 允許寫入檔案內容或截斷檔案。但是不允許對檔案進行重新命名或刪除,重新命名或刪除是由目錄的屬性決定的。 | 允許在目錄下新建、刪除或重新命名檔案,前提是目錄必須設定了可執行屬性(x)。 |
x | 允許將檔案作為程式來執行,使用指令碼語言編寫的程式必須設定為可讀才能被執行。 | 允許進入目錄,例如:cd directory 。 |
更改檔案模式
可以利用 chmod 命令更改檔案或目錄的模式(許可權)。注意只有檔案的所有者或者超級使用者才能更改檔案或目錄的模式。chmod 命令支援兩種不同的方法來改變檔案模式:八進位制數字表示法或符號表示法。
人類因為天生有十個手指,利用以10為基數的數字系統來計數。計算機,生來只有一個手指,只能表示0和1,因此它以二進位制來計數。
八進位制表示法
每個八進位制數字代表了 3 個二進位制數字,這種對應關係,正好對映到用來儲存檔案模式所使用的方案上。
八進位制 | 二進位制 | 檔案模式 |
0 | 000 | --- |
1 | 001 | --x |
2 | 010 | -w- |
3 | 011 | -wx |
4 | 100 | r-- |
5 | 101 | r-x |
6 | 110 | rw- |
7 | 111 | rwx |
通過使用3個八進位制數字,我們能夠設定檔案所有者、使用者組和其他人的許可權:
chmod 600 a.txt #6的八進位制為110,表示檔案所有者擁有讀寫的許可權,而使用者組和其他人無許可權。
雖然八進位制到二進位制的對映看起來不方便,但通常只會用到一些常見的對映關係: 7 (rwx),6 (rw-),5 (r-x),4 (r--),和 0 (---)。
符號表示法
符號表示法分為三部分:更改會影響誰, 要執行哪個操作,要設定哪種許可權。通過字元 “u”、“g”、“o”和 “a” 的組合來指定 要影響的物件:
u | "user"的簡寫,意思是檔案或目錄的所有者。 |
g | 使用者組。 |
o | "others"的簡寫,意思是其他所有的人。 |
a | "all"的簡寫,是"u", "g"和“o”三者的聯合。 |
如果沒有指定字元,則預設使用”all”。執行的操作可能是一個 “+”字元表示加上一個許可權, 一個 “-”字元表示刪掉一個許可權,或者是一個 “=”字元表示只有指定的許可權可用,其它所有的許可權被刪除。許可權由 “r”、“w”和 “x” 來指定。
u+x | 為檔案所有者新增可執行許可權。 |
u-x | 刪除檔案所有者的可執行許可權。 |
+x | 為檔案所有者,使用者組,和其他所有人新增可執行許可權。 等價於 a+x。 |
o-rw | 除了檔案所有者和使用者組,刪除其他人的讀許可權和寫許可權。 |
go=rw | 給檔案所屬的組和檔案所屬者/組以外的人讀寫許可權。如果檔案所屬組或其他人已經擁有執行的許可權,執行許可權將被移除。 |
u+x,go=rw | 給檔案擁有者執行許可權並給組和其他人讀和執行的許可權。多種設定可以用逗號分開。 |
我們也可以在GUI中更加直觀的設定檔案和目錄的許可權。
設定預設許可權
建立一個檔案時,umask 命令控制著檔案的預設許可權。umask 命令使用 4 位的八進位制表示法來表達從檔案模式屬性中刪除一個位掩碼。對於普通檔案和目錄的許可權設定,我們只關注後 3 位,將掩碼化為二進位制後哪一個位元位為1,刪除該對應位置許可權。
首先檢視預設的掩碼值:
[email protected]:~$ umask
0000
也就是沒有為1的位元位,因此對應我們前面建立的 a.txt 檔案的許可權為:-rw-rw-rw- (由於a.txt既不是指令碼檔案又不是可執行檔案,因此沒有執行許可權)。
我們將umask修改為 0002 ,再建立一個檔案觀察其許可權:
[email protected]:~$ umask 0002
[email protected]:~$ > a1.txt
[email protected]:~$ ls -l a1.txt
-rw-rw-r-- 1 ldz ldz 0 Sep 27 21:28 a1.txt
將掩碼化為二進位制,000 000 000 010 ,位元位為1的位置,正好對應新建檔案缺少的許可權。
注意:umask 命令設定的掩碼值只能在當前 shell 會話中生效,若當前 shell 會話結束後,則必須重新設定。
一些特殊許可權
雖然通常一個八進位制的許可權掩碼用三位數字來表示,但是從技術層面上來講, 用四位數字來表示它更確切些。因為除了讀取、寫入和執行許可權之外,還有其它較少用到的許可權設定。比如:
setuid 位(八進位制4000)
當應用到一個可執行檔案時,它把有效使用者 ID 從執行程式的使用者設定成程式所有者的 ID。這種操作通常會應用到一些由超級使用者所擁有的程式。設定了setuid位後,當普通使用者執行一個由根使用者(root) 所有的程式時,這個程式執行時具有超級使用者的特權,這樣程式就可以訪問普通使用者禁止訪問的檔案和目錄。
setgid 位(八進位制2000)
類似於 setuid 位,把有效使用者組 ID 從執行程式的使用者組 ID 更改為檔案所有者的組 ID。如果設定了一個目錄的 setgid 位,則目錄中新建立的檔案具有這個目錄使用者組的所有權,而不是檔案建立者所屬使用者組的所有權。當一個普通使用者組中的成員,需要訪問共享目錄中的所有檔案,而不用管檔案所有者的主使用者組時, 那麼設定 setgid 位很有用處。
sticky 位(八進位制1000)
繼承於 Unix,在 Unix 中,它可能把一個可執行檔案標誌為“不可交換的”。在 Linux 中,預設不設定檔案的 sticky 位,但是如果一個目錄設定了 sticky 位, 那麼它能阻止其他使用者刪除或重新命名檔案。這個經常用來控制訪問共享目錄,比方說/tmp。
特殊許可權使用方法:
chmod u+s 可執行檔名
[email protected]:~$ chmod u+s a
[email protected]:~$ ls -l a
-rwsrwxrwx 1 ldz ldz 9328 Sep 28 11:04 a #可以看到使用者的執行許可權由之前的x更改為了s
chmod g+s 目錄
[email protected]:~/bb$ chmod g+s de
[email protected]:~/bb$ ls -l
total 0
drwxrwsrwx 0 ldz ldz 512 Sep 3 10:48 de #可以看到使用者組的執行許可權由之前的x更改為了s
chmod +t 目錄
[email protected]:~/bb$ chmod +t de
[email protected]:~/bb$ ls -l
total 0
drwxrwsrwt 0 ldz ldz 512 Sep 3 10:48 de #可以看到其他使用者的執行許可權由之前的x更改為了t
切換使用者
有三種方式可以切換使用者身份
-
登出系統並以其他使用者身份重新登入系統。
-
使用 su 命令。
-
使用 sudo 命令。
第一種方法十分不方便,跳過就好。下面介紹另外兩種。
使用 su 命令切換使用者
使用方法為:su 選項 username
選項 | 作用 |
-c<指令>或--command=<指令> | 執行完指定的指令後,即恢復原來的身份 |
-f或--fast | 適用於csh與tsch,使shell不用去讀取啟動檔案 |
-l或--login | 改變身份時,也同時變更工作目錄,以及shell環境 |
-m,-p或--preserve-environment | 變更身份時,不要變更環境變數 |
-s<shell>或--shell=<shell> | 指定要執行的shell |
如果命令不包含引數選項,則僅僅切換使用者身份,工作目錄和shell環境不會改變(只有切換了Shell環境才不會出現PATH環境變數錯誤)。如果包含”-l”選項,那麼會為指定使用者啟動一個需要登入的 shell。這意味著會載入此使用者的 shell 環境, 並且工作目錄會更改到這個使用者的家目錄。如果不指定使用者,那麼就假定是超級使用者。注意,選項”-l”可以縮寫為”-“。
eg:啟動超級使用者的 shell
su -
按下回車符之後,shell 提示我們輸入超級使用者的密碼。如果密碼輸入正確,出現一個新的 shell 提示符, 表明這個 shell 具有超級使用者特權(提示符的末尾字元是”#”而不是”$”),並且當前工作目錄是超級使用者的家目錄 (通常是/root)。一旦進入一個新的 shell,我們能執行超級使用者所使用的命令。當工作完成後, 輸入”exit”,則返回到原來的 shell。
也可以利用“-c”選項只執行單個命令,而不是啟動一個新的可互動的 shell:
su -c 'command'
使用這種模式,命令傳遞到一個新 shell 中執行。注意要把命令用單引號引起來,因為我們不想命令在我們的 shell 中展開,而是在新 shell 中展開。
使用 sudo 命令以另一個使用者身份執行命令
管理員能夠配置 sudo 命令,從而允許普通使用者以不同的身份(通常是超級使用者),來執行命令。經過配置,sudo 命令不要求超級使用者的密碼,而是使用自己的密碼來認證。與 su 的一個重要區別是 sudo 不會重新啟動一個 shell,也不會載入另一個使用者的 shell 執行環境。
檢視 sudo 命令被授予了哪些許可權,可以使用“-l”選項:
[email protected]:~$ sudo -l
[sudo] password for ldz:
User ldz may run the following commands on MSI.localdomain:
(ALL : ALL) ALL
預設是 ALL 。注意,在第一次使用sudo命令之後,sudo命令會信任你幾分鐘,接下來再次使用sudo命令時不會提示輸入密碼,直到計時結束。
更改檔案所有者和使用者組
chown 命令可以用來更改檔案或目錄的所有者和使用者組。使用這個命令需要超級使用者許可權。
使用方法:chown 引數 filename...
引數 | 結果 |
---|---|
bob | 把檔案所有者從當前屬主更改為使用者 bob。 |
bob:users | 把檔案所有者改為使用者 bob,檔案使用者組改為使用者組 users。 |
:admins | 把檔案使用者組改為組 admins,檔案所有者不變。 |
bob: | 檔案所有者改為使用者 bob,檔案使用者組改為使用者 bob 登入系統時所屬的使用者組。 |
更改使用者組所有權
舊版 Unix 系統中,chown 命令只能更改檔案所有者,不能更改使用者組。後者需要 chgrp 命令來完成,chgrp 命令與 chown 命令使用方法類似。
更改使用者密碼
使用 passwd 命令,來設定或更改使用者密碼。
使用方法:passwd username
不帶使用者名稱引數時,預設修改當前使用者密碼,passwd 命令會強迫你使用“強”密碼。拒絕接受太短的密碼、與先前相似的密碼、 字典中的單詞作為密碼或者是太容易猜到的密碼。
如果具有超級使用者許可權,還可以指定一個使用者名稱作為 passwd 命令的引數,設定另一個使用者的密碼。
修改超級使用者密碼有兩種方式,第一種是先進入root使用者,然後輸入passwd,適用於單純想要更新密碼的。第二種是直接在普通使用者輸入sudo passwd root 修改密碼,適用於忘記了root使用者密碼的情況。
建立新的使用者與刪除使用者
Linux提供adduser與useradd兩個命令用來建立新的使用者。但都需要使用root許可權。
adduser 引數username #建立一個普通使用者
deluser username #刪除一個普通使用者
eg:
adduser ldz
如果不設定中間引數,則預設在/home下自動建立使用者目錄,設定系統shell程式(通常為/bin/bash),會在建立時會提示設定密碼。新建立的使用者可以在電腦重啟時用來登入GUI,也可以在系統設定中與原來的使用者隨時切換。
useradd 選項 username #建立一個普通使用者
userdel username #刪除一個普通使用者
主要選項 -c:加上備註文字,備註文字儲存在passwd的備註欄中。 -d:指定使用者登入時的啟始目錄。 -D:變更預設值。 -e:指定賬號的有效期限,預設表示永久有效。 -f:指定在密碼過期後多少天即關閉該賬號。 -g:指定使用者所屬的群組。 -G:指定使用者所屬的附加群組。 -m:自動建立使用者的登入目錄。 -M:不要自動建立使用者的登入目錄。 -n:取消建立以使用者名稱稱為名的群組。 -r:建立系統賬號。 -s:指定使用者登入後所使用的shell。 -u:指定使用者ID號。
如果不使用任何選項,則預設只建立一個使用者名稱,還需要手動設定登入密碼、shell程式、使用者目錄等。注意:使用useradd新建立的使用者,不可以用來登入GUI,只能在終端中切換該使用者。使用useradd指令所建立的帳號,實際上是儲存在/etc/passwd文字檔案中。
eg:
useradd csdn #新建使用者
passwd csdn #設定密碼
usermod -s /bin/bash csdn #設定shell程式
usermod -d /home/csdn csdn #指定使用者目錄
有關使用者和使用者組管理的命令:useradd(新增) usermod(修改) userdel(刪除)
groupadd(新增) groupmod(修改) groupdel(刪除)