1. 程式人生 > 程式設計 >python檢查目錄檔案許可權並修改目錄檔案許可權的操作

python檢查目錄檔案許可權並修改目錄檔案許可權的操作

我就廢話不多說了,還是直接看程式碼吧!

# -*- coding: utf-8 -*-
# @author flynetcn
import sys,os,pwd,stat,datetime;
 
LOG_FILE = '/var/log/checkDirPermission.log';
 
nginxWritableDirs = [
'/var/log/nginx','/usr/local/www/var',];
 
otherReadableDirs = [
'/var/log/nginx','/usr/local/www/var/log',];
 
dirs = [];
files = [];
 
def logger(level,str):
	logFd = open(LOG_FILE,'a');
	logFd.write(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')+": "+("WARNING " if level else "NOTICE ")+str);
	logFd.close();
 
def walktree(top,callback):
	for f in os.listdir(top):
		pathname = os.path.join(top,f);
		mode = os.stat(pathname).st_mode;
		if stat.S_ISDIR(mode):
			callback(pathname,True);
			walktree(pathname,callback);
		elif stat.S_ISREG(mode):
			callback(pathname,False);
		else:
			logger(1,"walktree skipping %s\n" % (pathname));
 
def collectPath(path,isDir=False):
	if isDir:
		dirs.append(path);
	else:
		files.append(path);
	
 
def checkNginxWritableDirs(paths):
	uid = pwd.getpwnam('nginx').pw_uid;
	gid = pwd.getpwnam('nginx').pw_gid;
	for d in paths:
		dstat = os.stat(d);
		if dstat.st_uid != uid:
			try:
				os.chown(d,uid,gid);
			except:
				logger(1,"chown(%s,nginx,nginx) failed\n" % (d));
 
def checkOtherReadableDirs(paths,isDir=False):
	for d in paths:
		dstat = os.stat(d);
		if isDir:
			checkMode = 5;
			willBeMode = dstat.st_mode | stat.S_IROTH | stat.S_IXOTH;
		else:
			checkMode = 4;
			willBeMode = dstat.st_mode | stat.S_IROTH;
		if int(oct(dstat.st_mode)[-1:]) & checkMode != checkMode:
			try:
					os.chmod(d,willBeMode);
			except:
				logger(1,"chmod(%s,%d) failed\n" % (d,oct(willBeMode)));
 
if __name__ == "__main__":
	for d in nginxWritableDirs:
		walktree(d,collectPath)
	dirs = dirs + files;
	checkNginxWritableDirs(dirs);
	dirs = [];
	files = [];
	for d in otherReadableDirs:
		walktree(d,collectPath)
	checkOtherReadableDirs(dirs,True);
	checkOtherReadableDirs(files,False);

補充知識:Python中獲取某個使用者對某個檔案或目錄的訪問許可權

在Python中我們通常可以使用os.access()函式來獲取當前使用者對某個檔案或目錄是否有某種許可權,但是要獲取某個使用者對某個檔案或目錄是否有某種許可權python中沒有很好的方法直接獲取,因此我寫了個函式使用stat和pwd模組來實現這一功能。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import pwd
import stat

def is_readable(path,user):
  user_info = pwd.getpwnam(user)
  uid = user_info.pw_uid
  gid = user_info.pw_gid
  s = os.stat(path)
  mode = s[stat.ST_MODE]
  return (
    ((s[stat.ST_UID] == uid) and (mode & stat.S_IRUSR > 0)) or
    ((s[stat.ST_GID] == gid) and (mode & stat.S_IRGRP > 0)) or
    (mode & stat.S_IROTH > 0)
   )

def is_writable(path,user):
  user_info = pwd.getpwnam(user)
  uid = user_info.pw_uid
  gid = user_info.pw_gid
  s = os.stat(path)
  mode = s[stat.ST_MODE]
  return (
    ((s[stat.ST_UID] == uid) and (mode & stat.S_IWUSR > 0)) or
    ((s[stat.ST_GID] == gid) and (mode & stat.S_IWGRP > 0)) or
    (mode & stat.S_IWOTH > 0)
   )

def is_executable(path,user):
  user_info = pwd.getpwnam(user)
  uid = user_info.pw_uid
  gid = user_info.pw_gid
  s = os.stat(path)
  mode = s[stat.ST_MODE]
  return (
    ((s[stat.ST_UID] == uid) and (mode & stat.S_IXUSR > 0)) or
    ((s[stat.ST_GID] == gid) and (mode & stat.S_IXGRP > 0)) or
    (mode & stat.S_IXOTH > 0)
   )

使用方法

print is_readable('/home',root)
print is_writable('/home',root)
print is_executable('/home',root)

print is_readable('/tmp',admin)
print is_writable('/tmp',admin)
print is_executable('/tmp',admin)

以上這篇python檢查目錄檔案許可權並修改目錄檔案許可權的操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。