<?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>阿德日志 &#187; Linux</title>
	<atom:link href="http://blog.delai.me/category/linux/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.delai.me</link>
	<description>我的自留地</description>
	<lastBuildDate>Thu, 29 Dec 2011 03:33:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Mac下搭建Django+XAMPP(Mysql+Apache)+Python网站开发环境</title>
		<link>http://blog.delai.me/2010/08/mc-django-mysql-python.html</link>
		<comments>http://blog.delai.me/2010/08/mc-django-mysql-python.html#comments</comments>
		<pubDate>Wed, 11 Aug 2010 02:42:32 +0000</pubDate>
		<dc:creator>阿德</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[xampp]]></category>

		<guid isPermaLink="false">http://blog.shidelai.cn/?p=1381</guid>
		<description><![CDATA[最近需要用django做个内部网站，在Mac下搭了个开发环境，由于Mac方面资料不多，前前后后折腾了一个下午才搞定。总结一下，按照下面的步骤安装一定OK。 原有环境： Mac Snow Leopard 10.6.4, 系统自... ]]></description>
			<content:encoded><![CDATA[<p>最近需要用django做个内部网站，在Mac下搭了个开发环境，由于Mac方面资料不多，前前后后折腾了一个下午才搞定。总结一下，按照下面的步骤安装一定OK。</p>
<h2>原有环境：</h2>
<p><a href="http://blog.delai.me/tag/mac" class="st_tag internal_tag" rel="tag" title="Posts tagged with mac">Mac</a> Snow Leopard 10.6.4, 系统自带的Python 2.6。</p>
<h2>一、XAMPP</h2>
<p>它包含了MySQL，PHP等东西，绿色软件，好处是，部署简单，更新方便。具体中文介绍看<a href="http://www.91linux.com/html/article/linux_soft/20091020/17989.html" target="_blank">这里</a></p>
<p>下载安装很简单到只要移动一下鼠标，看<a href="http://www.apachefriends.org/en/xampp-macosx.html#878" target="_blank">这里</a>：</p>
<p>这是个绿色软件，事实上就是一个叫XAMPP的文件夹，我把它放在了/Application 里面，如果要卸载，把/Application/XAMPP卸载即可。</p>
<p><span style="color: #ff0000;">我安装的是1.7.3版本</span></p>
<h2>二、<a href="http://blog.delai.me/tag/python" class="st_tag internal_tag" rel="tag" title="Posts tagged with python">Python</a></h2>
<p>系统自带的<span style="color: #ff0000;">2.6版本</span>。但默认是位模式的，为了和XAMPP里32位的mysql配合，需要将其改成32位模式：在shell里执行下面代码：</p>
<p>defaults write com.apple.versioner.python Prefer-32-Bit -bool yes<br />
<!--inline-more--></p>
<h2>三、Mysql</h2>
<p>1）如果XAMPP的目录里没有include文件夹（里面有mysql的一些头文件），需要将32位源码安装包里的include文件夹放到XAMPP的目录里，如/Applications/XAMPP/xamppfiles。可以从<a href="http://dev.mysql.com/downloads/mysql/" target="_blank">这里</a>下载源码安装包，选Mac OS X ver. 10.6 (x86, 32-bit), Compressed TAR Archive 下载。</p>
<p>2）修改PATH, 把/Applications/XAMPP/xamppfiles/bin添加到PATH里面，这样shell里就能使用mysql命令了</p>
<p>我安装的是1.7.3版本</p>
<h2>四、MySQLdb for Python (让python能使用mysql)</h2>
<p>1）这是Python和MySQL的连接模块。<a href="http://sourceforge.net/projects/mysql-python/" target="_blank">这里</a>下载 。解压后一次执行一下命令：</p>
<p>sudo python setup.py clean</p>
<p>sudo python setup.py build</p>
<p>sudo python setup.py install</p>
<p>2）测试：shell里输入python打开python命令行，输入import MySQLdb回车，如无任何输出，说明安装成功</p>
<p><span style="color: #ff0000;">我安装的是1.2.3版本</span></p>
<h2>五、<a href="http://blog.delai.me/tag/django" class="st_tag internal_tag" rel="tag" title="Posts tagged with django">Django</a></h2>
<p>安装下载很简单，看<a href="http://www.djangoproject.com/download/" target="_blank">这里</a></p>
<p><span style="color: #ff0000;">我安装的是1.2.1版本</span></p>
<p>判断是否安装成功：</p>
<p>按照<a href="http://docs.djangoproject.com/en/dev/intro/tutorial01/" target="_blank">官方指南</a> part one部分做下来，如果没出现什么错误，说明安装成功了。</p>
<h2>六、Django用Apache作为web服务器</h2>
<div>
<blockquote><p>以下内容假设前提是你已经跟着django<a href="http://docs.djangoproject.com/en/dev/intro/tutorial01/" target="_blank">官方指南</a> part 1 到 part 4做过一遍了，对django有个大概的了解了，针对的是Mac，其他平台也是类似的，这年头装逼的软件都喜欢玩跨平台的。</p></blockquote>
<h3>1）MOD_WSGI (让Python（Django）能使用Apache作为web服务器)</h3>
<p>1. Downloaded and installed Xcode.</p>
<p>2. Download and unpack mod_wsgi-2.6.tar.gz</p>
<p>3. Terminal &#8220;make distclean&#8221;</p>
<p>4. Terminal &#8220;./configure</p>
<p>5. Terminal &#8220;make&#8221;</p>
<p>6. Terminal &#8220;sudo make install&#8221;</p>
<p>7. edit “/Applications/XAMPP/xamppfiles/etc/httpd.conf” add lines below</p>
<blockquote><p>#add python support</p>
<p>LoadModule wsgi_module modules/mod_wsgi.so</p>
<p>AddType text/html .py</p>
<p>#information about the xxx setting profile</p>
<p>WSGIScriptAlias /xxx /Applications/XAMPP/xamppfiles/django.wsgi</p>
<p>&lt;Directory /Applications/XAMPP/xamppfiles&gt;</p>
<p>Order deny,allow</p>
<p>Allow from all</p>
<p>&lt;/Directory&gt;</p></blockquote>
<p>8. 在/Applications/XAMPP/xamppfiles/添加一个文件 文件名：django.wsgi 如下内容：</p>
<blockquote><p>import os</p>
<p>import sys</p>
<p>sys.path.append(&#8216;/Users/arthasshih/python/django_pro&#8217;)</p>
<p>os.environ['DJANGO_SETTINGS_MODULE'] = &#8216;xxx.settings&#8217;</p>
<p>import django.core.handlers.wsgi</p>
<p>application = django.core.handlers.wsgi.WSGIHandler()</p></blockquote>
<p>这是我的配置，需要修改的是xxx.settings（xxx是django工程的名字） 和 /Users/arthasshih/python/django_pro（这个是django工程xxx所在的目录） 具体看 <a href="http://stackoverflow.com/questions/1665994/mod-wsgi-difficulties-on-mac-os-x-snow-leopard" target="_blank">这里</a> 和 <a href="http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/" target="_blank">这里</a> 和 <a href="http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango" target="_blank">这里</a></p>
<p>这样，就可以直接使用http://localhost/xxx来登录这个django网站了，由Apache来handle访问流量，而不需要使用manage.py runserver，比较这玩意儿只是简易的web服务器，用于测试可以，用来做对外服务是不行的。</p>
<h3>2）使用静态文件</h3>
<p>对于css, image, js等外部元素，Django不会对其进行直接管理的，官方的简易是，把这些静态文件与Django隔离开来（打网站确实都是这么做的），以保持Django内部逻辑的一致性。对于单机环境，可以利用Apache搞个目录或domain专门放这类文件，在html页面的head里直接引用即可，跟Django没关系。</p>
<p>1. edit “/Applications/XAMPP/xamppfiles/etc/httpd.conf” add lines below</p>
<div id="_mcePaste">
<blockquote><p>#total media location like css js image</p>
<p>Alias /media/ &#8220;/Users/arthasshih/python/django_pro/media/&#8221;</p>
<p>&lt;Directory &#8220;/Users/arthasshih/python/django_pro/media/&#8221;&gt;</p>
<p>AllowOverride None</p>
<p>Options None</p>
<p>Order allow,deny</p>
<p>Allow from all</p>
<p>&lt;/Directory&gt;</p></blockquote>
<p>里面有些部分需要修改成你自己的配置。</p>
<p>这样，你就可以把各种静态文件放到/Users/arthasshih/python/django_pro/media/下面，比如media下有style.css文件。在django的html页面文件里head部分加入</p>
<blockquote><p>&lt;link rel=&#8221;Stylesheet&#8221; href=&#8221;/medit/style.css&#8221; type=&#8221;text/css&#8221;/&gt;</p></blockquote>
<p>即可。这里/media对应的就是http://localhost/media/，实际指向/Users/arthasshih/python/django_pro/media/</p>
<h3>3）解决Django admin页面显示不正常的情况</h3>
<p>由于使用了Apache，可能会导致后台admini打开来显示不正常，具体表现就是没有正确加载css文件。修改Apache配置把他需要的路径选择好就可以了。可以举一反三。</p>
<p>编辑加入</p>
<blockquote><p>#media location for django admin</p>
<p>Alias /admin_media &#8220;/Library/Python/2.6/site-packages/django/contrib/admin/media&#8221;</p>
<p>&lt;Directory &#8220;/Library/Python/2.6/site-packages/django/contrib/admin/media&#8221;&gt;</p>
<p>AllowOverride None</p>
<p>Options None</p>
<p>Order allow,deny</p>
<p>Allow from all</p>
<p>&lt;/Directory&gt;</p></blockquote>
<p>这样，就有了个http://localhost/admin_media指向django admin的css等文件所在位置。</p>
<p>然后在工程的setting.py文件里配置一下这一信息即可：修改其中的</p>
<p>ADMIN_MEDIA_PREFIX = &#8216;/admin_media/&#8217;</p>
<p>这样，django admin这个app就知道从http://localhost/admin_media下面加载需要的css文件了。</p>
</div>
</div>
<blockquote><p>#total media location like css js image</p>
<p>Alias /media/ &#8220;/Users/arthasshih/python/django_pro/media/&#8221;</p>
<p>&lt;Directory &#8220;/Users/arthasshih/python/django_pro/media/&#8221;&gt;</p>
<p>AllowOverride None</p>
<p>Options None</p>
<p>Order allow,deny</p>
<p>Allow from all</p>
<p>&lt;/Directory&gt;</p></blockquote>
<p>里面有些部分需要修改成你自己的配置。</p>
<p>这样，你就可以把各种静态文件放到/Users/arthasshih/python/django_pro/media/下面，比如media下有style.css文件。在django的html页面文件里head部分加入</p>
<blockquote><p>&lt;link rel=&#8221;Stylesheet&#8221; href=&#8221;/medit/style.css&#8221; type=&#8221;text/css&#8221;/&gt;</p></blockquote>
<p>即可。这里/media对应的就是http://localhost/media/，实际指向/Users/arthasshih/python/django_pro/media/</p>
<h3>4）解决Django admin页面显示不正常的情况</h3>
<p>由于使用了Apache，可能会导致后台admini打开来显示不正常，具体表现就是没有正确加载css文件。修改Apache配置把他需要的路径选择好就可以了。可以举一反三。</p>
<p>编辑加入</p>
<blockquote><p>#media location for django admin</p>
<p>Alias /admin_media &#8220;/Library/Python/2.6/site-packages/django/contrib/admin/media&#8221;</p>
<p>&lt;Directory &#8220;/Library/Python/2.6/site-packages/django/contrib/admin/media&#8221;&gt;</p>
<p>AllowOverride None</p>
<p>Options None</p>
<p>Order allow,deny</p>
<p>Allow from all</p>
<p>&lt;/Directory&gt;</p></blockquote>
<p>这样，就有了个http://localhost/admin_media指向django admin的css等文件所在位置。</p>
<p>然后在工程的setting.py文件里配置一下这一信息即可：修改其中的</p>
<p>ADMIN_MEDIA_PREFIX = &#8216;/admin_media/&#8217;</p>
<p>这样，django admin这个app就知道从http://localhost/admin_media下面加载需要的css文件了。</p>
<h2>结束</h2>
<p><a href="http://stackoverflow.com/">http://stackoverflow.com</a> 这个网站非常好，关于程序的很多问题能在上面解决，强烈推荐。</p>
<hr /><h2>Comments</h2><ul><li><a href="http://blog.delai.me/2010/08/mc-django-mysql-python.html">2010-08-17</a>, chuck911 writes: mac下XAMPP不如wamp</li><li><a href="http://blog.delai.me/2010/08/mc-django-mysql-python.html">2010-08-19</a>, <a href='http://blog.shidelai.cn/2010/08/django-work-with-apache-in-mac.html' rel='external nofollow' class='url'>Mac下Django用Apache作为web服务器 @ 阿德日志 ( apache, django, mac, )</a> writes: [...] 如果还没安装django开发环境请看这里：Mac下搭建Django+XAMPP(Mysql+Apache)+Python网站开发环境，其他平台也是类似的，这年头装逼的软件都喜欢玩跨平台的。 [...]</li></ul><hr /><h2>Related posts:</h2><ul><li><a href="http://blog.delai.me/2011/11/python-at-decorator.html" rel="bookmark" title="Permanent Link: [Python] 函数 @ Decorator 的两种使用方式">[Python] 函数 @ Decorator 的两种使用方式</a></li><li><a href="http://blog.delai.me/2011/11/the-zen-of-python-by-tim-peters.html" rel="bookmark" title="Permanent Link: The Zen of Python, by Tim Peters">The Zen of Python, by Tim Peters</a></li><li><a href="http://blog.delai.me/2010/09/work-hunting.html" rel="bookmark" title="Permanent Link: 结束eBay实习，开始找工作">结束eBay实习，开始找工作</a></li><li><a href="http://blog.delai.me/2011/12/feel-flask.html" rel="bookmark" title="Permanent Link: 玩Flask几个月的感受">玩Flask几个月的感受</a></li></ul><hr /><strong>[原文链接：<a href="http://blog.delai.me/2010/08/mc-django-mysql-python.html">http://blog.delai.me/2010/08/mc-django-mysql-python.html</a>] </strong>]]></content:encoded>
			<wfw:commentRss>http://blog.delai.me/2010/08/mc-django-mysql-python.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ftp批量上传下载的Shell脚本, Linux Mac适用</title>
		<link>http://blog.delai.me/2009/12/ftp-upload-download.html</link>
		<comments>http://blog.delai.me/2009/12/ftp-upload-download.html#comments</comments>
		<pubDate>Wed, 23 Dec 2009 03:51:14 +0000</pubDate>
		<dc:creator>阿德</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://blog.shidelai.cn/?p=1049</guid>
		<description><![CDATA[好久没写技术类文章啦，一直忙着实习。今天杭州阳光普照，心情很好，来点低技术含量的，分享两个脚本，都是在公司里经常用的。 FTP批量上传，ftput.sh： #!/bin/bash for filename in $@ do ftp -nv 192.... ]]></description>
			<content:encoded><![CDATA[<p>好久没写技术类文章啦，一直忙着实习。今天杭州阳光普照，心情很好，来点低技术含量的，分享两个脚本，都是在公司里经常用的。</p>
<p>FTP批量上传，ftput.sh：</p>
<pre class="brush:shell">#!/bin/bash
for filename in $@
do
ftp -nv 192.168.130.2 &lt;&lt;!
user username password
prompt off
bin
mput $filename
close
!
done</pre>
<p>FTP批量下载，ftpget.sh</p>
<pre class="brush:shell">#!/bin/bash
for filename in $@
do
ftp -nv 192.168.130.2 &lt;&lt;!
user username password
prompt off
bin
mget $filename
close
!
done</pre>
<p>适用方法：将代码修改下（FTP地址和用户名密码修改一下）保存成ftput.sh，把要上传的文件作为脚本参数执行之即可。如</p>
<pre class="brush:shell">sh ./ftput.sh *.jpg 123.txt config.xml</pre>
<p>就是把所有jpg文件和23.txt config.xml两个文件上传到ftp。</p>
<hr /><h2>Related posts:</h2><ul><li><a href="http://blog.delai.me/2010/03/douban-rank-8.html" rel="bookmark" title="Permanent Link: 独家发布豆瓣8分以上图书列表">独家发布豆瓣8分以上图书列表</a></li><li><a href="http://blog.delai.me/2009/06/xp-remote-desktop-solution.html" rel="bookmark" title="Permanent Link: xp远程桌面“远程计算机已结束连接”5种解决方案">xp远程桌面“远程计算机已结束连接”5种解决方案</a></li><li><a href="http://blog.delai.me/2008/06/how-to-flickrrss.html" rel="bookmark" title="Permanent Link: flickrRSS高阶使用三部曲之一：显示flickr上的图片">flickrRSS高阶使用三部曲之一：显示flickr上的图片</a></li><li><a href="http://blog.delai.me/2010/06/fuck-ccav.html" rel="bookmark" title="Permanent Link: CCAV，白岩松，不该就这点水准">CCAV，白岩松，不该就这点水准</a></li><li><a href="http://blog.delai.me/2010/08/mc-django-mysql-python.html" rel="bookmark" title="Permanent Link: Mac下搭建Django+XAMPP(Mysql+Apache)+Python网站开发环境">Mac下搭建Django+XAMPP(Mysql+Apache)+Python网站开发环境</a></li></ul><hr /><strong>[原文链接：<a href="http://blog.delai.me/2009/12/ftp-upload-download.html">http://blog.delai.me/2009/12/ftp-upload-download.html</a>] </strong>]]></content:encoded>
			<wfw:commentRss>http://blog.delai.me/2009/12/ftp-upload-download.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux可以完美运行影音风暴、PPlive、搜狗输入法哦</title>
		<link>http://blog.delai.me/2009/04/crazy-linux.html</link>
		<comments>http://blog.delai.me/2009/04/crazy-linux.html#comments</comments>
		<pubDate>Tue, 28 Apr 2009 14:20:03 +0000</pubDate>
		<dc:creator>阿德</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Linux/GNU]]></category>

		<guid isPermaLink="false">http://blog.shidelai.cn/?p=880</guid>
		<description><![CDATA[Linux可以完美运行影音风暴、PPlive、搜狗输入法哦~ 神奇吧~~？ 有图有真相 影音风暴 PPlive、搜狗输入法 骗你的， 其实是&#8230;. Comments2009-05-2, 乔帮主 writes: :eek: 我就说国产软件有这个闲心去支... ]]></description>
			<content:encoded><![CDATA[<p>Linux可以完美运行影音风暴、PPlive、搜狗输入法哦~</p>
<p>神奇吧~~？</p>
<p>有图有真相</p>
<p>影音风暴</p>

<a href="http://blog.delai.me/wp-content/gallery/upload/screanshot.jpg" title="" class="shutterset_singlepic140" >
	<img class="ngg-singlepic ngg-center" src="http://blog.delai.me/wp-content/gallery/cache/140__480x360_screanshot.jpg" alt="screanshot.jpg" title="screanshot.jpg" />
</a>

<p>PPlive、搜狗输入法</p>

<a href="http://blog.delai.me/wp-content/gallery/upload/creanshot3.jpg" title="" class="shutterset_singlepic141" >
	<img class="ngg-singlepic ngg-center" src="http://blog.delai.me/wp-content/gallery/cache/141__480x360_creanshot3.jpg" alt="creanshot3.jpg" title="creanshot3.jpg" />
</a>

<p><!--inline-more--></p>
<p>骗你的， 其实是&#8230;.</p>
<p><img onclick="grin(':cool:');" src="../wp-includes/images/smilies/icon_cool.gif" alt=":cool:" /></p>

<a href="http://blog.delai.me/wp-content/gallery/upload/screansho4.jpg" title="" class="shutterset_singlepic142" >
	<img class="ngg-singlepic ngg-center" src="http://blog.delai.me/wp-content/gallery/cache/142__640x320_screansho4.jpg" alt="screansho4.jpg" title="screansho4.jpg" />
</a>

<p><img onclick="grin(':cool:');" src="../wp-includes/images/smilies/icon_cool.gif" alt=":cool:" /></p>

<a href="http://blog.delai.me/wp-content/gallery/upload/snv32286.jpg" title="" class="shutterset_singlepic143" >
	<img class="ngg-singlepic ngg-center" src="http://blog.delai.me/wp-content/gallery/cache/143__640x320_snv32286.jpg" alt="snv32286.jpg" title="snv32286.jpg" />
</a>

<hr /><h2>Comments</h2><ul><li><a href="http://blog.delai.me/2009/04/crazy-linux.html">2009-05-2</a>, <a href='http://lovemetal.cn' rel='external nofollow' class='url'>乔帮主</a> writes: :eek: 我就说国产软件有这个闲心去支持linux么？</li><li><a href="http://blog.delai.me/2009/04/crazy-linux.html">2009-05-2</a>, <a href='http://www.soulward.cn' rel='external nofollow' class='url'>阿德</a> writes: :mrgreen:</li><li><a href="http://blog.delai.me/2009/04/crazy-linux.html">2009-06-16</a>, <a href='http://path.yo2.cn' rel='external nofollow' class='url'>chglu</a> writes: :oops:  丫不厚道 欺骗google</li><li><a href="http://blog.delai.me/2009/04/crazy-linux.html">2009-06-19</a>, <a href='http://www.soulward.cn' rel='external nofollow' class='url'>阿德</a> writes: 呵呵，我很少玩标题党的。。。。</li><li><a href="http://blog.delai.me/2009/04/crazy-linux.html">2009-07-9</a>, <a href='http://aaasss' rel='external nofollow' class='url'>aaa</a> writes: 太不厚道了</li><li><a href="http://blog.delai.me/2009/04/crazy-linux.html">2009-07-22</a>, <a href='http://www.soulward.cn' rel='external nofollow' class='url'>阿德</a> writes: :twisted:</li><li><a href="http://blog.delai.me/2009/04/crazy-linux.html">2009-11-29</a>, jee writes: 我觉得支持Linux不错阿 :mrgreen:</li><li><a href="http://blog.delai.me/2009/04/crazy-linux.html">2010-03-3</a>, Anonymous writes: 博主 太2了</li><li><a href="http://blog.delai.me/2009/04/crazy-linux.html">2010-03-25</a>, <a href='http://www.aflypen.com' rel='external nofollow' class='url'>Benson</a> writes: 原來如此
我還以為是用wine來跑的 :sad:</li><li><a href="http://blog.delai.me/2009/04/crazy-linux.html">2010-03-25</a>, <a href='http://www.shidelai.cn' rel='external nofollow' class='url'>阿德</a> writes: 呵呵，开个小玩笑～</li></ul><hr /><h2>Related posts:</h2><ul><li><a href="http://blog.delai.me/2009/11/obama.html" rel="bookmark" title="Permanent Link: 我在加纳天天见奥巴马~">我在加纳天天见奥巴马~</a></li><li><a href="http://blog.delai.me/2010/05/crazy-lenovo.html" rel="bookmark" title="Permanent Link: 柳传志怎么突然疯了">柳传志怎么突然疯了</a></li><li><a href="http://blog.delai.me/2010/11/qq-vs-360.html" rel="bookmark" title="Permanent Link: 腾讯那篇《致广大QQ用户的一封信》挺扯淡的">腾讯那篇《致广大QQ用户的一封信》挺扯淡的</a></li><li><a href="http://blog.delai.me/2008/02/linux-basic.html" rel="bookmark" title="Permanent Link: 最基础的Ubuntu文件移动|复制|打包|解包|挂载iso总结">最基础的Ubuntu文件移动|复制|打包|解包|挂载iso总结</a></li><li><a href="http://blog.delai.me/2008/02/linux-configuration-service-files.html" rel="bookmark" title="Permanent Link: linux常见配置文件&#038;常见服务对照表">linux常见配置文件&#038;常见服务对照表</a></li></ul><hr /><strong>[原文链接：<a href="http://blog.delai.me/2009/04/crazy-linux.html">http://blog.delai.me/2009/04/crazy-linux.html</a>] </strong>]]></content:encoded>
			<wfw:commentRss>http://blog.delai.me/2009/04/crazy-linux.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>linux使普通用户获得root权限的vmsplice系统调用漏洞分析</title>
		<link>http://blog.delai.me/2008/12/linux-vmsplice.html</link>
		<comments>http://blog.delai.me/2008/12/linux-vmsplice.html#comments</comments>
		<pubDate>Mon, 29 Dec 2008 15:54:43 +0000</pubDate>
		<dc:creator>阿德</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Linux/GNU]]></category>
		<category><![CDATA[vmsplice]]></category>
		<category><![CDATA[漏洞]]></category>

		<guid isPermaLink="false">http://www.soulward.cn/?p=688</guid>
		<description><![CDATA[vmsplice系统调用是linux内核2.6.17第一次引入的，随后被发现存在能让普通用户提升到root权限的漏洞。该漏洞影响的版本网络上笼统的说法是：2.6.17-2.6.24.1，实际上更确切的说是：2.6.17- 2.6.22.17，2... ]]></description>
			<content:encoded><![CDATA[<a href='http://blog.delai.me/2008/12/linux-vmsplice.html' target="_blank" rel="nofollow"><img src="http://blog.shidelai.cn/wp-content/gallery/icons/linux-logo.jpg" style="border:0; float:left; margin: 0 1em .5em 0;" alt="linux使普通用户获得root权限的vmsplice系统调用漏洞分析" title="linux使普通用户获得root权限的vmsplice系统调用漏洞分析"/></a>
<h3><span style="color: #008000;"><strong>2008期末课程小论文</strong> 之一 </span></h3>
<h3><span style="color: #008000;">《linux使普通用户获得root权限的vmsplice系统调用漏洞分析》</span></h3>
<p><span style="color: #000000;">vmsplice系统调用是linux内核2.6.17第一次引入的，随后被发现存在能让普通用户提升到root权限的漏洞。</span><span style="color: #000000;">该漏洞影响的版本网络上笼统的说法是：2.6.17-2.6.24.1，实际上更确切的说是：2.6.17-</span> 2.6.22.17，2.6.23-2.6.23.15 和 2.6.24-2.6.24.1.</p>
<p><span style="color: #000000;">关于这个漏洞，国内很少有人写过什么原创性的文章进行介绍，因为上研究生操作系统课的课程报告就是做这个，所以把它放上来。漏洞虽然已经补上，但学习其机理，还是比较有好处，有意思的。<br />
</span></p>
<h2>一、预备知识</h2>
<h3>1. 本文的一些约定</h3>
<p style="padding-left: 30px;"><span style="color: #0000ff;">这个颜色的代码来自攻击程序</span><br />
<span style="color: #808000;">这个颜色的代码来自内核</span><br />
<span style="color: #ff0000;">这个颜色表示重要的地方，或者安装程序逻辑，下一步要进入的函数</span><br />
所提到的攻击代码是本文附带的exp.c</p>
<h3>2. vmsplice()介绍</h3>
<p>原型：long vmsplice(int fd, const struct iovec *iov, unsigned long nr_segs, unsigned int flags);<br />
其中：</p>
<blockquote><p><span style="color: #808000;">struct iovec<br />
{<br />
void __user *iov_base;<br />
__kernel_size_t iov_len;<br />
};</span></p></blockquote>
<p>这个系统调用将用户空间的内存映射到内核空间，从而避免了实际的内存写操作，提高了系统效率。这个功能的是主要是通过fs/splice.c的do_vmsplice()来实现。</p>
<h3>3. 有关Page的常量</h3>
<blockquote><p><span style="color: #808000;">#define PAGE_SHIFT	12<br />
#define PAGE_SIZE	(1UL &lt;&lt; PAGE_SHIFT)<br />
/*1UL：32位的unsigned int 1，左移12位，PAGE_SIZE=0&#215;1000*/<br />
#define PAGE_MASK	(~(PAGE_SIZE-1))<br />
/*PAGE_MASK=0&#215;000*/</span></p></blockquote>
<h2>二、Splice系统调用漏洞考古</h2>
<p><strong>2006 Jun 18</strong><br />
在发布的Linux kernel 2.6.17中引入vmsplice()，用于提高性能。<br />
没有人知道，对应的fs/splice.c中的get_iovec_page_array()函数存在漏洞。<br />
<!--inline-more--><br />
<strong>2007 Oct 09</strong><br />
在发布的Linux kernel 2.6.23 中<br />
加入了vmsplice_to_user()函数和copy_from_user_mmap_sem()函数,也存在同样的漏洞。</p>
<p><strong>2007 Dec 03</strong><br />
ID为CVE-2008-0009和CVE-2008-0010的漏洞报告被提交到CVE。<br />
分别指出vmsplice_to_user()和copy_from_user_mmap_sem()存在这个漏洞。<br />
但这两份报告有个错误：这两个漏洞存在于2.6.23-2.6.24而不是报告里说的2.6.22-2.6.24,因为这两个函数是在2.6.23里正式被加进来的。</p>
<p><strong>2008 Feb 05</strong><br />
ID为CVE-2008-0600的漏洞报告被提交到CVE<br />
指出:</p>
<p style="padding-left: 30px;">The vmsplice_to_pipe function in Linux kernel 2.6.17 through 2.6.24.1 does not validate a certain userspace pointer before dereference, which allows local users to gain root privileges via crafted arguments in a vmsplice system call, a different vulnerability than CVE-2008-0009 and CVE-2008-0010.</p>
<p>事实上，问题出在get_iovec_page_array()函数。但因为get_iovec_page_array()函数只被vmsplice_to_pipe()调用，数据参数都来自vmsplice_to_pipe()，所以，get_iovec_page_array()没有验证用户数据的合法性也可以被认为vmsplice_to_pipe()没有验证用户数据的合法性。</p>
<p><strong>2008 Feb 08</strong><br />
在发布的Linux kernel 2.6.24.1和2.6.23.15补丁中补上了CVE-2008-0009和CVE-2008-0010提到这个这两个漏洞。</p>
<p><strong>2008 Feb 09</strong><br />
ID为qaaz的Geek在milw0rm上公布了两个对应的POC代码，第一个是针对vmsplice_to_user()函数和copy_from_user_mmap_sem()函数的，另外一个是针对get_iovec_page_array()函数，</p>
<p><img class="aligncenter" title="linux" src="http://lh5.ggpht.com/_8kd-QOlHLBY/SVJc4Uc57JI/AAAAAAAAC-I/r4v1p0DpzZU/s800/qaaz.jpg" alt="" width="689" height="54" /></p>
<p><strong>2008 Feb 11</strong><br />
在发布的Linux kernel 2.6.24.2 、2.6.23.16和 2.6.22.18补丁中补上了get_iovec_page_array()函数的漏洞。</p>
<h2>三、漏洞攻击效果</h2>
<p style="text-align: center;"><img class="aligncenter" title="linux" src="http://lh4.ggpht.com/_8kd-QOlHLBY/SVJdjnqnWmI/AAAAAAAAC-U/rSw40MqDeoE/s800/2.6.19.1.jpg" alt="" width="654" height="359" />攻击成功</p>
<p style="text-align: center;"><img class="aligncenter" title="linux" src="http://lh6.ggpht.com/_8kd-QOlHLBY/SVJdmAVTIdI/AAAAAAAAC-c/qj5og1SNZds/s800/2.6.24.2.jpg" alt="" width="590" height="375" />打了补丁的2.6.24.2就攻击不成功了</p>
<h2>四、漏洞攻击真实案例</h2>
<p>This bug is being actively exploited in the wild &#8212; our server was just broken in to by an attacker using it. (They got a user&#8217;s password by previously compromising a machine somewhere else where that user had an account, and installed a modified ssh binary on it to record user names and passwords. Then they logged in to our site as that user, exploited CVE-2008-0010, and became root).</p>
<h2>五、the vmsplice() exploit story</h2>
<h3>1. 整个过程可以概括为下图：</h3>
<p>Online view: http://share.xmind.net/shidelai/vmsplice-loopholes-in-the-success-of-the-attack-1/</p>
<h3>2. 攻击程序做了如下六件事情</h3>
<p><strong>1)</strong>定义 kernel_code()<br />
这个函数会修改当前用户的udi和gid，所有者一切的目的就是让内核执行这个函数。</p>
<p><strong>2)</strong>定义了pages[5]，其中：</p>
<blockquote><p><span style="color: #0000ff;">proc_pages[0]-&gt;flags    = 1 &lt;&lt; PG_compound;<br />
proc_pages[0]-&gt;private  = (unsigned long) proc_pages[0];<br />
proc_pages[0]-&gt;count    = 1;</span></p></blockquote>
<p>这是为了把这个proc_page伪装成compound page，保证内核执行到/mm/Swap.c的</p>
<blockquote><p><span style="color: #808000;">void put_page(struct page *page)<br />
{<br />
if (unlikely(PageCompound(page)))<br />
put_compound_page(page);<br />
else if (put_page_testzero(page))<br />
__page_cache_release(page);<br />
}</span></p></blockquote>
<p>时候，内核进入put_compound_page(page);</p>
<blockquote><p><span style="color: #0000ff;">proc_pages[1]-&gt;lru.next = (long) kernel_code;</span></p></blockquote>
<p>内核执行到/mm/Swap.c的</p>
<blockquote><p><span style="color: #808000;">static void put_compound_page(struct page *page)<br />
{<br />
&#8230;.<br />
dtor = get_compound_page_dtor(page);<br />
(*dtor)(page);<br />
}</span></p></blockquote>
<p>的时候，get_compound_page_dtor会返回proc_pages[1]-&gt;lru.next。这样，kernel_code()就被内核执行了。</p>
<p><strong>3)</strong>将proc_pages[0] mmap到0&#215;0 address<br />
到时候内核被骗执行0地址第二个page的lru.next指向的函数时候，实际上执行的就是这里定义的proc_pages[1]-&gt;lru.next所指向的kernel_code()。</p>
<p><strong>4)</strong>close(pi[0]); close pipe_read，当内核执行到/fs/Splice.c的splice_to_pipe()</p>
<blockquote><p><span style="color: #808000;">for (;;) {<br />
if (!pipe-&gt;readers) {<br />
send_sig(SIGPIPE, current, 0);<br />
if (!ret)<br />
ret = -EPIPE;<br />
break;<br />
}<br />
&#8230;<br />
}<br />
&#8230;<br />
while (page_nr &lt; spd_pages)<br />
page_cache_release(spd-&gt;pages[page_nr++]);</span></p></blockquote>
<p>时候，if判断会返回真，于是跳出for循环，于是导致page_cache_release(spd-&gt;pages[page_nr++]);被执行。</p>
<p><strong>5)</strong>iov.iov_len  = ULONG_MAX;<br />
iov.iov_len等于32个1。这个是关键，它保证了内核中数值溢出，结果将内核骗到攻击程序设定的page上来。</p>
<p><strong>6)</strong>_vmsplice(pi[1], &amp;iov, 1, 0);<br />
执行vmsplice系统调用。</p>
<h3>3. 内核代码执行细节</h3>
<p><strong>1)</strong>执行_vmsplice(pi[1], &amp;iov, 1, 0);后，/fs/Splice.c中的</p>
<blockquote><p><span style="color: #808000;">long <strong><span style="color: #ff0000;">sys_vmsplice</span></strong>(int fd, const struct iovec __user *<span style="color: #00ff00;">iov</span>, unsigned long nr_segs, unsigned int flags)<br />
{<br />
&#8230;<br />
if (file-&gt;f_mode &amp; FMODE_WRITE)//往管道写<br />
error = <strong><span style="color: #ff0000;">vmsplice_to_pipe</span></strong>(file,<span style="color: #00ff00;"> iov</span>, nr_segs, flags);<br />
&#8230;<br />
}</span></p></blockquote>
<p>被调用。<br />
2)接着内核进入/fs/Splice.c中的</p>
<blockquote><p><span style="color: #808000;">static long <span style="color: #ff0000;"><strong>vmsplice_to_pipe</strong></span>(struct file *file, const struct iovec __user *<span style="color: #00ff00;">iov</span>,<br />
unsigned long nr_segs, unsigned int flags)<br />
{<br />
struct pipe_inode_info *pipe;<br />
<span style="color: #ff0000;">struct page *pages[PIPE_BUFFERS];   //请注意这里<br />
struct partial_page partial[PIPE_BUFFERS]; //#define PIPE_BUFFERS (16) //请注意这里<br />
struct splice_pipe_desc spd = {//请注意这里</span><br />
.pages = pages,<br />
.partial = partial,<br />
.flags = flags,<br />
.ops = &amp;user_page_pipe_buf_ops,<br />
};<br />
&#8230;<br />
spd.nr_pages = <span style="color: #ff0000;"><strong>get_iovec_page_array</strong></span><span style="color: #00ff00;">(iov</span>, nr_segs, pages, partial,<br />
flags &amp; SPLICE_F_GIFT);<br />
&#8230;<br />
return splice_to_pipe(pipe, &amp;spd);<br />
}</span></p></blockquote>
<p>3)接着内核进入/fs/Splice.c中的</p>
<blockquote><p><span style="color: #808000;">static int <span style="color: #ff0000;"><strong>get_iovec_page_array</strong></span>(const struct iovec __user *<span style="color: #00ff00;">iov</span>,<br />
unsigned int nr_vecs, struct page **pages,<br />
struct partial_page *partial, int aligned)<br />
{<br />
&#8230;&#8230;</span></p>
<p><span style="color: #808000;">if (copy_from_user_mmap_sem(&amp;entry, <span style="color: #00ff00;">iov</span>, sizeof(entry))) //entry = iov<br />
break;<br />
base = entry.iov_base;//内核缓冲区基地址<br />
len = entry.iov_len;//长度<br />
&#8230;&#8230;<br />
npages = (off + len + PAGE_SIZE &#8211; 1) &gt;&gt; PAGE_SHIFT;<br />
// npages = （0+ 32个1 + 1后面12个0 &#8211; 1 ）&gt;&gt; PAGE_SHIFT = （32个1 + 1 -1 + 1后面12个0 &#8211; 1）&gt;&gt; PAGE_SHIFT =0<br />
if (npages &gt; PIPE_BUFFERS &#8211; buffers)<br />
npages = PIPE_BUFFERS &#8211; buffers;<br />
error = <strong><span style="color: #ff0000;">get_user_pages</span></strong>(current, current-&gt;mm,<br />
(unsigned long) base, npages, 0, 0,<br />
&amp;pages[buffers], NULL);<br />
&#8230;&#8230;<br />
}</span></p></blockquote>
<p>4) 于是内核进入/mm/Memory.c中的</p>
<blockquote><p><span style="color: #808000;">int <span style="color: #ff0000;"><strong>get_user_pages</strong></span>(struct task_struct *tsk, struct mm_struct *mm,<br />
unsigned long start, int len, int write, int force,<br />
struct page **pages, struct vm_area_struct **vmas)<br />
{<br />
&#8230;&#8230;<br />
do {<br />
&#8230;&#8230;<br />
i++;<br />
start += PAGE_SIZE;<br />
len&#8211;;<br />
continue;<br />
}<br />
do {<br />
&#8230;&#8230;<br />
i++;<br />
start += PAGE_SIZE;<br />
len&#8211;;<br />
} while (len &amp;&amp; start &lt; vma-&gt;vm_end);<br />
} while (len);<br />
return i;<br />
}</span></p></blockquote>
<p><span style="color: #000000;">len这里已经是int型了，而不是ulong int，len从0被减到-32768(0xf0000000)再减1变成+32767(0x7fffffff)，最终返回i=46。</span></p>
<p>5) 然后i返回给/fs/Splice.c中的</p>
<blockquote><p><span style="color: #808000;">static int <span style="color: #ff0000;"><strong>get_iovec_page_array</strong></span>(const struct iovec __user *iov,<br />
unsigned int nr_vecs, struct page **pages,<br />
struct partial_page *partial, int aligned)<br />
{<br />
&#8230;&#8230;<br />
error = get_user_pages(current, current-&gt;mm,<br />
(unsigned long) base, npages, 0, 0,<br />
&amp;pages[buffers], NULL);<br />
//error = 46<br />
&#8230;&#8230;<br />
for (i = 0; i &lt; error; i++) {<br />
const int plen = min_t(size_t, len, PAGE_SIZE &#8211; off);<br />
partial[buffers].offset = off;<br />
partial[buffers].len = plen;<br />
off = 0;<br />
len -= plen;<br />
buffers++;<br />
}<br />
&#8230;&#8230;<br />
}</span></p></blockquote>
<p>在这个for循环中，partial[]数组大小是16，而循环确循环了46次，所以，溢出了。比partial先定义的pages[]指针数组被0覆盖。</p>
<p>6) 接着，函数返回到/fs/Splice.c的</p>
<blockquote><p><span style="color: #808000;">static long <span style="color: #ff0000;"><strong>vmsplice_to_pipe</strong></span>(struct file *file, const struct iovec __user *iov,<br />
unsigned long nr_segs, unsigned int flags)<br />
{<br />
&#8230;&#8230;<br />
spd.nr_pages = get_iovec_page_array(iov, nr_segs, pages, partial,<br />
flags &amp; SPLICE_F_GIFT);<br />
&#8230;&#8230;<br />
return <span style="color: #ff0000;"><strong>splice_to_pipe</strong></span>(pipe, &amp;spd);<br />
}</span></p></blockquote>
<p>7) 进入/fs/Splice.c的</p>
<blockquote><p><span style="color: #808000;">ssize_t <span style="color: #ff0000;"><strong>splice_to_pipe</strong></span>(struct pipe_inode_info *pipe,<br />
struct splice_pipe_desc *spd)<br />
{<br />
&#8230;&#8230;<br />
for (;;) {<br />
if (!pipe-&gt;readers) {<br />
send_sig(SIGPIPE, current, 0);<br />
if (!ret)<br />
ret = -EPIPE;<br />
break;<br />
}<br />
&#8230;&#8230;.<br />
}<br />
&#8230;&#8230;<br />
while (page_nr &lt; spd_pages)<br />
<span style="color: #ff0000;"><strong>page_cache_release</strong></span>(spd-&gt;pages[page_nr++]);<br />
return ret;<br />
}</span></p></blockquote>
<p>因为之前提到的pipe的读已经被关掉了，所以从for循环跳出。内核执行进入page_cache_release(spd-&gt;pages[page_nr++]);<br />
请注意：这里的spd-&gt;pages就是之前被溢出被0覆盖的pages[]指针数组。</p>
<p>8)由于</p>
<blockquote><p><span style="color: #808000;">#define page_cache_release(page)<strong><span style="color: #ff0000;"> put_page(page)</span></strong></span></p></blockquote>
<p>9) 于是进入了/mm/Swap.c中的</p>
<blockquote><p><span style="color: #808000;">void <span style="color: #ff0000;"><strong>put_page</strong></span>(struct page *page)<br />
{<br />
if (unlikely(PageCompound(page)))<br />
<span style="color: #ff0000;"><strong>put_compound_page</strong></span>(page);<br />
else if (put_page_testzero(page))<br />
__page_cache_release(page);<br />
}<br />
</span></p></blockquote>
<p>由于之前提到的，攻击程序已经将其已经被mmap到0地址空间的proc_pages[]伪装成compound page，所以，这里if判断后</p>
<p>10)内核进入同在/mm/Swap.c 的</p>
<blockquote><p><span style="color: #808000;">static void <span style="color: #ff0000;"><strong>put_compound_page</strong></span>(struct page *page)<br />
{<br />
page = compound_head(page);<br />
if (put_page_testzero(page)) {<br />
compound_page_dtor *dtor;<br />
dtor = <span style="color: #ff0000;"><strong>get_compound_page_dtor</strong></span>(page);<br />
(*dtor)(page);<br />
}<br />
}</span></p></blockquote>
<p>11)再进入/include/linux/Mm.h中的</p>
<blockquote><p><span style="color: #808000;">static inline compound_page_dtor *get_compound_page_dtor(struct page *page)<br />
{<br />
<strong>return (compound_page_dtor *)page[1].lru.next;</strong><br />
}</span></p></blockquote>
<p>OK，到此，proc_pages[1].lru.next所指向的函数指针也即kernel_code()函数指针返回给dtor，随后(*dtor)(page);执行了这个函数，于是，攻击成功。</p>
<hr /><h2>Comments</h2><ul><li><a href="http://blog.delai.me/2008/12/linux-vmsplice.html">2009-01-2</a>, <a href='http://www.olihe.com' rel='external nofollow' class='url'>盒子</a> writes: 嘿嘿～ :mrgreen: 啊德这总能找到好东西</li></ul><hr /><h2>Related posts:</h2><ul><li><a href="http://blog.delai.me/2010/11/qq-vs-360.html" rel="bookmark" title="Permanent Link: 腾讯那篇《致广大QQ用户的一封信》挺扯淡的">腾讯那篇《致广大QQ用户的一封信》挺扯淡的</a></li><li><a href="http://blog.delai.me/2008/02/linux-basic.html" rel="bookmark" title="Permanent Link: 最基础的Ubuntu文件移动|复制|打包|解包|挂载iso总结">最基础的Ubuntu文件移动|复制|打包|解包|挂载iso总结</a></li><li><a href="http://blog.delai.me/2009/04/crazy-linux.html" rel="bookmark" title="Permanent Link: Linux可以完美运行影音风暴、PPlive、搜狗输入法哦">Linux可以完美运行影音风暴、PPlive、搜狗输入法哦</a></li><li><a href="http://blog.delai.me/2008/02/linux-configuration-service-files.html" rel="bookmark" title="Permanent Link: linux常见配置文件&#038;常见服务对照表">linux常见配置文件&#038;常见服务对照表</a></li><li><a href="http://blog.delai.me/likedislike" rel="bookmark" title="Permanent Link: 喜不喜欢">喜不喜欢</a></li></ul><hr /><strong>[原文链接：<a href="http://blog.delai.me/2008/12/linux-vmsplice.html">http://blog.delai.me/2008/12/linux-vmsplice.html</a>] </strong>]]></content:encoded>
			<wfw:commentRss>http://blog.delai.me/2008/12/linux-vmsplice.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Shell中的export &amp; sh &amp; source</title>
		<link>http://blog.delai.me/2008/10/export-sh-source.html</link>
		<comments>http://blog.delai.me/2008/10/export-sh-source.html#comments</comments>
		<pubDate>Mon, 27 Oct 2008 15:31:45 +0000</pubDate>
		<dc:creator>阿德</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[export]]></category>
		<category><![CDATA[Linux/GNU]]></category>
		<category><![CDATA[sh]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[source]]></category>
		<category><![CDATA[总结]]></category>

		<guid isPermaLink="false">http://www.soulward.cn/?p=509</guid>
		<description><![CDATA[今天做了几个实验总算把export+变量的用法给弄清楚了，过程不说，留下结果以备忘：

1. 在一个shell中（脚本）执行export+变量 的作用就是把该变量变成其父shell的变量，当执行该语句的shell或... ]]></description>
			<content:encoded><![CDATA[<p>今天做了几个实验总算把export+变量的用法给弄清楚了，过程不说，留下结果以备忘：</p>
<p>1. 当进程创建一个字进程时候，父进程并不会将普通变量的值传递给它的子进程。</p>
<p>而export就是解决这个问题用的。在父进程中export A 后，在子进程中就可以使用变量A了。</p>
<p>2. sh+脚本：重新建立一个子shell执行脚本里面的语句，该子shell继承父shell的变量，但子shell新建的、改变的变量不会被带回父shell，除非使用export。</p>
<p>可以这么理解：打开一个终端程序 = sh = 执行bash命令</p>
<p>3. source+脚本：这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行，没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。</p>
<p>所以，假设one.sh里面的内容是：export test=123 ；two.sh里面的内容是：test=123 。</p>
<p>那么，sh ./one.sh 在效果上等同于 source two.sh</p>
<hr /><h2>Related posts:</h2><ul><li><a href="http://blog.delai.me/2009/03/virginity-rates.html" rel="bookmark" title="Permanent Link: Wellesley College各专业处女比例之调查">Wellesley College各专业处女比例之调查</a></li></ul><hr /><strong>[原文链接：<a href="http://blog.delai.me/2008/10/export-sh-source.html">http://blog.delai.me/2008/10/export-sh-source.html</a>] </strong>]]></content:encoded>
			<wfw:commentRss>http://blog.delai.me/2008/10/export-sh-source.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>synergy-两台电脑共享一套鼠标键盘-Linux&amp;windows详细教程</title>
		<link>http://blog.delai.me/2008/08/synergy-trad.html</link>
		<comments>http://blog.delai.me/2008/08/synergy-trad.html#comments</comments>
		<pubDate>Sun, 31 Aug 2008 12:44:02 +0000</pubDate>
		<dc:creator>阿德</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[synergy]]></category>
		<category><![CDATA[两台电脑]]></category>
		<category><![CDATA[共享鼠标键盘]]></category>
		<category><![CDATA[共用]]></category>
		<category><![CDATA[教程]]></category>

		<guid isPermaLink="false">http://www.soulward.cn/?p=394</guid>
		<description><![CDATA[前些天，我把自己的台式电脑搬到实验室，与实验室里分配给我的电脑一起用。为了方便使用，我尝试了下用软件的方法实现两台电脑公用一套鼠标键盘，并且共享剪切板。本着分享的精神，... ]]></description>
			<content:encoded><![CDATA[<p>前些天，我把自己的台式电脑搬到实验室，与实验室里分配给我的电脑一起用。为了方便使用，我尝试了下用软件的方法实现两台电脑公用一套鼠标键盘，并且共享剪切板。本着分享的精神，写下心得，希望对需要的人有所帮助。</p>
<p>首先要说明的是我这两台都是装了Linux+windows xp的双系统的，目前，无论这两台机子各自开的是哪个系统，从出现登陆界面开始都能实现共享鼠键（比如，在鼠标当前在右边这台显示器上，将鼠标向左边移动，碰到屏幕左边边界再过去一点就到左边屏幕了，鼠标在哪个屏幕，键盘的输入也就针对那个屏幕），并且在一台电脑copy的文字能直接黏贴到另外一台电脑，但不能用这种Ctrl+C Ctrl+V的方式复制文件。</p>
<p style="text-align: center;"><a class="tt-flickr tt-flickr-Medium" href="http://blog.shidelai.cn/photos/photo/2813030237/snv31629.html"><img class="aligncenter" src="http://67.195.19.66/3287/2813030237_3666060dcb.jpg" border="0" alt="SNV31629" width="500" height="375" /></a></p>
<h2 style="text-align: left;">原理</h2>
<p>synergy是个开源的软件，有Linux, <a href="http://blog.delai.me/tag/mac" class="st_tag internal_tag" rel="tag" title="Posts tagged with mac">Mac</a>, windows三个版本，要想实现共享鼠标键盘，必须在所有机器上都安装这个软件，并进行相应的配置，有一台唯一的主机作为服务器端，其他主机作为客户端，要共享的那套鼠标键盘链接到服务器端。所有主机都必须连入同一个局域网，synergy会通过局域网交换鼠标键盘的输入信息，以实现其他主机共享使用这套鼠标键盘。</p>
<h2>安装</h2>
<p><!--inline-more--></p>
<p style="text-align: left;">1. 如果服务器端是Windows系统，下载安装：synergy windows版本。http://www.onlinedown.net/soft/5666.htm（华军的下载页面）</p>
<p style="text-align: left;">2. 如果服务器端是linux版本，请在这里下载：http://sourceforge.net/project/showfiles.php?group_id=59275&amp;release_id=406637 。Ubuntu可以直接通过源里面安装，或：sudo apt-get install synergy。</p>
<p style="text-align: left;"><span style="color: #3366ff;"><strong>无论是服务器端还是客户端，要装的软件都是一样的，只是配置不同而已。</strong></span></p>
<h2 style="text-align: left;">配置流程</h2>
<h3>一、服务器端</h3>
<p><span style="color: #3366ff;"><strong>我们假设，右边这台主机作为服务器端</strong></span></p>
<h4>1.服务器端是windows系统</h4>
<p>打开synergy，选上&#8221;share this computer&#8217;s keyboard and mouse(server)&#8221;，然后点击configure设置一些东西，来告诉synergy，你有几台电脑，各台电脑叫什么名字，各是什么ip地址，各台电脑之间是什么位置关系，电脑A是在电脑B左边呢还是上面呢？这些都是要实现上面提到的功能所必须的信息。具体设置如下：</p>
<p>第一步：在Screens里面点击 &#8220;+&#8221;按钮，在弹出的对话框中的Screen Name后面填写左边这台电脑的名字（名字不知道？google下如何查看电脑的名字），然后点“OK”。类似再添加右边这台电脑。</p>
<p>第二步：点击下面的“new link”，在下面选择 the &#8220;left&#8221; of 你右边电脑的名字 goes to 你左边电脑的名字，然后点击下面的“+”以添加一个位置信息。以这个方法再添加一条： the ”right“ of 你左边电脑的名字 goes to 你右边电脑的名字。这样，人家synergy就知道了，电脑1在电脑2左边，电脑2在电脑1右边，他们是连在一起的，中间没有其他电脑了，如果少了一条位置信息，会出现鼠标能从右边电脑进入左边电脑但不能从左边电脑进入右边电脑的情况。</p>
<p>第三步：点击“OK”离开配置界面。再点击AutoStart, 在弹出来的对话框中点击When Computer Start里面的按钮，按Close退出。</p>
<p>第四部：按Start开启服务器端的synergy服务，等待客户端来连接。</p>
<h4>2. 服务器端是Linux系统</h4>
<p>Linux服务器端的配置有点复杂，要自己写一个配置文件synergy.conf，用于告诉synergy有哪些主机，各个主机的位置关系等信息。并且如果要实现自动运行synergy，要修改三个文件，这三个文件在不同的发行版位置不同，名字大致差不多，比如：Ubuntu中，这三个文件是：</p>
<p>/etc/gdm/Init/Default   :登陆界面出现以前，系统加载的程序，我们要在这个文件里添加运行synergy的命令。</p>
<p>/etc/gdm/PostLogin/Default.sample    : 定义了登录过程中要做的事情，这里我们要暂时关闭synergy服务。</p>
<p>/etc/gdm/PreSession/Default  :定义了登录后加载的程序，这里我们要重新开启synergy服务。</p>
<p>Fedora一般是在/etc/X11/gdm</p>
<p>第一步，在当前用户目录下新建一个文件命名为：synergy.conf。打开，参考下面的例子，根据实际情况修改一下写入synergy.conf。</p>
<blockquote><p>section: screens<br />
wisper-desktop:<br />
wisper2-desktop:<br />
end<br />
section: links<br />
wisper-desktop:<br />
left = wisper2-desktop<br />
wisper2-desktop:<br />
right = wisper-desktop<br />
end</p>
<p>其中：wisper-desktop是右边电脑也即服务器端电脑的名字，wisper2-desktop是左边电脑的名字，<span style="color: #3366ff;">如</span><span style="color: #3366ff;">果你使用双系统，最好将两个系统的电脑名字都修改成一样</span>。</p></blockquote>
<p>第二步，修改/etc/gdm/Init/Default 和 /etc/gdm/PreSession/Default  在它们的最前面添加下面这三行：</p>
<blockquote><p>/usr/bin/killall synergys<br />
sleep 1<br />
/usr/bin/synergys &#8211;config synergy.conf</p></blockquote>
<p>第三步，在/etc/gdm/PostLogin/Default.sample   中添加下面2行</p>
<blockquote><p>/usr/bin/killall synergys<br />
sleep 1</p></blockquote>
<p>第四步，重启。</p>
<h3>二、客户端</h3>
<h4>1. 客户端是windows系统</h4>
<p>很简单，打开synergy，选上“Use another Computer‘keyboard and mouse （Client）”，接下来的操作同服务器端的第三步第四部。</p>
<h4>1. 客户端是Linux系统</h4>
<p>Linux下配置稍微复杂点，如果你已经配置好服务器端，你可以使用/usr/bin/synergyc &#8211;daemon 服务器端的IP 来使用，如果要实现出现登陆界面开始就自动启动这个功能，请参考服务器端的配置, 只需将</p>
<p>1. Init/default，以及PreSession/default里面的/usr/bin/synergys &#8211;config synergy.conf 修改为/usr/bin/synergyc &#8211;daemon 服务器端的IP ，/usr/bin/killall synergys修改为/usr/bin/killall synergyc</p>
<p>2./usr/bin/killall synergys 修改为/usr/bin/killall synergyc</p>
<p>即可。</p>
<hr /><strong>[原文链接：<a href="http://blog.delai.me/2008/08/synergy-trad.html">http://blog.delai.me/2008/08/synergy-trad.html</a>] </strong>]]></content:encoded>
			<wfw:commentRss>http://blog.delai.me/2008/08/synergy-trad.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《full circl》简体中文第11期发布了，很开心</title>
		<link>http://blog.delai.me/2008/05/full-circl-out-happy.html</link>
		<comments>http://blog.delai.me/2008/05/full-circl-out-happy.html#comments</comments>
		<pubDate>Sun, 04 May 2008 18:04:00 +0000</pubDate>
		<dc:creator>阿德</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[full circle]]></category>
		<category><![CDATA[杂志]]></category>
		<category><![CDATA[翻译]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=100</guid>
		<description><![CDATA[下面红色字那篇我翻译的哦，看到我翻译的东西能被别人看到，很有满足感。 show出贴图哈哈： 本期内容摘要 Linux Mint 和 Ubuntu 比较 如何在 Ubuntu 中使用 TrueCrypt 来保护重要的信息 关于 LaTex 的... ]]></description>
			<content:encoded><![CDATA[<p><strong>下面红色字那篇我翻译的哦，看到我翻译的东西能被别人看到，很有满足感。</strong></p>
<p><strong>show出贴图哈哈：</strong></p>
<p><strong></strong></p>
<p style="text-align: center;"><img class="aligncenter" title="full circle" src="http://lh3.ggpht.com/wispernano/SCFLrDKNxQI/AAAAAAAAAyc/wfiOvjkBRpc/s800/img.blog.163.com_photo_lJqoLGLketwPaEYN-Nx6kg%3D%3D_1689975760171239339.jpg" alt="full circle" width="480" height="157" /></p>
<p><strong>本期内容摘要</strong></p>
<ul>
<li>Linux Mint 和 <a href="http://blog.delai.me/tag/ubuntu" class="st_tag internal_tag" rel="tag" title="Posts tagged with ubuntu">Ubuntu</a> 比较</li>
<li>如何在 Ubuntu 中使用 TrueCrypt 来保护重要的信息</li>
<li>关于 LaTex 的入门介绍</li>
<li>怎样架设自己的服务器 (之三)</li>
<li style="color: #ff0000;"><span style="color: #ff0000;">iPod Classic + Amarok ，该文详细描述了在 Amarok 中使用 iPod Classic 的过程</span></li>
<li>此外，本期杂志还对 Lenovo 3000 C200 笔记本电脑进行了评测。</li>
</ul>
<p style="border: medium none;"><strong><span style="font-family: 宋体;">下载地址：</span></strong></p>
<ul>
<li><strong><span style="font-family: 宋体;">简体中文</span></strong><span style="font-family: 宋体;"><br />
官方下载 | <a rel="nofollow" href="http://www.ubuntuchina.com/viewthread.php?tid=540&amp;extra=page%3D1">UbuntuChina下载</a>（推荐）<br />
</span></li>
<li><span style="font-family: 宋体;"><strong>繁体中文</strong><br />
官方下载 </span><span style="font-family: 宋体;">| <a rel="nofollow" href="http://www.ubuntuchina.com/viewthread.php?tid=540&amp;extra=page%3D1">UbuntuChina下载</a>（推荐） </span></li>
</ul>
<hr /><h2>Related posts:</h2><ul><li><a href="http://blog.delai.me/2008/09/reading-notes-4.html" rel="bookmark" title="Permanent Link: 阅读&#038;札记第四期（08-09-20）">阅读&#038;札记第四期（08-09-20）</a></li><li><a href="http://blog.delai.me/about" rel="bookmark" title="Permanent Link: 关于本站">关于本站</a></li><li><a href="http://blog.delai.me/2010/04/solidot-full-feed.html" rel="bookmark" title="Permanent Link: solidot全文feed">solidot全文feed</a></li><li><a href="http://blog.delai.me/2008/06/how-to-flickrrss.html" rel="bookmark" title="Permanent Link: flickrRSS高阶使用三部曲之一：显示flickr上的图片">flickrRSS高阶使用三部曲之一：显示flickr上的图片</a></li><li><a href="http://blog.delai.me/feed-help" rel="bookmark" title="Permanent Link: 订阅本站">订阅本站</a></li></ul><hr /><strong>[原文链接：<a href="http://blog.delai.me/2008/05/full-circl-out-happy.html">http://blog.delai.me/2008/05/full-circl-out-happy.html</a>] </strong>]]></content:encoded>
			<wfw:commentRss>http://blog.delai.me/2008/05/full-circl-out-happy.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>同时使用中文和英文man(shell帮助)</title>
		<link>http://blog.delai.me/2008/04/chinese-english-man.html</link>
		<comments>http://blog.delai.me/2008/04/chinese-english-man.html#comments</comments>
		<pubDate>Thu, 10 Apr 2008 21:01:00 +0000</pubDate>
		<dc:creator>阿德</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[bashrc]]></category>
		<category><![CDATA[cman]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[帮助]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=110</guid>
		<description><![CDATA[我用的是英文版ubuntu，有时候用man查看shell命令的用法时候由于本上里面的参数含义不懂，还要用非母语看，理解起来非常吃力。如果干脆用中文版又担心翻译得不到位，比较英文的权威性高点... ]]></description>
			<content:encoded><![CDATA[<p>我用的是英文版ubuntu，有时候用man查看shell命令的用法时候由于本上里面的参数含义不懂，还要用非母语看，理解起来非常吃力。如果干脆用中 文版又担心翻译得不到位，比较英文的权威性高点，同时多看英文man肯定会比只看中文的要好的。于是很矛盾了，昨天google了下，搞定了，很方便，分 享下。<br />
sudo apt-get install manpages-zh       安装中文版男人<br />
其实这样就已经可以使用了，比如查看中文版 ls 命令的man<br />
man -M /usr/share/man/zh_CN ls 既可<br />
只是这样稍显麻烦，给man -M /usr/share/man/zh_CN 建立个别名吧：<br />
vim ./.bashrc<br />
把下面这行添加进去就OK啦。<br />
alias cman=&#8217;man -M /usr/share/man/zh_CN&#8217;<br />
同样的道理可以添加<br />
alias ll＝&#8217;ls -l&#8217;<br />
常用的比较常的命令＋参数都可以这么搞</p>
<hr /><h2>Related posts:</h2><ul><li><a href="http://blog.delai.me/2007/08/cadge-english-words.html" rel="bookmark" title="Permanent Link: 这才叫走国际化路线，乞讨也得有点技术含量啊">这才叫走国际化路线，乞讨也得有点技术含量啊</a></li><li><a href="http://blog.delai.me/2009/07/i-am-in-accraghana.html" rel="bookmark" title="Permanent Link: I am in Accra,GHANA">I am in Accra,GHANA</a></li><li><a href="http://blog.delai.me/2008/03/scim-default-english.html" rel="bookmark" title="Permanent Link: 设置SCIM输入法默认输入状态为英文">设置SCIM输入法默认输入状态为英文</a></li><li><a href="http://blog.delai.me/2008/07/traditional-chinese-medicine.html" rel="bookmark" title="Permanent Link: 中医推拿太牛了">中医推拿太牛了</a></li><li><a href="http://blog.delai.me/2011/11/the-family-man.html" rel="bookmark" title="Permanent Link: 居家男人">居家男人</a></li></ul><hr /><strong>[原文链接：<a href="http://blog.delai.me/2008/04/chinese-english-man.html">http://blog.delai.me/2008/04/chinese-english-man.html</a>] </strong>]]></content:encoded>
			<wfw:commentRss>http://blog.delai.me/2008/04/chinese-english-man.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>7个例子快速入门shell通配符</title>
		<link>http://blog.delai.me/2008/04/example-asterisk-wildcard.html</link>
		<comments>http://blog.delai.me/2008/04/example-asterisk-wildcard.html#comments</comments>
		<pubDate>Mon, 07 Apr 2008 20:00:00 +0000</pubDate>
		<dc:creator>阿德</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Linux/GNU]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[例子]]></category>
		<category><![CDATA[计算机]]></category>
		<category><![CDATA[通配符]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=114</guid>
		<description><![CDATA[＊ 代表0个或多个字符 ？ 代表一个字符 例子1： ls 11＊2？3      显示11开头的接着是若干个字符，最后是2加一个字符和3结束的文件 [] 可以理解为一个字符，与？的区别是[]里面的内容限定了... ]]></description>
			<content:encoded><![CDATA[<p><span style="color: #3366ff;">＊</span><br />
代表0个或多个字符<br />
？<br />
代表一个字符<br />
<a href="http://blog.delai.me/tag/%e4%be%8b%e5%ad%90" class="st_tag internal_tag" rel="tag" title="Posts tagged with 例子">例子</a>1：<br />
ls 11＊2？3      显示11开头的接着是若干个字符，最后是2加一个字符和3结束的文件</p>
<p><span style="color: #0000ff;">[]</span><br />
可以理解为一个字符，与？的区别是[]里面的内容限定了这个字符的范围<br />
例子2：<br />
[Cc]hange[Ll]og<br />
将与 Changelog、ChangeLog、changeLog 以及 changelog 匹配。在需要大小写匹配的时候，使用括弧通配符很有用。<br />
例子3：<br />
ls /etc/[0-9]* 将列出 /etc 中以数字开头的所有文件。<br />
ls /tmp/[A-Za-z]* 将列出 /tmp 中以大写字母或小写字母开头的所有文件。<br />
<!--inline-more--><br />
<span style="color: #0000ff;">[!]</span><br />
例子4：<br />
rm myfile[!9] 将删除除myfile9 之外的名为 myfile 加一个字符的所有文件。</p>
<p><span style="color: #0000ff;">‘’</span>单引号<br />
例子5：<br />
echo &#8216;[fo]*&#8217; &gt; newfile.txt  创建了包含字符串[fo]*的文件。<br />
如果echo [fo]* &gt; newfile.txt 则 newfile.txt 里面不会有任何东西<br />
例子6：<br />
如果用户目录下有12* 12333这么两个文件，那么<br />
rm 12* 会删除12＊ 和 12333<br />
rm ‘12＊’ 则只会删除12＊<br />
总结：用引号引起来则说明引号里面的是纯字符串无须进行通配符的相关处理</p>
<p><span style="color: #0000ff;">\</span><br />
功能与单引号类似，<br />
例子7：<br />
rm 12\＊ 则只会删除12＊，这里\代表起后面的字符是纯字符没有其他意思，这与C 语言里面的转义字符类似的。很自然的，如果要表示字符\，你必须使用\\。</p>
<hr /><strong>[原文链接：<a href="http://blog.delai.me/2008/04/example-asterisk-wildcard.html">http://blog.delai.me/2008/04/example-asterisk-wildcard.html</a>] </strong>]]></content:encoded>
			<wfw:commentRss>http://blog.delai.me/2008/04/example-asterisk-wildcard.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>从ubuntu发行版代号到野生动物保护</title>
		<link>http://blog.delai.me/2008/04/ubuntu-version-wildlife.html</link>
		<comments>http://blog.delai.me/2008/04/ubuntu-version-wildlife.html#comments</comments>
		<pubDate>Thu, 03 Apr 2008 13:04:00 +0000</pubDate>
		<dc:creator>阿德</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[杂杂的文]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[代号]]></category>
		<category><![CDATA[发行版]]></category>
		<category><![CDATA[野生动物保护]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=118</guid>
		<description><![CDATA[开发代号 中文 发布版本 Intrepid Ibex 勇敢的野山羊 8.10 Hardy Heron 坚强的苍鹭 8.04 Gutsy Gibbon 胆大的长臂猿 7.10 Feisty Fawn 烦躁不安的小鹿 7.04 Edgy Eft 尖利的小蜥蜴 6.10 Dapper Drake 伶俐的公鸡 6.06 Breezy ... ]]></description>
			<content:encoded><![CDATA[<table style="width: 524px; height: 245px;" border="0">
<tbody>
<tr>
<td width="105"><span style="font-size: x-small;">开发代号</span></td>
<td width="94"><span style="font-size: x-small;">中文</span></td>
<td width="52"><span style="font-size: x-small;">发布版本</span></td>
</tr>
<tr>
<td><span style="font-size: x-small;">Intrepid Ibex</span></td>
<td><span style="font-size: x-small;">勇敢的野山羊</span></td>
<td><span style="font-size: x-small;">8.10</span></td>
</tr>
<tr>
<td><span style="font-size: x-small;">Hardy Heron</span></td>
<td><span style="font-size: x-small;">坚强的苍鹭</span></td>
<td><span style="font-size: x-small;">8.04</span></td>
</tr>
<tr>
<td><span style="font-size: x-small;">Gutsy Gibbon</span></td>
<td><span style="font-size: x-small;">胆大的长臂猿</span></td>
<td><span style="font-size: x-small;">7.10</span></td>
</tr>
<tr>
<td><span style="font-size: x-small;">Feisty Fawn</span></td>
<td><span style="font-size: x-small;">烦躁不安的小鹿</span></td>
<td><span style="font-size: x-small;">7.04</span></td>
</tr>
<tr>
<td><span style="font-size: x-small;">Edgy Eft</span></td>
<td><span style="font-size: x-small;">尖利的小蜥蜴</span></td>
<td><span style="font-size: x-small;">6.10</span></td>
</tr>
<tr>
<td><span style="font-size: x-small;">Dapper Drake</span></td>
<td><span style="font-size: x-small;">伶俐的公鸡</span></td>
<td><span style="font-size: x-small;">6.06</span></td>
</tr>
<tr>
<td><span style="font-size: x-small;">Breezy Badger</span></td>
<td><span style="font-size: x-small;">活泼的獾</span></td>
<td><span style="font-size: x-small;">5.10</span></td>
</tr>
<tr>
<td><span style="font-size: x-small;">Hoary Hedgehog</span></td>
<td><span style="font-size: x-small;">白发的刺猬</span></td>
<td><span style="font-size: x-small;">5.04</span></td>
</tr>
<tr>
<td><span style="font-size: x-small;">Warty Warthog</span></td>
<td><span style="font-size: x-small;">多疣的疣猪</span></td>
<td><span style="font-size: x-small;">4.10</span></td>
</tr>
</tbody>
</table>
<hr /><h2>Related posts:</h2><ul><li><a href="http://blog.delai.me/2008/05/full-circl-out-happy.html" rel="bookmark" title="Permanent Link: 《full circl》简体中文第11期发布了，很开心">《full circl》简体中文第11期发布了，很开心</a></li><li><a href="http://blog.delai.me/2007/09/honey.html" rel="bookmark" title="Permanent Link: 蜂蜜">蜂蜜</a></li><li><a href="http://blog.delai.me/2008/04/firefox-logo-in-deep-space.html" rel="bookmark" title="Permanent Link: Firefox Logo Spied In Deep Space(火狐标志在宇宙深处出现）">Firefox Logo Spied In Deep Space(火狐标志在宇宙深处出现）</a></li><li><a href="http://blog.delai.me/2010/06/fuck-ccav.html" rel="bookmark" title="Permanent Link: CCAV，白岩松，不该就这点水准">CCAV，白岩松，不该就这点水准</a></li><li><a href="http://blog.delai.me/2008/07/plugins.html" rel="bookmark" title="Permanent Link: WordPress运行原理学习笔记之二：插件机制初探">WordPress运行原理学习笔记之二：插件机制初探</a></li></ul><hr /><strong>[原文链接：<a href="http://blog.delai.me/2008/04/ubuntu-version-wildlife.html">http://blog.delai.me/2008/04/ubuntu-version-wildlife.html</a>] </strong>]]></content:encoded>
			<wfw:commentRss>http://blog.delai.me/2008/04/ubuntu-version-wildlife.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

