C#版ip2long和long2ip

public static long ip2long(string ipAddress) 
{
    try

    {
       System.Net.IPAddress ip = System.Net.IPAddress.Parse(ipAddress); 
       return (((long)ip.GetAddressBytes()[0] < < 24) | ((int)ip.GetAddressBytes()[1] << 16) | ((int)ip.GetAddressBytes()[2] << 8) | ip.GetAddressBytes()[3]); 
    }
    catch (Exception) 
    {
        return 0; 
    }
}

public static string long2ip(long ipAddress) 
{
    try

    {
        System.Net.IPAddress tmpIp = System.Net.IPAddress.Parse(ipAddress.ToString()); 
        Byte[] bytes = tmpIp.GetAddressBytes();   
        long addr = (long)BitConverter.ToInt32(bytes, 0);
        return new System.Net.IPAddress(addr).ToString(); 
    }
    catch (Exception e) { return e.Message; } 
}

使用openssl生成双向加密证书

要生成证书的目录下建立几个文件和文件夹,有
./demoCA/
./demoCA/newcerts/
./demoCA/private/
./demoCA/index.txt (空文件,生成证书时会将数据记录写入)
./demoCA/serial (在serial文件中写入第一个序列号“01”,在生成证书时会以此递增)
概念:首先要有一个根证书,然后用根证书来签发用户证书。
用户进行证书申请:一般先生成一个私钥,然后用私钥生成证书请求(证书请求里应含有公钥信息),再利用证书服务器的根证书来签发证书。
特别说明:
(1)自签名证书(一般用于顶级证书、根证书): 证书的名称和认证机构的名称相同.
(2)根证书:根证书是CA认证中心给自己颁发的证书,是信任链的起始点。安装根证书意味着对这个CA认证中心的信任
数字证书则是由证书认证机构(CA)对证书申请者真实身份验证之后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机构的公章)后形成的一个数字文件。数字证书包含证书中所标识的实体的公钥(就是说你的证书里有你的公钥),由于证书将公钥与特定的个人匹配,并且该证书的真实性由颁发机构保证(就是说可以让大家相信你的证书是真的),因此,数字证书为如何找到用户的公钥并知道它是否有效这一问题提供了解决方案。
openssl中有如下后缀名的文件
.key格式:私有的密钥
.csr格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
.crt格式:证书文件,certificate的缩写
.crl格式:证书吊销列表,Certificate Revocation List的缩写
.pem格式:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式

常用证书协议
x509v3: IETF的证书标准
x.500:目录的标准
SCEP: 简单证书申请协议,用http来进行申请,数据有PKCS#7封装,数据其实格式也是PKCS#10的
PKCS#7: 是封装数据的标准,可以放置证书和一些请求信息
PKCS#10: 用于离线证书申请的证书申请的数据格式,注意数据包是使用PKCS#7封装这个数据
PKCS#12: 用于一个单一文件中交换公共和私有对象,就是公钥,私钥和证书,这些信息进行打包,加密放在存储目录中,CISCO放在NVRAM中,用户可以导出,以防证书服务器挂掉可以进行相应恢复。思科是.p12,微软是.pfx

再说步骤:
生成CA私钥–》生成CA证书请求–》自签名得到根证书(CA给自已颁发的证书)
生成私钥–》生成证书请求–》通过CA签名得到证书
—————————————————————————————-
1.生成X509格式的CA自签名证书
$openssl req -new -x509 -keyout ca.key -out ca.crt -days 3650
$openssl rsa -in ca.key -out ca.key.unsecure -days 3650 //生成一个不需要口令保护的私钥,不推荐,可以于去除密码
* 对已生成csr请求的证书进行自签名的无交互全自动命令:
$openssl -x509 -req -in csr/ca.csr -out newcerts/ca-cert.pem -signkey private/ca-key.pem -passin pass:999999 -days 3650

2.生成服务端的私钥(key文件)及csr 文件
$openssl genrsa -des3 -out server.key 2048
[无交互全自动:$openssl genrsa -des3 -passout pass:111111 -out server.key 2048]
$openssl req -new -key server.key -out server.csr
[无交互全自动:$openssl req -new -passin pass:111111 -key server.key -out server.csr -subj “/C=CN/ST=Guangdong/L=Shenzhen/O=atco company/OU=IT/CN=it.atco.com/emailAddress=atco@163.com”]

3.生成客户端的私钥(key文件)及csr文件
$openssl genrsa -des3 -out client.key 2048
[无交互全自动:$openssl genrsa -des3 -passout pass:111111 -out client.key 2048]
$openssl req -new -key client.key -out client.csr
[无交互全自动:$openssl req -new -passin pass:111111 -key client.key -out client.csr -subj “/C=CN/ST=Guangdong/L=Shenzhen/O=atco company/OU=IT/CN=it.atco.com/emailAddress=atco@163.com”]

4.用生成的CA的证书为刚才生成的server.csr,client.csr文件签名
$openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -days 3650
$openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -days 3650
[无交互全自动:$openssl ca -key 999999 -in client.csr -out client.crt -config conf\openssl.cnf -batch]
(说明:ca私钥及证书位置在conf\openssl.cnf中指定,设置好了可不带-config参数,-key为ca私钥密码,-in为待签名证书申请文件,-out为输出证书文件,-batch表示输出无需人工干预,注意一个证书不可被签名多次,因为index文件中有记录,在此生成的.crt也可换成其它如.pem格式证书)
*进行CA签名获取证书时,需要注意国家、省、单位需要与CA证书相同,否则会报:
The countryName field needed to be the same in the CA certificate (cn) and the request (sh)
*进行CA签名获取证书时,如果信息完全和已有证书信息相同会报错,即不能生成相同的证书,报错信息为:
failed to update database
TXT_DB error number 2
*在进行CA签名获取证书时,可对证书的有效起止时间作控制,默认有效期是一年,可用-days 3650这样的方式改为10年,如想更精确控制,可使用-startdate 和-enddate参数,如-startdate 120501000000Z -enddate 120601000000Z,日期格式为yyMMddHHmmssZ,分别表示年,月,日,时, 分,秒. 其中”Z”是遗留自初始的UTCTIME. 如果没有”Z”,就允许两种附加组”[+/-]hh ‘mm'”,其中”hh”和”mm”分别为与GMT的时差和分差. 如果有”Z”,则时间是以Zulu或GMT时间表示.注:如出现:unable to access the ./demoCA/newcerts directory
这时可找到配置文件,一般是openssl.cnf,修改配置文件项为你生成证书的路径
[ CA_default ]
dir = C:\\OpenSSL\\bin\\demoCA (原值是:./demoCA,注意路径用双斜杠)

5. 生成p12格式证书 (思科是.p12,微软是.pfx)
$openssl pkcs12 -export -inkey client.key -in client.crt -out client.pfx
$openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx
[无交互全自动:$openssl pkcs12 -export -clcerts -in client.pem -inkey client.key -passin pass:111111 -out client.p12 -passout pass:111111]
说明:-in 为欲转换为p12文件的证书文件,-inkey为与转换为p12文件的证书私钥文件,-passin 为私钥文件密码,-out为p12文件,-passout为p12文件打开密码

6.生成pem格式证书
有时需要用到pem格式的证书,可以用以下方式合并证书文件(crt)和私钥文件(key)来生成
$cat client.crt client.key> client.pem
$cat server.crt server.key > server.pem

7.PFX文件转换为X509证书文件和RSA密钥文件
$openssl pkcs12 -in server.pfx -nodes -out server.pem
$openssl rsa -in server.pem -out server2.key
$openssl x509 -in server.pem -out server2.crt
8. 其他相关命令
$openssl rsa -noout -text -in ca.key //查看私钥

==============NGINX相关配置==============
listen 443 ssl;
ssl_password_file cert/server.pwd; #启动密码
ssl_certificate cert/server.crt;
ssl_certificate_key cert/server.key;
ssl_client_certificate cert/ca.crt;
ssl_verify_client on;
ssl_session_cache shared:SSL:30m;
ssl_session_timeout 30m;
#ssl_protocols SSLv3 TLSv1.2 TLSv1.1 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

各种编程语言中获取与转换Unix时间戳(Unix timestamp)

如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)?

Java time
JavaScript Math.round(new Date().getTime()/1000)
getTime()返回数值的单位是毫秒
Microsoft .NET / C# epoch = (DateTime.Now.ToUniversalTime().Ticks – 621355968000000000) / 10000000
MySQL SELECT unix_timestamp(now())
Perl time
PHP time()
PostgreSQL SELECT extract(epoch FROM now())
Python 先 import time 然后 time.time()
Ruby 获取Unix时间戳:Time.now 或 Time.new
显示Unix时间戳:Time.now.to_i
SQL Server SELECT DATEDIFF(s, ‘1970-01-01 00:00:00’, GETUTCDATE())
Unix / Linux date +%s
VBScript / ASP DateDiff(“s”, “01/01/1970 00:00:00”, Now())
其他操作系统
(如果Perl被安装在系统中)
命令行状态:perl -e “print time”

如何在不同编程语言中实现Unix时间戳(Unix timestamp) → 普通时间?

Java String date = new java.text.SimpleDateFormat(“dd/MM/yyyy HH:mm:ss”).format(new java.util.Date(Unix timestamp * 1000))
JavaScript 先 var unixTimestamp = new Date(Unix timestamp * 1000) 然后 commonTime = unixTimestamp.toLocaleString()
Linux date -d @Unix timestamp
MySQL from_unixtime(Unix timestamp)
Perl 先 my $time = Unix timestamp 然后 my ($sec, $min, $hour, $day, $month, $year) = (localtime($time))[0,1,2,3,4,5,6]
PHP date(‘r’, Unix timestamp)
PostgreSQL SELECT TIMESTAMP WITH TIME ZONE ‘epoch’ + Unix timestamp) * INTERVAL ‘1 second’;
Python 先 import time 然后 time.gmtime(Unix timestamp)
Ruby Time.at(Unix timestamp)
SQL Server DATEADD(s, Unix timestamp, ‘1970-01-01 00:00:00’)
VBScript / ASP DateAdd(“s”, Unix timestamp, “01/01/1970 00:00:00”)
其他操作系统
(如果Perl被安装在系统中)
命令行状态:perl -e “print scalar(localtime(Unix timestamp))”

PHP大括号的妙用

一、不管什么程序,function name(){}, for(){}, ….太多了,不说也知道做什么用了。
二、$str{4}在字符串的变量的后面跟上{}刚大括号和中括号一样都是把某个字符串变量当成数组处理。
三、{$val}这时候大括号起的作用就是,告诉PHP,括起来的要当成变量处理。
复制代码 代码如下:
$arr=array(0=>123, ‘name’=>’你好’);
foreach($array as $k=>$v){
echo “select * from blog_blogs where blog_tags like ‘%{$arr[$k]}%’ order by blog_id”; //加一个大括号只是将作为变量的标志符
}
echo ‘<br/ ><br/ ><br/ ><br/ ><br/ ><br/ ><br/ >’;
foreach($array as $k=>$v){
echo “select * from blog_blogs where blog_tags like ‘%{{$arr[$k]}}%’ order by blog_id”; //加两个大括号,外层的将作为普通的字符
}
//用大括号来区分变量
//echo “$arr[‘name’]”; //用此句会报语法错误
echo “{$arr[‘name’]}”; //此句正常,大括号内的字符将作为变量来处理
//$str{4} 在字符串的变量的后面跟上{} 大括号和中括号一样都是把某个字符串变量当成数组处理
$str = ‘abcdefg’;
echo $str{4};
{}大括号在php中的作用(PHP变量放在大括号里面的含义)

如:$sql = “insert into article (`channel_id`,`title`,`detail`,`pub_time`) values (‘{$cid}’,'{$title}’,'{$detail}’,'{$time}’);”;
不加似乎也可以,加{}是什么意思呢?
还有字段名 为什么要以“包括呢?

==============================================

至少便于阅读嘛~~~”是insert into语句要求的,因为字符串要成对出现嘛
加{}有时候是为了防止变量名和后面的字符串连在一起嘛
例如
{$cid}dd
如果cid=aa
那么{$cid}dd=aadd
不加的话你自己看看了$ciddd,岂不变成了ciddd变量了~~

PHP 变量后面加上一个大括号{},里面填上数字,就是指 PHP 变量相应序号的字符。
例如:
$str = ‘hello’;
echo $str{0}; // 输出为 h
echo $str{1}; // 输出为 e
如果要检查某个字符串是否满足多少长度,可以考虑用这种大括号(花括号)加 isset 的方式替代 strlen 函数,因为 isset 是语言结构,strlen 是函数,所以使用 isset 比使用 strlen 效率更高。
比如判断一个字符串的长度是否小于 5:
if ( !isset ( $str{5} ) ) 就比 if ( strlen ( $str ) < 5 ) 好。
下面几个比较能说明原因的解释是:

表示{}里面的是一个变量 ,执行时按照变量来处理 在字符串中引用变量使用的特殊包括方式,这样就可以不使用.运算符,从而减少代码的输入量了。

其实输出那块是等同于print “hello “.$arr[‘fruit’];

一、使用大括号的变量
前一篇日志提到了,PHP Notice警告的是下面一句:

switch (${action}.’_’.${child}) {
初看并没有什么问题。我也查询了PHP手册上关于变量的定义:这里。
1、可变变量的情况
可见,与大部分资料一样,变量使用大括号的情况,在于“可变变量”(Variable variables)。其中提到:
引用
In order to use variable variables with arrays, you have to resolve an ambiguity problem. That is, if you write $$a[1] then the parser needs to know if you meant to use $a[1] as a variable, or if you wanted $$a as the variable and then the [1] index from that variable. The syntax for resolving this ambiguity is: ${$a[1]} for the first case and ${$a}[1] for the second.
也就是说,为了在数组环境中也可以使用可变变量,因此,需要根据不同的情况,恰当的使用大括号{}限制变量的范围。${$a[1]} 与${$a}[1] 是完全不同的:
引用
${$a[1]} 这里$a[1]是一个变量;
${$a}[1] 这里$a是一个变量;
2、定界、避免歧义
实际上,这情况与可变变量时类似。例如,若使用“.”连接符,连接一个字符串,可能是这样:

echo $str.’_2010′;
用大括号来写,可能更简单:

echo “${str}_2010”;
可见,如果没有大括号,则可能把$str_2010整个作为一个变量来处理。当然,这样的写法,只能用在双引号中,单引号里面是不会执行变量替换的。

3、字符串变量中的单个字符
例如:
复制代码 代码如下:
<?php
$str=’000′;
$str{0}=’1′;
echo $str; //输出为100
?>

这不难理解,与中括号[]的作用是一致的,有点类似Python中把字符串看成对象的情况。所以,下面的语句功能相同:
复制代码 代码如下:
<?php
$str=’000′;
$str[0]=’1′;
echo $str; //也是输出100
?>

不过,这些都不是我想说明的内容,真正想描述的情况,请见下面。

二、变量使用大括号的异同 
首先,把PHP的错误信息输出全部打开,即/etc/php.ini 为:
引用
error_reporting = E_ALL
display_errors = On
然后,打开测试页面,其中代码为:
复制代码 代码如下:
<?php
$test=’123′;
echo $test;
echo “${test}”;
echo “{$test}”;
echo ${test}.’_’;
echo ${test};
?>

你会看到如下的结果:
引用
123123123
Notice: Use of undefined constant test – assumed ‘test’ in /var/www/html/phpcrm/testpages/variables.php on line 6
123_
Notice: Use of undefined constant test – assumed ‘test’ in /var/www/html/phpcrm/testpages/variables.php on line 7
123
这说明什么?
1、可接受的写法
从输出结果中“123123123”,表明前面三行的echo语句都是正常的:
复制代码 代码如下:
echo $test;
echo “${test}”;
echo “{$test}”;

2、不建议的写法
后面的两行都有Notice警告,也就是曾把test变量看成常量,只是后来才假设为变量来处理的。因此,为了避免歧义和冲突,不建议这样写:
复制代码 代码如下:
echo ${test}.’_’;
echo ${test};

不过,可以有一种变通的写法
复制代码 代码如下:
echo ${‘test’}.’_’;
echo ${‘test’};

这样写的话就不会报错了
3、不正确的写法
网上不少资料介绍,${var}与{$var}的作用是一样的。但是,如果你再加入一句:

echo {$test};
那么,你将会得到以下错误信息:
引用
Parse error: syntax error, unexpected ‘{‘ in /var/www/html/phpcrm/testpages/variables.php on line 8
这可不是Notice警告,是错误,因解析问题,程序将不能正常运行。

三、总结
结合前面两部分的内容,我相信,对于变量引用时使用大括号,应遵循以下原则:
引用
1、正确的写法为:${var} 的形式;
2、与双引号一同使用;
3、根据需表达的意思进行定界。
所以,最后我把switch一行改为:

switch (“${action}_${child}”) {
即不再出现Notice警告。

服务器自动备份目录并删除旧备份批处理

xcopy "D:\www" "D:\backup\%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%-%time:~3,2%-%time:~6,2%\" /H/E/Y/V
forfiles /P D:\backup /D -7 /C "cmd /c if @isdir==TRUE rd /s /q @path"

第一行:复制D:\www目录下所有文件至D:\backup目录下并以当前日期时间命名目录
第二行:删除D:\backup目录下7天之前的备份

使用方法:将命令保存为BAT格式文件并添加到计划任务中。

JAVASCRIPT版PRINT_R函数

function print_r( theObj, echo, dep ) {
    var retStr = '', rn = "\r\n";
    if(typeof dep == 'undefined') {
        dep = 0;
    }
    var blank = function (num) {
        for(var i=0, str = ''; i < num; i++) str += ' ';
        return str;
    };
    if( typeof theObj == 'object') {
        var cbox = theObj.constructor == Array ? ['[', ']'] : ['{', '}'];
        retStr += (theObj.constructor == Array ? 'array' : typeof theObj) + cbox[0] + rn;
        for (var p in theObj) {
            retStr += blank( (dep + 1) * 4 ) + p + ' => ';
            retStr += typeof theObj[p] == 'object' ? print_r( theObj[p], true, dep + 1 ) : theObj[p];
            retStr += rn;
        }
        retStr += blank( dep * 4 ) + cbox[1] + rn;
    }
    else {
        retStr += typeof theObj + ':' + theObj + rn;
    }
    if(echo) {
        return retStr;
    }
    else {
        alert(retStr);
    }
}

CentOS6使用yum搭建VPN

第一步:检查
如果检查结果没有这些支持的话,是不能安装pptp的。执行指令:

#modprobe ppp-compress-18 && echo ok

这条执行执行后,显示“ok”则表明通过。不过接下来还需要做另一个检查,输入指令:

#cat /dev/net/tun

如果这条指令显示结果为下面的文本,则表明通过:
cat: /dev/net/tun: File descriptor in bad state
上述两条均通过,才能安装pptp。否则就只能考虑openvpn,或者请你的服务商来解决这个问题。
注意:如果你显示的不是这个文本,而是别的,可能显示的就不一样,这是版本问题,(如你安装的简体中文可能就会出现error之类的一句话。)

#rpm -q ppp //查询当前系统的ppp是否默认集成了,以及ppp的版本

第二步:安装
1.安装ppp和iptables
PPTPD要求Linux内核支持mppe,一般来说CentOS安装时已经包含了

#yum install perl ppp iptables //centos默认安装了iptables和ppp
#chkconfig iptables on
#service iptables start

2.安装pptpd

#rpm -Uvh http://poptop.sourceforge.net/yum/stable/rhel6/pptp-release-current.noarch.rpm
#yum install pptpd
#chkconfig pptpd on
#service pptpd start

以下命令检查PPP是否支持MPPE:

#strings '/usr/sbin/pppd' |grep -i mppe | wc --lines

如果以上命令输出为“0”则表示不支持;输出为“30”或更大的数字就表示支持,MPPE(Microsoft Point to Point Encryption,微软点对点加密)。

第三步:配置
开启路由转发

#vi /etc/sysctl.conf

修改
net.ipv4.ip_forward = 1
执行:

#sysctl -p //让修改的内核参数生效

配置

#vi /etc/ppp/options.pptpd

修改:
ms-dns 8.8.8.8
ms-dns 8.8.4.4

#vi /etc/pptpd.conf

修改 :
localip 10.8.8.1 为vpn管道的ip (VPN主机IP)
remoteip 10.8.8.2-245 为给客户端连接分配的ip地址范围

添加账号

#echo -e 'vpntest pptpd vpntestpassword *' >> /etc/ppp/chap-secrets

注:chap-secrets保存的信息客户端连接信息依次是:用户名,服务名,密码,允许的ip。服务名在options.pptpd的name定义,默认为pptpd

iptables 配置脚本:

#!/bin/bash
### Clear Old Rules
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
### * filter
# Default DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# INPUT Chain
iptables -A INPUT -p gre -j ACCEPT
iptables -A INPUT -i lo -p all -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# OUTPUT Chain
iptables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
# FORWARD Chain
iptables -A FORWARD -s 10.8.8.0/24 -o eth0 -j ACCEPT
iptables -A FORWARD -d 10.8.8.0/24 -i eth0 -j ACCEPT
### * nat
# POSTROUTING Chain
iptables -t nat -A POSTROUTING -s 10.8.8.0/24 -o eth0 -j MASQUERADE

保存规则并重启

#service iptables save
#service iptables restart

Android Studio创建项目报错Failed to import new Gradle project

Failed to import new Gradle project: Could not install Gradle distribution from ‘http://services.gradle.org/distributions/gradle-1.6-bin.zip’.
java.net.UnknownHostException: services.gradle.org
services.gradle.org
Consult IDE log for more details (Help | Show Log)

解决步骤:
一、手动下载:http://services.gradle.org/distributions/gradle-1.6-bin.zip,解压至一固定目录
二、配置环境变量path添加gradle的bin目录,如:D:\Develop\Android\gradle-1.6
三、CMD运行命令:gradle -v,验证成功
四、重启Android Studio并新建项目

Visual Studio Team System 2008 Team Suite 迅雷下载

Visual Studio Team System 2008 Team Suite 迅雷下载地址:
ed2k://|file|zh-Hans_visual_studio_team_system_2008_team_suite_x86_x64wow_dvd_X14-26452.iso|4663904256|8E2D6430D819328940B9BF83568589FA|h=EEIMYZRV4MPHLRU2XW3FVLV6ZGV7XH7U|/

正版序列号:
PYHYP-WXB3B-B2CCM-V9DX9-VDY8T

破解方法:
开始> 设置> 控制面版> 添加或删除程序> 卸载vs.net2008> 选择升级选项> 输入正版序列号
点击升级,完成!

注意:在WIN7,WIN2008 SERVER等系统中,卸载界面是没有显示出输入序列号的地方,微软将输入的位置隐藏起来了。
那么在WIN7或WIN2008系统中,如何升级输入序列号呢?我们需要借CrackVS2008ForWindows7.zip这个工具,将隐藏的输入框找回来。

具体的操作方法如下:
1. 安装 VS2008 (如果你已经安装了,那忽略此项)
2. 打开 控制面板 –> 添加删除程序, 找到 VS2008 的安装项,运行 VS2008的安装卸载程序,出现如下的界面
clip_image001

clip_image003
3. 打开CrackVS2008ForWindows7破解程序,出现如下的界面
clip_image004
4. 点击上面的 “Bug 微软”,随即将出现升级输入序列号输入框
clip_image006

输入序列号并点击升级按钮,完成!

Linux Shell获取目录文件列表及文件名(sh)

#!/bin/bash
for fullpath in "$@"
do
    filename="${fullpath##*/}"                      # Strip longest match of */ from start
    dir="${fullpath:0:${#fullpath} - ${#filename}}" # Substring from 0 thru pos of filename
    base="${filename%.[^.]*}"                       # Strip shortest match of . plus at least one non-dot char from end
    ext="${filename:${#base} + 1}"                  # Substring from len of base thru end
    if [[ -z "$base" && -n "$ext" ]]; then          # If we have an extension and no base, it's really the base
        base=".$ext"
        ext=""
    fi

    echo -e "$fullpath:\n\tdir  = \"$dir\"\n\tbase = \"$base\"\n\text  = \"$ext\""
done

Ubuntu使用apt-get安装Nginx,MySql,PHP5

一、Nginx安装

安装key

# cd /tmp
# wget http://nginx.org/keys/nginx_signing.key
# sudo apt-key add nginx_signing.key
# rm -rf nginx_signing.key

修改/etc/apt/sources.list文件增加如下内容:

deb http://nginx.org/packages/mainline/ubuntu/ codename nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ codename nginx

Ubuntu各版本对应Codename如下:

Version Codename
10.04 lucid
11.10 oneiric
12.04 precise
12.10 quantal
13.04 raring

使用apt-get安装并启动

# sudo apt-get update
# sudo apt-get install nginx
# sudo service nginx start

站点配置文件样本 :

server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.php;

error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PHP_ADMIN_VALUE open_basedir=$document_root/;
include fastcgi_params;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
}
location ~ .*\.(js|css)?$ {
expires 12h;
}
#access_log /var/log/nginx/log/host.access.log main;
}

默认安装目录: /etc/nginx/
默认SSL和虚拟主机配置目录: /etc/nginx/conf.d/
默认日志保存目录: /var/log/nginx/
默认网站文件目录: /usr/share/nginx/html
默认配置文件: /etc/nginx/nginx.conf
默认访问日志文件: /var/log/nginx/access.log
默认错误日志文件: /var/log/nginx/error.log

二、MYSQL安装

# sudo apt-get install mysql mysql-server
# sudo service mysqld start
# sudo mysqladmin -u root password 'your-password'

配置文件路径:/etc/my.cnf
数据库路径:/var/lib/mysql

三、PHP5安装

# sudo apt-get install php5-common php5-fpm php5-cli php5-mysql php5-mcrypt php5-gd php5-tidy php5-xmlrpc
# sudo chown www-data:www-data /etc/php5/fpm/php-fpm.conf
# sudo service php5-fpm start

配置文件路径:/etc/php5/fpm/php.ini
SESSION保存路径:/var/lib/php5

CentOS6.x使用YUM安装配置LNMP运行环境

一、Nginx
# cd /tmp
# wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
# rpm -ivh nginx-release-centos-6-0.el6.ngx.noarch.rpm
# yum install nginx

站点配置样本:
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.php;

error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PHP_ADMIN_VALUE open_basedir=$document_root/;
include fastcgi_params;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
}
location ~ .*\.(js|css)?$ {
expires 12h;
}
#access_log /var/log/nginx/log/host.access.log main;
}

默认安装目录: /etc/nginx/
默认SSL和虚拟主机配置目录: /etc/nginx/conf.d/
默认日志保存目录: /var/log/nginx/
默认网站文件目录: /usr/share/nginx/html
默认配置文件: /etc/nginx/nginx.conf
默认访问日志文件: /var/log/nginx/access.log
默认错误日志文件: /var/log/nginx/error.log

二、MYSQL
# yum install mysql mysql-server
# chkconfig mysqld on
# service mysqld start
# mysqladmin -u root password 'your-password'

配置文件路径:/etc/my.cnf
数据库路径:/var/lib/mysql

三、PHP
# yum install php-common php-fpm php-cli php-pdo php-mysql php-mcrypt php-mbstring php-gd php-tidy php-xml php-xmlrpc php-pear php-pecl-memcache php-eaccelerator
# chown nginx:nginx /etc/php-fpm.conf
# mkdir /var/lib/php/session
# chown -R nginx:nginx /var/lib/php/session
# chkconfig php-fpm on
# service php-fpm start

配置文件路径:/etc/php.ini
扩展模块路径:/usr/lib64/php/modules