【Linux入門教程】2 檔案許可權和訪問模式、環境變數、管道和過濾器
Linux檔案許可權和訪問模式
為了更加安全的儲存檔案,Linux為不同的檔案賦予了不同的許可權,每個檔案都擁有下面三種許可權:
- 所有者許可權:檔案所有者能夠進行的操作
- 組許可權:檔案所屬使用者組能夠進行的操作
- 外部許可權(其他許可權):其他使用者可以進行的操作。
檢視檔案許可權
使用 ls -l 命令可以檢視與檔案許可權相關的資訊:
$ls -l /home/amrood -rwxr-xr-- 1 amrood users 1024 Nov 2 00:10 myfile drwxr-xr--- 1 amrood users 1024 Nov 2 00:10 mydir
第一列就包含了檔案或目錄的許可權。
第一列的字元可以分為三組,每一組有三個,每個字元都代表不同的許可權,分別為讀取(r)、寫入(w)和執行(x):
- 第一組字元(2-4)表示檔案所有者的許可權,-rwxr-xr-- 表示所有者擁有讀取(r)、寫入(w)和執行(x)的許可權。
- 第二組字元(5-7)表示檔案所屬使用者組的許可權,-rwxr-xr-- 表示該組擁有讀取(r)和執行(x)的許可權,但沒有寫入許可權。
- 第三組字元(8-10)表示所有其他使用者的許可權,rwxr-xr-- 表示其他使用者只能讀取(r)檔案。
檔案訪問模式
檔案許可權是Linux系統的第一道安全防線,基本的許可權有讀取(r)、寫入(w)和執行(x):
- 讀取:使用者能夠讀取檔案資訊,檢視檔案內容。
- 寫入:使用者可以編輯檔案,可以向檔案寫入內容,也可以刪除檔案內容。
- 執行:使用者可以將檔案作為程式來執行。
目錄訪問模式
目錄的訪問模式和檔案類似,但是稍有不同:
- 讀取:使用者可以檢視目錄中的檔案
- 寫入:使用者可以在當前目錄中刪除檔案或建立檔案
- 執行:執行許可權賦予使用者遍歷目錄的權利,例如執行 cd 和 ls 命令。
改變許可權
可以使用 chmod (change mode) 命令來改變檔案或目錄的訪問許可權,許可權可以使用符號或數字來表示。
使用符號表示許可權
對於初學者來說最簡單的就是使用符號來改變檔案或目錄的許可權,你可以增加(+)和刪除(-)許可權,也可以指定特定許可權。
符號 | 說明 |
---|---|
+ | 為檔案或目錄增加許可權 |
- | 刪除檔案或目錄的許可權 |
= | 設定指定的許可權 |
下面的例子將會修改 testfile 檔案的許可權:
$ls -l testfile -rwxrwxr-- 1 amrood users 1024 Nov 2 00:10 testfile $chmod o+wx testfile $ls -l testfile -rwxrwxrwx 1 amrood users 1024 Nov 2 00:10 testfile $chmod u-x testfile $ls -l testfile -rw-rwxrwx 1 amrood users 1024 Nov 2 00:10 testfile $chmod g=rx testfile $ls -l testfile -rw-r-xrwx 1 amrood users 1024 Nov 2 00:10 testfile
也可以同時使用多個符號:
$chmod o+wx,u-x,g=rx testfile $ls -l testfile -rw-r-xrwx 1 amrood users 1024 Nov 2 00:10 testfile
使用數字表示許可權
除了符號,也可以使用八進位制數字來指定具體許可權,如下表所示:
數字 | 說明 | 許可權 |
---|---|---|
0 | 沒有任何許可權 | --- |
1 | 執行許可權 | --x |
2 | 寫入許可權 | -w- |
3 | 執行許可權和寫入許可權:1 (執行) + 2 (寫入) = 3 | -wx |
4 | 讀取許可權 | r-- |
5 | 讀取和執行許可權:4 (讀取) + 1 (執行) = 5 | r-x |
6 | 讀取和寫入許可權:4 (讀取) + 2 (寫入) = 6 | rw- |
7 | 所有許可權: 4 (讀取) + 2 (寫入) + 1 (執行) = 7 | rwx |
下面的例子,首先使用 ls -1 命令檢視 testfile 檔案的許可權,然後使用 chmod 命令更改許可權:
$ls -l testfile -rwxrwxr-- 1 amrood users 1024 Nov 2 00:10 testfile $ chmod 755 testfile $ls -l testfile -rwxr-xr-x 1 amrood users 1024 Nov 2 00:10 testfile $chmod 743 testfile $ls -l testfile -rwxr---wx 1 amrood users 1024 Nov 2 00:10 testfile $chmod 043 testfile $ls -l testfile ----r---wx 1 amrood users 1024 Nov 2 00:10 testfile
更改所有者和使用者組
在Linux中,每新增一個新使用者,就會為它分配一個使用者ID和群組ID,上面提到的檔案許可權也是基於使用者和群組來分配的。
有兩個命令可以改變檔案的所有者或群組:
- chown:chown 命令是"change owner"的縮寫,用來改變檔案的所有者。
- chgrp:chgrp 命令是"change group"的縮寫,用來改變檔案所在的群組。
chown 命令用來更改檔案所有者,其語法如下:
$ chown user filelist
user 可以是使用者名稱或使用者ID,例如
$ chown amrood testfile
將 testfile 檔案的所有者改為 amrood。
注意:超級使用者 root 可以不受限制的更改檔案的所有者和使用者組,但是普通使用者只能更改所有者是自己的檔案或目錄。
chgrp 命令用來改變檔案所屬群組,其語法為:
$ chgrp group filelist
group可以是群組名或群組ID,例如
$ chgrp special testfile
將檔案 testfile 的群組改為 special。
SUID和SGID位
在Linux中,一些程式需要特殊許可權才能完成使用者指定的操作。
例如,使用者的密碼儲存在 /etc/shadow 檔案中,出於安全考慮,一般使用者沒有讀取和寫入的許可權。但是當我們使用 passwd 命令來更改密碼時,需要對 /etc/shadow 檔案有寫入許可權。這就意味著,passwd 程式必須要給我們一些特殊許可權,才可以向 /etc/shadow 檔案寫入內容。
Linux 通過給程式設定SUID(Set User ID)和SGID(Set Group ID)位來賦予普通使用者特殊許可權。當我們執行一個帶有SUID位的程式時,就會繼承該程式所有者的許可權;如果程式不帶SUID位,則會根據程式使用者的許可權來執行。
SGID也是一樣。一般情況下程式會根據你的組許可權來執行,但是給程式設定SGID後,就會根據程式所在組的組許可權執行。
如果程式設定了SUID位,就會在表示檔案所有者可執行許可權的位置上出現's'字母;同樣,如果設定了SGID,就會在表示檔案群組可執行許可權的位置上出現's'字母。如下所示:
$ ls -l /usr/bin/passwd -r-sr-xr-x 1 root bin 19031 Feb 7 13:47 /usr/bin/passwd*
上面第一列第四個字元不是'x'或'-',而是's',說明 /usr/bin/passwd 檔案設定了SUID位,這時普通使用者會以root使用者的許可權來執行passwd程式。
注意:小寫字母's'說明檔案所有者有執行許可權(x),大寫字母'S'說明程式所有者沒有執行許可權(x)。
如果在表示群組許可權的位置上出現SGID位,那麼也僅有三類使用者可以刪除該目錄下的檔案:目錄所有者、檔案所有者、超級使用者 root。
為一個目錄設定SUID和SGID位可以使用下面的命令:
$ chmod ug+s dirname $ ls -l drwsr-sr-x 2 root root 4096 Jun 19 06:45 dirname
Linux環境變數
在Linux中,環境變數是一個很重要的概念。環境變數可以由系統、使用者、Shell以及其他程式來設定。
變數就是一個可以被賦值的字串,賦值範圍包括數字、文字、檔名、裝置以及其他型別的資料。
下面的例子,我們將為變數 TEST 賦值,然後使用 echo 命令輸出:
$TEST="Linux Programming" $echo $TEST Linux Programming
注意:變數賦值時前面不能加 $ 符號,變數輸出時必須要加 $ 字首。退出 Shell 時,變數將消失。
登入系統後,Shell會有一個初始化的過程,用來設定環境變數。這個階段,Shell會讀取 /etc/profile 和 .profile 兩個檔案,過程如下:
- Shell首先檢查 /etc/profile 檔案是否存在,如果存在,就讀取內容,否則就跳過,但是不會報錯。
- 然後檢查你的主目錄(登入目錄)中是否存在 .profile 檔案,如果存在,就讀取內容,否則就跳過,也不會報錯。
讀取完上面兩個檔案,Shell就會出現 $ 命令提示符:
$
出現這個提示符,就可以輸入命令並呼叫相應的程式了。
注意:上面是Bourne Shell的初始化過程,bash 和 ksh 在初始化過程中還會檢查其他檔案。
.profile檔案
/etc/profile檔案包含了通用的Shell初始化資訊,由Linux管理員維護,一般使用者無權修改。
但是你可以修改主目錄下的 .profile 檔案,增加一些“私人定製”初始化資訊,包括:
- 設定預設終端型別和外觀樣式;
- 設定 Shell 命令查詢路徑,即PATH變數;
- 設定命令提示符。
找到主目錄下的 .profile 檔案,使用 vi 編輯器開啟並檢視內容。
設定終端型別
一般情況下,我們使用的終端是由 login 或 getty 程式設定的,可能會不符合我們的習慣。
對於沒有使用過的終端,可能會比較生疏,不習慣命令的輸出樣式,互動起來略顯吃力。所以,一般使用者會將終端設定成下面的型別:
$TERM=vt100
vt100 是 virtual terminate 100 的縮寫。虛擬終端是一種假的終端,真正有自己的顯示器和鍵盤的終端,會通過特殊電纜(如串列埠)連到計算機主機。vt100 是被絕大多數Linux系統所支援的一種虛擬終端規範,常用的還有ansi、xterm等。
設定PATH變數
在命令提示符下輸入一個命令時,Shell 會根據 PATH 變數來查詢該命令對應的程式,PATH變數指明瞭這些程式所在的路徑。
一般情況下PATH變數的設定如下:
$PATH=/bin:/usr/bin
多個路徑使用冒號(:)分隔。如果使用者輸入的命令在PATH設定的路徑下沒有找到,就會報錯,例如:
$hello hello: not found
PS1和PS2變數
PS1變數用來儲存命令提示符,可以隨意修改,如果你不習慣使用 $ 作為提示符,也可以改成其他字元。PS1變數被修改後,提示符會立即改變。
例如,把命令提示符設定成'=>':
$PS1='=>' => => =>
也可以將提示資訊設定成當前目錄,例如:
=>PS1="[\u@\h \w]\$" [root@ip-72-167-112-17 /var/www/tutorialspoint/Linux]$ [root@ip-72-167-112-17 /var/www/tutorialspoint/Linux]$
命令提示資訊包含了使用者名稱、主機名和當前目錄。
下表中的轉義字元可以被用作PS1的引數,豐富命令提示符資訊。
轉義字元 | 描述 |
---|---|
\t | 當前時間,格式為 HH:MM:SS |
\d | 當前日期,格式為Weekday Month Date |
\n | 換行 |
\W | 當前所在目錄 |
\w | 當前所在目錄的完整路徑 |
\u | 使用者名稱 |
\h | 主機名(IP地址) |
# | 輸入的命令的個數,每輸入一個新的命令就會加1 |
\$ | 如果是超級使用者 root,提示符為#,否則為$。 |
你可以在每次登入的時候修改提示符,也可以在 .profile 檔案中增加 PS1 變數,這樣每次登入時會自動修改提示符。
如果使用者輸入的命令不完整,Shell還會使用第二提示符來等待使用者完成命令的輸入。預設的第二命令提示符是 >,儲存在 PS2 變數,可以隨意修改。
下面的例子使用預設的第二命令提示符:
$ echo "this is a > test" this is a test $
下面的例子通過PS2變數改變提示符:
$ PS2="secondary prompt->" $ echo "this is a secondary prompt->test" this is a test $
常用環境變數
下表列出了部分重要的環境變數,這些變數可以通過上面提到的方式修改。
變數 | 描述 |
---|---|
DISPLAY | 用來設定將圖形顯示到何處。 |
HOME | 當前使用者的主目錄。 |
IFS | 內部域分隔符。 |
LANG | LANG可以讓系統支援多語言。例如,將LANG設為pt_BR,則可以支援(巴西)葡萄牙語。 |
PATH | 指定Shell命令的路徑。 |
PWD | 當前所在目錄,即 cd 到的目錄。 |
RANDOM | 生成一個介於 0 和 32767 之間的隨機數。 |
TERM | 設定終端型別。 |
TZ | 時區。可以是AST(大西洋標準時間)或GMT(格林尼治標準時間)等。 |
UID | 以數字形式表示的當前使用者ID,shell啟動時會被初始化。 |
下面的例子中使用了部分環境變數:
$ echo $HOME /root ]$ echo $DISPLAY $ echo $TERM xterm $ echo $PATH /usr/local/bin:/bin:/usr/bin:/home/amrood/bin:/usr/local/bin $
Linux管道和過濾器
有時候,我們可以把兩個命令連起來使用,一個命令的輸出作為另一個命令的輸入,這就叫做管道。為了建立管道,需要在兩個命令之間使用豎線(|)連線。
管道是Linux程式之間一種重要的通訊機制;除了管道,還有共享記憶體、訊息佇列、訊號、套接字(socket) 等程式通訊機制。
管道使用豎線(|)將兩個命令隔開,豎線左邊命令的輸出就會作為豎線右邊命令的輸入。連續使用豎線表示第一個命令的輸出會作為第二個命令的輸入,第二個命令的輸出又會作為第三個命令的輸入,依此類推。
能夠接受資料,過濾(處理或篩選)後再輸出的工具,稱為過濾器。
grep命令
grep 是一個強大的文字搜尋工具,可以使用正規表示式,並返回匹配的行,語法為:
$grep pattern file(s)
“grep”源於 ed(Linux的一個行文字編輯器)的 g/re/p 命令,g/re/p 是“globally search for a regular expression and print all lines containing it”的縮寫,意思是使用正規表示式進行全域性檢索,並把匹配的行列印出來。
正規表示式是一個包含了若干特殊字元的字串,每個字元都有特殊含義,可以用來匹配文字,更多資訊請檢視正規表示式教程。
grep 可以看做是一個過濾器,如果沒有為 grep 指定要檢索的檔案,那麼它會從標準輸入裝置(一般是鍵盤)讀取;其他過濾器也是如此。
grep 命令最簡單的使用就是檢索包含固定字元的文字。
例如,在管道中使用 grep 命令,只允許包含指定字元的行輸出到顯示器:
$ls -l | grep "Aug" -rw-rw-rw- 1 john doc 11008 Aug 6 14:10 ch02 -rw-rw-rw- 1 john doc 8515 Aug 6 15:30 ch07 -rw-rw-r-- 1 john doc 2488 Aug 15 10:51 intro -rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros $
grep 命令有很多選項:
選項 | 說明 |
---|---|
-v | 反轉查詢,輸出不匹配的行。例如,grep -v "test" demo.txt 將輸出不包含"test"的行。 |
-n | 輸出匹配的行以及行號。 |
-l | 輸出匹配的行所在的檔名。 |
-c | 輸出匹配的總行數。 |
-i | 不區分大小寫進行匹配。 |
下面我們使用正規表示式來匹配這樣的行:包含字元“carol”,然後包含任意數目(含零個)的其他字元,最後還要包含“Aug”。
使用 -i 選項進行不區分大小寫的匹配:
$ls -l | grep -i "carol.*aug" -rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros $
sort命令
sort 命令在 Linux 中非常有用,它將檔案中的各行按字母或數進行排序。sort命令既可以從特定的檔案,也可以從stdin獲取輸入。
例如,對 foot 檔案的各行進行排序:
$sort food Afghani Cuisine Bangkok Wok Big Apple Deli Isle of Java Mandalay Sushi and Sashimi Sweet Tooth Tio Pepe's Peppers $
通過下面的選項可以控制排序規則:
選項 | 描述 |
---|---|
-n | 按照數字大小排序,例如,10會排在2後面;-n 選項會忽略空格或 tab縮排。 |
-r | 降序排序。sort 預設是升序排序。 |
-f | 不區分大小寫。 |
+x | 對第x列(從0開始)進行排序。 |
下面的例子通過管道將 ls、grep 和 sort 命令連起來使用,過濾包含“Aug”的行,並按照檔案大小排序:
$ls -l | grep "Aug" | sort +4n -rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros -rw-rw-r-- 1 john doc 2488 Aug 15 10:51 intro -rw-rw-rw- 1 john doc 8515 Aug 6 15:30 ch07 -rw-rw-rw- 1 john doc 11008 Aug 6 14:10 ch02 $
上面的命令,對當前目錄中八月份修改的檔案按照大小排序;+4n 表示對第5列按照數字大小排序。
pg和more命令
如果檔案內容過多,全部顯示會很亂,可以使用 pg 和 more 命令分頁顯示,每次只顯示一屏。
例如,通過管道,使用more命令顯示目錄中的檔案:
$ls -l | grep "Aug" | sort +4n | more -rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros -rw-rw-r-- 1 john doc 2488 Aug 15 10:51 intro -rw-rw-rw- 1 john doc 8515 Aug 6 15:30 ch07 -rw-rw-r-- 1 john doc 14827 Aug 9 12:40 ch03 . . . -rw-rw-rw- 1 john doc 16867 Aug 6 15:56 ch05 --More--(74%)
如上,一次只顯示一屏文字,顯示滿後,停下來,並提示已顯示全部內容的百分比,按空格鍵(space)可以檢視下一屏,按 b 鍵可以檢視上一屏。
相關文章
- 利用PATH環境變數 - 提升linux許可權~?變數Linux
- linux 檔案許可權 s 許可權和 t 許可權解析Linux
- Linux的檔案存取許可權和0644許可權Linux
- Linux 檔案許可權Linux
- Linux檔案許可權Linux
- 阿里雲體驗實驗室 教程《Linux指令入門-檔案與許可權》阿里Linux
- win共享檔案沒有許可權訪問怎麼辦 win10共享檔案許可權訪問的方法Win10
- Linux檔案許可權對應數值Linux
- 《MySQL 入門教程》第 05 篇 賬戶和許可權MySql
- Linux 許可權入門指南Linux
- rust程式中設定和訪問環境變數Rust變數
- [svc]linux檔案許可權Linux
- Linux下的檔案許可權和使用者身份Linux
- linux的常用操作——檢視和修改檔案許可權Linux
- linux 基礎(2)檔案許可權及其修改Linux
- 使用maven-war-plugin動態載入處理環境變數,過濾打包檔案MavenPlugin變數
- Linux檔案許可權管理命令Linux
- Linux中檔案的許可權Linux
- Linux的檔案許可權管理Linux
- Linux更改檔案及目錄許可權問題Linux
- Vue 設定環境變數和模式Vue變數模式
- Java入門筆記(六)——訪問許可權修飾符Java筆記訪問許可權
- linux3-管道符、重定向、環境變數Linux變數
- Ionic2入門教程(一)安裝和環境配置
- 教程示例:控制儲存空間和資料夾的訪問許可權訪問許可權
- Linux 檔案許可權管理的方法Linux
- linux 檔案、資料夾許可權Linux
- Laravel 和 Lumen 中通過環境變數配置對應的 env 檔案Laravel變數
- [20191104]sqlplus 管道檔案 過濾.txtSQL
- 簡單介紹Linux環境變數檔案Linux變數
- 『學了就忘』Linux許可權管理 — 55、檔案特殊許可權Linux
- 如何在 Linux 中配置 sudo 訪問許可權Linux訪問許可權
- C++中封裝和繼承的訪問許可權C++封裝繼承訪問許可權
- hdfs檔案本地許可權問題
- Linux檔案許可權符號含義Linux符號
- Linux 檔案許可權、系統優化Linux優化
- Linux常用檔案許可權命令詳解Linux
- Linux檔案讀、寫、執行許可權Linux