1. 程式人生 > 程式設計 >Python3通過chmod修改目錄或檔案許可權的方法示例

Python3通過chmod修改目錄或檔案許可權的方法示例

簡單的介紹下linux檔案許可權

linux中,檔案的許可權分為"所有者、組、其他使用者"三個角色,每個角色由3個bit位表示它的許可權,3bit從左到右分別為讀寫執行三個許可權,3bit的值範圍為0~7。所以如果直接在linux執行chmod 777 xxx.sh代表,將xxx.sh檔案賦予所有者、組、其他使用者這三個角色對xxx.sh檔案的讀寫執行許可權。

os的chmod

python的os模組負責作業系統層面的操作。修改檔案許可權可以通過os的chmod方法來操作。
os.chmod(path,mode)
方法的path指向要賦許可權的檔案或目錄;
mode為許可權值,也就是檔案許可權的9位bit的10進位制數,取值範圍0~511;

比如我們要將xxx.sh檔案賦予所有者讀許可權,其他角色沒有任何的許可權,則linux中對應的檔案許可權用ls -l檢視為:-r---------;第一個-是檔案型別,後面的9個位就代表了整個檔案的許可權,對應二進位制為100000000,那麼我們的mode應該取值為256;
所以上面的許可權修改程式碼為os.chmod("xxx.sh",256)。

這麼麻煩?

還好stat模組提供了常量值可以直接對應使用。

常量 描述
S_IRWXU 所有者讀寫執行許可權,代表值:448
S_IRUSR 所有者讀,代表值:256
S_IWUSR 所有者寫,代表值:128
S_IXUSR 所有者執行,代表值:64
S_IRWXG 使用者組讀寫執行許可權,代表值:56
S_IRGRP 使用者組讀,代表值:32
S_IWGRP 使用者組寫,代表值:16
S_IXGRP 使用者組執行,代表值:8
S_IRWXO 其他使用者讀寫執行,代表值:7
S_IROTH 其他使用者讀,代表值:4
S_IWOTH 其他使用者寫,代表值:2
S_IXOTH 其他使用者執行,代表值:1

如下的程式碼是將xxx.sh檔案賦予所有者讀寫執行、使用者組讀執行、其他使用者讀的操作,即-rwxr-xr--:

import os
import stat

os.chmod("xxx.sh",stat.S_IRWXU+stat.S_IRGRP+stat.S_IXGRP+stat.S_IROTH)

什麼?感覺常量記不住?還是不方便?

寫個類似chmod 777的使用方式的util吧…

import re
import os
import stat

RD,WD,XD = 4,2,1
BNS = [RD,XD]
MDS = [
  [stat.S_IRUSR,stat.S_IRGRP,stat.S_IROTH],[stat.S_IWUSR,stat.S_IWGRP,stat.S_IWOTH],[stat.S_IXUSR,stat.S_IXGRP,stat.S_IXOTH]
]

def chmod(path,mode):
  if isinstance(mode,int):
    mode = str(mode)
  if not re.match("^[0-7]{1,3}$",mode):
    raise Exception("mode does not conform to ^[0-7]{1,3}$ pattern")
  mode = "{0:0>3}".format(mode)
  mode_num = 0
  for midx,m in enumerate(mode):
    for bnidx,bn in enumerate(BNS):
      if (int(m) & bn) > 0:
        mode_num += MDS[bnidx][midx]
  os.chmod(path,mode_num)

if __name__ == '__main__':
  chmod("xxx.sh","744") #744代表所有者讀寫執行,組和其他的許可權只有讀

類似的你也可以讓它支援類似chmod u+rwx,g+rw,o+rw xxx.sh的使用方式。

注意:os.chmod貌似沒有辦法遞迴修改目錄下所有檔案的許可權?那使用下面的subprocess直接呼叫命令吧…

subprocess直接呼叫chmod命令

subprocess模組實現了子程序執行。可以在子程序中呼叫作業系統命令或者執行shell,並獲取stdout、stderr。

import subprocess

if __name__ == '__main__':
  cmd = ['chmod',"-R","777","xxx.sh"]
  res = subprocess.run(cmd,universal_newlines=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)

  print(res.returncode,res.stdout,res.stderr)

到此這篇關於Python3通過chmod修改目錄或檔案許可權的方法示例的文章就介紹到這了,更多相關Python3 chmod修改目錄或檔案許可權內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!