分类 默认分类 下的文章

如何修改www-data用户的umask

不算个安全方面的问题,但也跟安全息息相关,因为控制好文件权限是维护服务器安全的重要一点。
所以问题来了:

通常nginx或apache或php-fpm都是以www-data或www之类的用户启动并运行的,但这些用户并不像root等用户。他没有home目录,所以也没有~/.bashrc这种配置文件。
那我怎么设置www-data用户的umask(文件默认权限),让php新建的目录、文件有我想要的掩码,而不是默认的022。同时,不影响其他用户的umask?

我只能想到以下三个思路:
解决方法1.所有php文件开头都手工写上umask(0xxx); ,明显不行,如果文件多而杂,根本不可能兼顾所有文件。
解决方法2.在开机启动项中加入sudo su www-data -c "umask 0003",开机时手工设置。这个方法不行,我试过,第一次设置成功,第二次再查看umask,还是默认的022。
解决方法3.修改系统的umask,但这样就影响其他用户、服务了。如果xxx服务也想设置和www-data不一样的umask,怎么办?

感觉都不行,有没有什么好方法,求linux大牛解答~~


问题解决

找到一个简单方法:
可以改/etc/init.d/php5-fpm
start-stop-daemon --start --quiet --umask 0002 --pidfile /var/run/php5-fpm.pid --exec /usr/sbin/php5-fpm -- --daemonize --fpm-config /etc/php5/fpm/php-fpm.conf
加入--umask参数即可。
因为是fpm的配置,所以nginx、apache均可用~

参考文献:
http://stackoverflow.com/questions/21248904/how-to-trace-where-php5-fpm-umask-settings-are-coming-from-on-ubuntu
http://stackoverflow.com/questions/428416/setting-the-umask-of-the-apache-user

Linux Bash中如何判断某文件是否存在?

这应该是初学bash的同学最早遇到的问题,因为站长最近需要写关于linux shell的作业,所以也看了一下bash。
有的同学说这很简单呀,if [ -e "file" ]; then xxxx,-e这个操作符就能判断某个文件是否存在。
另外,下面是一些判断文件属性的操作:

001.jpg

所以这个问题是否就结题了呢?
那我们来做个试验,写一个如下shell,判断当前目录下是否存在文件$1,$1就是我们给shell传入的第一个参数。例如,./exists.sh "file"就判断文件"file"是否存在。

#!/bin/sh

if [ ! $# -eq 1 ]; then
    echo "Usage : $0 file"
    exit 0
fi 

if [ -e $1 ]; then 
    echo "File $1 exists"
else
    echo "Oooops ~ File $1 not exists"
fi

代码比较简单,先判断参数个数是否是1,如果不是就输出usage然后退出。再就用-e来判断$1是否是一个已存在的文件,如果是则输出exists,否则输出0ooops。
然后我们来做试验了。首先我们看看目录下有哪些文件:

002.jpg

有01、02、03、CHANGE.TXT、exists.sh、no1.sh一共6个文件,没有目录。
简单测试一下,脚本功能是ok的:

003.jpg

01存在而05不存在。
但是但是,如果我们传入的参数是一个空字符串,看看脚本运行是什么结果:

004.jpg

是不是很奇怪?明明不存在""这个文件,但结果却是File exists。我们可以把-e换成-f,结果都一样。
也就是说,在shell中,如果-e、-f等此类判断符号后面接着一个内容为空的字符串的时候,就会认为结果为真,从而出现一个"BUG",当BUG在被用到了特殊位置的时候,甚至可能是一个漏洞。
实话说,除了再去判断$1是否为""之外,我还不知道有什么更优雅的方法去解决这个问题。