linux 权限777_Linux编程之权限系统与工具使用(二)
阿里P7移動互聯網架構師進階視頻(每日更新中)免費學習請點擊:https://space.bilibili.com/474380680
本篇文章將繼續通過權限系統與工具使用來闡述Linux編程:
一、Linux系統中的權限詳解
我們linux服務器上有嚴格的權限等級,如果權限過高導致誤操作會增加服務器的風險。所以對于了解linux系統中的各種權限及要給用戶,服務等分配合理的權限十分重要。
1.1、文件基本權限
首先看下linux下的文件權限,可以使用ll命令或者是帶-l(長列表選項)的ls命令。
文件列表信息分為:文件類型、權限、鏈接數、所屬用戶、所屬用戶組、文件大小、最后修改時間、文件名。
linux一共有7種文件類型,分別如下:
-:普通文件d:目錄文件l: 軟鏈接(類似Windows的快捷方式)(下面四種是特殊文件)b:塊設備文件(例如硬盤、光驅等)p:管道文件c:字符設備文件(例如貓等串口設備)s:套接口文件/數據接口文件(例如啟動一個MySql服務器時會產生一個mysql.sock文件)文件權限對應關系
我們看上面截圖第一個文件權限信息,每三位為一組
rwxr-xr-x 5 root root 94 Jun 27 2017 xdg
rwx:代表文件所有者(u表示)權限,這里是root,root對該文件擁有讀寫執行權限。
r-x : 代表所屬組(g表示)的權限,這里所屬組擁有對該文件讀和執行的權限。
r-x : 代表其他人(o表示)的權限,這里和上面權限一樣。
當然我們也可以修改文件的權限。
linux中chmod命令就可以用來變更文件或目錄的權限。
語法: chmod (選項) 模式 文件名
用法如下:
先創建一個文件a.txt,此時a.txt文件擁有者是沒有執行權限,我們可以給它加上執行權限(x),u就是代表文件擁有者。
如果想給a.txt的用戶組和其他用戶也加上執行權限,可以加上多個。
既然可以加權限,也可以減權限,加號改成減號就行。
還有更簡單的方式,直接用等于號賦予相應的權限
或者用a=的方式賦予,a就是代表all。
也可以給多個文件賦予權限,我們在創建一個文件b.txt
總結下,權限對文件及目錄的作用
對于文件:
r : 可以讀取文件內容(比如命令 cat more head tail)。
w : 可以編輯文件(比如命令 vim echo ),但是不能刪除文件,因為文件名沒有放在自己的文件空間,而是放在了上一級的目錄空間下。
x : 可以執行。
對于目錄:
r:可以查詢目錄下的文件(比如命令ls ll)。w:具有修改目錄結構的權限,比如新建文件和目錄,刪除此目錄下文件和目錄,重命名此目錄下文件和目錄,剪切和復制(比如命令cp mv touch rm)。x:目錄有執行權限但是不能運行,可以進入目錄(cd命令)。
對文件來說最高權限是x,對于目錄來說最高權限是w,一般給目錄賦予權限0 ,5(rx),7(rxw),賦予4 ,1, 6都是沒有意義的。對于文件能否刪除,首先要對目錄具有執行權限,同時對文件也具有執行權限。chown命令:用來改變文件或目錄的所有者和所屬用戶組。chgrp命令 :用來改變文件或目錄的所屬的用戶組。示例:
[root@localhost test123]# ll 總用量 0 drwxr-x--- 2 root root 20 5月 5 11:38 abc [root@localhost test123]# chown test123:test123 abc 將abc用戶組和所屬者都改成test123 中間用:分割 [root@localhost test123]# ll 總用量 0 drwxr-x--- 2 test123 test123 20 5月 5 11:38 abc1.2、默認權限
我們在linux系統中新建一個文件或者目錄,那么這個文件或目錄會有一個權限,這個權限就是默認權限。這個權限就是靠umask的值來定義的。那么什么是umask?
umask(權限掩碼) 就是指定當前用戶在建立文件或目錄時候的權限默認值。當新文件被創建時,其最初的權限由文件創建掩碼決定。用戶每次登錄系統時,umask命令都被執行, 并自動設置掩碼mode來限制新文件的權限。用戶可以通過再次執行umask命令來改變默認值,新的權限將會把舊的覆蓋掉。我們可以執行umask命令來查看系統中文件默認權限。
[root@localhost local]# umask 0022解釋下0022
第一位0:文件特殊權限。
022:文件默認權限。
下面創建一個文件和一個目錄。
[root@localhost tmp]# touch a.txt [root@localhost tmp]# mkdir dir [root@localhost tmp]# ll 總用量 54768 -rw-r--r-- 1 root root 0 5月 5 14:31 a.txt drwxr-xr-x 2 root root 6 5月 5 14:31 dir我們看文件默認權限是644,而目錄的權限是755,那么是如何依靠umask來設定權限的呢。
我們先看下文件默認權限的特點:
1.文件默認不能建立為執行權限,必須手工賦予執行權限。所以文件的默認權限最大為666。這樣能保護系統安全。
2.默認權限要換算成對應的字母權限在相減而不是數字。
3.建立文件或目錄之后的默認權限,為666減去umask的值。
計算方式如下:
-rw-rw-rw- 減去 -----w--w- 等于 -rw-r--r-- (644)
-rw-rw-rw- 減去 -----wx-wx 等于 -rw-r--r-- (644)
其實是做了一個邏輯與的運算。
目錄的默認權限:
1.目錄默認權限最大是777。
2.目錄默認權限換算成字符在相減。
3.建立目錄之后的默認權限,是777減去umask的值。
修改umask的值:
使用umask + 值,比如umask 0000;
不過這樣只是臨時生效,要永久修改就要修改環境變量配置文件/etc/profile
1.3、ACL(Access Control List )權限
linux系統中一個文件只有一個所屬組,一個所有者,acl權限是解決用戶對文件權限不足,也就是用戶身份不夠的情況下。打算讓某個用戶對這個文件有權限,不用考慮這個用戶是哪個所有組
還是其他人。用acl給這個用戶賦予權限。ACL權限 是解決用戶對文件身份不足的問題(該用戶不屬于 擁有者 所屬組 其他人)。系統是否支持ACL是與文件系統有關的。
首先查看系統分區中ACL權限是否開啟,命令如下:
先看下分區情況 [root@localhost tmp]# df 文件系統 1K-塊 已用 可用 已用% 掛載點 /dev/mapper/centos-root 39134548 29770328 9364220 77% / devtmpfs 923152 0 923152 0% /dev tmpfs 933636 80 933556 1% /dev/shm tmpfs 933636 9128 924508 1% /run tmpfs 933636 0 933636 0% /sys/fs/cgroup /dev/mapper/centos-home 19105792 33080 19072712 1% /home /dev/sda1 508588 177692 330896 35% /boot .host:/ 127927292 118371212 9556080 93% /mnt/hgfs tmpfs 186728 12 186716 1% /run/user/42 tmpfs 186728 0 186728 0% /run/user/0因為我安裝的是centos7,所以我的系統文件系統是xfs類型,用xfs_growfs命令查看,如果文件系統是ext2/ext3/ext4可以用dumpe2fs命令查看指定分區詳細文件系統信息。 [root@localhost tmp]# xfs_growfs /dev/sda1 meta-data=/dev/sda1 isize=256 agcount=4, agsize=32000 blks= sectsz=512 attr=2, projid32bit=1= crc=0 finobt=0 spinodes=0 data = bsize=4096 blocks=128000, imaxpct=25= sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal bsize=4096 blocks=853, version=2= sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0查看系統是否支持ACL,使用dmesg命令(可以幫助用戶了解系統的啟動信息,可以查看ACL信息)查看,發現xfs文件系統是默認支持ACL權限的。
查看ACL權限:
設定ACL權限:
setfacl 選項 文件名
選項:
-m:設定ACL權限。
-x:刪除指定的ACL權限。
-b:刪除所有的ACL權限。
-d:設定默認的ACL權限。
-k:刪除默認的ACL權限。
-R:遞歸設定ACL權限。
1.4、sudo權限
sudo是linux系統管理指令,操作對象是系統命令。是允許讓普通用戶執行部分或者全部的系統管理員才能執行的命令的一個工具,限制某個普通用戶有限的命令有root權限(比如說重啟,備份,添加用戶,ifconfig命令等)。sudo 執行時候不需要知道超級管理員的密碼。
sudo是超級用戶賦予普通用戶權限才能使用,sudo為系統管理員提供配置文件,使用visudo命令(這個命令可以防止兩個用戶同時修改它,也能進行有限的語法檢查)可以打開該配置文件:
[root@localhost ~]# visudo 這個命令實際是打開了/etc/sudoers文件 ## Sudoers allows particular users to run various commands as ## the root user, without needing the root password. ## ## Examples are provided at the bottom of the file for collections ## of related commands, which can then be delegated out to particular ## users or groups. ... ...在文件98行有個例子
格式解釋: 用戶名(給哪個用戶賦予權限,這里是root) 被管理的主機地址(第一個ALL)= (可使用身份(第二個ALL),這個可以省略直接跟授權的命令) 授權的命令(要寫絕對路徑,命令寫的越簡單權限就越大,越詳細普通用戶獲得權限就越小)
使用 man 5 sudoers 命令查看配置文件詳細解釋
普通用戶沒有關閉系統的權限,如下提示。
[song@localhost ~]$ shutdown -r now ==== AUTHENTICATING FOR org.freedesktop.login1.reboot === Authentication is required for rebooting the system. Authenticating as: root Password: Failed to execute operation: 連接超時 Must be root. polkit-agent-helper-1: pam_authenticate failed: Authentication failure在配置文件中最后一行給song用戶添加shutdown權限并保存
用song賬號登錄并用sudo -l 命令顯示出自己(執行 sudo 的使用者)的權限。
[song@localhost ~]$ sudo -l [sudo] password for song: 匹配此主機上 song 的默認條目:requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORSDISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATELC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARYLC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALLLANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",secure_path=/sbin:/bin:/usr/sbin:/usr/bin用戶 song 可以在該主機上運行以下命令:(ALL) /sbin/shutdown -r now 這里song身份就被切換成ALL這里用sudo命令后面加配置文件賦予的命令去執行,不能寫錯,不然會執行不了,如下。
[song@localhost ~]$ sudo /sbin/shutdown -h now 對不起,用戶 song 無權以 root 的身份在 localhost.localdomain 上執行 /sbin/shutdown -h now。所以寫成配置文件里一模一樣的就可以執行
[song@localhost ~]$ sudo /sbin/shutdown -r now如果寫多個可以用逗號分開
再看下
[song@localhost ~]$ sudo -l 匹配此主機上 song 的默認條目:requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAMELANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin:/bin:/usr/sbin:/usr/bin用戶 song 可以在該主機上運行以下命令:(ALL) /sbin/shutdown -r now, (ALL) /sbin/ls上面的例子是給某個用戶賦予權限,當然我們也可以給一組用戶賦予權限。也是在配置文件中
## Same thing without a password # %wheel ALL=(ALL) NOPASSWD: ALL上面wheel是組名,前面要加上%號,其它設置和用戶一樣。
sudo命令主要參數說明:
1.5、文件的特殊權限SetUid & SetGid & Sticky BIT
linux系統文件中除了讀(r),寫(w),執行(x)權限外,還有s和t這兩個特殊的權限。當s這個標志出現在文件所有者的x權限上時,此時就被稱為SetUid(簡稱SUID),當s出現在用戶組(g)上就是SetGid,當s出現在其他用戶(o)上就是Sticky Bit(簡稱SBIT)。
SetUid的功能:
只有可執行的二進制程序才能設定SUID權限,就是這個文件可以執行才可以設定,否則不起作用。
命令執行者要對該程序擁有x(執行)權限。
命令執行者在執行該程序是獲得該程序文件屬主身份,打個比方,user1用戶沒有passwd文件的讀取權限,那么user1用戶希望能看見passwd文件內容,只能將自己的身份添加到passwd文件所屬的用戶組,或 者是用root用戶登錄,或者就是修改passwd的文件權限,也就是setuid這個特殊的文件權限。
SetUid權限只在該程序執行過程中有效,也就是說身份改變只在程序執行過程中有效。
賦SUID權限方式:
數字賦予法:chmod 4755 文件名。
字母賦予法: chmod u+s 文件名 這里s就是SUID的意思,取消可以用chmod u-s 文件名。
普通用戶不能設置SUID權限。要用root用戶執行。
[song@localhost ~]$ chmod 4755 /bin/vi chmod: 更改"/bin/vi" 的權限: 不允許的操作下面有個文件aaa,并且用戶對該文件擁有執行權限,我們去給該文件添加SUID權限。
紅色箭頭那里之前x變成了s,表示aaa文件擁有了s權限,同時aaa文件也變成了紅色,表示不安全。
如果要是用戶對aaa沒有執行權限呢。我們創建一個新文件bbb,并修改其權限不包含執行權限。然后在賦予SUID。
這里變成了大S,這里大S表示不能正確使用的。
我們知道用戶的密碼是保存在/etc/shadow文件中,我們看下這個文件的權限
[root@localhost tmp]# ll /etc/shadow ---------- 1 root root 1696 5月 27 18:58 /etc/shadow發現這個文件的權限是000,用戶屬主是root,那么除了root用戶能修改密碼外,用戶自己同樣也能修改密碼,為什么沒有寫入這個文件的權限去修改密碼,這是因為這個SUID功能。我們看下passwd這個命令就知道原因了。
[root@localhost tmp]# which passwd /usr/bin/passwd [root@localhost tmp]# ll /usr/bin/passwd -rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd首先passwd命令是可執行的,同時發現passwd命令默認就有SUID權限,而且任何用戶對這個命令也有執行權限(最后有x),所以普通用戶在執行這個命令的時候就會擁有這個命令所屬主的身份,變成了root,命令執行完后這個身份就消失了又變成普通用戶。
系統還有其他的命令也包含SUID權限,比如su命令。
SUID權限比較靈活,所以不能隨意設置,不然會對系統造成潛在的危害。比如vi命令,如果添加SUID權限,那么普通用戶獲取root身份就可以修改所有的文件。
所以SUID(也包括SGID)權限原則:
關鍵的目錄要嚴格控制寫權限,比如根目錄“/”,“/usr”目錄等。
用戶的密碼設置要嚴格遵守密碼三原則(復雜性,易記性,時效性)。
對系統中默認應該具有SUID,SGID權限的文件列表出來,定時檢查有沒有之外的文件被設置SUID,SGID權限。可以通過find命令查找。
在上面我們新創建一個文件系統會根據umask的設置賦予新文件一個權限,那么umask的值是四位,如下:
[root@localhost ~]# umask 0022可是我們通過chmod命令給文件賦予權限一般都是三位數字,比如755,644等,那么這個umask后三位022是基本默認權限,第一位0就是特殊權限。
1.6、chattr權限(不可改變位權限)
chattr命令用于改變文件屬性,只針對root用戶有效。
格式:chattr [ + - = ] [選項] 文件或目錄,這里的[ + - = ]是控制文件的屬性。
- : 增加權限。
- : 刪除權限。
= : 賦予/等于某權限。
常用選項:
i: 即insert,不得任意更動文件或目錄。
如果對文件設置i屬性,那么不允許對文件進行刪除,重命名,添加和修改數據,相當于鎖定這個文件。如果對目錄設置i屬性,那么只能修改目錄下的文件數據(文件數據保存在文件自己的數據塊中),不允許建立和刪除文件。
a:即append,讓文件或目錄僅供附加用途。
如果對文件設置a屬性,只能在文件中添加數據(因為vi被禁用了,所以用echo >> 輸出重定向追加的方式),不能刪除也不能修改數據。如果對目錄設置a屬性,那么只允許在目錄中新建和修改文件,不允許刪除文件,可以適用于各種日志文件。
案例:
給文件添加i屬性
[root@localhost tmp]# chattr +i aa.txt [root@localhost tmp]# lsattr aa.txt 用lsattr命令查看 ----i----------- aa.txt不允許刪除
[root@localhost tmp]# rm -rf aa.txt rm: 無法刪除"aa.txt": 不允許的操作給目錄添加i屬性
[root@localhost tmp]# chattr +i dir [root@localhost tmp]# lsattr -d dir ----i----------- dir [root@localhost tmp]# cd dir [root@localhost dir]# touch a.txt touch: 無法創建"a.txt": 權限不夠1.7、Linux常用權限
1.600(rw------):只有root有讀寫權限。
2.644(rw-r--r--):只有root有讀寫權限;group用戶和other用戶只有讀權限。
3.755(rwxr-xr-x):root有讀、寫、執行權限;group用戶和other用戶只有讀、執行權限。
二、Linux下Vim工具使用介紹
所有的Unix Like系統都會內建vi文書編輯器,其他的文書編輯器則不一定會存在。
但是目前我們使用比較多的是vim編輯器。vim具有程序編輯的能力,可以主動的以字體顏色辨別語法的正確性,方便程序設計。
什么是vim?
Vim是從vi發展出來的一個文本編輯器。代碼補完、編譯及錯誤跳轉等方便編程的功能特別豐富,在程序員中被廣泛使用。
簡單的來說,vi是老式的字處理器,不過功能已經很齊全了,但是還是有可以進步的地方。vim則可以說是程序開發者的一項很好用的工具。
連vim的官方網站(http://www.vim.org)自己也說vim是一個程序開發工具而不是文字處理軟件。
vim鍵盤圖:
vi/vim的使用:
基本上vi/vim共分為三種模式,分別是命令模式(Command mode),輸入模式(Insert mode)和底線命令模式(Last line mode)。 這三種模式的作用分別是:
命令模式:
用戶剛剛啟動vi/vim,便進入了命令模式。
此狀態下敲擊鍵盤動作會被Vim識別為命令,而非輸入字符。比如我們此時按下i,并不會輸入一個字符,i被當作了一個命令。
以下是常用的幾個命令:
i:切換到輸入模式,以輸入字符。
x:刪除當前光標所在處的字符。
::切換到底線命令模式,以在最底一行輸入命令。
若想要編輯文本:啟動Vim,進入了命令模式;按下i,切換到輸入模式。
命令模式只有一些最基本的命令,因此仍要依靠底線命令模式輸入更多命令。
輸入模式:
在命令模式下按下i就進入了輸入模式。
在輸入模式中,可以使用以下按鍵:
字符按鍵以及Shift組合,輸入字符;
ENTER,回車鍵,換行;
BACK SPACE,退格鍵,刪除光標前一個字符;
DEL,刪除鍵,刪除光標后一個字符;
方向鍵,在文本中移動光標;
HOME/END,移動光標到行首/行尾;
Page Up/Page Down,上/下翻頁;
Insert,切換光標為輸入/替換模式,光標將變成豎線/下劃線;
ESC,退出輸入模式,切換到命令模式;
底線命令模式:
在命令模式下按下:(英文冒號)就進入了底線命令模式。
底線命令模式可以輸入單個或多個字符的命令,可用的命令非常多。
在底線命令模式中,基本的命令有(已經省略了冒號):
q:退出程序;
w:保存文件;
按ESC鍵可隨時退出底線命令模式。
簡單的說,我們可以將這三個模式想成底下的圖標來表示:
vi/vim使用實例:
使用vi/vim進入一般模式:
如果你想要使用vi來建立一個名為runoob.txt的文件時,你可以這樣做:
$ vi runoob.txt
直接輸入vi文件名就能夠進入vi的一般模式了。請注意,記得vi后面一定要加文件名,不管該文件存在與否!
按下i進入輸入模式(也稱為編輯模式),開始編輯文字。
在一般模式之中,只要按下i、o、a等字符就可以進入輸入模式了!
在編輯模式當中,你可以發現在左下角狀態欄中會出現 –INSERT- 的字樣,那就是可以輸入任意字符的提示。
這個時候,鍵盤上除了Esc這個按鍵之外,其他的按鍵都可以視作為一般的輸入按鈕了,所以你可以進行任何的編輯。
按下ESC按鈕回到一般模式。
好了,假設我已經按照上面的樣式給他編輯完畢了,那么應該要如何退出呢?是的!沒錯!就是給他按下Esc這個按鈕即可!馬上你就會發現畫面左下角的– INSERT –不見了!
在一般模式中按下:wq儲存后離開vi。
OK,我們要存檔了,存盤并離開的指令很簡單,輸入:wq即可保存離開!
OK! 這樣我們就成功創建了一個runoob.txt的文件。
vi/vim按鍵說明:
除了上面簡易范例的i、Esc、:wq之外,其實vim還有非常多的按鍵可以使用。第一部份:一般模式可用的光標移動、復制粘貼、搜索替換等
如果你將右手放在鍵盤上的話,你會發現hjkl是排列在一起的,因此可以使用這四個按鈕來移動光標。如果想要進行多次移動的話,例如向下移動30行,可以使用"30j"或"30↓"的組合按鍵,亦即加上想要進行的次數(數字)后,按下動作即可。
第二部份:一般模式切換到編輯模式的可用的按鈕說明
[Esc]:退出編輯模式,回到一般模式中。
第三部份:一般模式切換到指令行模式的可用的按鈕說明
特別注意,在vi/vim中,數字是很有意義的!數字通常代表重復做幾次的意思!也有可能是代表去到第幾個什么的意思。
舉例來說,要刪除50行,則是用50dd對吧!數字加在動作之前,如我要向下移動20行呢?那就是『20j』或者是『20↓』即可。
參考https://blog.csdn.net/caihaitao2000/article/details/80550145
https://www.cnblogs.com/songgj/p/8890710.html
阿里P7移動互聯網架構師進階視頻(每日更新中)免費學習請點擊:https://space.bilibili.com/474380680
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的linux 权限777_Linux编程之权限系统与工具使用(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql优化中in关键字_工作中遇到的一个
- 下一篇: linux 其他常用命令