如何修改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

python类中怎么判断本对象是否存在某个方法并调用

众所周知在php中可以用method_exists和call_user_func来检查类中是否有某方法,并调用之。
但python里面似乎没有这么方便的函数。
python里有两个函数,一个是getattr,一个是hasattr可以完成部分功能,但不是全部功能。
我举个例子:

class ls:
    def a(self):
        act = raw_input('input a action: ')
        if hasattr(self, '%s_action' % act):
            return getattr(self, '%s_action' % act)()
        else:
            print "bad function name!!!"

    def nice_action(self):
        print "nice!!"

    def __bad_action(self):
        print "bad!!"

t = ls()
t.a()

定义了一个简单的类,其中有一个a方法,接受一个输入。输入的字符串和"_action"组成一个方法名。先判断这个方法是否在类中,如果在则调用之,如果不在则输出“bad function name!!!”。
那么,我输入nice,这样就会调用nice_action,但如果我输入__bad,就会输出bad function name:
10.jpg
为什么?按道理来说应该输出“bad!!”才对呀?
因为在python中,类中以2个下划线打头的方法都是私有方法,类似于php里的private,而hasattr、getattr这两个函数是不能取得一个类中私有方法的。
也就是说我前面用hasattr判断类中是否存在__bad_action,实际上就返回的false,因为hasattr不能取得私有方法。
所以,我才说这两个函数只能“完成部分功能”,我还是没有找到万能的方式去在python的类中判断某方法是否存在并调用之。可能还是我对py核心实现原理不了解。

python字符串find和index的区别是什么?

find和index是python中UserString类的两个方法,也就是字符串的两个处理方法。
查文档的话你会看到,这二者的原型都是一样的,功能也是一样的(查找子字符串):

find(self, sub, start=0, end=2147483647)
index(self, sub, start=0, end=2147483647)

那么二者有什么区别呢?
很简单:
str.find当找不到子串的时候,就会返回-1。
str.index找不到子串的时候,会抛出错误。

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是否为""之外,我还不知道有什么更优雅的方法去解决这个问题。

python怎样转换字符串与数字?

看似简单的一个问题,不就是str()与int()两个内建函数吗?
但有些问题就接踵而至了,str()还好说,int()这个函数当我们传入的参数不是一个“数字型字符串”的时候,就会抛出错误。
举个栗子吧,print int('123aaa'):
01.jpg
果断报错了。而这样的情况如果在php里的话(用intval),是会将'123aaa'转换成123的,不会出错。
更可恶的是int('')一个空字符串也会报错。

于是自己实现一下intval函数:

def intval(str):
    try:
        return int(str)
    except:
        if str and str[0] == '-': l = 1
        else: l = 0
        for t in str[l:]:
            if t.isdigit(): l += 1
            else: break
    try:
        return int(str[0: l])
    except:
        return 0

输出结果:
02.jpg

考虑了负数、空字符的情况,基本和php里的intval类似了吧。