<?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/GNU</title>
	<atom:link href="http://blog.shidelai.cn/category/linux/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.shidelai.cn</link>
	<description>WordPress, Blog, linux, 杂文</description>
	<lastBuildDate>Thu, 29 Jul 2010 13:19:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Ftp批量上传下载的Shell脚本, Linux Mac适用</title>
		<link>http://blog.shidelai.cn/2009/12/ftp-upload-download.html</link>
		<comments>http://blog.shidelai.cn/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/GNU]]></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>

	<b>[相关文章]</b>
	<ul class="st-related-posts">
	<li><a href="http://blog.shidelai.cn/2008/02/example-shell-chmod.html" title="通过例子学shell文件访问权限管理 (2008-02-10)">通过例子学shell文件访问权限管理</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/04/chinese-english-man.html" title="同时使用中文和英文man(shell帮助) (2008-04-11)">同时使用中文和英文man(shell帮助)</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/10/export-sh-source.html" title="Shell中的export &#038; sh &#038; source (2008-10-27)">Shell中的export &#038; sh &#038; source</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/04/example-asterisk-wildcard.html" title="7个例子快速入门shell通配符 (2008-04-8)">7个例子快速入门shell通配符</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.shidelai.cn/2009/12/ftp-upload-download.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux可以完美运行影音风暴、PPlive、搜狗输入法哦</title>
		<link>http://blog.shidelai.cn/2009/04/crazy-linux.html</link>
		<comments>http://blog.shidelai.cn/2009/04/crazy-linux.html#comments</comments>
		<pubDate>Tue, 28 Apr 2009 14:20:03 +0000</pubDate>
		<dc:creator>阿德</dc:creator>
				<category><![CDATA[Linux/GNU]]></category>

		<guid isPermaLink="false">http://blog.shidelai.cn/?p=880</guid>
		<description><![CDATA[Linux可以完美运行影音风暴、PPlive、搜狗输入法哦~ 神奇吧~~？ 有图有真相 影音风暴 PPlive、搜狗输入法 骗你的， 其实是&#8230;. [相关文章] 设置SCIM输入法默认输入状态为英文 (0) 最基础的Ubuntu文... ]]></description>
			<content:encoded><![CDATA[<p>Linux可以完美运行影音风暴、PPlive、搜狗输入法哦~</p>
<p>神奇吧~~？</p>
<p>有图有真相</p>
<p>影音风暴</p>

<a href="http://blog.shidelai.cn/wp-content/gallery/upload/screanshot.jpg" title="" class="shutterset_singlepic140" >
	<img class="ngg-singlepic ngg-center" src="http://blog.shidelai.cn/wp-content/gallery/cache/140__480x360_screanshot.jpg" alt="screanshot.jpg" title="screanshot.jpg" />
</a>

<p>PPlive、搜狗输入法</p>

<a href="http://blog.shidelai.cn/wp-content/gallery/upload/creanshot3.jpg" title="" class="shutterset_singlepic141" >
	<img class="ngg-singlepic ngg-center" src="http://blog.shidelai.cn/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.shidelai.cn/wp-content/gallery/upload/screansho4.jpg" title="" class="shutterset_singlepic142" >
	<img class="ngg-singlepic ngg-center" src="http://blog.shidelai.cn/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.shidelai.cn/wp-content/gallery/upload/snv32286.jpg" title="" class="shutterset_singlepic143" >
	<img class="ngg-singlepic ngg-center" src="http://blog.shidelai.cn/wp-content/gallery/cache/143__640x320_snv32286.jpg" alt="snv32286.jpg" title="snv32286.jpg" />
</a>


	<b>[相关文章]</b>
	<ul class="st-related-posts">
	<li><a href="http://blog.shidelai.cn/2008/03/scim-default-english.html" title="设置SCIM输入法默认输入状态为英文 (2008-03-3)">设置SCIM输入法默认输入状态为英文</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/02/linux-basic.html" title="最基础的Ubuntu文件移动|复制|打包|解包|挂载iso总结 (2008-02-3)">最基础的Ubuntu文件移动|复制|打包|解包|挂载iso总结</a> (1)</li>
	<li><a href="http://blog.shidelai.cn/2008/02/two-linux-documentary.html" title="两部与linux有关的纪录片:《Revolution.OS》 《The Code Linux》 (2008-02-11)">两部与linux有关的纪录片:《Revolution.OS》 《The Code Linux》</a> (3)</li>
	<li><a href="http://blog.shidelai.cn/2008/10/export-sh-source.html" title="Shell中的export &#038; sh &#038; source (2008-10-27)">Shell中的export &#038; sh &#038; source</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/02/3d-desktop-apple-theme.html" title="linux界面优化，实现3D桌面，苹果主题。 (2008-02-22)">linux界面优化，实现3D桌面，苹果主题。</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.shidelai.cn/2009/04/crazy-linux.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>linux使普通用户获得root权限的vmsplice系统调用漏洞分析</title>
		<link>http://blog.shidelai.cn/2008/12/linux-vmsplice.html</link>
		<comments>http://blog.shidelai.cn/2008/12/linux-vmsplice.html#comments</comments>
		<pubDate>Mon, 29 Dec 2008 15:54:43 +0000</pubDate>
		<dc:creator>阿德</dc:creator>
				<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.shidelai.cn/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>

	<b>[相关文章]</b>
	<ul class="st-related-posts">
	<li><a href="http://blog.shidelai.cn/2008/03/scim-default-english.html" title="设置SCIM输入法默认输入状态为英文 (2008-03-3)">设置SCIM输入法默认输入状态为英文</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/02/linux-basic.html" title="最基础的Ubuntu文件移动|复制|打包|解包|挂载iso总结 (2008-02-3)">最基础的Ubuntu文件移动|复制|打包|解包|挂载iso总结</a> (1)</li>
	<li><a href="http://blog.shidelai.cn/2008/02/two-linux-documentary.html" title="两部与linux有关的纪录片:《Revolution.OS》 《The Code Linux》 (2008-02-11)">两部与linux有关的纪录片:《Revolution.OS》 《The Code Linux》</a> (3)</li>
	<li><a href="http://blog.shidelai.cn/2008/10/export-sh-source.html" title="Shell中的export &#038; sh &#038; source (2008-10-27)">Shell中的export &#038; sh &#038; source</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/02/3d-desktop-apple-theme.html" title="linux界面优化，实现3D桌面，苹果主题。 (2008-02-22)">linux界面优化，实现3D桌面，苹果主题。</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.shidelai.cn/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.shidelai.cn/2008/10/export-sh-source.html</link>
		<comments>http://blog.shidelai.cn/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/GNU]]></category>
		<category><![CDATA[export]]></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+脚本：重新建立一个子<a href="http://blog.shidelai.cn/tag/shell" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with shell">shell</a>执行脚本里面的语句，该子<a href="http://blog.shidelai.cn/tag/shell" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with shell">shell</a>继承父<a href="http://blog.shidelai.cn/tag/shell" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with shell">shell</a>的变量，但子<a href="http://blog.shidelai.cn/tag/shell" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with shell">shell</a>新建的、改变的变量不会被带回父<a href="http://blog.shidelai.cn/tag/shell" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with shell">shell</a>，除非使用export。</p>
<p>可以这么理解：打开一个终端程序 = sh = 执行bash命令</p>
<p>3. source+脚本：这个命令其实只是简单地读取脚本里面的语句依次在当前<a href="http://blog.shidelai.cn/tag/shell" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with shell">shell</a>里面执行，没有建立新的子<a href="http://blog.shidelai.cn/tag/shell" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with shell">shell</a>。那么脚本里面所有新建、改变变量的语句都会保存在当前<a href="http://blog.shidelai.cn/tag/shell" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with shell">shell</a>里面。</p>
<p>所以，假设one.sh里面的内容是：export test=123 ；two.sh里面的内容是：test=123 。</p>
<p>那么，sh ./one.sh 在效果上等同于 source two.sh</p>

	<b>[相关文章]</b>
	<ul class="st-related-posts">
	<li><a href="http://blog.shidelai.cn/2008/04/example-asterisk-wildcard.html" title="7个例子快速入门shell通配符 (2008-04-8)">7个例子快速入门shell通配符</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/02/example-shell-chmod.html" title="通过例子学shell文件访问权限管理 (2008-02-10)">通过例子学shell文件访问权限管理</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/03/scim-default-english.html" title="设置SCIM输入法默认输入状态为英文 (2008-03-3)">设置SCIM输入法默认输入状态为英文</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/02/linux-basic.html" title="最基础的Ubuntu文件移动|复制|打包|解包|挂载iso总结 (2008-02-3)">最基础的Ubuntu文件移动|复制|打包|解包|挂载iso总结</a> (1)</li>
	<li><a href="http://blog.shidelai.cn/2008/04/chinese-english-man.html" title="同时使用中文和英文man(shell帮助) (2008-04-11)">同时使用中文和英文man(shell帮助)</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.shidelai.cn/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.shidelai.cn/2008/08/synergy-trad.html</link>
		<comments>http://blog.shidelai.cn/2008/08/synergy-trad.html#comments</comments>
		<pubDate>Sun, 31 Aug 2008 12:44:02 +0000</pubDate>
		<dc:creator>阿德</dc:creator>
				<category><![CDATA[Linux/GNU]]></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://76.13.18.77/3287/2813030237_3666060dcb.jpg" border="0" alt="SNV31629" width="500" height="375" /></a></p>
<h2 style="text-align: left;">原理</h2>
<p>synergy是个开源的软件，有Linux, Mac, 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 。<a href="http://blog.shidelai.cn/tag/ubuntu" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with ubuntu">Ubuntu</a>可以直接通过源里面安装，或：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，要修改三个文件，这三个文件在不同的发行版位置不同，名字大致差不多，比如：<a href="http://blog.shidelai.cn/tag/ubuntu" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with ubuntu">Ubuntu</a>中，这三个文件是：</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>

	<b>[相关文章]</b>
	<ul class="st-related-posts">
	<li>没有相关文章.</li>
	</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.shidelai.cn/2008/08/synergy-trad.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《full circl》简体中文第11期发布了，很开心</title>
		<link>http://blog.shidelai.cn/2008/05/full-circl-out-happy.html</link>
		<comments>http://blog.shidelai.cn/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/GNU]]></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.shidelai.cn/tag/ubuntu" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with ubuntu">Ubuntu</a> 比较</li>
<li>如何在 <a href="http://blog.shidelai.cn/tag/ubuntu" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with ubuntu">Ubuntu</a> 中使用 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>

	<b>[相关文章]</b>
	<ul class="st-related-posts">
	<li>没有相关文章.</li>
	</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.shidelai.cn/2008/05/full-circl-out-happy.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>同时使用中文和英文man(shell帮助)</title>
		<link>http://blog.shidelai.cn/2008/04/chinese-english-man.html</link>
		<comments>http://blog.shidelai.cn/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/GNU]]></category>
		<category><![CDATA[bashrc]]></category>
		<category><![CDATA[cman]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[中文]]></category>
		<category><![CDATA[帮助]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=110</guid>
		<description><![CDATA[我用的是英文版ubuntu，有时候用man查看shell命令的用法时候由于本上里面的参数含义不懂，还要用非母语看，理解起来非常吃力。如果干脆用中文版又担心翻译得不到位，比较英文的权威性高点... ]]></description>
			<content:encoded><![CDATA[<p>我用的是英文版<a href="http://blog.shidelai.cn/tag/ubuntu" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with ubuntu">ubuntu</a>，有时候用man查看<a href="http://blog.shidelai.cn/tag/shell" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with shell">shell</a>命令的用法时候由于本上里面的参数含义不懂，还要用非母语看，理解起来非常吃力。如果干脆用中 文版又担心翻译得不到位，比较英文的权威性高点，同时多看英文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>

	<b>[相关文章]</b>
	<ul class="st-related-posts">
	<li><a href="http://blog.shidelai.cn/2008/02/example-shell-chmod.html" title="通过例子学shell文件访问权限管理 (2008-02-10)">通过例子学shell文件访问权限管理</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/03/scim-default-english.html" title="设置SCIM输入法默认输入状态为英文 (2008-03-3)">设置SCIM输入法默认输入状态为英文</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/10/export-sh-source.html" title="Shell中的export &#038; sh &#038; source (2008-10-27)">Shell中的export &#038; sh &#038; source</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2009/12/ftp-upload-download.html" title="Ftp批量上传下载的Shell脚本, Linux Mac适用 (2009-12-23)">Ftp批量上传下载的Shell脚本, Linux Mac适用</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/04/example-asterisk-wildcard.html" title="7个例子快速入门shell通配符 (2008-04-8)">7个例子快速入门shell通配符</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.shidelai.cn/2008/04/chinese-english-man.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>7个例子快速入门shell通配符</title>
		<link>http://blog.shidelai.cn/2008/04/example-asterisk-wildcard.html</link>
		<comments>http://blog.shidelai.cn/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/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 />
例子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>

	<b>[相关文章]</b>
	<ul class="st-related-posts">
	<li><a href="http://blog.shidelai.cn/2008/02/example-shell-chmod.html" title="通过例子学shell文件访问权限管理 (2008-02-10)">通过例子学shell文件访问权限管理</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/10/export-sh-source.html" title="Shell中的export &#038; sh &#038; source (2008-10-27)">Shell中的export &#038; sh &#038; source</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/03/scim-default-english.html" title="设置SCIM输入法默认输入状态为英文 (2008-03-3)">设置SCIM输入法默认输入状态为英文</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/02/linux-basic.html" title="最基础的Ubuntu文件移动|复制|打包|解包|挂载iso总结 (2008-02-3)">最基础的Ubuntu文件移动|复制|打包|解包|挂载iso总结</a> (1)</li>
	<li><a href="http://blog.shidelai.cn/2008/03/zju-retrial-over.html" title="复试结束 (2008-03-28)">复试结束</a> (2)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.shidelai.cn/2008/04/example-asterisk-wildcard.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>从ubuntu发行版代号到野生动物保护</title>
		<link>http://blog.shidelai.cn/2008/04/ubuntu-version-wildlife.html</link>
		<comments>http://blog.shidelai.cn/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/GNU]]></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>

	<b>[相关文章]</b>
	<ul class="st-related-posts">
	<li><a href="http://blog.shidelai.cn/2008/02/linux-basic.html" title="最基础的Ubuntu文件移动|复制|打包|解包|挂载iso总结 (2008-02-3)">最基础的Ubuntu文件移动|复制|打包|解包|挂载iso总结</a> (1)</li>
	<li><a href="http://blog.shidelai.cn/2008/02/3d-desktop-apple-theme.html" title="linux界面优化，实现3D桌面，苹果主题。 (2008-02-22)">linux界面优化，实现3D桌面，苹果主题。</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.shidelai.cn/2008/04/ubuntu-version-wildlife.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>设置SCIM输入法默认输入状态为英文</title>
		<link>http://blog.shidelai.cn/2008/03/scim-default-english.html</link>
		<comments>http://blog.shidelai.cn/2008/03/scim-default-english.html#comments</comments>
		<pubDate>Mon, 03 Mar 2008 12:04:00 +0000</pubDate>
		<dc:creator>阿德</dc:creator>
				<category><![CDATA[Linux/GNU]]></category>
		<category><![CDATA[scim]]></category>
		<category><![CDATA[中文]]></category>
		<category><![CDATA[输入法]]></category>
		<category><![CDATA[默认]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=130</guid>
		<description><![CDATA[默认是一打开就是中文的,大多时候是需要输入英文的,需要按shift很麻烦.可以修改. sudo ~/.scim/config 找到/FrontEnd/IMOpenedByDefault = true 改成false 重新加载设置一下就OK了. [相关文章] 最基础的Ubuntu文... ]]></description>
			<content:encoded><![CDATA[<p>默认是一打开就是中文的,大多时候是需要输入英文的,需要按shift很麻烦.可以修改.<br />
sudo ~/.scim/config<br />
找到/FrontEnd/IMOpenedByDefault = true 改成false<br />
重新加载设置一下就OK了.</p>

	<b>[相关文章]</b>
	<ul class="st-related-posts">
	<li><a href="http://blog.shidelai.cn/2008/02/linux-basic.html" title="最基础的Ubuntu文件移动|复制|打包|解包|挂载iso总结 (2008-02-3)">最基础的Ubuntu文件移动|复制|打包|解包|挂载iso总结</a> (1)</li>
	<li><a href="http://blog.shidelai.cn/2008/04/chinese-english-man.html" title="同时使用中文和英文man(shell帮助) (2008-04-11)">同时使用中文和英文man(shell帮助)</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/02/two-linux-documentary.html" title="两部与linux有关的纪录片:《Revolution.OS》 《The Code Linux》 (2008-02-11)">两部与linux有关的纪录片:《Revolution.OS》 《The Code Linux》</a> (3)</li>
	<li><a href="http://blog.shidelai.cn/2008/10/export-sh-source.html" title="Shell中的export &#038; sh &#038; source (2008-10-27)">Shell中的export &#038; sh &#038; source</a> (0)</li>
	<li><a href="http://blog.shidelai.cn/2008/02/3d-desktop-apple-theme.html" title="linux界面优化，实现3D桌面，苹果主题。 (2008-02-22)">linux界面优化，实现3D桌面，苹果主题。</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.shidelai.cn/2008/03/scim-default-english.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
