记一个logrotate的配置文件权限问题
问题描述
从git仓库更新了别人配置好的logrotate,发现不能正常运行。手工执行报错
error: Ignoring syslog because of bad file mode - must be 0644 or 0444
具体看了下,确实有个配置文件,是664。手工执行chmod 修改权限后,就可以运行了。但这个提交之前确实时有测试过的,为什么经过上传下载后,就不行了呢?到仓库中去,执行下chmod想修正下权限提交,发现chmod之后git却没检测到有修改。赶紧google学习下。
文件权限位
先简介下权限位。
linux文件具有权限位属性。一般是用三个数字表示,例如755,664,644等。
三个数字分别代表,文件所有者的权限,与文件所有者同一组的用户的权限,不与文件所有者同组的其他用户的权限。
具体的每个数字,是代表了读写执行(rwx)三种权限。
7转换为二进制是0b111,即代表有读写执行权限。
6转换为二进制是0b110,代表有读写权限,无执行权限。
4转换成二进制是0b100,代表有读权限,无写和执行权限。
ls -l 即可看到某个文件的具体权限。
chmod 可改变某个文件的权限。
git仓库对权限位的处理
重点来了,权限位包括了读写执行,但git仓库并不记录全部权限位。
当 git config core.fileMode 为true时,git会记录该文件是否是可执行的。即当你chmod将文件从664改为755时,git可以检测到修改,你也可以添加提交这个改动。
但git只记录执行权限,而不记录读写权限。
换句话说,644的文件和664的文件,对git来说是没区别的。
这就是问题的原因了。提交者本地修改完测试的时候,权限位已经改成644,测试了logrotate没问题才提交上去,其他人下载下来却变成了664,无法正常运行。
什么决定了下载下来的文件权限
既然git中不记录读写权限,那么为什么下载下来时664,而不是644,666,444等其他权限呢?
答案是,跟每个人本地设定的umask有关。
umask设置了用户创建文件的默认权限补码。
在控制台输入umask命令,可以打印出当前的umask值。
umask=002时, 创建的文件默认为664(666-002),文件夹默认为775(777-002)
umask=022时,创建的文件默认为644(666-022),文件夹默认为755(777-022)
怎么解决logrotate的这个问题
回到问题本身,大部分时候,我们不必关心644和664的区别。但出现了logrotate这种必须644的情况时,也不可能通知到每个人,手工去chmod或者修改每台电脑上的umask,还是要在SDK中解决。既然git不记录,那就要靠编译系统了。
例如openwrt中,就已经定义了一系列的命令。在写包的makefile时尽量规范些,根据产物的不同,选用合适的INSTALL_XXX命令,安装到rootfs中,就可以避免这个问题了。
INSTALL_BIN:=install -m0755
INSTALL_DIR:=install -d -m0755
INSTALL_DATA:=install -m0644
INSTALL_CONF:=install -m0600
如果确实很特殊,那就特殊处理下了,手工在对应makefile中加个chmod。
参考
stackoverflow问题:git-pull-is-setting-664-instead-of-644-permissions
记一个logrotate的配置文件权限问题的更多相关文章
- phpMyAdmin提示:配置文件权限错误,无法写入!解决方法
访问phpMyAdmin提示: 配置文件权限错误,无法写入! 解决办法: chmod -R 755 ./phpmyadmin 这样设置下phpMyAdmin目录权限属性为就可以访问了.原来phpMyA ...
- 将所有程序设置XML集中到一个单独XML配置文件的方法:使用appSettings元素的configSource元素
在.NET程序中,程序的配置文件默认都会放在程序根目录下的web.config(网站程序)或App.config(控制台等程序),在该配置文件中可以定义若干程序配置信息. 在此以网站程序为例,首先将下 ...
- 记一个社交APP的开发过程——基础架构选型(转自一位大哥)
记一个社交APP的开发过程——基础架构选型 目录[-] 基本产品形态 技术选型 最近两周在忙于开发一个社交App,因为之前做过一点儿社交方面的东西,就被拉去做API后端了,一个人头一次完整的去搭这么一 ...
- 如何创建一个有System用户权限的命令行
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何创建一个有System用户权限的命令行.
- 写一个简单的配置文件和日志管理(shell)
最近在做一个Linux系统方案的设计,写了一个之前升级服务程序的配置和日志管理. 共4个文件,服务端一个UpdateServer.conf配置文件和一个UpdateServer脚本,客户端一个Upda ...
- 一个垃圾的Android权限框架
一个垃圾的Android权限框架 学习和参考 简书 https://www.jianshu.com/p/2324a2bdb3d4 写在前头 今天突发奇想想要把Android申请权限的流程封装一下,为使 ...
- phpmyadmin配置文件权限错误,不应任何用户都能修改
访问phpmyadmin提示“配置文件权限错误,不应任何用户都能修改” 原因:phpmyadmin目录权限过高,设置了777访问权限 解决: $ phpmyadin 转自: http://www.it ...
- 每天一个linux命令(权限):【转载】chmod命令
chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. Linux系统中的每 ...
- Entity Framework学习笔记——记一个错误解决方式及思路
继续之前设定的学习目标前,先来一篇小小的外篇.按照第一篇里的配置方式配置好的工程前两天还能正常工作,昨天却突然无法通过Add-Migration命令进行数据库的升级.错误信息如下: System.Da ...
随机推荐
- Spark:一个高效的分布式计算系统--转
原文地址:http://soft.chinabyte.com/database/431/12914931.shtml 概述 什么是Spark ◆ Spark是UC Berkeley AMP lab所开 ...
- bzoj2013[CEOI2010] A huge tower
题意 有N(2<=N<=620000)快砖,要搭一个N层的塔,要求:如果砖A恰好在砖B上面,那么A不能比B的长度+D要长.问有几种方法,输出 答案 mod 1000000009的值 分析 ...
- 【JavaScript】20款漂亮的css字体
样式一: body { margin: 0; padding: 0; line-height: 1.5em; font-family: "Times New Roman", Tim ...
- 【JavaScript&jQuery】单选框radio,复选框checkbox,下拉选择框select
HTML: <!DOCTYPE html> <html> <head> <title></title> <meta charset=& ...
- C++解析(10):struct和class的区别
0.目录 1.默认访问级别 2.默认继承方式 2.1 分别独立继承 2.2 struct继承class 2.3 class继承struct 3.小结 1.默认访问级别 在用struct定义类时,所有成 ...
- Python常忘的进阶知识(上)
0.目录 1.面向对象 1.1 函数与方法 1.2 类变量与实例变量 1.3 实例方法.类方法.静态方法 1.4 公开和私有:没有什么是不能访问的 1.5 继承 2.正则表达式 2.1 Python内 ...
- 洛谷 P1401 城市(二分+网络流)
题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最长的边的长度最小,边不能 ...
- NOIP 2012 洛谷P1081 开车旅行
Description: 就是两个人开车,只能向东开.向东有n个城市,城市之间的距离为他们的高度差.A,B轮流开车,A喜欢到次近的城市,B喜欢到最近的城市.如果车子开到底了或者车子开的路程已经超过了限 ...
- 流媒体协议之RTSP详解20170922
一.RTSP协议介绍 1.什么是rtsp? RTSP协议以客户服务器方式工作,,如:暂停/继续.后退.前进等.它是一个多媒体播放控制协议,用来使用户在播放从因特网下载的实时数据时能够进行控制, 因此 ...
- WPF系列之三:实现类型安全的INotifyPropertyChanged接口,可以不用“Magic string” 么?
通常实现INotifyPropertyChanged接口很简单,为你的类只实现一个PropertyChanged 的Event就可以了. 例如实现一个简单的ViewModel1类: public cl ...