Apache 中用户身份

同一个apache的 不同虚拟主机可以运行在不同的用户权限,有趣的是并不是使用user group指令来设置,Apache1.3的virtualhost中支持user group指令,但是后来就不再支持了,取而代之的是SuexecUserGroup 指令,即指定了用户也指定了组,当然这条指令需要模块 mod_suexec的支持,还需要有程序 suexec 权限一定要正确:
-r-s–x— 1 root apache 10760 Apr 12 2005 /usr/sbin/suexec
root设置s位,任何非root用户不可写,只有同组用户可执行

相关资料:http://lamp.linux.gov.cn/Apache/ApacheMenu/suexec.html

urlecode 与 rawurlencode

    

        

            

        

    

            

$str = 'foo @+%/';
            echo $str;
            echo "\n";
            echo rawurlencode($str);
            echo "\n";
            echo urldecode(rawurlencode($str));
            echo "\n";
            echo urlencode($str);
            echo "\n";
            echo rawurldecode(urlencode($str));
            
            //结论:
            //1. rawurlencode() 比 urlencode() 做的编码的部分多,urldecode() 比 rawurldecode() 解码的部分多;
            //2. rawurlencode() 的结果用urldecode()来解,没有问题,php中对参数的解码看来是用urldecode()的;
            //3. urlencode() 的结果用rawurldecode()来解,可能有问题,urlencode() 可以把空格编成加号,而rawurldecode() 却不将加号解码成空格;
            //4. 对于url的东西用urlencode已经足够,但是用rawurlencode 也绝对没有问题,urlencode天生是为url编码准备的,而rawurlencode()
            
            // 参考资料:http://man.chinaunix.net/develop/rfc/RFC1738.txt
            exit;

            

 

 

输出:

 ———-PHP代码调试 ———-
foo @+%/
foo%20%40%2B%25%2F
foo @+%/
foo+%40%2B%25%2F
foo+@+%/
输出完成 (耗时 0 秒) – 正常终止

权限问题

   曾经有好几次调试程序的时候,因为命令行执行的结果和apache中执行的结果不一样,就怀疑是权限的问题,因为命令行中我们是一自己帐户的或root的帐户来执行命令的,而apache是以web帐户来执行的,当时就测试程序中涉及权限的地方,因为web帐户自从创建之后就没有人修改过密码,也就谁也不知道密码,所以直接从普通帐户su到web时不可能的,于是谁也没想到su到web来执行命令,实际上,因为我有root的权限,所以一切都不是问题,如果我先su到root,在su到web就不需要密码了,然后执行命令看看结果,与apache执行的结果比较,是不是权限的问题就一目了然了。

动一下脑子,事情就是这么简单!

SVN Server 入门

       觉得svn是个很有意思的东西,但是一直没时间研究这个东西,今天突然来了兴致,就像装一个服务器端,于是到官方网站下了安装包,Linux下的,别说装了,就那个INSTALL文件都看的头大,我看硬着来是不行了,还是找条近道先熟悉熟悉吧,还果然有Windows下的非常方便的svn服务器,就是VisualSVN,自己不妨去下一个装装玩玩,下载就是官方网站http://www.visualsvn.com/ ,安装基本就是 ‘下一步 -> 下一步 。。。’,所以,我就不多说了,等有了成果再续吧!

getopt函数的使用

一个程序往往会提供很多参数,如果仅是简单的几个参数也就罢了,如果是很多参数,仅根据参数的位置来分析,程序会给人一种“很烂”的感觉,其实每种语言基本都提供类似getopt的函数的,先从php说起吧。

例:

    

        

            

        

    

            

$arr_opt = getopt("a:b:cd");

            

print_r($arr_opt);

            

说明: ‘:’ 代表该选项需要值
用法: ./cmd -a valueofa  -b valueofb -c -d

注意: 该函数在Windows下没有实现,本来该函数还提供long option呢,只是也需要编译php时c的支持,所以我还没研究过

shell中的用法

    

        

            

        

    

            

#!/bin/sh
            

            #FileName: getopt.sh
            

            #Desc: Show how to use command getopts
            

            #Date: 2008-01-05
            

            #Auth: lijunjie
            

            
            args='o:i:th'
            
            function show_help(){
                echo "Usage: [" $args "]"
                exit 1
            }
            #if no any args then show_help
            

            if [ -z $1 ];then
                show_help
            fi
            while getopts $args var
            do
                case $var in
                'o') out_file="$OPTARG";;
                'i') in_file="$OPTARG";;
                't') title="hello";;
                'h') show_help;;
                *) exit 2;;
                esac
            done
            echo out_file : $out_file
            echo in_file : $in_file
            [ ! -z $title ] && echo $title
            exit 0

            

 

 

c语言中怎么用的呢?

    

        

            

        

    

            

#include <unistd.h>
            
            int main(int ac ,char** av){
                int c;
                /* process arguments */
                while ((c = getopt(ac, av, "a:b:c")) != -1) {
                    switch (c) {
                        case 'a':
                            printf("a:%s\n",optarg);
                            break;
                        case 'b':
                            printf("b:%d\n",atoi(optarg));
                            break;
                        case 'c':
                            printf("c is set\n");
                            break;
                        default:
                            printf("%c is invalidate argument\n",&c);
                            break;
                    }
                }
                
            }

            

 

c中long option 的用法:

    

        

            

        

    

            

#include <stdio.h> /* for printf */
            #include <stdlib.h> /* for exit */
            #include <getopt.h>
            
            int main (int argc, char **argv) {
                int c;
                int digit_optind = 0;
            
                while (1) {
                    int this_option_optind = optind ? optind : 1;
                    int option_index = 0;
                    static struct option long_options[] = {
                        {"add", 1, 0, 0},
                        {"append", 0, 0, 0},
                        {"delete", 1, 0, 0},
                        {"verbose", 0, 0, 0},
                        {"create", 1, 0, 'c'},
                        {"file", 1, 0, 0},
                        {0, 0, 0, 0}
                    };
            
                    c = getopt_long (argc, argv, "abc:d:012",
                             long_options, &option_index);
                    if (c == -1)
                        break;
            
                    switch (c) {
                    case 0:
                        printf ("option %s", long_options[option_index].name);
                        if (optarg)
                            printf (" with arg %s", optarg);
                        printf ("\n");
                        break;
            
                    case '0':
                    case '1':
                    case '2':
                        if (digit_optind != 0 && digit_optind != this_option_optind)
                          printf ("digits occur in two different argv-elements.\n");
                        digit_optind = this_option_optind;
                        printf ("option %c\n", c);
                        break;
            
                    case 'a':
                        printf ("option a\n");
                        break;
            
                    case 'b':
                        printf ("option b\n");
                        break;
            
                    case 'c':
                        printf ("option c with value : %s'\n", optarg);
                        break;
            
                    case 'd':
                        printf ("option d with value : %s'\n", optarg);
                        break;
            
                    case '?':
                        break;
            
                    default:
                        printf ("getopt returned character code :%o \n", c);
                    }
                }
            
                if (optind < argc) {
                    printf ("non-option ARGV-elements: ");
                    while (optind < argc)
                        printf ("%s ", argv[optind++]);
                    printf ("\n");
                }
            
                exit (0);
            }

            

不怕你自私,就怕你自私的不择手段

古人云: 人不为己,天诛地灭;

自私是人的本性,自私是自然的,是天然的;但是作为一个社会人,不同于其他动物,人是有社会属性的,自私是不应该被张扬的;所以,我认为,自私并不可怕,可怕的是自私的不择手段

常听公司的一个领导在遇到问题的时候,是这么对下属讲话的:我不管你采用什么手段,在?点之前你必须把这个问题给我解决了。
我想,对于任何一个员工来讲都不会像这个领导说的那样,为了达到目的而不择手段的。但是我也不会去推究这个领导是不是在说气话,我只知道,这样的领导不是一个好领导。

Linux 下进程相关信息

Linux下看到一个进程,怀疑它有问题,就像查查该进程的相关信息,如:进程的属主,正在执行的文件,当前目录等,怎么查呢?

1 。根据进程号到目录/proc/pid下查

cat cmdline    查看启动的命令行

cat environ     查看当前的环境,里面有pwd loginname 等信息

2。如果用户是从普通用户su到root来执行命令的,可以 ps -p pid -o pid,ppid,comm 来查看对应进程的父进程id,查到su命令对应的进程的pid,在查看该命令的环境信息,就知道是从哪个普通用户su到root的了