<?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>Nutty Coder &#187; Linux</title>
	<atom:link href="http://blog.nuttycoder.com/tag/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.nuttycoder.com</link>
	<description>tech articles</description>
	<lastBuildDate>Wed, 08 Dec 2010 13:26:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>翻入墙内 &#124; 反向SSH Tunnel &#124; Reverse SSH Tunnel</title>
		<link>http://blog.nuttycoder.com/2010/09/06/reverse-ssh-tunnel/</link>
		<comments>http://blog.nuttycoder.com/2010/09/06/reverse-ssh-tunnel/#comments</comments>
		<pubDate>Mon, 06 Sep 2010 08:58:38 +0000</pubDate>
		<dc:creator>Wang Xiaoxing</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[网络 | Network]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[mod_proxy]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[reverse ssh]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[vpn]]></category>
		<category><![CDATA[web proxy]]></category>
		<category><![CDATA[代理]]></category>
		<category><![CDATA[翻墙]]></category>

		<guid isPermaLink="false">http://blog.nuttycoder.com/?p=192</guid>
		<description><![CDATA[状况 &#124; Case 因为GFW的关系，越来越多的网友熟练掌握了使用SSH Tunnel“翻墙”的方法——这种方法使我们通过墙外一台主机作为代理中转访问国际互联网。网上关于SSH翻墙的文章已经很多，无须赘述，提及此只为特别感谢郭嘉。 少数情况下，我们不仅需要翻出墙，可能还需要从墙外翻回来。比如你交友不慎，某个邪恶国家友人强烈要求感受一下国内的网络环境;你如此勤奋以至于希望在家中仍然能够连接到公司网络开工，公司却出于体恤员工的考虑没有提供VPN，此时就需要手段先“翻”到公司的院子里。反向的SSH Tunnel就是这样的手段。 原理 &#124; Principle 在一般的SSH转发模型中，我们从大中华局域网中的Desktop B去SSH连接外部SSH Server X，将A的Px端口映射到X的SSH Server端口（22）。连接建立后我们就可以在应用中指定127.0.0.1:Px为代理。发往127.0.0.1.Px的请求将通过Tunnel发送到X:22，并根据SSH协议中转发的规定转发到外部网络。（此部分图中未表现）。 在反向SSH Tunnel中，我们由大中华局域网内Desktop B用SSH连接外部主机Desktop A上的SSH Server，并建立一个反向Tunnel，将A:Port1映射到B:Port2。相比于一般的正向Tunnel，反向Tunnel允许SSH连接的被动方A将Port1上的请求通过Tunnel转发到B:Port2上。而B上应有一个应用监听Port2，对Port2上的请求做适宜的处理。对于一般的网络代理而言，此“应用”即为SSH Server。SSH Server监听22端口，并对来自SSH Tunnel的请求通过本地网络转发，起到代理的作用。 实例 &#124; Practice 用到反向SSH Tunnel，是因为之前有这样一个需求：我们有一个开发中的网站，将要在外部Web Server（Host A）上布署测试环境，需要在外部主机上获取代码并持续更新。代码通过公司内部的SVN Server（Host S）进行版本控制，公司外部无法访问。我们不希望在外部主机上通过VPN一类软件登录公司网络，而是在必要的时候由内部网络发起连接。因此我们使用反向SSH Tunnel。 创建反向SSH Tunnel的过程由内网的桌面（Host B）来完成 1root@B#ssh -NfR {PORT_A}:localhost:{PORT_B} {HOST_A} -l {USER@HOST_A} 如 1root@desktop#ssh -Nf$ 8080:localhost:9090 www.example.com -l webadmin 输入密码确认后，一个从desktop:8080到www.example.com:9090的反向Tunnel就建好了。在Host A上用 1netstat -ntl &#124; grep [...]]]></description>
			<content:encoded><![CDATA[<ul>
<h3>
<ol>状况 | Case</ol>
</h3>
<p>因为GFW的关系，越来越多的网友熟练掌握了使用<a href="http://en.wikipedia.org/wiki/Secure_Shell">SSH</a> Tunnel“翻墙”的方法——这种方法使我们通过墙外一台主机作为代理中转访问<b>国际</b>互联网。网上关于SSH翻墙的文章已经很多，无须赘述，提及此只为特别感谢郭嘉。<br />
少数情况下，我们不仅需要翻出墙，可能还需要从墙外翻回来。比如<del datetime="2010-09-06T07:32:35+00:00">你交友不慎，某个邪恶国家友人强烈要求感受一下国内的网络环境;</del>你如此勤奋以至于希望在家中仍然能够连接到公司网络开工，公司却出于体恤员工的考虑没有提供VPN，此时就需要手段先“翻”到公司的院子里。反向的SSH Tunnel就是这样的手段。</p>
<h3>
<ol>原理 | Principle</ol>
</h3>
<p><div id="attachment_196" class="wp-caption alignnone" style="width: 610px"><a href="http://blog.nuttycoder.com/wp-content/uploads/2010/09/Reverse-SSH-Tunnel2.jpg"><img src="http://blog.nuttycoder.com/wp-content/uploads/2010/09/Reverse-SSH-Tunnel2-e1283763921227.jpg" alt="反向SSH Tunnel原理图" title="Reverse SSH Tunnel" width="600" height="356" class="size-full wp-image-196" /></a><p class="wp-caption-text">反向SSH Tunnel原理</p></div><br />
在一般的SSH转发模型中，我们从<del datetime="2010-09-06T07:32:35+00:00">大中华</del>局域网中的Desktop B去SSH连接外部SSH Server X，将A的Px端口映射到X的SSH Server端口（22）。连接建立后我们就可以在应用中指定127.0.0.1:Px为代理。发往127.0.0.1.Px的请求将通过Tunnel发送到X:22，并根据SSH协议中转发的规定转发到外部网络。（此部分图中未表现）。<br />
在反向SSH Tunnel中，我们由<del datetime="2010-09-06T07:32:35+00:00">大中华</del>局域网内Desktop B用SSH连接外部主机Desktop A上的SSH Server，并建立一个反向Tunnel，将A:Port1映射到B:Port2。相比于一般的正向Tunnel，反向Tunnel允许SSH连接的被动方A将Port1上的请求通过Tunnel转发到B:Port2上。而B上应有一个应用监听Port2，对Port2上的请求做适宜的处理。对于一般的网络代理而言，此“应用”即为SSH Server。SSH Server监听22端口，并对来自SSH Tunnel的请求通过本地网络转发，起到代理的作用。</p>
<h3>
<ol>实例 | Practice</ol>
</h3>
<p>用到反向SSH Tunnel，是因为之前有这样一个需求：我们有一个开发中的网站，将要在外部Web Server（Host A）上布署测试环境，需要在外部主机上获取代码并持续更新。代码通过公司内部的SVN Server（Host S）进行版本控制，公司外部无法访问。我们不希望在外部主机上通过VPN一类软件登录公司网络，而是在必要的时候由内部网络发起连接。因此我们使用反向SSH Tunnel。<br />
创建反向SSH Tunnel的过程由内网的桌面（Host B）来完成</p>
<div class="codecolorer-container text mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">root@B#ssh -NfR {PORT_A}:localhost:{PORT_B} {HOST_A} -l {USER@HOST_A}</div></td></tr></tbody></table></div>
<p>如</p>
<div class="codecolorer-container text mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">root@desktop#ssh -Nf$ 8080:localhost:9090 www.example.com -l webadmin</div></td></tr></tbody></table></div>
<p>输入密码确认后，一个从desktop:8080到www.example.com:9090的反向Tunnel就建好了。在Host A上用</p>
<div class="codecolorer-container text mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">netstat -ntl | grep 127</div></td></tr></tbody></table></div>
<p>将看到9090端口已经在监听。此后发往www.example.com:9090的请求将被通过Tunnel转送到desktop:8080。<br />
接下来我们对转发到Host B的8080端口上的请求做处理。在本例中，我们使用Apache Server的Proxy Module来转发请求。为此，首先要确认Apache有安装好mod_proxy和mod_http_proxy。然后，在Apache中添加虚拟主机，配置如下：</p>
<div class="codecolorer-container text mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">NameVirtualHost *:8080<br />
Listen 8080<br />
# ...<br />
&lt;VirtualHost *:8080&gt;<br />
&nbsp; &nbsp; ServerName svn.company-domain.com<br />
<br />
&nbsp; &nbsp; ProxyPass / http://svn.company-domain.com/<br />
&nbsp; &nbsp; ProxyPassReverse / http://svn.company-domain.com/<br />
&nbsp; &nbsp; &lt;Proxy *&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; Order deny,allow<br />
&nbsp; &nbsp; &nbsp; &nbsp; Allow from all<br />
&nbsp; &nbsp; &lt;/Proxy&gt;<br />
&nbsp; &nbsp; &lt;Directory /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; Order allow,deny<br />
&nbsp; &nbsp; &nbsp; &nbsp; Allow from all<br />
&nbsp; &nbsp; &lt;/Directory&gt;<br />
&lt;/VirtualHost&gt;</div></td></tr></tbody></table></div>
<p>此配置将在8080端口上建立虚拟主机，并将发往此主机的所有请求转发到http://svn.company-domain.com/。<br />
这样，一个完整的Reverse SSH Tunnel就建好了。在SSH Tunnel连通时，我们可以使用svn co http://172.0.0.1:9090/trunk/myproject/&#8230;/在Host A上下载源码。这个请求首先通过Tunnel进入公司网络，被转发到desktop:8080。然后，再被Apache根据mod_proxy的设置转发到svn.company-domina.com。SVN Server的响应也会按照原路逐级转发回到外部主机Host A。当然，我们也可以再做一些锦上添花的工作比如修改Host A上的本地DNS，将svn.company-domain.com解析到127.0.0.1。<br />
当必要的任务完成后，只要在Host B上断开SSH连接，外部主机Host A将没有办法访问内部网络。</p>
<h3>
<ol>更多 | More</ol>
</h3>
<p>以上只是实现了一个基本的反向SSH Tunnel实例，在此基础上我们还可以做很多，比如最重要的安全策略。我们可以在Host A（www.example.com）上限制对9090（PORT_A）的访问，在Host B上对SSH Server和Apache Proxy做相应的权限，日志等设置。<br />
另外，虽然从安全模型上说，这种由内部网络主动发起并且可控的连接是可以信任的，但是此办法实质是在公司防火墙上开了个后门。所以在使用前还是要看看公司安全规定有否相关约束。<br />
关于SSH用法还有无数的内容，部分可参考下面的资源。</p>
<h3>
<ol>资源 | Resource</ol>
</h3>
<p><a href="http://en.wikipedia.org/wiki/Secure_Shell">Secure Shell</a><br />
<a href="http://articles.techrepublic.com.com/5100-10878_11-5779944.html?tag=nl.e011">Setting up a reverse SSH tunnel</a><br />
<a href="http://network.51cto.com/art/201007/209108.htm">深入讲解SSH协议的转发概念</a><br />
<a href="http://josephjiang.com/entry.php?id=312">反向建立 SSH Tunnel、免 VPN 連回公司</a><br />
<a href="http://www.ubuntu-tw.org/modules/newbb/viewtopic.php?viewmode=compact&#038;topic_id=17538&#038;forum=7">上班族ssh tunnel求生手冊</a><br />
<a href="http://hi.baidu.com/thinkinginlamp/blog/item/4e1d510fe7c811216059f3ea.html">SSH Tunnel扫盲</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nuttycoder.com/2010/09/06/reverse-ssh-tunnel/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>用Shell Script导出SVN版本间变更的文件</title>
		<link>http://blog.nuttycoder.com/2010/06/04/export-updated-files-in-svn-with-shell-scrip/</link>
		<comments>http://blog.nuttycoder.com/2010/06/04/export-updated-files-in-svn-with-shell-scrip/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 09:52:12 +0000</pubDate>
		<dc:creator>Wang Xiaoxing</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[grep]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[sed]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://blog.nuttycoder.com/?p=150</guid>
		<description><![CDATA[#!/bin/bash # 配置 # TODO 将配置信息保存在外部文件中以方便产生不同目标的导出。 START=9981 END=10054 VER=eom BUILD=v1 OUTPUT_PATH=builds/$VER/$BUILD/files/ # 清理 if [ -d &#34;$OUTPUT_PATH&#34; ]; then rm -rf $OUTPUT_PATH fi # 得到更改过的文件数量和文件名列表 # svn diff --summarize 返回&#34;Status \t Filename&#34; COUNT=`svn diff --summarize -r $START:$END &#124; wc -l` Diff=`svn diff --summarize -r $START:$END` until [ $COUNT -lt &#34;1&#34; ] do # echo &#34;$Diff&#34; [...]]]></description>
			<content:encoded><![CDATA[<pre class="brush: plain; title: ;">
#!/bin/bash

# 配置
# TODO 将配置信息保存在外部文件中以方便产生不同目标的导出。
START=9981
END=10054
VER=eom
BUILD=v1
OUTPUT_PATH=builds/$VER/$BUILD/files/

# 清理
if [ -d &quot;$OUTPUT_PATH&quot; ]; then
	rm -rf $OUTPUT_PATH
fi

# 得到更改过的文件数量和文件名列表
# svn diff --summarize 返回&quot;Status \t Filename&quot;

COUNT=`svn diff --summarize -r $START:$END | wc -l`
Diff=`svn diff --summarize -r $START:$END`
until [ $COUNT -lt &quot;1&quot; ]
do
	# echo &quot;$Diff&quot; 的用法也许不合适。
	# awk pattern action, 'print $2' 即输出第二列的内容
	# grep -v 反向选择，即不含模式的。此为“选取路径不以builds开头的文件”

	File=&quot;`echo &quot;$Diff&quot; | awk {'print $2'} | grep &quot;^builds&quot; -v | head -$COUNT | tail -1`&quot;
	Dir=`dirname $File`
	Name=`basename $File`

	# 检查目标路径，如不存在则递归的创建

	if [ ! -d &quot;$OUTPUT_PATH$Dir&quot; ]; then
		mkdir $OUTPUT_PATH$Dir -p
	fi

	# 将文件中的string1替换为string2，并且输出到目标路径
	# 此处是将两个操作合并，也可先做cp，再替换
	sed 's/string1/string2/g' $File &amp;gt; $OUTPUT_PATH$Dir/$Name

	# 如果目标文件中含有string3，则将之替换为string4，在目标文件上操作。
	if grep &quot;string3&quot; $File &amp;gt; /dev/null
	then
		sed -in-place -e 's/string3/string4/g' $OUTOUT_PATH$Dir/$Name
	fi

	# 去除string5
	if grep &quot;string5&quot; $File &amp;gt; /dev/null
	then
		sed -in-place -e 's/string5\///g' $OUTPUT_PATH$Dir/$Name
	fi

	# more replace here
	# TODO

	# replace configure variables, need define configure file
	# TODO

	COUNT=`expr $COUNT - 1`
done

# export changed database table
# TODO

# commit to svn
# TODO
</pre>
<p>另外记录一条批量替换字串的命令：</p>
<pre class="brush: plain; title: ;">
sed -i 's/pattern/new/g' `grep -rl 'pattern' *`
# sed -i: in place，在原文件上操作
# grep -r: recursive，递归的，遍历所有子目录下的文件
# grep -l: file with matches，返回包含有模式的文件
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.nuttycoder.com/2010/06/04/export-updated-files-in-svn-with-shell-scrip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux下DB2的问题总结</title>
		<link>http://blog.nuttycoder.com/2010/05/03/linux-db2-faqs/</link>
		<comments>http://blog.nuttycoder.com/2010/05/03/linux-db2-faqs/#comments</comments>
		<pubDate>Mon, 03 May 2010 10:39:43 +0000</pubDate>
		<dc:creator>Benny Chen</dc:creator>
				<category><![CDATA[DB2]]></category>
		<category><![CDATA[db2]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.nuttycoder.com/?p=134</guid>
		<description><![CDATA[使用db2cc命令启动db2 control center时出现 &#8211; Error: Can&#8217;t connect to X11 window server using &#8217;0.0&#8242; as the value of the DISPLAY 解决方法: 12- su root - xhost + 关于xhost: http://linux.about.com/library/cmd/blcmdl_xhost.htm 使用control center操控数据库时抛出SQL4414N错误 解决方法: 12- su dasusr1 - db2admin start 在用db2move导出数据库时出现如下的错误 Application code page not determined, using ANSI codepage 1208 Error opening list file. Terminating &#8230; **Error occured [...]]]></description>
			<content:encoded><![CDATA[<ol>
<h3>
<li>使用db2cc命令启动db2 control center时出现 &#8211; Error: Can&#8217;t connect to X11 window server using &#8217;0.0&#8242; as the value of the DISPLAY</li>
</h3>
<p>
解决方法:</p>
<div class="codecolorer-container text mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">- su root<br />
- xhost +</div></td></tr></tbody></table></div>
<p>关于xhost: <a href="http://linux.about.com/library/cmd/blcmdl_xhost.htm">http://linux.about.com/library/cmd/blcmdl_xhost.htm</a>
</p>
<h3>
<li>使用control center操控数据库时抛出SQL4414N错误</li>
</h3>
<p>
解决方法:</p>
<div class="codecolorer-container text mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">- su dasusr1<br />
- db2admin start</div></td></tr></tbody></table></div>
</p>
<h3>
<li>在用db2move导出数据库时出现如下的错误<br />
Application code page not determined, using ANSI codepage 1208<br />
Error opening list file.  Terminating &#8230;<br />
**Error occured while opening a file.</li>
</h3>
<p>
解决方法：<br />
db2的用户对于当前文件夹没有写权限，使用chown改变owner或者chmod改变权限。</p>
<div class="codecolorer-container text mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">chown db2inst1:db2iadm1 $directory_name -R</div></td></tr></tbody></table></div>
</p>
<h3>
<li>如何卸载db2</li>
</h3>
<ol>
<li>删除所有关联的instance</li>
<p>$DB2DIR/instance/db2idrop InstName</p>
<li>删除db2</li>
<p>$DB2DIR/install/db2_deinstall -a
</ol>
</p>
<h3>
<li>$DB2DIR的include目录下为何只有一个asn.h</li>
</h3>
<p>
原因是在安装db2的时候，可能选用了typical模式，则不会安装这些头文件。使用custom 模式，并在select features to install中选中SDK
</p>
<h3>
<li>如何查看db2的版本</li>
</h3>
<p>
db2level</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nuttycoder.com/2010/05/03/linux-db2-faqs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

