转 linux 权限
发布系统架构图简化如下:
管理员通过Jenkins调用“发布程序(代号varian,以下简称varian)”,发布程序会进行一系列的初始化操作,完成后生成Docker镜像上传到Docker仓库,容器集群更新镜像,用户通过负载均衡访问我们的容器集群。
老的varian采用shell+python开发,配合Jenkins(jdk1.7)进行发布,因内部项目较多,写了很多兼容脚本,代码比较乱。我们计划对varian进行重构,完全采用python开发,各个功能模块化,不同类型的项目用乐高的思想拼装模块部署发布,降低耦合。并将jenkins升级到最新版本,jdk同样升级到1.8。新的varian已经开发完成,现在开始部署测试了,故事就由此开始。
为了降低对现有项目的影响决定重新部署一套新的环境,完全测试通过后将老环境废弃,直接启用新环境,新环境信息如下:
- 系统:Debian8
- 语言:Python3.4
- JDK1.8 + Jenkins2.134
故障处理过程
解决nginx访问403的问题
通过Jenkins调用varian正常部署了一个静态项目(纯html,css,js等静态资源),通过负载均衡访问容器集群(参考上边架构图),发现页面样式无法加载,浏览器按F12调出控制台发现个CSS文件返回403状态
web服务用的nginx,脑海里迅速过了一遍什么情况下nginx会返回403:
- nginx配置了白名单,client端访问的IP不在白名单内
allow 192.168.0.152;
deny all;
- 访问的路径是个目录,而nginx配置了禁止列目录
#nginx中这个配置默认就是off,改成on当访问的路径是目录时,可以列出目录中的内容
autoindex off;
- 访问的路径是个文件,但nginx服务配置的用户和用户组对文件没有读取权限
#nginx中这个配置指定nginx服务的用户和用户组
user www-data www-data;
- 目录索引index配置错误,例如你的目录下只有index.html,你却配置了index.shmtl或index.php等等
index index.shtml index.php;
常见的有以上问题会导致nginx返回403,迅速排查了一下,发现就是权限的问题导致的,nginx配置的用户和用户组为www-data,而css文件的属主属组都是root,且其他用户没有任何权限
# cat /etc/nginx/nginx.conf
user www-data www-data;
# ls -lh csl.css
-rw-r----- 1 root root 7.9K Jul 24 12:34 csl.css
这里再详细讲解下linux下的文件权限,以上边的csl.css文件为例:
-rw-r----- 1 root root 7.9K Jul 24 12:34 csl.css
以空格分割
- 第一段
-rw-r-----
10个字符定义了文件的权限- 第一个字符,这里为
-
代表这是一个文件,还会看到像d
代表目录、l
代表连接 - 剩下九个字符,每三个一组,第2-4个字符代表属主权限,第5-7个字符代表属组权限,第8-10个字符代表其他用户的权限
- 其中每一组三个字符分别为r、w、x,用数字表示r=4、w=2、x=1,分别代表读、写、执行权限,如果这个字符有值表明有这个权限,例如上边css文件的权限就为属主有rw读写权限,属组只有r权限,其他用户没有权限
- 第一个字符,这里为
- 第二段为一个数字,表示文件的连接数
- 第三段root表示用户的属主为root
- 第四段root表示用户的属组也为root
- 第五段则表示文件大小
- 后边三段为修改时间
- 最后一段为文件名
好了,接着上边的故障说,已经找到了是因为文件权限的问题导致的403,那么修改了文件的权限为644(其他用户有读取权限),再次访问顺利返回正常状态了。问题就这么结束了吗?当然不能,仔细想想为啥其他的文件权限都ok,就这个文件权限不对?接着找原因
tomcat8 UMASK
经过反复测试,发现我直接在linux下通过控制台执行python脚本的方式发布部署最终文件权限正常,但是同样的脚本经过Jenkins执行后权限就不对了。
控制台执行跟Jenkins执行有什么区别?账号不一样啊,遂把jenkins项目、tomcat文件都改成属主属组都为root重新执行,发现还是一样的结果。
再想想还有哪里不对,这个css文件是程序生成的,生成的文件权限不对,umask!这个词突然蹦出来,对,应该就是umask,他控制了生成新文件的权限。
简单介绍下什么是umask:
umask值用来设置用户在创建文件时的默认权限,跟设置文件权限命令chmod是相对的,总共四位,不过我们通常只用后三位,同样对应属主属组以及其他用户的权限,例如你的账号umask值为0022(可直接通过umask命令查看),此时你创建的文件权限默认为644(文件初始的最高权限为666,umask设置为022,那么最终的权限为:6-0,6-2,6-2=644。当然有人说文件的权限最高是777,是的没错,但我们说的是默认权限,默认权限是由umask决定的,umask设置为000时文件的权限就是666,文件夹权限777),此时创建的目录权限为755(目录的最高权限为777,umask设置为022,那么最终的权限为7-0,7-2,7-2=755)
- - -
查了root用户的umask、jenkins用户的umask,都为0022,没问题呀,并且登录这两个账号创建了新文件权限也都正常,就剩下一种情况了Jenkins!
Jenkins没有地方可以给配置UMASK,Jenkins跑在tomcat容器里,老版本的varian也有相似的处理逻辑一直没问题,本次升级了tomcat8,难道tomcat8更新了UMASK?半信半疑的看了下,果然!tomcat8的umask默认改成了0027,麻溜的改成了0022,问题顺利解决
# vi tomcat/bin/catalina.sh
if [ -z "$UMASK" ]; then
UMASK="0027"
fi
转 linux 权限的更多相关文章
- linux权限系统
Linux权限分为 r(4):可读 , w(2)可写 , x(1)可执行 , -无权限 , 可以通过ls -l 文件名查看权限 , 如 ls -l 文件名 输出: -rwxrw---x. root r ...
- Shell基础:Linux权限管理
Linux权限基本概念 查看系统(文件夹/文件)权限: ls -l =>d/- xxx xxx xxx. num owner group size date filename ...
- 关于LINUX权限-bash: ./startup.sh: Permission denied
关于LINUX权限-bash: ./startup.sh: Permission denied <script type="text/javascript"></ ...
- Linux权限操作 [转]
Linux权限操作 本文内容来自<鸟哥linux私房菜>读后个人做的笔记,该书实为学习linux的很好入门教材 一.文件属性 ls ls -al列出所有的档案属性 ls是List的意思 档 ...
- linux权限解读
1 只读权限,用r表示(read):可以读取文件或者列出目录的内容 2 可写权限,用w表示(write):可以删除文件或目录 3 可执行权限,用x表示(execute):可以执行可执行文件:可以进入目 ...
- linux权限---【600,644,700,755,711,666,777】 - - 博客频道 - CSDN.NET
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- Linux系列教程(十六)——Linux权限管理之ACL权限
通过前面的两篇博客我们介绍了Linux系统的用户管理,Linux用户和用户组管理之相关配置文件 讲解了用户管理的相关配置文件,包括用户信息文件/etc/passwd,用户密码文件/etc/shadow ...
- Linux权限分析
我看过网上的一些有关Linux的权限分析,有些说的不够清楚,另外一些说的又太复杂.这里我尽量简单.清楚的把Linux权限问题阐述明白,Linux权限没有那么复杂. Linux权限问题要区分文件权限和目 ...
- 【Linux】 Linux权限管理与特殊权限
Linux权限管理 权限管理这方面,非常清楚地记得刚开始实习那会儿是仔细研究过的,不知道为什么没有笔记留痕..除了一些基本的知识点早就忘光了,无奈只好从头开始学习一遍.. ■ 基本权限知识 这部分实在 ...
- Linux权限管理(week1_day5)--技术流ken
权限概述 Linux系统一般将文件可存/取访问的身份分为3个类别:owner(拥有者).group(和所有者同组的用户).others(其他人,除了所有者,除了同组的用户以及除了超级管理员),且3种身 ...
随机推荐
- java 多线程 19: ReentrantLock 与 Condition
ReentrantLock ReentrantLock,一个可重入的互斥锁,它具有与使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大. Reentran ...
- Python通过ssh连接服务器并执行命令
[本文出自天外归云的博客园] 脚本示例如下: # coding:utf-8 import time,paramiko,re,StringIO def exec_shell(command): ''' ...
- tf.reduce_mean
tf.reduce_mean reduce_mean( input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=N ...
- ZooKeeper管理分布式环境中的数据
Reference: http://www.cnblogs.com/wuxl360/p/5817549.html 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它 ...
- EF实现主从表自动生成主键保存
Class cl = new Class() { ClassName = "一年级1班" }; TestDBEntities context = new TestDBEntitie ...
- Android(我还是个菜鸟)——UI-开源框架ImageLoader的完美例子
开源框架ImageLoader 可在文件里面找——Desktop.zip(原文件为jar格式) 使用这个框架的好处: 让图片能在异步加载更加流畅,可以显示大量图片,在拖动ListView的时候不会出现 ...
- asp.net cookie的操作
//写入 protected void Button2_Click(object sender, EventArgs e) { HttpCookie cookie=new Ht ...
- MFC——CDC
CDC类定义的是设备上下文对象的类,有称设备环境对象类. Windows使用与设备无关的图形设备环境(DC:Device Context)进行显示. 说到CDC类就不能不提一下GdiObject——图 ...
- Kryonet client disconnects after send a packet to server (java)
http://stackoverflow.com/questions/25934876/kryonet-client-disconnects-after-send-a-packet-to-server ...
- Android studio中出现Couldn't resolve resource @dimen/...
问题出现: Path.isConvex is not supported. Rendering problems .. Couldn't resolve resource @dimen/...等等 资 ...