Python中利用os.chmod修改文件权限详解
本文介绍Python中通过os.chmod函数修改文件读写执行权限的方法。详细列举了stat模块中用于定义所有者、组及其他用户权限的常用常量,如S_IRUSR、S_IWGRP等,并结合实例说明如何检查及调整目录权限,适用于Linux环境下的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);
使用os.chmod(path, mode)函数可以修改文件权限,该函数接收两个参数:目标路径path和权限模式mode。以下列出在该模式下常用的权限常量及其含义:
stat.S_ISUID:设置用户ID执行位。此选项在实际应用中较少使用。
stat.S_ISGID:设置组ID执行位。此选项在实际应用中较少使用。
stat.S_ENFMT:强制记录锁。此选项在实际应用中较少使用。
stat.S_ISVTX:粘着位(Sticky Bit)。在执行后保留文本图像,通常用于目录以防止非所有者删除文件。
stat.S_IREAD:所有者读权限。赋予文件所有者读取文件的权限。
stat.S_IWRITE:所有者写权限。赋予文件所有者修改文件的权限。
stat.S_IEXEC:所有者执行权限。赋予文件所有者运行文件的权限。
stat.S_IRWXU:所有者读写执行权限。同时赋予文件所有者读、写及执行的权限。
stat.S_IRUSR:所有者读权限。等同于S_IREAD,赋予文件所有者读取权限。
stat.S_IWUSR:所有者写权限。等同于S_IWRITE,赋予文件所有者写入权限。
stat.S_IXUSR:所有者执行权限。等同于S_IEXEC,赋予文件所有者执行权限。
stat.S_IRWXG:组读写执行权限。赋予同组用户读、写及执行的权限。
stat.S_IRGRP:组读权限。赋予同组用户读取文件的权限。
stat.S_IWGRP:组写权限。赋予同组用户写入文件的权限。
stat.S_IXGRP:组执行权限。赋予同组用户执行文件的权限。
stat.S_IRWXO:其他用户读写执行权限。赋予非所有者、非组用户的读、写及执行权限。
stat.S_IROTH:其他用户读权限。赋予其他用户读取文件的权限。
stat.S_IWOTH:其他用户写权限。赋予其他用户写入文件的权限。
stat.S_IXOTH:其他用户执行权限。赋予其他用户执行文件的权限。
>>> os.stat('test')
posix.stat_result(st_mode=33204, st_ino=93328670, st_dev=18L, st_nlink=1, st_uid=30448, st_gid=1000, st_size=0, st_atime=1445932321, st_mtime=1445932321, st_ctime=1445932321)
>>> os.stat('test').st_mode
33204
>>> oct(os.stat('test').st_mode)
'0100664'
>>> oct(os.stat('test').st_mode)[-3:]
'664'
以上内容讲解了Python中查看及修改文件读写权限的方法,希望能为读者提供参考。如需了解更多技术细节,欢迎持续关注本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













