<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Fwolf's Blog &#187; bash - Fwolf's Blog</title>
	<atom:link href="http://www.fwolf.com/blog/post/tag/bash/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fwolf.com/blog</link>
	<description>随心·随意·随缘·努力～</description>
	<lastBuildDate>Sun, 29 Aug 2010 14:52:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>[PHP]在bash中输出彩色文本</title>
		<link>http://www.fwolf.com/blog/post/389</link>
		<comments>http://www.fwolf.com/blog/post/389#comments</comments>
		<pubDate>Mon, 17 Mar 2008 16:57:13 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[color]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/post/389</guid>
		<description><![CDATA[先看图吧： 乱不乱？这是我自己用的一个web游戏机器人程序的输出，游戏自然一切都是数字说了算，可每次看这一大堆数字实在是让我头疼，从中找出有用的数据太难了，对齐、缩进都办法也不怎么见效，突然我想到，如果用escape color输出彩色的文本，应该看起来会舒服很多吧？ 说到escape color，用过bash的人应该都见过，只是不知道它叫这么名字而已。ls中彩色的文件、目录名就是用escape color来实现的。早些年用得比较多的telnet形式的bbs，它的颜色也是escape color，最明显的特征就是bbs文章被转贴到别处的时候，经常会多出一些ESC什么的字符出来，这就是escape color的控制字符。 想完整的了解escape color，资料很多，wikipedia &#8211; ANSI escape code就有比较完整的解释，中文的资料也不少，比如啦啦~在bash下输出彩色的文本，甚至还有人做出了颜色表：The 256 color mode of xterm。 不用觉得眼花缭乱，简单说来，escape code就是在终端（terminal）中输出的控制字符，不光包括文字颜色，还可以控制很多其它内容，当然，颜色是比较常用的，所以习惯称之为escape color。我在这里也只讲颜色，其它控制字符的使用方式大同小异，但需要主意不同的终端类型可能会略有区别。 escape color的格式为： &#60;ESC&#62;[{attr};{fg};{bg}m 其中&#60;ESC&#62;[是起始字符，在bash中一般是16进制的0x1b，也就是八进制的033，十进制的27，另外一种表现方式就是^[，熟悉吧，在bash中按一下Ctrl+v再按ESC它就出来了。后面分别是attr模式、fg前景色、bg背景色，中间用逗号;间隔，最后用字母m结尾。 attr的取值有： 0 Reset All Attributes (return to normal mode) #重置所有设置，回归自然 1 Bright (Usually turns on BOLD) # 高亮/加粗 2 Dim 3 Underline 5 Blink 7 Reverse 8 Hidden fg的取值有： [...]]]></description>
			<content:encoded><![CDATA[<p>先看图吧：</p>

<p><a href="http://www.flickr.com/photos/fwolf/2341037870/" title="PHP在bash中输出彩色文本 by fwolf, on Flickr"><img src="http://farm3.static.flickr.com/2259/2341037870_e7a216bdf3.jpg" width="500" height="233" alt="PHP在bash中输出彩色文本" /></a></p>

<p>乱不乱？这是我自己用的一个web游戏机器人程序的输出，游戏自然一切都是数字说了算，可每次看这一大堆数字实在是让我头疼，从中找出有用的数据太难了，对齐、缩进都办法也不怎么见效，突然我想到，如果用escape color输出彩色的文本，应该看起来会舒服很多吧？</p>

<p>说到escape color，用过bash的人应该都见过，只是不知道它叫这么名字而已。ls中彩色的文件、目录名就是用escape color来实现的。早些年用得比较多的telnet形式的bbs，它的颜色也是escape color，最明显的特征就是bbs文章被转贴到别处的时候，经常会多出一些<code>ESC</code>什么的字符出来，这就是escape color的控制字符。</p>

<p>想完整的了解escape color，资料很多，<a href="http://en.wikipedia.org/wiki/ANSI_escape_code">wikipedia &#8211; ANSI escape code</a>就有比较完整的解释，中文的资料也不少，比如<a href="http://www.fedorachina.cn/index.php/topic,124.0.html">啦啦~在bash下输出彩色的文本</a>，甚至还有人做出了颜色表：<a href="http://www.frexx.de/xterm-256-notes/">The 256 color mode of xterm</a>。</p>

<p>不用觉得眼花缭乱，简单说来，escape code就是在终端（terminal）中输出的控制字符，不光包括文字颜色，还可以控制很多其它内容，当然，颜色是比较常用的，所以习惯称之为escape color。我在这里也只讲颜色，其它控制字符的使用方式大同小异，但需要主意不同的终端类型可能会略有区别。</p>

<p>escape color的格式为：</p>

<pre><code>&lt;ESC&gt;[{attr};{fg};{bg}m
</code></pre>

<p>其中<code>&lt;ESC&gt;[</code>是起始字符，在bash中一般是16进制的0x1b，也就是八进制的033，十进制的27，另外一种表现方式就是<code>^[</code>，熟悉吧，在bash中按一下Ctrl+v再按ESC它就出来了。后面分别是<code>attr</code>模式、<code>fg</code>前景色、<code>bg</code>背景色，中间用逗号<code>;</code>间隔，最后用字母<code>m</code>结尾。</p>

<p>attr的取值有：</p>

<pre><code>0   Reset All Attributes (return to normal mode) #重置所有设置，回归自然
1   Bright (Usually turns on BOLD) # 高亮/加粗
2   Dim
3   Underline
5   Blink
7   Reverse
8   Hidden
</code></pre>

<p>fg的取值有：</p>

<pre><code>30  Black
31  Red
32  Green
33  Yellow
34  Blue
35  Magenta
36  Cyan
37  White
</code></pre>

<p>bg的取值有：</p>

<pre><code>40  Black
41  Red
42  Green
43  Yellow
44  Blue
45  Magenta
46  Cyan
47  White
</code></pre>

<p>可以看到，attr/fg/bg的用值范围不重叠，所以空缺哪个无所谓。</p>

<p>在用php输出的时候，只需要在正常字符串内容中，加入适当的escape color代码就可以了，其实其它应用程序也是类似操作的，并不需要额外的设置，比如：</p>

<pre><code>$ php -r 'echo "\x1b[5;31;44m第一种色彩\x1b[3;34;41m第二种色彩\x1b[0m 回归自然\n";'
</code></pre>

<p>看到彩色了吧？秀一下我那个机器人美化之后的界面：</p>

<p><a href="http://www.flickr.com/photos/fwolf/2341037976/" title="PHP在bash中输出彩色文本 by fwolf, on Flickr"><img src="http://farm4.static.flickr.com/3020/2341037976_b8dec03114.jpg" width="500" height="329" alt="PHP在bash中输出彩色文本" /></a></p>

<p>顺便说一句，把字符串储存到文件中的时候，escape color也可以一起存上的，浏览时，cat和tail默认就支持颜色显示，less则需要带上<code>-R</code>参数才行。</p>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/bash" title="bash" rel="tag">bash</a>, <a href="http://www.fwolf.com/blog/post/tag/color" title="color" rel="tag">color</a>, <a href="http://www.fwolf.com/blog/post/tag/php" title="PHP" rel="tag">PHP</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/347" title="升级MT dv 3.0主机到php5 (2007-08-09)">升级MT dv 3.0主机到php5</a> (9)</li>
	<li><a href="http://www.fwolf.com/blog/post/300" title="针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS） (2007-03-18)">针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS）</a> (3)</li>
	<li><a href="http://www.fwolf.com/blog/post/443" title="配置安全的共享web服务器（抛砖引玉） (2009-06-09)">配置安全的共享web服务器（抛砖引玉）</a> (4)</li>
	<li><a href="http://www.fwolf.com/blog/post/400" title="选择Eclipse PHP Development Tools(PDT)作为PHP开发工具 (2008-05-03)">选择Eclipse PHP Development Tools(PDT)作为PHP开发工具</a> (8)</li>
	<li><a href="http://www.fwolf.com/blog/post/176" title="让phpmailer支持中文名称的附件 (2006-05-23)">让phpmailer支持中文名称的附件</a> (5)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/389/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Bash script中的命令行参数处理</title>
		<link>http://www.fwolf.com/blog/post/371</link>
		<comments>http://www.fwolf.com/blog/post/371#comments</comments>
		<pubDate>Sat, 01 Dec 2007 11:00:48 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[cli]]></category>
		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/post/371</guid>
		<description><![CDATA[Bash中的script是强大的，但如果想让写出的脚本更加实用、灵活，不能简单的堆砌命令，势必要加上一些命令行参数。命令行参数除了实际的操作对象以外，还可能是一些选项（通常是用-开头的），如果还是用$1、$2这样的方式一个一个的判断参数到底是不是选项、是哪个选项就太低效了，更好的方式是用getopts，先看简单的例子： #!/bin/bash while getopts 'd:Dm:f:t:' OPT; do case $OPT in d) DEL_DAYS="$OPTARG";; D) DEL_ORIGINAL='yes';; f) DIR_FROM="$OPTARG";; m) MAILDIR_NAME="$OPTARG";; t) DIR_TO="$OPTARG";; ?) echo "Usage: `basename $0` [options] filename" esac done shift $(($OPTIND - 1)) getopts后面的字符串就是可以使用的选项列表，每个字母代表一个选项，后面带:的意味着选项除了定义本身之外，还会带上一个参数作为选项的值，比如d:在实际的使用中就会对应-d 30，选项的值就是30；getopts字符串中没有跟随:的是开关型选项，不需要再指定值，相当于true/false，只要带了这个参数就是true。如果命令行中包含了没有在getopts列表中的选项，会有警告信息，如果在整个getopts字符串前面也加上个:，就能消除警告信息了。 使用getopts识别出各个选项之后，就可以配合case来进行相应的操作了。操作中有两个相对固定的“常量”，一个是OPTARG，用来取当前选项的值，另外一个是OPTIND，代表当前选项在参数列表中的位移。注意case中的最后一个选择──?，代表这如果出现了不认识的选项，所进行的操作。 选项参数识别完成之后，如果要取剩余的其它命令行参数，可以使用shift把选项参数抹去，就像例子里面的那样，对整个参数列表进行左移操作，最左边的参数就丢失了（已经用case判断并进行了处理，不再需要了），位移的长度正好是刚才case循环完毕之后的OPTIND - 1，因为参数从1开始编号，选项处理完毕之后，正好指向剩余其它参数的第一个。在这里还要知道，getopts在处理参数的时候，处理一个开关型选项，OPTIND加1，处理一个带值的选项参数，OPTIND则会加2。 最后，真正需要处理的参数就是$1~$#了，可以用for循环依次处理。 使用getopts处理参数虽然是更加方便了，但仍然有两个小小的局限： 选项参数的格式必须是-d val，而不能是中间没有空格的-dval。 所有选项参数必须写在其它参数的前面，因为getopts是从命令行前面开始处理，遇到非-开头的参数，或者选项参数结束标记--就中止了，如果中间遇到非选项的命令行参数，后面的选项参数就都取不到了。 参考 Parsing arguments for your shell script Tags: bash, cli, Linux, [...]]]></description>
			<content:encoded><![CDATA[<p>Bash中的script是强大的，但如果想让写出的脚本更加实用、灵活，不能简单的堆砌命令，势必要加上一些命令行参数。命令行参数除了实际的操作对象以外，还可能是一些选项（通常是用-开头的），如果还是用$1、$2这样的方式一个一个的判断参数到底是不是选项、是哪个选项就太低效了，更好的方式是用getopts，先看简单的例子：</p>

<pre><code>#!/bin/bash
while getopts 'd:Dm:f:t:' OPT; do
    case $OPT in
        d)
            DEL_DAYS="$OPTARG";;
        D)
            DEL_ORIGINAL='yes';;
        f)
            DIR_FROM="$OPTARG";;
        m)
            MAILDIR_NAME="$OPTARG";;
        t)
            DIR_TO="$OPTARG";;
        ?)
            echo "Usage: `basename $0` [options] filename"
    esac
done

shift $(($OPTIND - 1))
</code></pre>

<p>getopts后面的字符串就是可以使用的选项列表，每个字母代表一个选项，后面带<code>:</code>的意味着选项除了定义本身之外，还会带上一个参数作为选项的值，比如<code>d:</code>在实际的使用中就会对应<code>-d 30</code>，选项的值就是30；getopts字符串中没有跟随<code>:</code>的是开关型选项，不需要再指定值，相当于true/false，只要带了这个参数就是true。如果命令行中包含了没有在getopts列表中的选项，会有警告信息，如果在整个getopts字符串前面也加上个<code>:</code>，就能消除警告信息了。</p>

<p>使用getopts识别出各个选项之后，就可以配合case来进行相应的操作了。操作中有两个相对固定的“常量”，一个是<code>OPTARG</code>，用来取当前选项的值，另外一个是<code>OPTIND</code>，代表当前选项在参数列表中的位移。注意case中的最后一个选择──<code>?</code>，代表这如果出现了不认识的选项，所进行的操作。</p>

<p>选项参数识别完成之后，如果要取剩余的其它命令行参数，可以使用<code>shift</code>把选项参数抹去，就像例子里面的那样，对整个参数列表进行左移操作，最左边的参数就丢失了（已经用case判断并进行了处理，不再需要了），位移的长度正好是刚才case循环完毕之后的<code>OPTIND - 1</code>，因为参数从1开始编号，选项处理完毕之后，正好指向剩余其它参数的第一个。在这里还要知道，getopts在处理参数的时候，处理一个开关型选项，OPTIND加1，处理一个带值的选项参数，OPTIND则会加2。</p>

<p>最后，真正需要处理的参数就是$1~$#了，可以用for循环依次处理。</p>

<p>使用getopts处理参数虽然是更加方便了，但仍然有两个小小的局限：</p>

<ol>
<li>选项参数的格式必须是<code>-d val</code>，而不能是中间没有空格的<code>-dval</code>。</li>
<li>所有选项参数必须写在其它参数的前面，因为getopts是从命令行前面开始处理，遇到非<code>-</code>开头的参数，或者选项参数结束标记<code>--</code>就中止了，如果中间遇到非选项的命令行参数，后面的选项参数就都取不到了。</li>
</ol>

<h4>参考</h4>

<ul>
<li><a href="http://www.linux.com/feature/118031">Parsing arguments for your shell script</a></li>
</ul>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/bash" title="bash" rel="tag">bash</a>, <a href="http://www.fwolf.com/blog/post/tag/cli" title="cli" rel="tag">cli</a>, <a href="http://www.fwolf.com/blog/post/tag/linux" title="Linux" rel="tag">Linux</a>, <a href="http://www.fwolf.com/blog/post/tag/script" title="script" rel="tag">script</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/279" title="配置ssh的自动登录 (2007-01-05)">配置ssh的自动登录</a> (13)</li>
	<li><a href="http://www.fwolf.com/blog/post/400" title="选择Eclipse PHP Development Tools(PDT)作为PHP开发工具 (2008-05-03)">选择Eclipse PHP Development Tools(PDT)作为PHP开发工具</a> (8)</li>
	<li><a href="http://www.fwolf.com/blog/post/410" title="用ssh打通反向隧道，内网也可对外提供服务 (2008-07-10)">用ssh打通反向隧道，内网也可对外提供服务</a> (2)</li>
	<li><a href="http://www.fwolf.com/blog/post/437" title="安装ibus输入法 (2009-04-06)">安装ibus输入法</a> (3)</li>
	<li><a href="http://www.fwolf.com/blog/post/347" title="升级MT dv 3.0主机到php5 (2007-08-09)">升级MT dv 3.0主机到php5</a> (9)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/371/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>升级MT dv 3.0主机到php5</title>
		<link>http://www.fwolf.com/blog/post/347</link>
		<comments>http://www.fwolf.com/blog/post/347#comments</comments>
		<pubDate>Wed, 08 Aug 2007 17:02:56 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Hosted]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[FastCGI]]></category>
		<category><![CDATA[MediaTemple]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[sed]]></category>
		<category><![CDATA[suexec]]></category>
		<category><![CDATA[upgrade]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/post/347</guid>
		<description><![CDATA[MT主机dv 3.0上的php默认是4，现在已经是php5时代了，不知道MT什么时候默认给配php5，现阶段官方的方式仍然是由用户自行升级，详细步骤见kb中的Upgrade to PHP5 on (dv) 3.0 Dedicated Virtual Servers。 推荐使用suexec方式，这样每个用户执行cgi使用的都是自己的身份，即安全也便于管理。suexec要求的前提条件有三个，就是用户的主机设置开启如下三个选项： PHP支持打开，安全模式safe_mode关闭。 CGI支持打开。 FastCGI支持打开。 具体步骤说起来也是很简单的，首先把/opt/php51下的php5执行文件拷贝到用户目录下，并设置相应权限： cp /opt/php51/cgi-bin/php5 /var/www/vhosts/&#60;domain&#62;/bin/ cd /var/www/vhosts/&#60;domain&#62;/ chown -R &#60;domain-user&#62;:psacln bin/ 其中&#60;domain&#62;是用户的域名，&#60;domain-user&#62;是用户的ssh/ftp用户名，然后编辑/var/www/vhosts/&#60;domain&#62;/conf/vhost.conf文件，添加如下内容： AddHandler fcgid-script .php .php5 SuexecUserGroup &#60;domain-user&#62; psacln &#60;Directory /var/www/vhosts/&#60;domain&#62;/httpdocs&#62; FCGIWrapper /var/www/vhosts/&#60;domain&#62;/bin/php5 .php FCGIWrapper /var/www/vhosts/&#60;domain&#62;/bin/php5 .php5 Options ExecCGI allow from all &#60;/Directory&#62; 如果是https站点，除了httpdocs换成httpsdocs之外，配置文件名称为vhost_ssl.conf。最后启用设置： /usr/local/psa/admin/sbin/websrvmng -a -v 就可以了，我们主机上现在的php5版本是5.1.4，还是不够新:)。 为了方便操作，自己写了个小脚本： #! /bin/bash # [...]]]></description>
			<content:encoded><![CDATA[<p>MT主机dv 3.0上的php默认是4，现在已经是php5时代了，不知道MT什么时候默认给配php5，现阶段官方的方式仍然是由用户自行升级，详细步骤见<a href="http://kb.mediatemple.net/article.php?id=260">kb中的Upgrade to PHP5 on (dv) 3.0 Dedicated Virtual Servers</a>。</p>

<p>推荐使用suexec方式，这样每个用户执行cgi使用的都是自己的身份，即安全也便于管理。suexec要求的前提条件有三个，就是用户的主机设置开启如下三个选项：</p>

<ul>
<li>PHP支持打开，安全模式safe_mode关闭。</li>
<li>CGI支持打开。</li>
<li>FastCGI支持打开。</li>
</ul>

<p>具体步骤说起来也是很简单的，首先把<code>/opt/php51</code>下的php5执行文件拷贝到用户目录下，并设置相应权限：</p>

<pre><code>cp /opt/php51/cgi-bin/php5 /var/www/vhosts/&lt;domain&gt;/bin/
cd /var/www/vhosts/&lt;domain&gt;/
chown -R &lt;domain-user&gt;:psacln bin/
</code></pre>

<p>其中<code>&lt;domain&gt;</code>是用户的域名，<code>&lt;domain-user&gt;</code>是用户的ssh/ftp用户名，然后编辑<code>/var/www/vhosts/&lt;domain&gt;/conf/vhost.conf</code>文件，添加如下内容：</p>

<pre><code>AddHandler fcgid-script .php .php5
SuexecUserGroup &lt;domain-user&gt; psacln
&lt;Directory /var/www/vhosts/&lt;domain&gt;/httpdocs&gt;
     FCGIWrapper /var/www/vhosts/&lt;domain&gt;/bin/php5 .php
     FCGIWrapper /var/www/vhosts/&lt;domain&gt;/bin/php5 .php5
     Options ExecCGI
     allow from all
&lt;/Directory&gt;
</code></pre>

<p>如果是https站点，除了httpdocs换成httpsdocs之外，配置文件名称为vhost_ssl.conf。最后启用设置：</p>

<pre><code>/usr/local/psa/admin/sbin/websrvmng -a -v
</code></pre>

<p>就可以了，我们主机上现在的php5版本是5.1.4，还是不够新:)。</p>

<p>为了方便操作，自己写了个小脚本：</p>

<pre><code>#! /bin/bash
# Automatic enable php5 support for mediatemple user(via suexec).

# Pre-prepare in plesk:
#   php support is checked, safe_mod 'on' is UNCHECKED
#   cgi support is checked.
#   fastcgi support is checked.

# Check username, must run with root
WHOAMI=`whoami`
if [ ! $WHOAMI == 'root' ]; then
    echo "This script must run with root."
    exit 1
fi

# Check parameters
if [ $# -lt 2 ];then
    echo "Usage: `basename $0` ssh_user domain"
    exit 1
fi
USER=$1
DOMAIN=$2

# If given a wrong domain, exit
if [ ! -d /var/www/vhosts/$DOMAIN ]; then
    echo "Domain doesn't exists."
    exit 1
fi

# Copy php5 files
cp /opt/php51/cgi-bin/php5 /var/www/vhosts/$DOMAIN/bin/
cd /var/www/vhosts/$DOMAIN/
chown -R $USER:psacln bin/
cd conf

BEGIN="###_87b4e7fc -- Add by enable_php script, DON'T modify this section --"
END="# -- Enable_php modify section end -- 87b4e7fc_###"

# If vhost.conf doesn't exists, create it with default content
if [ -z vhost.conf ]; then
    echo "\\
$BEGIN\\
$END\\
" &gt;&gt; vhost.conf
else
    MARK=`grep "###_87b4e7fc" vhost.conf|wc -l`
    if [ $MARK -eq 0 ]; then
        # If vhost.conf exists &amp; not mark, add replace mark
        echo "\\
$BEGIN\\
$END\\
" &gt;&gt; vhost.conf
    fi
fi
# Vhost_ssl.conf
if [ -z vhost_ssl.conf ]; then
    echo "\\
$BEGIN\\
$END\\
" &gt;&gt; vhost_ssl.conf
else
    MARK=`grep "###_87b4e7fc" vhost_ssl.conf|wc -l`
    if [ $MARK -eq 0 ]; then
        # If vhost.conf exists &amp; not mark, add replace mark
        echo "\\
$BEGIN\\
$END\\
" &gt;&gt; vhost_ssl.conf
    fi
fi


STR="$BEGIN\\n\\
AddHandler fcgid-script .php .php5\\n\\
SuexecUserGroup $USER psacln\\n\\
&lt;Directory \\/var\\/www\\/vhosts\\/$DOMAIN\\/httpdocs&gt;\\n\\
    FCGIWrapper \\/var\\/www\\/vhosts\\/$DOMAIN\\/bin\\/php5 .php\\n\\
    FCGIWrapper \\/var\\/www\\/vhosts\\/$DOMAIN\\/bin\\/php5 .php5\\n\\
    Options \\+ExecCGI\\n\\
    allow from all\\n\\
&lt;\\/Directory&gt;\\n\\
&lt;Directory \\/var\\/www\\/vhosts\\/$DOMAIN\\/httpsdocs&gt;\\n\\
    FCGIWrapper \\/var\\/www\\/vhosts\\/$DOMAIN\\/bin\\/php5 .php\\n\\
    FCGIWrapper \\/var\\/www\\/vhosts\\/$DOMAIN\\/bin\\/php5 .php5\\n\\
    Options \\+ExecCGI\\n\\
    allow from all\\n\\
&lt;\\/Directory&gt;\\n\\
$END"

# Backup original configure
cp vhost.conf vhost.conf.`date +"%Y%m%d-%H%M%S"`
cp vhost_ssl.conf vhost_ssl.conf.`date +"%Y%m%d-%H%M%S"`

# Write configure information
sed -i -e ":begin; /###_87b4e7fc/,/87b4e7fc_###/ { /87b4e7fc_###/! { $! { N; b begin }; }; s/###_87b4e7fc.*87b4e7fc_###/$STR/g };" vhost.conf
sed -i -e ":begin; /###_87b4e7fc/,/87b4e7fc_###/ { /87b4e7fc_###/! { $! { N; b begin }; }; s/###_87b4e7fc.*87b4e7fc_###/$STR/g };" vhost_ssl.conf

# Active new configure
/usr/local/psa/admin/sbin/websrvmng -a -v
</code></pre>

<p>使用方法，用root用户执行：</p>

<pre><code>enable_php5 &lt;domain-user&gt; &lt;domain&gt;
</code></pre>

<p>不支持subdomain的设置，其中sed替换多行内容的用法，可以参考我写的另外一篇文章<a href="346">用sed替换跨行内容</a>。</p>

<p>conf/vhost.conf这个文件存在之后，并不会自动被apache调用，执行<code>/usr/local/psa/admin/sbin/websrvmng -a -v</code>可以自动在<code>conf/httpd.include</code>文件中include vhost.conf了。而<code>conf/httpd.include</code>这个文件是由plesk维护的，用户不要直接修改它，会被plesk覆盖掉。</p>

<p>另外由于使用的是suexec方式执行，所以上传目录、cache等以前需要设置apache用户有可写权限的文件，现在要把owner设置为<code>&lt;domain-user&gt;:psacln</code>才行，和用户的其他文件权限一样就可以了，是不是管理起来更方便一些？</p>

<p>看了一下phpinfo，自动加载了位于<code>/opt/php51/lib/php5/extensions/</code>下的如下模块：</p>

<pre><code>curl.so  gd.so        mysql.so    pdo.so        sockets.so  zlib.so
dom.so   iconv.so     mysqli.so   pdo_mysql.so  sqlite.so
ftp.so   mbstring.so  openssl.so  posix.so      xsl.so
</code></pre>

<p>基本上常用的都有了，但不知道<code>/opt/php51</code>这个目录下的内容MT什么时候给更新，还是说需要用户自己更新？</p>

<h4>参考</h4>

<ul>
<li><a href="http://www.v2ex.com/topic/view/13732.html">(mt) (dv) 3.0 入门</a></li>
</ul>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/apache" title="Apache" rel="tag">Apache</a>, <a href="http://www.fwolf.com/blog/post/tag/bash" title="bash" rel="tag">bash</a>, <a href="http://www.fwolf.com/blog/post/tag/fastcgi" title="FastCGI" rel="tag">FastCGI</a>, <a href="http://www.fwolf.com/blog/post/tag/mediatemple" title="MediaTemple" rel="tag">MediaTemple</a>, <a href="http://www.fwolf.com/blog/post/tag/php" title="PHP" rel="tag">PHP</a>, <a href="http://www.fwolf.com/blog/post/tag/sed" title="sed" rel="tag">sed</a>, <a href="http://www.fwolf.com/blog/post/tag/suexec" title="suexec" rel="tag">suexec</a>, <a href="http://www.fwolf.com/blog/post/tag/upgrade" title="upgrade" rel="tag">upgrade</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/411" title="由一个错误学到的一些php安全配置问题 (2008-07-13)">由一个错误学到的一些php安全配置问题</a> (4)</li>
	<li><a href="http://www.fwolf.com/blog/post/412" title="[MediaTemple]从(dv)3.0升级到3.5 (2008-07-13)">[MediaTemple]从(dv)3.0升级到3.5</a> (1)</li>
	<li><a href="http://www.fwolf.com/blog/post/443" title="配置安全的共享web服务器（抛砖引玉） (2009-06-09)">配置安全的共享web服务器（抛砖引玉）</a> (4)</li>
	<li><a href="http://www.fwolf.com/blog/post/407" title="生成用于web服务器的openssl证书 (2008-06-25)">生成用于web服务器的openssl证书</a> (1)</li>
	<li><a href="http://www.fwolf.com/blog/post/127" title="利用SVN更新网站 (2006-01-19)">利用SVN更新网站</a> (7)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/347/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
