1. 程式人生 > >Linux基礎命令(四):高階鍵盤操作與許可權控制——history、自動補全、命令列快捷鍵、歷史命令展開、id、chmod、umask、su、sudo、chown、chgrp、passwd

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” 的組合來指定 要影響的物件:

chmod 命令符號表示法
u "user"的簡寫,意思是檔案或目錄的所有者。
g 使用者組。
o "others"的簡寫,意思是其他所有的人。
a "all"的簡寫,是"u", "g"和“o”三者的聯合。

如果沒有指定字元,則預設使用”all”。執行的操作可能是一個 “+”字元表示加上一個許可權, 一個 “-”字元表示刪掉一個許可權,或者是一個 “=”字元表示只有指定的許可權可用,其它所有的許可權被刪除。許可權由 “r”、“w”和 “x” 來指定。

chmod 符號表示法例項
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

切換使用者

有三種方式可以切換使用者身份

  1. 登出系統並以其他使用者身份重新登入系統。

  2. 使用 su 命令。

  3. 使用 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...

chown 引數例項
引數 結果
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(刪除)