<?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>I am LAZY bones ? &#187; 备忘</title>
	<atom:link href="http://luy.li/category/memoire/feed/" rel="self" type="application/rss+xml" />
	<link>http://luy.li</link>
	<description>all linux</description>
	<lastBuildDate>Fri, 21 Oct 2011 03:38:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>mysql主备部署笔记</title>
		<link>http://luy.li/2011/05/11/mysql_replication/</link>
		<comments>http://luy.li/2011/05/11/mysql_replication/#comments</comments>
		<pubDate>Wed, 11 May 2011 11:48:20 +0000</pubDate>
		<dc:creator>bones7456</dc:creator>
				<category><![CDATA[备忘]]></category>

		<guid isPermaLink="false">http://luy.li/?p=1787</guid>
		<description><![CDATA[本文说的mysql主备是指单向、异步的数据复制。可以是一个主、多个备。 这样做的好处显而易见：有利于健壮性、速度和系统管理。备用数据库可以做为只读查询和备份的机器，减轻主用数据库的负担。 实施前提： 主用数据库的配置里至少有： &#91;mysqld&#93; log-bin=mysql-bin server-id=1 建议主备的数据库版本一致。 我所知道的最简单的实施方式（不需要停主库，甚至不需要长时间地禁止主库写入）： 主库操作： 在主库里建一个复制用的用户： grant replication slave on *.* TO 'replication'@'备库地址' identified by 'replication'; 导出主库的数据，并记下当然日志文件和偏移： mysqldump --master-data=2 --single-transaction -uroot -p --all-databases &#62;dumpfile 这里是把数据以SQL的形式导出，并记下导出瞬间的日志文件和偏移(得益于--master-data=2参数)，出来的dumpfile的前面会有一行类似以下的注释信息，就是文件名和偏移值了： -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000011', MASTER_LOG_POS=1061553673; 对于这步，网络上一般采用的方法为： FLUSH TABLES WITH READ LOCK；--先把主库设置成只读，然后导出SQL或者直接复制数据文件 SHOW MASTER STATUS; --记下日志文件和偏移 UNLOCK TABLES; --恢复主库写入 这样，至少在复制数据的那段时间，主库是不可提供服务的。 备库操作： 复制主库的/etc/my.cnf和dumpfile。 把主库配置里的 server-id 改成2（或者3、4，多个备库保存互不相同），再加上 [...]]]></description>
			<content:encoded><![CDATA[<p>本文说的mysql主备是指单向、异步的数据复制。可以是一个主、多个备。<br />
这样做的好处显而易见：有利于健壮性、速度和系统管理。备用数据库可以做为只读查询和备份的机器，减轻主用数据库的负担。</p>
<p>实施前提：<br />
主用数据库的配置里至少有：</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>mysqld<span style="">&#93;</span></span>
<span style="color: #000099;">log-bin</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">mysql-bin</span>
<span style="color: #000099;">server-id</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">1</span></pre></div></div>

<p>建议主备的数据库版本一致。</p>
<p>我所知道的最简单的实施方式（不需要停主库，甚至不需要长时间地禁止主库写入）：</p>
<p><strong>主库操作：</strong><br />
在主库里建一个复制用的用户：</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">grant</span> replication slave <span style="color: #990099; font-weight: bold;">on</span> <span style="color: #CC0099;">*</span>.<span style="color: #CC0099;">*</span> <span style="color: #990099; font-weight: bold;">TO</span> <span style="color: #008000;">'replication'</span>@<span style="color: #008000;">'备库地址'</span> identified by <span style="color: #008000;">'replication'</span><span style="color: #000033;">;</span></pre></div></div>

<p>导出主库的数据，并记下当然日志文件和偏移：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mysqldump <span style="color: #660033;">--master-data</span>=<span style="color: #000000;">2</span> <span style="color: #660033;">--single-transaction</span> <span style="color: #660033;">-uroot</span> <span style="color: #660033;">-p</span> <span style="color: #660033;">--all-databases</span> <span style="color: #000000; font-weight: bold;">&gt;</span>dumpfile</pre></div></div>

<p>这里是把数据以SQL的形式导出，并记下导出瞬间的日志文件和偏移(得益于<code>--master-data=2</code>参数)，出来的dumpfile的前面会有一行类似以下的注释信息，就是文件名和偏移值了：</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000011', MASTER_LOG_POS=1061553673;</span></pre></div></div>

<blockquote><p>对于这步，网络上一般采用的方法为：</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;">FLUSH <span style="color: #990099; font-weight: bold;">TABLES</span> <span style="color: #990099; font-weight: bold;">WITH</span> <span style="color: #990099; font-weight: bold;">READ</span> <span style="color: #990099; font-weight: bold;">LOCK</span>；<span style="color: #CC0099;">--</span>先把主库设置成只读，然后导出SQL或者直接复制数据文件
<span style="color: #990099; font-weight: bold;">SHOW</span> MASTER <span style="color: #990099; font-weight: bold;">STATUS</span><span style="color: #000033;">;</span> <span style="color: #CC0099;">--</span>记下日志文件和偏移
UNLOCK <span style="color: #990099; font-weight: bold;">TABLES</span><span style="color: #000033;">;</span>  <span style="color: #CC0099;">--</span>恢复主库写入</pre></div></div>

<p>这样，至少在复制数据的那段时间，主库是不可提供服务的。</p></blockquote>
<p><strong>备库操作：</strong><br />
复制主库的<code>/etc/my.cnf</code>和<code>dumpfile</code>。<br />
把主库配置里的 server-id  改成2（或者3、4，多个备库保存互不相同），再加上</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000099;">relay-log</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> slave-relay.log </span>
<span style="color: #000099;">relay-log-index</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> slave-relay-log.index</span></pre></div></div>

<p>导入数据：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"> mysql <span style="color: #000000; font-weight: bold;">&lt;</span>dumpfile</pre></div></div>

<p>进入mysql命令行执行：</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;">SLAVE STOP<span style="color: #000033;">;</span>
CHANGE MASTER <span style="color: #990099; font-weight: bold;">TO</span>
MASTER_HOST<span style="color: #CC0099;">=</span><span style="color: #008000;">'主库地址'</span><span style="color: #000033;">,</span>
MASTER_PORT<span style="color: #CC0099;">=</span><span style="color: #008080;">3306</span><span style="color: #000033;">,</span>
MASTER_USER<span style="color: #CC0099;">=</span><span style="color: #008000;">'replication'</span><span style="color: #000033;">,</span>
MASTER_PASSWORD<span style="color: #CC0099;">=</span><span style="color: #008000;">'密码'</span><span style="color: #000033;">,</span>
MASTER_LOG_FILE<span style="color: #CC0099;">=</span><span style="color: #008000;">'mysql-bin.000011'</span><span style="color: #000033;">,</span>
MASTER_LOG_POS<span style="color: #CC0099;">=</span><span style="color: #008080;">1061553673</span><span style="color: #000033;">;</span>
SLAVE <span style="color: #990099; font-weight: bold;">START</span><span style="color: #000033;">;</span></pre></div></div>

<p>然后，就搞定了，可以在备库执行</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">SHOW</span> PROCESSLIST<span style="color: #000033;">;</span></pre></div></div>

<p>查看同步的状态，如果此命令的输出里有两个“system user”的进程，并且Command都是“Connect”的话，就差不多OK了，此时，任何对主库的修改，都能准实时地从备库里查询出来。</p>
<p>参考文章：<a href="http://dev.mysql.com/doc/refman/5.1/zh/replication.html">mysql官方中文手册</a></p>
]]></content:encoded>
			<wfw:commentRss>http://luy.li/2011/05/11/mysql_replication/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>天朝第二代身份证号码的验证机制</title>
		<link>http://luy.li/2011/01/01/sfzhm/</link>
		<comments>http://luy.li/2011/01/01/sfzhm/#comments</comments>
		<pubDate>Sat, 01 Jan 2011 10:35:30 +0000</pubDate>
		<dc:creator>bones7456</dc:creator>
				<category><![CDATA[备忘]]></category>

		<guid isPermaLink="false">http://luy.li/?p=1750</guid>
		<description><![CDATA[今天，在盛大某网站注册的时候，身份证必填，但我又不想填真实身份证号码，于是随便编了串自认为合法的身份证号码，但是却马上被提示号码错误，由于响应速度极快，可以肯定不是联机校验正确性的，那也就是说第二代身份证除了大家都知道的几位表示生日和性别的规则以外，还有另外的自我校验规则。于是翻开页面源码查看，发现这段js没有被压缩，所以规则也很好懂。 就在这里给大家科普下，不知道是不是火星了，呵呵。 以下代码来自这里，版权归盛大。当然，你也可以在维基百科找到更详细的介绍和算法。 iW = new Array&#40;7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1&#41;; iSum = 0; for&#40; i=0;i&#60;17;i++&#41;&#123; iC = v_card.charAt&#40;i&#41; ; iVal = parseInt&#40;iC&#41;; iSum += iVal * iW&#91;i&#93;; &#125; iJYM = iSum % 11; var sJYM = ''; if&#40;iJYM == 0&#41; sJYM = &#34;1&#34;; else if&#40;iJYM == 1&#41; sJYM = &#34;0&#34;; else if&#40;iJYM == 2&#41; sJYM = &#34;x&#34;; else [...]]]></description>
			<content:encoded><![CDATA[<p>今天，在盛大某网站注册的时候，身份证必填，但我又不想填真实身份证号码，于是随便编了串自认为合法的身份证号码，但是却马上被提示号码错误，由于响应速度极快，可以肯定不是联机校验正确性的，那也就是说第二代身份证除了大家都知道的几位表示生日和性别的规则以外，还有另外的自我校验规则。于是翻开页面源码查看，发现这段js没有被压缩，所以规则也很好懂。<br />
就在这里给大家科普下，不知道是不是火星了，呵呵。<br />
以下代码来自<a href="http://aig.sdo.com/js/ajax.js">这里</a>，版权归盛大。当然，你也可以在<a href="http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD%E5%85%AC%E6%B0%91%E8%BA%AB%E4%BB%BD%E5%8F%B7%E7%A0%81">维基百科</a>找到更详细的介绍和算法。</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">iW <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Array<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">7</span><span style="color: #339933;">,</span><span style="color: #CC0000;">9</span><span style="color: #339933;">,</span><span style="color: #CC0000;">10</span><span style="color: #339933;">,</span><span style="color: #CC0000;">5</span><span style="color: #339933;">,</span><span style="color: #CC0000;">8</span><span style="color: #339933;">,</span><span style="color: #CC0000;">4</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #CC0000;">6</span><span style="color: #339933;">,</span><span style="color: #CC0000;">3</span><span style="color: #339933;">,</span><span style="color: #CC0000;">7</span><span style="color: #339933;">,</span><span style="color: #CC0000;">9</span><span style="color: #339933;">,</span><span style="color: #CC0000;">10</span><span style="color: #339933;">,</span><span style="color: #CC0000;">5</span><span style="color: #339933;">,</span><span style="color: #CC0000;">8</span><span style="color: #339933;">,</span><span style="color: #CC0000;">4</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
iSum <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span> i<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span><span style="color: #CC0000;">17</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    iC <span style="color: #339933;">=</span> v_card.<span style="color: #660066;">charAt</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
    iVal <span style="color: #339933;">=</span> parseInt<span style="color: #009900;">&#40;</span>iC<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    iSum <span style="color: #339933;">+=</span> iVal <span style="color: #339933;">*</span> iW<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
iJYM <span style="color: #339933;">=</span> iSum <span style="color: #339933;">%</span> <span style="color: #CC0000;">11</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> sJYM <span style="color: #339933;">=</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>iJYM <span style="color: #339933;">==</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> sJYM <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;1&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>iJYM <span style="color: #339933;">==</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> sJYM <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;0&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>iJYM <span style="color: #339933;">==</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span> sJYM <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;x&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>iJYM <span style="color: #339933;">==</span> <span style="color: #CC0000;">3</span><span style="color: #009900;">&#41;</span> sJYM <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;9&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>iJYM <span style="color: #339933;">==</span> <span style="color: #CC0000;">4</span><span style="color: #009900;">&#41;</span> sJYM <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;8&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>iJYM <span style="color: #339933;">==</span> <span style="color: #CC0000;">5</span><span style="color: #009900;">&#41;</span> sJYM <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;7&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>iJYM <span style="color: #339933;">==</span> <span style="color: #CC0000;">6</span><span style="color: #009900;">&#41;</span> sJYM <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;6&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>iJYM <span style="color: #339933;">==</span> <span style="color: #CC0000;">7</span><span style="color: #009900;">&#41;</span> sJYM <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;5&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>iJYM <span style="color: #339933;">==</span> <span style="color: #CC0000;">8</span><span style="color: #009900;">&#41;</span> sJYM <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;4&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>iJYM <span style="color: #339933;">==</span> <span style="color: #CC0000;">9</span><span style="color: #009900;">&#41;</span> sJYM <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;3&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>iJYM <span style="color: #339933;">==</span> <span style="color: #CC0000;">10</span><span style="color: #009900;">&#41;</span> sJYM <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;2&quot;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> cCheck <span style="color: #339933;">=</span> v_card.<span style="color: #660066;">charAt</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">17</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> cCheck <span style="color: #339933;">!=</span> sJYM <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//对不上就是假号码</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://luy.li/2011/01/01/sfzhm/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>[转] ldd 的一个安全问题</title>
		<link>http://luy.li/2009/10/28/ldd-arbitrary-code-execution/</link>
		<comments>http://luy.li/2009/10/28/ldd-arbitrary-code-execution/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 03:45:05 +0000</pubDate>
		<dc:creator>bones7456</dc:creator>
				<category><![CDATA[备忘]]></category>

		<guid isPermaLink="false">http://li2z.cn/?p=1153</guid>
		<description><![CDATA[本文的英文原文来自这里，作者：Peteris Krumins；中文译文转自酷壳，译者：陈皓。 我们知道“ldd”这个命令主要是被程序员或是管理员用来查看可执行文件所依赖的动态链接库的。是的，这就是这个命令的用处。可是，这个命令比你想像的要危险得多，也许很多黑客通过ldd的安全问题来攻击你的服务器。其实，ldd的安全问题存在很长的时间了，但居然没有被官方文档所记录来下，这听上去更加难以理解了。怎么？是不是听起来有点不可思议？下面，让我为你细细道来。 首先，我们先来了解一下，我们怎么来使用ldd的，请你看一下下面的几个命令： (1) $ ldd /bin/grep linux-gate.so.1 =&#62; &#40;0xffffe000&#41; libc.so.6 =&#62; /lib/libc.so.6 &#40;0xb7eca000&#41; /lib/ld-linux.so.2 &#40;0xb801e000&#41; (2) $ LD_TRACE_LOADED_OBJECTS=1 /bin/grep linux-gate.so.1 =&#62; &#40;0xffffe000&#41; libc.so.6 =&#62; /lib/libc.so.6 &#40;0xb7e30000&#41; /lib/ld-linux.so.2 &#40;0xb7f84000&#41; (3) $ LD_TRACE_LOADED_OBJECTS=1 /lib/ld-linux.so.2 /bin/grep linux-gate.so.1 =&#62; &#40;0xffffe000&#41; libc.so.6 =&#62; /lib/libc.so.6 &#40;0xb7f7c000&#41; /lib/ld-linux.so.2 &#40;0xb80d0000&#41; 第(1)个命令，我们运行了 `ldd` 于 `/bin/grep`。我们可以看到命令的输出是我们想要的，那就是 `/bin/grep` 所依赖的动态链接库。 第(2)个命令设置了一个叫 LD_TRACE_LOADED_OBJECTS 的环境变量，然后就好像在运行命令 `/bin/grep` (但其实并不是)。 [...]]]></description>
			<content:encoded><![CDATA[<p>本文的英文原文来自<a href="http://www.catonmat.net/blog/ldd-arbitrary-code-execution/">这里</a>，作者：Peteris Krumins；中文译文转自<a href="http://coolshell.cn/?p=1626">酷壳</a>，译者：<a href="http://blog.csdn.net/haoel">陈皓</a>。</p>
<p>我们知道“ldd”这个命令主要是被程序员或是管理员用来查看可执行文件所依赖的动态链接库的。是的，这就是这个命令的用处。可是，这个命令比你想像的要危险得多，也许很多黑客通过ldd的安全问题来攻击你的服务器。其实，ldd的安全问题存在很长的时间了，但居然没有被官方文档所记录来下，这听上去更加难以理解了。怎么？是不是听起来有点不可思议？下面，让我为你细细道来。</p>
<p>首先，我们先来了解一下，我们怎么来使用ldd的，请你看一下下面的几个命令：<br />
(1)</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ldd</span> <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">grep</span>
        linux-gate.so.1 =<span style="color: #000000; font-weight: bold;">&gt;</span>  <span style="color: #7a0874; font-weight: bold;">&#40;</span>0xffffe000<span style="color: #7a0874; font-weight: bold;">&#41;</span>
        libc.so.6 =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>libc.so.6 <span style="color: #7a0874; font-weight: bold;">&#40;</span>0xb7eca000<span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>ld-linux.so.2 <span style="color: #7a0874; font-weight: bold;">&#40;</span>0xb801e000<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>(2)</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #007800;">LD_TRACE_LOADED_OBJECTS</span>=<span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">grep</span>
        linux-gate.so.1 =<span style="color: #000000; font-weight: bold;">&gt;</span>  <span style="color: #7a0874; font-weight: bold;">&#40;</span>0xffffe000<span style="color: #7a0874; font-weight: bold;">&#41;</span>
        libc.so.6 =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>libc.so.6 <span style="color: #7a0874; font-weight: bold;">&#40;</span>0xb7e30000<span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>ld-linux.so.2 <span style="color: #7a0874; font-weight: bold;">&#40;</span>0xb7f84000<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>(3)</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #007800;">LD_TRACE_LOADED_OBJECTS</span>=<span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>ld-linux.so.2 <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">grep</span>
        linux-gate.so.1 =<span style="color: #000000; font-weight: bold;">&gt;</span>  <span style="color: #7a0874; font-weight: bold;">&#40;</span>0xffffe000<span style="color: #7a0874; font-weight: bold;">&#41;</span>
        libc.so.6 =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>libc.so.6 <span style="color: #7a0874; font-weight: bold;">&#40;</span>0xb7f7c000<span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>ld-linux.so.2 <span style="color: #7a0874; font-weight: bold;">&#40;</span>0xb80d0000<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>第(1)个命令，我们运行了 `ldd` 于 `/bin/grep`。我们可以看到命令的输出是我们想要的，那就是 `/bin/grep` 所依赖的动态链接库。<br />
第(2)个命令设置了一个叫 LD_TRACE_LOADED_OBJECTS 的环境变量，然后就好像在运行命令 `/bin/grep` (但其实并不是)。 其运行结果和ldd的输出是一样的！<br />
第(3)个命令也是设置了环境变量 LD_TRACE_LOADED_OBJECTS ，然后调用了动态链接库 `ld-linux.so` 并把 `/bin/grep` 作为参数传给它。我们发现，其输出结果还是和前面两个一样的。</p>
<p><strong><big>具体发生了什么？</big></strong></p>
<p>对于第二个和第三个命令来说，好像是对 `ldd` 的一个包装或是一个隐式调用。对于第二个和第三个命令来说， `/bin/grep` 这个命令就根本没有被运行。这是一个GNU动态载入器的怪异的特性。如果其注意到环境变量LD_TRACE_LOADED_OBJECTS 被设置了，那么它就不会去执行那个可运行的程序，而去输出这个可执行程序所依赖的动态链接库 （在BSD 系统上的`ldd` 是一个C 程序)。<br />
如果你使用的是Linux，那么，你可以去看看 `ldd` 程序，你会发现这是一个 bash 的脚本。如果你仔细查看这个脚本的源码，你会发现，第二个命令和第三个命令的差别就在于 `ld-linux.so` 装载器是否可以被`ldd`所装载，如果不能，那就是第二个命令，如果而的话，那就是第三个命令。<br />
所以，如果我们可以让`ld-linux.so` 装载器失效的话，或是让别的装载器来取代这个系统默认的动态链接库的话，那么我们就可以让 `ldd`来载入并运行我们想要程序了——使用不同的载装器并且不处理LD_TRACE_LOADED_OBJECTS 环境变量，而是直接运行程序。<br />
例如，你可以创建一个具有恶意的程序，如： ~/app/bin/exec 并且使用他自己的装载器 ~/app/lib/loader.so。如果某人（比如超级用户root） 运行了 `ldd /home/you/app/bin/exec` ，于是，他就玩完了。因为，那并不会列出所依赖的动态链接库，而是，直接执行你的那个恶意程序，这相当于，那个用户给了你他的授权。</p>
<p><strong><big>编译一个新的装载器</big></strong></p>
<p>下载 uClibc C库。这是一个相当漂亮的代码，并且可以非常容易地修改一下源代码，使其忽略 LD_TRACE_LOADED_OBJECTS 检查。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">mkdir</span> app
$ <span style="color: #7a0874; font-weight: bold;">cd</span> app
app$ <span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #ff0000;">'http://www.uclibc.org/downloads/uClibc-0.9.30.1.tar.bz2'</span></pre></div></div>

<p>解压这个包，并执行 `make menuconfig`，选项你的平台架构（比如：i386），剩下的事情保持不变。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">bunzip2</span> <span style="color: #000000; font-weight: bold;">&lt;</span> uClibc-0.9.30.1.tar.bz2 <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-vx</span>
$ <span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-rf</span> uClibc-0.9.30.1.tar.bz2
$ <span style="color: #7a0874; font-weight: bold;">cd</span> uClibc-0.9.30.1
$ <span style="color: #c20cb9; font-weight: bold;">make</span> menuconfig</pre></div></div>

<p>编辑 .config 并设置目标安装目录：到 `/home/you/app/uclibc`，</p>

<div class="wp_syntax"><div class="code"><pre class="config" style="font-family:monospace;">RUNTIME_PREFIX=&quot;/usr/$(TARGET_ARCH)-linux-uclibc/&quot;
DEVEL_PREFIX=&quot;/usr/$(TARGET_ARCH)-linux-uclibc/usr/&quot;</pre></div></div>

<p>改成</p>

<div class="wp_syntax"><div class="code"><pre class="config" style="font-family:monospace;">RUNTIME_PREFIX=&quot;/home/you/app/uclibc/&quot;
DEVEL_PREFIX=&quot;/home/you/app/uclibc/usr/&quot;</pre></div></div>

<p>(bones7456注： 其实上面这一步也可以在make menuconfig的界面里修改Library Installation Options。)<br />
现在你需要改动一下其源代码，让其忽略LD_TRACE_LOADED_OBJECTS 环境变量的检查。下面是个这修改的diff，你需要修改的是 `ldso/ldso/ldso.c` 文件。你可把下面的这个diff存成一个叫file的文件，然后运行这个命令：`patch -p0 < file`。如果你不这样做的话，那么，我们的黑客程序就无法工作，而我们的这个装载器还是会认为 `ldd` 想列出动态链接库的文件列表。</p>

<div class="wp_syntax"><div class="code"><pre class="diff" style="font-family:monospace;"><span style="color: #888822;">--- ldso/ldso/ldso-orig.c       2009-10-25 00:27:12.000000000 +0300</span>
<span style="color: #888822;">+++ ldso/ldso/ldso.c    2009-10-25 00:27:22.000000000 +0300</span>
<span style="color: #440088;">@@ -404,9 +404,11 @@</span>
         <span style="">&#125;</span>  #endif
<span style="color: #00b000;">+    /*</span>
         if <span style="">&#40;</span>_dl_getenv<span style="">&#40;</span>&quot;LD_TRACE_LOADED_OBJECTS&quot;, envp<span style="">&#41;</span> != NULL<span style="">&#41;</span> <span style="">&#123;</span>
                 trace_loaded_objects++;
         <span style="">&#125;</span>
<span style="color: #00b000;">+    */</span>
   #ifndef __LDSO_LDD_SUPPORT__
         if <span style="">&#40;</span>trace_loaded_objects<span style="">&#41;</span> <span style="">&#123;</span></pre></div></div>

<p>下面让我们来编译并安装它。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">make</span>
$ <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p>(bones7456注：在我的gentoo系统里，make isntall的时候会出点小错，将extra/scripts/unifdef.c里所有的getline改成getline_就可以通过了。)</p>
<p>于是，我们的 uClibc 装载器就被安装了，并且libc 库指向了 /home/you/app/uclibc. 就这么简单，现在，我们需要做的就是把我们的uClibc的装载器 (app/lib/ld-uClibc.so.0)变成默认的。</p>
<p><strong><big>小试牛刀</big></strong></p>
<p>首先，先让我们来创建一个测试程序，这人程序也就是输出些自己的东西，这样可以让我们看到我们的程序被执行了。我们把这个程序放在 `app/bin/`下，叫“myapp.c”，下面是源代码</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>getenv<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;LD_TRACE_LOADED_OBJECTS&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;All your things are belong to me.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Nothing.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>这是一个很简单的代码了，这段代码主要检查一下环境变量LD_TRACE_LOADED_OBJECTS 是否被设置了，如果是，那么恶意程序执行，如果没有，那么程序什么也不发生。</p>
<p>下面是编译程序的命令，大家可以看到，我们静态链接了一些函数库。我们并不想让LD_LIBRARY_PATH这个变量来发挥作用。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #007800;">L</span>=<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>you<span style="color: #000000; font-weight: bold;">/</span>app<span style="color: #000000; font-weight: bold;">/</span>uclibc
$ <span style="color: #c20cb9; font-weight: bold;">gcc</span> -Wl,--dynamic-linker,<span style="color: #007800;">$L</span><span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>ld-uClibc.so.0 \
    -Wl,-rpath-link,<span style="color: #007800;">$L</span><span style="color: #000000; font-weight: bold;">/</span>lib \
    <span style="color: #660033;">-nostdlib</span> \
    myapp.c <span style="color: #660033;">-o</span> myapp \
    <span style="color: #007800;">$L</span><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>crt<span style="color: #000000; font-weight: bold;">*</span>.o \
    -L<span style="color: #007800;">$L</span><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span> \
    <span style="color: #660033;">-lc</span></pre></div></div>

<p>下面是GCC的各个参数的解释：<br />
    * <strong>-Wl,–dynamic-linker,$L/lib/ld-uClibc.so.0</strong> — 指定一个新的装载器。<br />
    * <strong>-Wl,-rpath-link,$L/lib</strong> — 指定一个首要的动态装载器所在的目录，这个目录用于查找动态库。<br />
    * <strong>-nostdlib</strong> — 不使用系统标准库。<br />
    * <strong>myapp.c -o myapp</strong> — 编译myapp.c 成可执行文件 myapp,<br />
    * <strong>$L/usr/lib/crt*.o</strong> — 静态链接runtime 代码<br />
    * <strong>-L$L/usr/lib/</strong> — libc 的目录（静态链接）<br />
    * <strong>-lc</strong> —  C 库</p>
<p>现在让我们来运行一下我们的 `myapp` （没有ldd，一切正常）</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">app<span style="color: #000000; font-weight: bold;">/</span>bin$ .<span style="color: #000000; font-weight: bold;">/</span>myapp
Nothing.</pre></div></div>

<p>LD_TRACE_LOADED_OBJECTS 没有设置，所以输出 “Nothing.” 。<br />
现在，让我们来使用 `ldd` 来看看这个程序的最大的影响力，让我们以root身份来干这个事。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">su</span>
Password:
<span style="color: #666666; font-style: italic;"># ldd ./myapp</span>
All your things are belong to me.</pre></div></div>

<p>哈哈，我们可以看到，ldd触发了我们的恶意代码。于是，我们偷了整个系统！</p>
<p><strong><big>邪恶的程序</big></strong></p>
<p>下面这个例子更为实际一些，如果没有`ldd` ，那程序程序会报错 “error while loading shared libraries” ，这个错误信息会引诱你去去使用 `ldd` 去做检查，如果你是root的话，那么就整个系统就玩完了。而当你可以了 `ldd` 后，它会在干完坏事后，模仿正确的`ldd`的输出，告诉你 `libat.so.0` 不存在。<br />
下面的代码仅仅是向你展示了一下整个想法，代码还需加工和改善。</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;unistd.h&gt;</span>
<span style="color: #339933;">#include &lt;sys/types.h&gt;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*
This example pretends to have a fictitious library 'libat.so.0' missing.
When someone with root permissions runs `ldd this_program`, it does
something nasty in malicious() function.
&nbsp;
I haven't implemented anything malicious but have written down some ideas
of what could be done.
&nbsp;
This is, of course, a joke program. To make it look more real, you'd have
to bump its size, add some more dependencies, simulate trying to open the
missing library, detect if ran under debugger or strace and do absolutely
nothing suspicious, etc.
*/</span>
&nbsp;
<span style="color: #993333;">void</span> pretend_as_ldd<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>linux-gate.so.1 =&gt;  (0xffffe000)<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>libat.so.0 =&gt; not found<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>libc.so.6 =&gt; /lib/libc.so.6 (0xb7ec3000)<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>/lib/ld-linux.so.2 (0xb8017000)<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> malicious<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>geteuid<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #808080; font-style: italic;">/* we are root ... */</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;poof, all your box are belong to us<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;">/* silently add a new user to /etc/passwd, */</span>
        <span style="color: #808080; font-style: italic;">/* or create a suid=0 program that you can later execute, */</span>
        <span style="color: #808080; font-style: italic;">/* or do something really nasty */</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>getenv<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;LD_TRACE_LOADED_OBJECTS&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        malicious<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        pretend_as_ldd<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s: error while loading shared libraries: libat.so.0: &quot;</span>
           <span style="color: #ff0000;">&quot;cannot open shared object file: No such file or directory<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>
           argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">127</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong><big>邪恶的电话</big></strong></p>
<p>事实上来说，上面的那段程序可以影响更具破坏性，因为大多数的系统管理员可能并不知道不能使用 `ldd` 去测试那些不熟悉的执行文件。下面是一段很可能会发现的对话，让我们看看我们的程序是如何更快地获得系统管理员的权限的。</p>
<p>系统管理员的电话狂响……<br />
系统管理员： “同志你好，我是系统管理员，有什么可以帮你的？”<br />
黑客：“管理员同志你好。我有一个程序不能运行，总是报错，错误我也看不懂，你能不能帮我看看？”<br />
系统管理员：“没问题，你的那个程序在哪里？”<br />
黑客： “在我的home目录下，/home/you/app/bin/myapp”。<br />
系统管理员：“ OK，等一些”，黑客在电话这头可以听到一些键盘的敲击声。<br />
系统管理员：“好像是动态链接库的问题，你能告诉我你的程序具体需要什么样的动态链接库吗？”<br />
黑客说: “谢谢，应该没有别的嘛。”<br />
系统管理员：“嗯，查到了，说是没有了 `libat.so.0`这是你自己的动态链接库吗？”<br />
黑客说：“哦，好像是的，你等一下，我看看……” 黑客在那头露出了邪恶的笑，并且，讯速地输入了下面的命令：<br />
`mv ~/.hidden/working_app ~/app/bin/myapp`<br />
`mv ~/.hidden/libat.so.0 ~/app/bin/`<br />
黑客说：“哦，对了，的确是我的不对，我忘了把这个链接库拷过来了，现在应该可以了，谢谢你啊，真是不好意思，麻烦你了”<br />
系统管理员： “没事就行了，下次注意啊！”（然后系统管理心里暗骂，TMD，又一个白痴用户！……）</p>
<p><strong>教训一：千万不要使用 `ldd` 去测试你不知道的文件！<br />
教训二：千万不要相信陌生人！</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://luy.li/2009/10/28/ldd-arbitrary-code-execution/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>ubuntu下，给现有网站加个简单的流量监控的方法</title>
		<link>http://luy.li/2009/09/25/ubuntu_mrtg/</link>
		<comments>http://luy.li/2009/09/25/ubuntu_mrtg/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 14:44:13 +0000</pubDate>
		<dc:creator>bones7456</dc:creator>
				<category><![CDATA[备忘]]></category>

		<guid isPermaLink="false">http://li2z.cn/?p=1074</guid>
		<description><![CDATA[这里假设你已经用LAMP或者其他东西建立好了一个网站，并可以正常访问了。比如我的ubuntu源。 在这样的基础上，如果你要给你的站加一个流量监控的功能的话。可以选择最基础的mrtg。 mrtg是一个基于snmp的web监控软件，可以生成系统信息的图表结果，这个“系统信息”其实不仅包括网络流量，还可以是CPU/负载/内存等其他信息。如果你想监控更多信息，可以参考这个页面。 我这里只以我需要的网络流量为例。 安装必要的包： sudo apt-get install snmpd mrtg 再修改snmpd的配置，编辑 /etc/snmp/snmpd.conf ，找到以下几行，改成这样： # sec.name source community #com2sec paranoid default public #注释掉这行 com2sec readonly default public #再把这行打开 #com2sec readwrite default private 这样，其他进程就可以通过snmp读取相关信息了。记得修改完配置需要 sudo /etc/init.d/snmpd restart 重启一下snmpd。 接下来要修改mrtg的配置了。mrtg的配置文件是 /etc/mrtg.cfg ，他的格式比较复杂。所以mrtg提供了专门的命令行工具──cfgmaker──来生成它的配置文件，你只需要通过给cfgmaker传入特定的参数，即可生成相应的配置。 还是以我的简单应用为例： cfgmaker --global &#34;WorkDir: /data/mirrors/mrtg&#34; public@localhost &#124; sudo tee /etc/mrtg.cfg 这样就把生成的配置文件写入了 /etc/mrtg.cfg，你也可以再打开确认一下是否符合你的要求。 下一步是生成mrtg的index.html文件，方法如下： sudo indexmaker /etc/mrtg.cfg [...]]]></description>
			<content:encoded><![CDATA[<p>这里假设你已经用LAMP或者其他东西建立好了一个网站，并可以正常访问了。比如<a href="http://luy.li/2009/09/18/ubuntu_mirror/">我的ubuntu源</a>。<br />
在这样的基础上，如果你要给你的站加一个流量监控的功能的话。可以选择最基础的<a href="http://oss.oetiker.ch/mrtg/">mrtg</a>。<br />
mrtg是一个基于snmp的web监控软件，可以生成系统信息的图表结果，这个“系统信息”其实不仅包括网络流量，还可以是CPU/负载/内存等其他信息。如果你想监控更多信息，可以参考这个<a href="http://www.phpd.cn/show-56-1.html">页面</a>。<br />
我这里只以我需要的网络流量为例。<br />
安装必要的包：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> snmpd mrtg</pre></div></div>

<p>再修改snmpd的配置，编辑 /etc/snmp/snmpd.conf ，找到以下几行，改成这样：</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">#       sec.name  source          community
#com2sec paranoid  default         public   #注释掉这行
com2sec readonly  default         public    #再把这行打开
#com2sec readwrite default         private</pre></div></div>

<p>这样，其他进程就可以通过snmp读取相关信息了。记得修改完配置需要</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>snmpd restart</pre></div></div>

<p>重启一下snmpd。</p>
<p>接下来要修改mrtg的配置了。mrtg的配置文件是 /etc/mrtg.cfg ，他的格式比较复杂。所以mrtg提供了专门的命令行工具──cfgmaker──来生成它的配置文件，你只需要通过给cfgmaker传入特定的参数，即可生成相应的配置。<br />
还是以我的简单应用为例：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">cfgmaker <span style="color: #660033;">--global</span> <span style="color: #ff0000;">&quot;WorkDir: /data/mirrors/mrtg&quot;</span> public<span style="color: #000000; font-weight: bold;">@</span>localhost <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">tee</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>mrtg.cfg</pre></div></div>

<p>这样就把生成的配置文件写入了 /etc/mrtg.cfg，你也可以再打开确认一下是否符合你的要求。<br />
下一步是生成mrtg的index.html文件，方法如下：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> indexmaker <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>mrtg.cfg <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">tee</span> <span style="color: #000000; font-weight: bold;">/</span>data<span style="color: #000000; font-weight: bold;">/</span>mirrors<span style="color: #000000; font-weight: bold;">/</span>mrtg<span style="color: #000000; font-weight: bold;">/</span>index.html</pre></div></div>

<p>注意了，这个index.html文件只需要手工生成一次，以后就都是静态的了，除非你修改过 /etc/mrtg.cfg 就不用再次生成了。但是这个html文件会引用其他的图片之类的，就需要重新生成了，默认ubuntu的mrtg已经把这个任务加进crontab了，5分钟执行一次，所以稍等片刻，你就可以访问了。<br />
我配置的mrtg访问地址是<a href="http://ubuntu.srt.cn/mrtg/">http://ubuntu.srt.cn/mrtg/</a></p>
<p>另外也参考其他类似的流量统计软件 <a href="http://awstats.sourceforge.net">awstats</a></p>
]]></content:encoded>
			<wfw:commentRss>http://luy.li/2009/09/25/ubuntu_mrtg/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>架设ubuntu源时的两个脚本</title>
		<link>http://luy.li/2009/09/18/script_of_ubuntu_mirror/</link>
		<comments>http://luy.li/2009/09/18/script_of_ubuntu_mirror/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 15:01:35 +0000</pubDate>
		<dc:creator>bones7456</dc:creator>
				<category><![CDATA[备忘]]></category>

		<guid isPermaLink="false">http://li2z.cn/?p=1056</guid>
		<description><![CDATA[最近在折腾新的ubuntu的源，向公司申请了一台配置一般的服务器，另外买了一块硬盘，硬件就有了。 然后装了个ubuntu 9.04 server，装上ssh，再装上nginx，稍微配置一下，服务就好了，这个过程还是蛮简单的，也很顺利，就不多说了。 接下来就可以开始同步数据了。由于我的目标是一个完整的源，所以就没有用apt-mirror之类的工具，而是直接拿rsync抓取上游的数据了。这个数据量是很大的，所以想尽量选择一个速度最快的带rsync的而且是“Up to date”的源，但是在茫茫的ubuntu官方源列表里，这么多源哪个最快呢？当然没有人会告诉你答案，因为每个人的网络环境都不一样啊。所以，最好的办法还是实地测试，所谓磨刀不误砍柴功啊，后面有300多G的数据要下载呢，这个测试绝对有价值。 上脚本（2009-12-12 更新）： #!/bin/bash &#160; rmie&#40;&#41;&#123; while &#91; -n &#34;$1&#34; &#93; ; do &#91; -f $1 &#93; &#38;&#38; rm $1 shift done &#125; &#160; urls=`curl https://launchpad.net/ubuntu/+archivemirrors &#124; \ tr -d &#34;\n&#34; &#124; sed 's/&#60;\/tr&#62;/\n/g' &#124; grep &#34;Up to date&#34;&#124;grep '&#62;rsync&#60;/a&#62;'&#124;awk -F '&#34;' '{print $4}'` rmie res &#123; echo &#34;$urls&#34; [...]]]></description>
			<content:encoded><![CDATA[<p>最近在折腾新的ubuntu的源，向公司申请了一台配置一般的服务器，另外买了一块硬盘，硬件就有了。<br />
然后装了个ubuntu 9.04 server，装上ssh，再装上nginx，稍微配置一下，服务就好了，这个过程还是蛮简单的，也很顺利，就不多说了。<br />
接下来就可以开始同步数据了。由于我的目标是一个完整的源，所以就没有用apt-mirror之类的工具，而是直接拿rsync抓取上游的数据了。这个数据量是很大的，所以想尽量选择一个速度最快的带rsync的而且是“Up to date”的源，但是在茫茫的<a href="https://launchpad.net/ubuntu/+archivemirrors">ubuntu官方源列表</a>里，这么多源哪个最快呢？当然没有人会告诉你答案，因为每个人的网络环境都不一样啊。所以，最好的办法还是实地测试，所谓磨刀不误砍柴功啊，后面有300多G的数据要下载呢，这个测试绝对有价值。<br />
上脚本（2009-12-12 更新）：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
rmie<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">&quot;$1&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> ; <span style="color: #000000; font-weight: bold;">do</span>
        <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-f</span> <span style="color: #007800;">$1</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #007800;">$1</span>
        <span style="color: #7a0874; font-weight: bold;">shift</span>
<span style="color: #000000; font-weight: bold;">done</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #007800;">urls</span>=<span style="color: #000000; font-weight: bold;">`</span>curl https:<span style="color: #000000; font-weight: bold;">//</span>launchpad.net<span style="color: #000000; font-weight: bold;">/</span>ubuntu<span style="color: #000000; font-weight: bold;">/</span>+archivemirrors <span style="color: #000000; font-weight: bold;">|</span> \
<span style="color: #c20cb9; font-weight: bold;">tr</span> <span style="color: #660033;">-d</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span>  <span style="color: #ff0000;">'s/&lt;\/tr&gt;/\n/g'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">&quot;Up to date&quot;</span><span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">'&gt;rsync&lt;/a&gt;'</span><span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #660033;">-F</span> <span style="color: #ff0000;">'&quot;'</span> <span style="color: #ff0000;">'{print $4}'</span><span style="color: #000000; font-weight: bold;">`</span>
rmie res
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$urls</span>&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> url;<span style="color: #000000; font-weight: bold;">do</span> 
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;testing... <span style="color: #007800;">$url</span>&quot;</span>
rmie T
<span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #660033;">-q</span> <span style="color: #660033;">--no-cache</span> <span style="color: #660033;">-O</span> T <span style="color: #ff0000;">&quot;<span style="color: #007800;">$url</span>/ls-lR.gz&quot;</span> <span style="color: #000000; font-weight: bold;">&amp;</span>
<span style="color: #c20cb9; font-weight: bold;">sleep</span> <span style="color: #000000;">5</span>
<span style="color: #c20cb9; font-weight: bold;">kill</span> <span style="color: #000000; font-weight: bold;">%%</span> 
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$url</span> &quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> res
<span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> T <span style="color: #000000; font-weight: bold;">&gt;&gt;</span>res
<span style="color: #000000; font-weight: bold;">done</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span> <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">sort</span> <span style="color: #660033;">-k</span> <span style="color: #000000;">6</span> <span style="color: #660033;">-n</span> res <span style="color: #000000; font-weight: bold;">&gt;</span> fast_mirror_<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>F<span style="color: #000000; font-weight: bold;">`</span>
rmie res T</pre></div></div>

<p>最后你可以 tail fast_mirror_XXX 看到5秒内下载的字节数最多的一个源。我这还真有一个源，能在3秒把7.4M大的ls-lR.gz给下载完的。<br />
然后，你可以先用这个最快的源把大部分数据先更新下来，完了之后，为了保证数据最新，再向官方源更新一次，我用的是这个脚本：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$UID</span> == <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">||</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Must be root to run this script.&quot;</span>; <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span>; <span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #007800;">LOCK</span>=<span style="color: #ff0000;">&quot;/data/sync_sh/lock&quot;</span>
<span style="color: #007800;">LOG</span>=<span style="color: #ff0000;">&quot;/data/sync_sh/log&quot;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">true</span>; <span style="color: #000000; font-weight: bold;">do</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>start sync @ <span style="color: #780078;">`date`</span>&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tee</span> <span style="color: #660033;">-a</span> <span style="color: #007800;">$LOG</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-f</span> <span style="color: #007800;">$LOCK</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;another sync is running, I exiting...&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tee</span> <span style="color: #660033;">-a</span> <span style="color: #007800;">$LOG</span>
	<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">1</span>
<span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #c20cb9; font-weight: bold;">touch</span> <span style="color: #007800;">$LOCK</span>
&nbsp;
<span style="color: #007800;">st</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>s<span style="color: #000000; font-weight: bold;">`</span>
rsync <span style="color: #660033;">--timeout</span>=<span style="color: #000000;">120</span> <span style="color: #660033;">--exclude</span>=<span style="color: #ff0000;">&quot;.~tmp~&quot;</span> <span style="color: #660033;">-avP</span> <span style="color: #660033;">--delete-excluded</span> <span style="color: #660033;">--progress</span> rsync:<span style="color: #000000; font-weight: bold;">//</span>archive.ubuntu.com<span style="color: #000000; font-weight: bold;">/</span>ubuntu<span style="color: #000000; font-weight: bold;">/</span>pool<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight: bold;">/</span>data<span style="color: #000000; font-weight: bold;">/</span>mirrors<span style="color: #000000; font-weight: bold;">/</span>ubuntu<span style="color: #000000; font-weight: bold;">/</span>pool<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #007800;">res</span>=<span style="color: #007800;">$?</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$res</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;rsync pool succ&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tee</span> <span style="color: #660033;">-a</span> <span style="color: #007800;">$LOG</span>
	<span style="color: #007800;">et</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>s<span style="color: #000000; font-weight: bold;">`</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;pool sync use <span style="color: #007800;">$(( $et-$st )</span>) sec = <span style="color: #007800;">$(( ($et-$st)</span>/60 )):<span style="color: #007800;">$(( ($et-$st)</span>%60 ))&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tee</span> <span style="color: #660033;">-a</span> <span style="color: #007800;">$LOG</span>
<span style="color: #000000; font-weight: bold;">else</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;rsync pool failed&quot;</span> <span style="color: #007800;">$res</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tee</span> <span style="color: #660033;">-a</span> <span style="color: #007800;">$LOG</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #007800;">st</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>s<span style="color: #000000; font-weight: bold;">`</span>
rsync <span style="color: #660033;">--timeout</span>=<span style="color: #000000;">120</span> <span style="color: #660033;">--exclude</span>=<span style="color: #ff0000;">&quot;.~tmp~&quot;</span> <span style="color: #660033;">-avP</span> <span style="color: #660033;">--delete-excluded</span> <span style="color: #660033;">--progress</span> rsync:<span style="color: #000000; font-weight: bold;">//</span>archive.ubuntu.com<span style="color: #000000; font-weight: bold;">/</span>ubuntu<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight: bold;">/</span>data<span style="color: #000000; font-weight: bold;">/</span>mirrors<span style="color: #000000; font-weight: bold;">/</span>ubuntu<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #007800;">res</span>=<span style="color: #007800;">$?</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$res</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;rsync all succ&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tee</span> <span style="color: #660033;">-a</span> <span style="color: #007800;">$LOG</span>
        <span style="color: #007800;">et</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>s<span style="color: #000000; font-weight: bold;">`</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;all sync use <span style="color: #007800;">$(( $et-$st )</span>) sec = <span style="color: #007800;">$(( ($et-$st)</span>/60 )):<span style="color: #007800;">$(( ($et-$st)</span>%60 ))&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tee</span> <span style="color: #660033;">-a</span> <span style="color: #007800;">$LOG</span>
<span style="color: #000000; font-weight: bold;">else</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;rsync all failed&quot;</span> <span style="color: #007800;">$res</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tee</span> <span style="color: #660033;">-a</span> <span style="color: #007800;">$LOG</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">df</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">&quot;/data&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tee</span> <span style="color: #660033;">-a</span> <span style="color: #007800;">$LOG</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;end sync @ <span style="color: #780078;">`date`</span>&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tee</span> <span style="color: #660033;">-a</span> <span style="color: #007800;">$LOG</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #007800;">$LOCK</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">sleep</span> <span style="color: #000000;">7200</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>这个脚本先更新pool目录，再整个目录更新一遍，这样是为了减少出现软件列表里已经有某软件，但是却下载不到的情况。<br />
脚本常驻运行，在上次更新完以后的2小时，启动下一次更新，这样应该算是国内最新的源了吧？<br />
PS： 感谢服务器达人lupa的walkerxk在我架设源时，给我的热心帮助。</p>
]]></content:encoded>
			<wfw:commentRss>http://luy.li/2009/09/18/script_of_ubuntu_mirror/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>

