1. 程式人生 > >2018-05-11筆記

2018-05-11筆記

linux

1、系統文件目錄結構

/bin:bin是Binary的縮寫,該目錄下存放的是最常用的命令。
/boot:該目錄下存放的是啟動Linux時使用的一些核心文件,包括一些連接文件以及鏡像文件。
/dev:dev是Device(設備)的縮寫。該目錄下存放的是Linux的外部設備。在Linux中,訪問設備的方式和訪問文件的方式是相同的。
/etc:該目錄下存放的是所有系統管理所需要的配置文件和子目錄。
/home:這是用戶的主目錄。在Linux中,每個用戶都有一個自己的目錄,一般該目錄名是以用戶的賬號命名的。
/lib和/lib64:這兩個目錄下存放的是系統最基本的動態連接共享庫,其作用類似於Windows裏的DLL文件,幾乎所有的應用程序都需要用到這些共享庫。其中/lib64為64位的軟件包的庫文件所在目錄。

/media:系統會自動識別一些設備(如U盤、光驅等),當識別後,Linux會把識別的設備掛載到該目錄下。
/mnt:系統提供該目錄是為了讓用戶臨時掛載別的文件系統。我們可以將光驅掛載到/mnt/上,然後進入該目錄查看光驅裏的內容。
/opt:這是給主機額外安裝軟件所設置的目錄,該目錄默認為空。比如你要安裝一個ORACLE數據庫,可以放到該目錄下。
/proc:該目錄是一個虛擬的目錄,是系統內存的映射,我們可以通過直接訪問來獲取系統信息。該目錄的內容在內存裏,我們可以直接修改裏面的某些文件。比如可以通過下面的命令來屏蔽主機的ping命令,使其他人無法ping你的機器。後續,在日常工作中,你會經常用到類似的用法。

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

/root:該目錄是系統管理員的用戶主目錄。
/run:這個目錄其實和/var/run是同一個目錄,這裏面存放的是一些服務的pid,一個服務啟動完後,是有一個pid文件的。
/sbin:s就是Super User的意思,該目錄存放的是系統管理員使用的系統管理程序。
/srv:該目錄存放的是一些服務啟動之後需要提取的數據。
/sys:該目錄存放的是與硬件驅動程序相關的信息。
/tmp:該目錄是用來存放一些臨時文件的。
/usr:這是一個非常重要的目錄,類似於Windows下的Program Files目錄,用戶的很多應用程序和文件都存放在該目錄下。後面的章節中,我們會多次用到這個目錄。

/usr/bin:該目錄存放的是系統用戶使用的應用程序。
/usr/sbin: 該目錄存放的是超級用戶使用的比較高級的管理程序和系統守護程序。
/usr/src :該目錄是內核源代碼默認的放置目錄。
/var:該目錄存放的是在不斷擴充且經常被修改的目錄,包括各種日誌文件或者pid文件,剛剛提到的/var/run就是在/var目錄下面
在Linux系統中,有幾個重要的目錄需要註意,不要誤刪除或者隨意更改其內部文件。
/etc目錄下是系統的配置文件,如果更改了該目錄下的某個文件可能會導致系統無法正常啟動。
/bin、/sbin、/usr/bin和/usr/sbin目錄是系統預設的執行文件的放置目錄,其中/bin和/usr/bin目錄下是供系統用戶使用的指令(除root外的通用賬戶),而/sbin和/usr/sbin目錄下則是供root使用的指令。比如ls指令就存放在/bin/目錄下。
/var也是一個非常重要的目錄,系統上運行各個程序時所產生的日誌都被記錄在該目錄下(即/var/log目錄中),另外mail指令的預設也放置在這裏

ldd命令可以查看文件所依賴的庫

[root@localhost ~]# ldd /bin/ls
    linux-gate.so.1 =>  (0x00406000)
    libselinux.so.1 => /lib/libselinux.so.1 (0x002c1000)
    librt.so.1 => /lib/librt.so.1 (0x005ca000)
    libcap.so.2 => /lib/libcap.so.2 (0x002fd000)
    libacl.so.1 => /lib/libacl.so.1 (0x00661000)
    libc.so.6 => /lib/libc.so.6 (0x00c9b000)
    libdl.so.2 => /lib/libdl.so.2 (0x003d3000)
    /lib/ld-linux.so.2 (0x00c72000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x00178000)
    libattr.so.1 => /lib/libattr.so.1 (0x00269000)

2、ls命令
ls = list(列出目標目錄中所有子目錄和文件)
語法: ls [選項] [目錄名]
常用選項:
-a =all 列出目錄下的所有文件,包括以“.”開頭的隱藏文件
-l 除了文件名之外還將文件的權限、所有者、文件大小等信息詳細列出來
-t 以文件編輯時間就近排序
-i =inode(索引節點號)顯示文件的索引節點號
-d directory 只列出目錄名稱,不顯示目錄其他信息
註:以上選項均可組合使用!

[root@localhost ~]# ls -ltr /root
總用量 24
-rw-r--r--. 1 root root  3482 4月  22 00:05 install.log.syslog
-rw-r--r--. 1 root root 12360 4月  22 00:06 install.log
-rw-------. 1 root root   974 4月  22 00:06 anaconda-ks.cfg

3、文件類型
LINUX中的七種文件類型
d 目錄文件。
l 符號鏈接(指向另一個文件,類似於win下的快捷方式)。
s 套接字文件。socket文件
b 塊設備文件,二進制文件。
c 字符設備文件。
p 命名管道文件。

  • f 普通文件
    可以通過ls -l 命令查看文件的具體信息看到文件的類型
    [root@localhost ~]# ls -l /var/run/rpcbind.sock 
    srw-rw-rw-. 1 root root 0 5月  12 23:56 /var/run/rpcbind.sock

4、alias命令
alias 設置指令的別名
語法: alias [別名]=[指令名稱]
輸入alias可以查看系統預設的別名

[root@localhost ~]# alias
alias cp=‘cp -i‘
alias l.=‘ls -d .* --color=auto‘
alias ll=‘ls -l --color=auto‘
alias ls=‘ls --color=auto‘
alias mv=‘mv -i‘
alias rm=‘rm -i‘
alias which=‘alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde‘

設置別名的辦法和系統預設別名一樣,用戶alias設置別名僅對當前shell有效,若要使得該別名永久生效,可以編輯 .profile 或 .bashrc文件

5、絕對路徑和相對路徑 cd、pwd、mkdir、rmdir、rm命令
絕對路徑:路徑的寫法一定由根目錄 ‘/’寫起,例如 /root/.ssh/authorized_keys這就是絕對路徑。

相對路徑:路徑的寫法不是由根目錄 ‘/’寫起,例如,首先用戶進入到/, 然後再進入到home ,命令為 cd /home 然後 cd test 此時用戶所在的路徑為 /home/test 第一個cd命令後跟 ‘/home’ 第二個cd命令後跟 ‘test’, 並沒有斜杠,這個 ‘test’ 是相對於 ‘/home’ 目錄來講的,所以叫做相對路徑

cd命令
cd=change directory更改目錄
cd - 進入上次所在目錄
cd ~ 進入當前用戶的家目錄
cd . 進入當前目錄
cd .. 進入當前目錄的上一級目錄
cd /tmp/ 進入指定目錄

pwd命令
pwd = Print Working Directory 指印工作的目錄
作用: 顯示工作目錄的路徑名稱
語法: pwd [選項]
```[root@localhost ~]# pwd
/root

目錄設有鏈接時,pwd -P顯示其實際路徑

[root@localhost ~]# cd /etc/init.d/
[root@localhost init.d]# pwd -P
/etc/rc.d/init.d


**mkdir命令**
mkdir=make directory創建目錄
語法: mkdir [-mp] [目錄名稱] ,其中-m,-p為其選項。
-m =mod 指定目錄的權限

[root@localhost tmp]# mkdir -m 700 /123
[root@localhost tmp]# ll -d /123
drwx------. 2 root root 4096 5月 13 01:37 /123

-p 創建級聯目錄,當上一級目錄不存在時幫你直接創建,這個選項還有一個好處,那就是當你創建一個已經存在的目錄時,不會報錯

[root@localhost tmp]# mkdir /tmp/123/111/
mkdir: 無法創建目錄"/tmp/123/111": 沒有那個文件或目錄
[root@localhost ~]# mkdir -p /tmp/123/111/
[root@localhost ~]# tree /tmp
/tmp
├── 123
│?? └── 111


**rmdir命令 刪除空目錄**
rmdir 有一個和mkdir同樣的選項 ‘-p’, 可以級聯刪除一大串目錄,但是級聯的目錄中其中一個目錄裏還有目錄或者文件時就不好用了。

**rm命令**
rm=remove
rm命令可以刪除一個目錄中的一個或多個文件或目錄,也可以將某個目錄及其下屬的所有文件及其子目錄均刪除掉。對於鏈接文件,只是刪除整個鏈接文件,而原有文件保持不變。
語法: rm (選項) (參數)
選項:
-r 刪除目錄用的選項
-f 強制刪除文件或目錄
-d 直接把欲刪除的目錄的硬連接數據刪除成0,刪除該目錄
-i 刪除已有文件或目錄之前先詢問用戶
-v =visual顯示指令的詳細執行過程
註: -rf可以組合使用。使用rm命令要格外小心,因為一旦刪除了一個文件,就無法再恢復它。所以,在刪除文件之前,最好再看一下文件的內容,確定是否真要刪除。rm命令可以用-i選項,這個選項在使用文件擴展名字符刪除多個文件時特別有用。使用這個選項,系統會要求你逐一確定是否要刪除。這時,必須輸入y並按Enter鍵,才能刪除文件。如果僅按Enter鍵或其他字符,文件不會被刪除

**環境變量PATH**
PATH路徑的變量,當輸入命令的時候LINUX會去查找PATH裏面記錄的路徑(系統預設的命令除外,例如:ls、cd等等)。為什麽我們輸入很多命令時是直接打出了命令,而沒有去使用這些命令的絕對路徑?這就是因為環境變量PATH在起作用了,可以輸入echo $PATH查看默認的路徑

[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

添加一個路徑

[root@localhost ~]# PATH=$PATH:/tmp
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/tmp

**cp命令**
copy的簡寫,拷貝文件或目錄。格式為 cp  [選項]  [ 來源文件 ] [目的文件]
常用的選項:
-r : 如果你要拷貝一個目錄,必須要加-r選項,否則你是拷貝不了目錄的, 和 ‘rm’ 類似。

[root@localhost tmp]# cp /123 /tmp
cp: 略過目錄"/123"
[root@localhost tmp]# cp -r /123 /tpm
[root@localhost tmp]# ls /tmp
123 yum.log

-i 安全選項,類似於rm命令,如果遇到一個存在的文件,會詢問是否覆蓋。系統默認cp=cp -i。
註: 當目標目錄已存在的時候,cp命令會把源目錄放到目標目錄下面;當目標目錄不存在的時候,cp命令會把源目錄重命名後放到目標目錄的位置

**命令: mv**

‘mv’ 是move的簡寫。格式為 mv  [ 選項 ] [源文件] [目標文件] 下面介紹幾個常用的選項。

-i : 和cp的-i 一樣,當目標文件存在時會問用戶是否要覆蓋。在Redhat/CentOS系統中,我們使用的mv其實是mv -i

該命令有幾種情況:

1) 目標文件是目錄,而且目標文件不存在;

2) 目標文件是目錄,而且目標文件存在;

3) 目標文件不是目錄不存在;

4) 目標文件不是目錄存在;

目標文件是目錄,存在和不存在,移動的結果是不一樣的,如果存在,則會把源文件移動到目標文件目錄中。否則,就直接移動了,相當於重命名。例如:
目標文件為目錄,並且目標目錄不存在,相當於把 ‘dira’ 重命名為 ‘dirc’

[root@localhost ~]# mkdir dira dirb
[root@localhost ~]# ls
anaconda-ks.cfg dira dirb install.log install.log.syslog
[root@localhost ~]# mv dira dirc
[root@localhost ~]# ls
anaconda-ks.cfg dirb dirc install.log install.log.syslog

目標文件為目錄,且目標目錄存在,則會把 ‘dirc’ 移動到 ‘dirb’ 目錄裏

[root@localhost ~]# mv dirc dirb
[root@localhost ~]# ls
anaconda-ks.cfg dirb install.log install.log.syslog
[root@localhost ~]# ls dirb
dirc

目標文件不是目錄,且不存在,則會重命名文件

[root@localhost ~]# touch filed
[root@localhost ~]# ls
anaconda-ks.cfg dirb filed install.log install.log.syslog
[root@localhost ~]# mv filed filee
[root@localhost ~]# ls
anaconda-ks.cfg dirb filee install.log install.log.syslog
[root@localhost ~]# mv filee dirb
[root@localhost ~]# ls
anaconda-ks.cfg dirb install.log install.log.syslog
[root@localhost ~]# ls dirb
dirc filee


**幾個和文檔相關的命令 cat tac more less head tail**
**命令: cat**
比較常用的一個命令,即查看一個文件的內容並顯示在屏幕上, 後面可以不加任何選項直接跟文件名,兩個常用的選項:
-n : 查看文件時,把行號也顯示到屏幕上

[root@localhost tmp]# cat -n /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin

-A : 顯示所有東西出來,包括特殊字符

[root@localhost tmp]# cat -A /etc/passwd
root:x:0:0:root:/root:/bin/bash$
bin:x:1:1:bin:/bin:/sbin/nologin$
daemon:x:2:2:daemon:/sbin:/sbin/nologin$
adm:x:3:4:adm:/var/adm:/sbin/nologin$


**命令: tac 倒序顯示文件的內容**
和 ‘cat’ 一樣,用來把文件的內容顯示在屏幕上,只不過是先顯示最後一行,然後是倒數第二行,最後顯示的是第一行。

**命令: more**

也是用來查看一個文件的內容,後面直接跟文件名,當文件內容太多,一屏幕不能占下,而你用 ‘cat’ 肯定是看不前面的內容的,那麽使用 ‘more’ 就可以解決這個問題了。當看完一屏後按空格鍵繼續看下一屏。但看完所有內容後就會退出。如果你想提前退出,只需按 ‘q’ 鍵即可。

**命令: less**

作用跟more一樣,後面直接跟文件名,但比more好在可以上翻,下翻。空格鍵同樣可以翻頁,而按 ‘j’ 鍵可以向下移動(按一下就向下移動一行),按 ‘k’ 鍵向上移動。在使用more和less查看某個文件時,你可以按一下 ‘/’ 鍵,然後輸入一個word回車,這樣就可以查找這個word了。如果是多個該word可以按 ‘n’ 鍵顯示下一個。另外你也可以不按 ‘/’ 而是按 ‘?’ 後邊同樣跟word來搜索這個word,唯一不同的是, ‘/’ 是在當前行向下搜索,而 ‘?’ 是在當前行向上搜索。

**命令: head**

‘head’後直接跟文件名,則顯示文件的前十行。如果加 -n 選項則顯示文件前n行。‘-n’後可以有空格也可以無空格

[root@localhost ~]# head /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@localhost ~]# head -n 1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# head -n2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin


**命令: tail**

和head一樣,後面直接跟文件名,則顯示文件最後十行。如果加-n 選項則顯示文件最後n行

[root@localhost ~]# tail /etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:76:‘Saslauthd user‘:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
[root@localhost ~]# tail -n2 /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

-f : 動態顯示文件的最後十行,如果文件是不斷增加的,則用-f 選項。如:tail -f /var/log/messages 該選項特別特別常用

[root@localhost tmp]# tail -f /var/log/messages
May 12 23:56:42 localhost kernel: EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts:
May 12 23:56:42 localhost kernel: Adding 2097144k swap on /dev/sda3. Priority:-1 extents:1 across:2097144k
May 12 23:56:42 localhost kernel: NET: Registered protocol family 10
May 12 23:56:42 localhost kernel: lo: Disabled Privacy Extensions
May 12 23:56:42 localhost kernel: ip6_tables: (C) 2000-2006 Netfilter Core Team
May 12 23:56:42 localhost kernel: nf_conntrack version 0.5.0 (16102 buckets, 64408 max)
May 12 23:56:42 localhost kernel: ip_tables: (C) 2000-2006 Netfilter Core Team
May 12 23:56:42 localhost kernel: eth1: link up
May 12 23:56:43 localhost rpc.statd[924]: Version 1.2.3 starting
May 12 23:56:43 localhost sm-notify[925]: Version 1.2.3 starting


**文件的所屬主以及所屬組**

一個linux目錄或者文件,都會有一個所屬主和所屬組。所屬主,即文件的擁有者,而所屬組,即該文件所屬主所在的一個組。Linux這樣設置文件屬性的目的是為了文件的安全。例如,test文件的所屬主是user0 而test1文件的所屬主是user1,那麽user1是不能查看test文件的,相應的user0也不能查看test1文件。有時我們也會有這樣的需求,讓一個文件同時讓user0和user1來查看,這怎麽實現呢?
這時 ‘所屬組’ 就派上用場了。即,創建一個群組users,讓user0和user1同屬於users組,然後建立一個文件test2,且其所屬組為users,那麽user0和user1都可以訪問test2文件。Linux文件屬性不僅規定了所屬主和所屬組,還規定了所屬主(user)、所屬組(group)以及其他用戶(others)對該文件的權限。可以通過ls -l 來查看這些屬性。

[root@localhost ~]# ls -l
總用量 40
-rw-------. 1 root root 980 5月 7 18:00 anaconda-ks.cfg
drwxr-xr-x. 3 root root 4096 5月 10 05:10 dirb

**linux文件屬性**

用ls –l 查看當前目錄下的文件時,共顯示了9列內容(用空格劃分列)

第1列,包含的東西有該文件類型和所屬主、所屬組以及其他用戶對該文件的權限。第一列共11位有的文件是10位,沒有最後面的一位。 其中第一位用來描述該文件的類型。上例中,我們看到的類型有 ‘d’, ‘-‘ ,其實除了這兩種外還有 ‘l’, ‘b’, ‘c’, ‘s’ 等。

‘d’ 表示該文件為目錄;

‘-‘ 表示該文件為普通文件;

‘l’ 表示該文件為鏈接文件(linux file),上邊提到的軟鏈接即為該類型;

[root@localhost ~]# ls -l /etc/rc.local
lrwxrwxrwx. 1 root root 13 5月 7 17:54 /etc/rc.local -> rc.d/rc.local

上例中,第一列第一位是 ‘l’ 表示該文件為鏈接文件,稍後阿銘詳細介紹。

‘b’ 表示該文件為塊設備,比如 /dev/sda 就是這樣的文件。

‘c’ 表示該文件為串行端口設備,例如鍵盤、鼠標。

‘s’ 表示該文件為套接字文件(socket),用於進程間通信。

後邊的9位,每三個為一組。均為rwx 三個參數的組合。其中r 代表可讀,w代表可寫,x代表可執行。前三位為所屬主(user)的權限,中間三位為所屬組(group)的權限,最後三位為其他非本群組(others)的權限。下面拿一個具體的例子來述說一下。

一個文件的屬性為 ‘-rwxr-xr–.’ ,它代表的意思是,該文件為普通文件,文件擁有者可讀可寫可執行,文件所屬組對其可讀不可寫可執行,其他用戶對其只可讀。對於一個目錄來講,打開這個目錄即為執行這個目錄,所以任何一個目錄必須要有x權限才能打開並查看該目錄。例如一個目錄的屬性為 ‘drwxr–r–.’ 其所屬主為root,那麽除了root外的其他用戶是不能打開這個目錄的。

關於第一列的最後一位的 .,之前的CentOS 5 是沒有這個點的,這主要是因為新版本的ls把selinux或者acl的屬性加進來了,當文件或者目錄只使用了selinux context的屬性,這裏是一個點。如果設置了acl,後面將是一個加號 ‘+’. 。

第2列,表示為鏈接占用的節點(inode), [1] 為目錄時,通常與該目錄底下還有多少目錄有關系。

第3列,表示該文件的所屬主。

第4列,表示該文件的所屬組。

第5列,表示該文件的大小。

第6列、第7列和第8列為該文件的最近的修改日期,分別為月份日期以及時間,也就是所謂的mtime.

第9列,文件名。

更改文件的權限

更改所屬組 chgrp
語法:chgrp  [組名]  [文件名]

[root@localhost ~]# groupadd testgroup
[root@localhost ~]# touch test1
[root@localhost ~]# ls -l test1
-rw-r--r-- 1 root root 0 5月 10 08:41 test1
[root@localhost ~]# chgrp testgroup test1
[root@localhost ~]# ls -l test1
-rw-r--r-- 1 root testgroup 0 5月 10 08:41 test1

這裏用到了 ‘groupadd’ 命令,其含義為增加一個用戶組。除了更改文件的所屬組,還可以更改目錄的所屬組。

[root@localhost ~]# ls -l dirb/
總用量 8
drwxr-xr-x. 2 root root 4096 5月 10 05:08 dirc
-rw-r--r--. 1 root root 20 5月 10 05:37 filee
[root@localhost ~]# ls -ld dirb/
drwxr-xr-x. 3 root root 4096 5月 10 05:10 dirb/
[root@localhost ~]# chgrp testgroup dirb
[root@localhost ~]# ls -ld dirb/
drwxr-xr-x. 3 root testgroup 4096 5月 10 05:10 dirb/
[root@localhost ~]# ls -l dirb/
總用量 8
drwxr-xr-x. 2 root root 4096 5月 10 05:08 dirc
-rw-r--r--. 1 root root 20 5月 10 05:37 filee

‘chgrp’命令也可以更改目錄的所屬組,但是只能更改目錄本身,而目錄下面的目錄或者文件沒有更改,要想級聯更改子目錄以及子文件,有個選項-R可以實現:

[root@localhost ~]# chgrp -R testgroup dirb
[root@localhost ~]# ls -l dirb
總用量 8
drwxr-xr-x. 2 root testgroup 4096 5月 10 05:08 dirc
-rw-r--r--. 1 root testgroup 20 5月 10 05:37 filee

‘chgroup’ 命令使用的不多,因為還有一個命令可以替代。

**更改文件的所屬主 chown**
語法: chown [ -R ] 賬戶名 文件名 chown [ -R ] 賬戶名:組名 文件名

這裏的-R選項只作用於目錄,作用是級聯更改,即不僅更改當前目錄,連目錄裏的目錄或者文件全部更改。

[root@localhost ~]# mkdir test // 創建 ‘test‘ 目錄
[root@localhost ~]# useradd user1 // 創建用戶 ‘user1‘, 關於 ‘useradd‘ 命令會在後續章節介紹。
[root@localhost ~]# touch test/test2 // 在test目錄下創建test2文件
[root@localhost ~]# chown user1 test
[root@localhost ~]# ls -l test
總用量 0
-rw-r--r-- 1 root root 0 5月 10 09:00 test2
[root@localhost ~]# ls -ld test // test目錄所屬主已經由 ‘root‘ 改為 ‘user1‘.
drwxr-xr-x 2 user1 root 4096 5月 10 09:00 test
[root@localhost ~]# ls -l test // 但是test目錄下的test2文件所屬主依舊是 ‘root‘.
總用量 0
-rw-r--r-- 1 root root 0 5月 10 09:00 test2
[root@localhost ~]# chown -R user1:testgroup test
[root@localhost ~]# ls -l test
總用量 0
-rw-r--r-- 1 user1 testgroup 0 5月 10 09:00 test2
chown -R user1:testgroup test //把test目錄以及目錄下的文件都修改成所屬主為user1, 所屬組為testgroup
```.
改變用戶對文件的讀寫執行權限 chmod
在linux中為了方便更改這些權限,linux使用數字去代替rwx, 具體規則為 ‘r’ 等於4, ‘w’ 等於2, ‘x’ 等於1, ‘-‘ 等於0. 舉個例子: ‘-rwxrwx—’ 用數字表示就是 ‘770’, 具體是這樣來的: ‘rwx’ = 4+2+1=7; ‘rwx’ = 4+2+1=7; ‘- - -‘ = 0+0+0=0.

chmod 語法: chmod [-R] xyz 文件名 (這裏的xyz,表示數字)

‘-R’ 選項作用同chown,級聯更改。

值得提一下的是,在linux系統中,默認一個目錄的權限為 755,而一個文件的默認權限為644.

[root@localhost ~]# ls -ld test
drwxr-xr-x 2 user1 testgroup 4096 5月  10 09:00 test
[root@localhost ~]# ls -l test
總用量 0
-rw-r--r-- 1 user1 testgroup 0 5月  10 09:00 test2
[root@localhost ~]# chmod 750 test
[root@localhost ~]# ls -ld test
drwxr-x--- 2 user1 testgroup 4096 5月  10 09:00 test
[root@localhost ~]# ls -l test/test2
-rw-r--r-- 1 user1 testgroup 0 5月  10 09:00 test/test2
[root@localhost ~]# chmod 700 test/test2
[root@localhost ~]# chmod -R 700 test
[root@localhost ~]# ls -ld test
drwx------ 2 user1 testgroup 4096 5月  10 09:00 test
[root@localhost ~]# ls -l test
總用量 0
-rwx------ 1 user1 testgroup 0 5月  10 09:00 test2

如果你創建了一個目錄,而該目錄不想讓其他人看到內容,則只需設置成 ‘rwxr—–’ (740) 即可。’chmod’ 還支持使用rwx的方式來設置權限。基本上就九個屬性分別是(1)user (2)group (3)others, 我們可以使用u, g, o 來代表它們三個的屬性,此外, a 則代表 all 亦即全部。例如:

[root@localhost ~]# chmod u=rwx,og=rx test/test2
[root@localhost ~]# ls -l test/test2
-rwxr-xr-x 1 user1 testgroup 0 5月  10 09:00 test/test2

這樣可以把 ‘test/test2’ 文件權限修改為 ‘rwxr-xr-x’. 另外還可以針對u, g, o, a增加或者減少某個權限(讀,寫,執行),例如:

[root@localhost ~]# chmod u-x test/test2
[root@localhost ~]# ls -l test
總用量 0
-rw-r-xr-x 1 user1 testgroup 0 5月  10 09:00 test2
[root@localhost ~]# chmod a-x test/test2
[root@localhost ~]# ls -l test/test2
-rw-r--r-- 1 user1 testgroup 0 5月  10 09:00 test/test2
[root@localhost ~]# chmod u+x test/test2
[root@localhost ~]# ls -l test/test2
-rwxr--r-- 1 user1 testgroup 0 5月  10 09:00 test/test2

命令: umask

默認情況下,目錄權限值為755, 普通文件權限值為644, 那麽這個值是由誰規定呢?追究其原因就涉及到了 ‘umask’.
umask語法: umask xxx (這裏的xxx代表三個數字)
查看umask值只要輸入 ‘umask’ 然後回車。

[root@localhost ~]# umask
0022

umask預設是0022,其代表什麽含義?先看一下下面的規則:

1)若用戶建立為普通文件,則預設 ‘沒有可執行權限’, 只有’rw’兩個權限。最大為666 (‘-rw-rw-rw-‘).

2)若用戶建立為目錄,則預設所有權限均開放,即777 (‘drwxrwxrwx’).

umask數值代表的含義為,上邊兩條規則中的默認值(文件為666,目錄為777)需要減掉的權限。所以目錄的權限為 ‘rwxrwxrwx‘ - ‘----w--w-‘ = ‘rwxr-xr-x‘,普通文件的權限為 ‘rw-rw-rw-‘ - ‘----w--w-‘ = ‘rw-r--r--‘. umask的值是可以自定義的,比如設定umask 為 002,你再創建目錄或者文件時,默認權限分別為 ‘rwxrwxrwx‘ - ‘-------w-‘ = ‘rwxrwxr-x‘ 和 ‘rw-rw-rw-‘ - ‘-------w-‘ = ‘rw-rw-r--‘.

[root@localhost ~]# umask 002
[root@localhost ~]# mkdir test2
[root@localhost ~]# ls -ld test2
drwxrwxr-x 2 root root 4096 5月  10 09:44 test2
[root@localhost ~]# touch test3
[root@localhost ~]# ls -l test3
-rw-rw-r-- 1 root root 0 5月  10 09:45 test3

可以看到創建的目錄權限默認變為775, 而文件默認權限變為664. 然後再把umask改回來。

[root@localhost ~]# umask 022
[root@localhost ~]# touch test4
[root@localhost ~]# ls -l test4
-rw-r--r-- 1 root root 0 5月  10 09:45 test4

註:umask 可以在 /etc/bashrc 裏面更改,預設情況下,root的umask為022,而一般使用者則為002,因為可寫的權限非常重要,因此預設會去掉寫權限

2018-05-11筆記