<?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&#039;m rem1x.</title>
	<atom:link href="http://imxie.net/feed" rel="self" type="application/rss+xml" />
	<link>http://imxie.net</link>
	<description>生活和工作的点滴记录</description>
	<lastBuildDate>Fri, 22 Jul 2011 10:00:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>net-snmp之利用pass做snmpget和snmpset</title>
		<link>http://imxie.net/2011/07/use_pass_for_snmp_get_and_set.htm</link>
		<comments>http://imxie.net/2011/07/use_pass_for_snmp_get_and_set.htm#comments</comments>
		<pubDate>Fri, 22 Jul 2011 09:51:04 +0000</pubDate>
		<dc:creator>rem1x</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[pass]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[snmp]]></category>

		<guid isPermaLink="false">http://imxie.net/?p=378</guid>
		<description><![CDATA[前几天写了一个运维工具，用来监控夜间业务的处理情况。 虽然是生产网，但由于都是内部网络，所以决定谨慎采用snmp来获取一些信息。其中的一个需求是，根据某个指定的业务日期从远程服务器的日志中分析产生结果，然后将结果在本地监控机上呈现。 这个需求的实现有很多种方法，我这边利用 net-snmp 的扩展命令 pass 调用 shell 脚本来实现。通过 man snmpd.conf(5) 可知，net-snmp支持自定义的脚本以获取需要的信息，那就是扩展命令exec、extend 和 pass（三者的区别详见此 FAQ）。 pass命令整合了三个EXEC执行过程： PROG -g MIBOID       &#8212; g 代表 get PROG -n MIBOID       &#8212; n 代表 getnext 上述两条调用指令对应的功能便是 snmpget 和 snmpgetnext，PROG 表示 Shell脚本本身 。 如果你在某台监控机上执行 snmpget 命令来通过 pass 调用 shell 脚本获取信息时，shell 脚本的输出结果是有格式要求的： 输出到 stdout 的第一行必须是 MIB OID 第二行必须是 TYPE （string, integer, unsigned, [...]]]></description>
			<content:encoded><![CDATA[<p>前几天写了一个运维工具，用来监控夜间业务的处理情况。</p>
<p>虽然是生产网，但由于都是内部网络，所以决定谨慎采用snmp来获取一些信息。其中的一个需求是，根据某个指定的业务日期从远程服务器的日志中分析产生结果，然后将结果在本地监控机上呈现。</p>
<p>这个需求的实现有很多种方法，我这边利用 net-snmp 的扩展命令 pass 调用 shell 脚本来实现。通过 man snmpd.conf(5) 可知，net-snmp支持自定义的脚本以获取需要的信息，那就是扩展命令exec、extend 和 pass（三者的区别详见此<a title="What's the difference between 'exec', 'sh' and 'pass'? " href="http://www.net-snmp.org/wiki/index.php/FAQ:Agent_07" target="_blank"> FAQ</a>）。<span id="more-378"></span></p>
<p>pass命令整合了三个EXEC执行过程：</p>
<p><span style="color: #ff6600;"><strong>PROG -g MIBOID       &#8212; g 代表 get</strong></span></p>
<p><span style="color: #ff6600;"><strong>PROG -n MIBOID       &#8212; n 代表 getnext</strong></span></p>
<p>上述两条调用指令对应的功能便是 snmpget 和 snmpgetnext，<strong>PROG</strong> 表示 Shell脚本本身 。</p>
<p>如果你在某台监控机上执行 snmpget 命令来通过 pass 调用 shell 脚本获取信息时，shell 脚本的输出结果是有格式要求的：</p>
<p>输出到 stdout 的第一行必须是 <strong>MIB OID</strong><br />
第二行必须是<strong> TYPE</strong> （string, integer, unsigned, objectid, timeticks, ipaddress, counter,  gauge）<br />
第三行必须是与 TYPE 相对应的<strong> VALUE</strong></p>
<p>举个例子，假如 oid .1.3.6.1.4.100 的值是整数42，当使用自定义的脚本去获取时 ，其结果输出必须返回下面三行内容：</p>
<blockquote><p><span style="color: #000080;">.1.3.6.1.4.100</span><br />
<span style="color: #000080;"> integer</span><br />
<span style="color: #000080;"> 42</span></p></blockquote>
<p>如果在获取某个oid的值时出现错误，那么脚本可以直接exit而无需向stdout输出任何的内容，net-snmp 的 snmpget 命令会自动产生noSuchName的错误。</p>
<p><strong><span style="color: #ff6600;">PROG -s MIBOID TYPE VALUE       &#8212; s 代表 set</span></strong></p>
<p>当你执行 snmpset 命令时，自定义脚本的调用格式如上所述。TYPE就是指 integer, counter, gauge, timeticks, ipaddress, objid, string。如果脚本在获取信息时没有出错，无需向stdout输出任何内容，直接exit即可；否则，需要向 stdout 输出 not-writable 或者 wrong-type。</p>
<p>如何开启 pass 呢？ 编辑 /etc/snmp/snmpd.conf 配置文件，加入如下类似的语句：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">pass  .1.3.6.1.4.1.2021.255  <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">bash</span>  <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>rem1x<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>passecho</pre></div></div>

<p>其中的 oid 是由你自己选择的，passecho是自定义的Shell脚本，通过bash调用。</p>
<p>一个简单的Shell脚本模板：</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;
<span style="color: #007800;">opt</span>=<span style="color: #007800;">$1</span>
<span style="color: #007800;">oid</span>=<span style="color: #007800;">$2</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$opt</span>&quot;</span> = <span style="color: #ff0000;">&quot;-g&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
    do_the_snmpget
    ...
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$oid</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> TYPE
    <span style="color: #7a0874; font-weight: bold;">echo</span> VALUE
<span style="color: #000000; font-weight: bold;">elif</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$opt</span>&quot;</span> = <span style="color: #ff0000;">&quot;-n&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
    do_the_snmpgetnext
    ...
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$oid</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> TYPE
    <span style="color: #7a0874; font-weight: bold;">echo</span> VALUE
<span style="color: #000000; font-weight: bold;">elif</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$opt</span>&quot;</span> = <span style="color: #ff0000;">&quot;-s&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
    do_the_snmpset
    ...
    if_success, exit_directly
    if_fail, <span style="color: #7a0874; font-weight: bold;">echo</span> not-writable or wrong-type
<span style="color: #000000; font-weight: bold;">fi</span>  
&nbsp;
<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://imxie.net/2011/07/use_pass_for_snmp_get_and_set.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Archlinux上使用PRO*C 开发Oracle程序之sqlca (1)</title>
		<link>http://imxie.net/2011/06/use_proc_dev_oracle_app_on_archlinux.htm</link>
		<comments>http://imxie.net/2011/06/use_proc_dev_oracle_app_on_archlinux.htm#comments</comments>
		<pubDate>Sun, 26 Jun 2011 06:11:18 +0000</pubDate>
		<dc:creator>rem1x</dc:creator>
				<category><![CDATA[programing]]></category>
		<category><![CDATA[archlinux]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[proc]]></category>
		<category><![CDATA[sqlca]]></category>

		<guid isPermaLink="false">http://imxie.net/?p=367</guid>
		<description><![CDATA[关于在archlinux上安装oracle客户端，可参考wiki：https://wiki.archlinux.org/index.php/Oracle 访问Oracle数据库的C语言编程接口，比较常见的是PRO*C和oci，前者是一种以C语言作为宿主的预编译语言，后者则是一套现成的数据库访问API。比如，俺们公司的后台的一些重要系统现在主要以Oracle系列数据库为主，开发语言基本是C，pro*c和oci在项目中都有使用。一句话，PRO*C上手容易，编码简单，但受约束；oci直接以API形式调用，效率最高，但学习成本高，一般都会做二次封装（有个C++的封装库：OTL）。 本文主要说明在使用PRO*C时，如果需要定义局部sqlca变量时，该做哪些准备工作。 如果你的程序只使用全局的sqlca变量，那么 #include &#60;sqlca.h&#62; 就完事儿了，文章到此可以直接 return 0 。 SQLCA称为SQL通讯区，用于记录每个SQL语句的执行状态，以便进行错误诊断，它是一个结构体，存在于sqlca.h头文件中： struct sqlca { /* ub1 */ char    sqlcaid[8]; /* b4   */ int     sqlabc; /* b4   */ int     sqlcode; struct { /* ub2 */ unsigned short sqlerrml; /* ub1 */ char           sqlerrmc[70]; } sqlerrm; /* ub1 */ char    sqlerrp[8]; /* b4   */ int     [...]]]></description>
			<content:encoded><![CDATA[<p>关于在archlinux上安装oracle客户端，可参考wiki：<a href="https://wiki.archlinux.org/index.php/Oracle" target="_blank">https://wiki.archlinux.org/index.php/Oracle</a></p>
<p>访问Oracle数据库的C语言编程接口，比较常见的是PRO*C和oci，前者是一种以C语言作为宿主的预编译语言，后者则是一套现成的数据库访问API。比如，俺们公司的后台的一些重要系统现在主要以Oracle系列数据库为主，开发语言基本是C，pro*c和oci在项目中都有使用。一句话，PRO*C上手容易，编码简单，但受约束；oci直接以API形式调用，效率最高，但学习成本高，一般都会做二次封装（有个C++的封装库：<a href="http://otl.sourceforge.net/http://otl.sourceforge.net/" target="_blank">OTL</a>）。</p>
<p>本文主要说明在使用PRO*C时，如果需要定义局部sqlca变量时，该做哪些准备工作。</p>
<p>如果你的程序只使用全局的sqlca变量，那么 <strong><span style="color: #0000ff;">#include &lt;sqlca.h&gt;</span></strong> 就完事儿了，文章到此可以直接 return 0 。</p>
<p><span id="more-367"></span>SQLCA称为SQL通讯区，用于记录每个SQL语句的执行状态，以便进行错误诊断，它是一个结构体，存在于sqlca.h头文件中：</p>
<blockquote><p><span style="color: #ff0000;">struct sqlca {</span><br />
<span style="color: #ff0000;"> /* ub1 */ char    sqlcaid[8];</span><br />
<span style="color: #ff0000;"> /* b4   */ int     sqlabc;</span><br />
<span style="color: #ff0000;"> /* b4   */ int     sqlcode;</span><br />
<span style="color: #ff0000;"> struct {</span><br />
<span style="color: #ff0000;"> /* ub2 */ unsigned short sqlerrml;</span><br />
<span style="color: #ff0000;"> /* ub1 */ char           sqlerrmc[70];</span><br />
<span style="color: #ff0000;"> } sqlerrm;</span><br />
<span style="color: #ff0000;"> /* ub1 */ char    sqlerrp[8];</span><br />
<span style="color: #ff0000;"> /* b4   */ int        sqlerrd[6];</span><br />
<span style="color: #ff0000;"> /* ub1 */ char    sqlwarn[8];</span><br />
<span style="color: #ff0000;"> /* ub1 */ char    sqlext[8];</span><br />
<span style="color: #ff0000;">};</span></p></blockquote>
<p>在执行PRO*C程序时，Oracle会把每一个嵌入式SQL语句执行的状态信息保存在SQLCA结构体里，包括错误代码、警告标志设置、诊断文本和处理行数等。因此，在SQL语句执行之后，可以通过SQLCA的信息来判断SQL语句的执行是否成功，出现了什么错误和例外等等。</p>
<p>当proc的mode=oracle（这是默认的模式）时，SQLCA是需要显示说明的，否则proc预编译就会报错，或者是在连接时失败。SQLCA的说明方式有以下两种：</p>
<p>1. 直接把上述 struct sqlca 的代码写到自己的程序文件中（如果选择这种方法，就别 #include &lt;sqlca.h&gt; 了）；</p>
<p>2. 显示引用：<span style="color: #0000ff;"><strong>EXEC SQL INCLUDE SQLCA</strong></span> （是否 #include &lt;sqlca.h&gt; ，都不影响proc的执行）；</p>
<p>如果你和我一样，需要在一些情况下定义局部的sqlca变量以分开记录不同SQL语句的通讯信息，那么就选择上面两种方法的其中一种，然后在代码里 struct sqlca var_sqlca 定义自己的sqlca变量吧。</p>
<p>请注意，方法二的语句一般放在文件头部。</p>
]]></content:encoded>
			<wfw:commentRss>http://imxie.net/2011/06/use_proc_dev_oracle_app_on_archlinux.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Archlinux升级grub至grub2 [针对bios]</title>
		<link>http://imxie.net/2011/05/upd-grub-to-grub2-on-archlinux-with-bios-system.htm</link>
		<comments>http://imxie.net/2011/05/upd-grub-to-grub2-on-archlinux-with-bios-system.htm#comments</comments>
		<pubDate>Sun, 22 May 2011 02:53:21 +0000</pubDate>
		<dc:creator>rem1x</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[archlinux]]></category>
		<category><![CDATA[bios]]></category>
		<category><![CDATA[grub]]></category>
		<category><![CDATA[grub2]]></category>
		<category><![CDATA[pacman]]></category>

		<guid isPermaLink="false">http://imxie.net/?p=360</guid>
		<description><![CDATA[GRUB2是下一代的多系统引导器，grub即将退位，项目名也改成了grub-legacy。相比grub(目前的版本是0.97)而言，grub2重写了代码以实现模块化和可移植性。 有趣的Grub Logo: 将archlinux的grub升级到grub2是一件很简单的事情，你只需要通过pacman安装新的grub2软件包，转换menu.lst为grub.cfg就可以了。这篇日志的大部分资料来自Archlinux的wiki，命令操作记录来自我的笔电。 首先来搜索一下仓库里的grub2软件包: ~&#62;; pacman -Ss grub2 extra/grub2-bios 1.99~rc2.r3238-1 The GNU GRand Unified Bootloader version 2 &#8211; Built for PC BIOS extra/grub2-common 1.99~rc2.r3238-1 The GNU GRand Unified Bootloader version 2 &#8211; Files common for all platforms extra/grub2-efi-i386 1.99~rc2.r3238-1 The GNU GRand Unified Bootloader version 2 &#8211; i386 UEFI version extra/grub2-efi-x86_64 1.99~rc2.r3238-1 The GNU [...]]]></description>
			<content:encoded><![CDATA[<p>GRUB2是下一代的多系统引导器，grub即将退位，项目名也改成了grub-legacy。相比grub(目前的版本是0.97)而言，grub2重写了代码以实现模块化和可移植性。</p>
<p>有趣的Grub Logo: <img class="alignnone" title="grub logo" src="http://www.inf.sgsp.edu.pl/pub/MALUNKI/LOGO/grub.png" alt="" width="125" height="105" /> <img class="alignnone" title="another grub logo" src="http://www.inf.sgsp.edu.pl/pub/MALUNKI/LOGO/grub2.png" alt="" width="118" height="152" /></p>
<p>将archlinux的grub升级到grub2是一件很简单的事情，你只需要通过pacman安装新的grub2软件包，转换menu.lst为grub.cfg就可以了。这篇日志的大部分资料来自<a href="https://wiki.archlinux.org/index.php/Grub2" target="_blank">Archlinux的wiki</a>，命令操作记录来自我的笔电。</p>
<p>首先来搜索一下仓库里的grub2软件包:</p>
<blockquote><p><span style="color: #993300;">~&gt;; pacman -Ss grub2</span><br />
<span style="color: #993300;"> extra/grub2-bios 1.99~rc2.r3238-1</span><br />
<span style="color: #993300;"> The GNU GRand Unified Bootloader version 2 &#8211; Built for PC BIOS</span><br />
<span style="color: #993300;"> extra/grub2-common 1.99~rc2.r3238-1</span><br />
<span style="color: #993300;"> The GNU GRand Unified Bootloader version 2 &#8211; Files common for all platforms</span><br />
<span style="color: #993300;"> extra/grub2-efi-i386 1.99~rc2.r3238-1</span><br />
<span style="color: #993300;"> The GNU GRand Unified Bootloader version 2 &#8211; i386 UEFI version</span><br />
<span style="color: #993300;"> extra/grub2-efi-x86_64 1.99~rc2.r3238-1</span><br />
<span style="color: #993300;"> The GNU GRand Unified Bootloader version 2 &#8211; x86_64 UEFI version</span></p></blockquote>
<p>你会发现目前仓库里有4个grub2的软件包，做个简单的介绍吧:</p>
<p>grub2-bios            &#8211;&gt; 适用于PC BIOS</p>
<p>grub2-commin    &#8211;&gt; 文件集合（包含了所有平台相关的文件）</p>
<p>grub2-efi-i386      &#8211;&gt; 适用于32位平台的UEFI</p>
<p>grub2-efi-x86_64 &#8211;&gt; 适用于64位平台的UEFI</p>
<p>一般情况下，我们选择安装grub2-bios。什么是UEFI呢？这货全称Unified Extensible Firmware Interface，直译叫做“统一的可扩展固件接口”，这种接口用于操作系统自动从预启动的操作环境，加载到某种操作系统上，从而使开机程序化繁为简，节省时间。UEFI将替代已存在多年的BIOS，目前市场上的主板已经开始采用UEFI 。</p>
<p><span id="more-360"></span>安装和升级步骤:</p>
<p>1) 安装grub2-bios</p>
<blockquote><p><span style="color: #800000;">~&gt;; sudo pacman -S grub2-bios</span><br />
<span style="color: #800000;"> resolving dependencies&#8230;</span><br />
<span style="color: #800000;"> looking for inter-conflicts&#8230;</span><br />
<span style="color: #800000;"> :: grub2-common and grub are in conflict. Remove grub? [y/N] y</span></p>
<p><span style="color: #800000;">Remove (1): grub-0.97-17</span></p>
<p><span style="color: #800000;">Total Removed Size:   0.61 MB</span></p>
<p><span style="color: #800000;">Targets (2): grub2-common-1.99~rc2.r3238-1  grub2-bios-1.99~rc2.r3238-1</span></p>
<p><span style="color: #800000;">Total Download Size:    1.74 MB</span><br />
<span style="color: #800000;"> Total Installed Size:   7.25 MB</span></p>
<p><span style="color: #800000;">Proceed with installation? [Y/n] y</span></p></blockquote>
<p>安装时肯定会报与现有的grub冲突，想装就YY吧。如果你喜欢干净，可以在安装之前先把/boot/grub目录备份到其他地方，然后删除/boot下的grub目录。</p>
<p>2) 擦除MBR上grub-legacy的痕迹。这一步一定要<span style="color: #ff0000;"><strong>小心</strong></span>，如果你的grub安装在MBR上的，需要做这一步操作。of后面跟的是主硬盘的设备名，也许你的是/dev/hda。</p>
<blockquote><p><span style="color: #800000;">~&gt;; sudo dd if=/dev/zero of=/dev/sda bs=<span style="color: #008000;"><strong>440</strong></span> count=1</span><br />
<span style="color: #800000;"> 1+0 records in</span><br />
<span style="color: #800000;"> 1+0 records out</span><br />
<span style="color: #800000;"> 440 bytes (440 B) copied, 3.1918e-05 s, 13.8 MB/s</span></p></blockquote>
<p>3) 安装grub2到MBR</p>
<blockquote><p><span style="color: #800000;">~&gt;; sudo grub_bios-install &#8211;boot-directory=/boot &#8211;no-floppy &#8211;recheck /dev/sda</span><br />
<span style="color: #800000;"> Installation finished. No error reported.</span></p>
<p><span style="color: #800000;">~&gt;; sudo cp /usr/share/grub/{unicode.pf2,ascii.pf2} /boot/grub/</span></p></blockquote>
<p>4) 生成grub2使用的配置文件grub.cfg （可以从 menu.lst 或者 grub.conf 转换过来）</p>
<blockquote><p><span style="color: #800000;">~&gt;; sudo grub-menulst2cfg /boot/grub/menu.lst.pacsave /boot/grub/grub.cfg</span></p></blockquote>
<p>5) 重启系统，检验成果。<br />
结束语：</p>
<p>这里只是介绍了Archlinux上如何将grub（又名grub-legacy）升级到grub2，至于grub2的命令操作、grub.cfg的配置方式则没有给出说明 （你可以在wiki上获得详细内容，下面有链接）</p>
<p>参考资料:</p>
<p>1. Archlinux上有详细的介绍，包括BIOS和UEFI的安装方式，GPT的延伸阅读。</p>
<p>https://wiki.archlinux.org/index.php/GRUB2#For_BIOS_Systems</p>
<p>2. GRUB项目主页</p>
<p>http://www.gnu.org/software/grub/index.html</p>
]]></content:encoded>
			<wfw:commentRss>http://imxie.net/2011/05/upd-grub-to-grub2-on-archlinux-with-bios-system.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Archlinux上使用华为E1780 3G上网</title>
		<link>http://imxie.net/2011/01/use-3g-device-on-linux.htm</link>
		<comments>http://imxie.net/2011/01/use-3g-device-on-linux.htm#comments</comments>
		<pubDate>Wed, 12 Jan 2011 14:54:50 +0000</pubDate>
		<dc:creator>rem1x</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[3G]]></category>
		<category><![CDATA[archlinux]]></category>
		<category><![CDATA[E1780]]></category>
		<category><![CDATA[华为]]></category>
		<category><![CDATA[联通]]></category>

		<guid isPermaLink="false">http://imxie.net/?p=357</guid>
		<description><![CDATA[出差在外，所以买了一张联通的186 3G卡来无线上网，上网设备选择了华为的E1780，因为我觉得外观很好看&#8230; 在linux上3G上网基本上是如下的两步配置流程： 1、使用usb_modeswitch将上网设备的模式转换为modem 2、使用wvdial自动生成配置文件并拨号 关于3G的配置步骤这里不再赘述，google会告诉你很多结果。 usb_modeswitch 和 wvdial 都可通过pacman安装。其他发行版可以通过本身软件仓库安装，或是下载源码包编译安装。 由于，现在的3G上网设备插入后默认是模拟成 cd-rom 用于安装驱动，如果你想3G拨号，必须先将设备转换成usb modem模式。不过貌似高版本的 linux kernel 不需要手动做 usb_modeswitch，我的 E1780 插入后直接正确识别为可拨号的 modem 了。 贴一下配置文件供各位参考。一开始通过wvdialconf自动生成的配置文件没有Init3参数，虽然可以拨号成功，但无法ping通网络，后来增加Init3参数后拨号成功且可以正常上网。没有了解过AT指令，以下配置内容无法做出详细解释了。 我的 /etc/wvdial.conf : [Dialer Defaults] Init1 = ATZ Init2 = ATQ0 V1 E1 S0=0 &#38;C1 &#38;D2 +FCLASS=0 Init3 = AT+CGDCONT=1,&#8221;IP&#8221;,&#8221;3gnet&#8221; Modem Type = Analog Modem Modem = /dev/ttyUSB0 Baud = 460800 ISDN [...]]]></description>
			<content:encoded><![CDATA[<p>出差在外，所以买了一张联通的186 3G卡来无线上网，上网设备选择了华为的E1780，因为我觉得外观很好看&#8230;</p>
<p>在linux上3G上网基本上是如下的两步配置流程：</p>
<p>1、使用usb_modeswitch将上网设备的模式转换为modem</p>
<p>2、使用wvdial自动生成配置文件并拨号</p>
<p>关于3G的配置步骤这里不再赘述，google会告诉你很多结果。</p>
<p><span id="more-357"></span></p>
<p>usb_modeswitch 和 wvdial 都可通过pacman安装。其他发行版可以通过本身软件仓库安装，或是下载源码包编译安装。</p>
<p>由于，现在的3G上网设备插入后默认是模拟成 cd-rom 用于安装驱动，如果你想3G拨号，必须先将设备转换成usb modem模式。不过貌似高版本的 linux kernel 不需要手动做 usb_modeswitch，我的 E1780 插入后直接正确识别为可拨号的 modem 了。</p>
<p>贴一下配置文件供各位参考。一开始通过wvdialconf自动生成的配置文件没有Init3参数，虽然可以拨号成功，但无法ping通网络，后来增加Init3参数后拨号成功且可以正常上网。没有了解过AT指令，以下配置内容无法做出详细解释了。</p>
<p>我的 /etc/wvdial.conf :</p>
<blockquote><p><span style="color: #993300;">[Dialer Defaults]<br />
Init1 = ATZ<br />
Init2 = ATQ0 V1 E1 S0=0 &amp;C1 &amp;D2 +FCLASS=0<br />
Init3 = AT+CGDCONT=1,&#8221;IP&#8221;,&#8221;3gnet&#8221;<br />
Modem Type = Analog Modem<br />
Modem = /dev/ttyUSB0<br />
Baud = 460800<br />
ISDN = 0<br />
Phone = *99#<br />
Username = 3gnet<br />
Password = 3gnet</span></p></blockquote>
<p>wvdial拨号信息输出参考：</p>
<blockquote><p><span style="color: #003300;">rem1x-laptop $ wvdial<br />
&#8211;&gt; WvDial: Internet dialer version 1.61<br />
&#8211;&gt; Cannot get information for serial port.<br />
&#8211;&gt; Initializing modem.<br />
&#8211;&gt; Sending: ATZ<br />
ATZ<br />
OK<br />
&#8211;&gt; Sending: ATQ0 V1 E1 S0=0 &amp;C1 &amp;D2 +FCLASS=0<br />
ATQ0 V1 E1 S0=0 &amp;C1 &amp;D2 +FCLASS=0<br />
OK<br />
&#8211;&gt; Sending: AT+CGDCONT=1,&#8221;IP&#8221;,&#8221;3gnet&#8221;<br />
AT+CGDCONT=1,&#8221;IP&#8221;,&#8221;3gnet&#8221;<br />
OK<br />
&#8211;&gt; Modem initialized.<br />
&#8211;&gt; Sending: ATDT*99#<br />
&#8211;&gt; Waiting for carrier.<br />
ATDT*99#<br />
CONNECT<br />
&#8211;&gt; Carrier detected.  Waiting for prompt.<br />
&#8211;&gt; Don&#8217;t know what to do!  Starting pppd and hoping for the best.<br />
&#8211;&gt; Starting pppd at Wed Jan 12 21:42:29 2011<br />
&#8211;&gt; Pid of pppd: 4553<br />
&#8211;&gt; Using interface ppp0<br />
&#8211;&gt; pppd: 圼16]- 衃1c]- �[18]-<br />
&#8211;&gt; pppd: 圼16]- 衃1c]- �[18]-<br />
&#8211;&gt; pppd: 圼16]- 衃1c]- �[18]-<br />
&#8211;&gt; pppd: 圼16]- 衃1c]- �[18]-<br />
&#8211;&gt; pppd: 圼16]- 衃1c]- �[18]-<br />
&#8211;&gt; pppd: 圼16]- 衃1c]- �[18]-<br />
&#8211;&gt; local  IP address 172.26.238.250<br />
&#8211;&gt; pppd: 圼16]- 衃1c]- �[18]-<br />
&#8211;&gt; remote IP address 10.64.64.64<br />
&#8211;&gt; pppd: 圼16]- 衃1c]- �[18]-<br />
&#8211;&gt; primary   DNS address 221.12.1.227<br />
&#8211;&gt; pppd: 圼16]- 衃1c]- �[18]-<br />
&#8211;&gt; secondary DNS address 221.12.33.227<br />
&#8211;&gt; pppd: 圼16]- 衃1c]- �[18]- </span></p></blockquote>
<p>172.26.238.250 就是拨号成功后的本地IP，两个DNS221.12.1.227和221.12.33.227是浙江联通的DNS（我买的是浙江卡），不同的3G卡获取的DNS信息都是卡归属地的DNS。</p>
<p>目前测试发现浙江联通的186卡无法进行pptp vpn连接，按照网上的讨论原因可能有:</p>
<p>1、浙江联通的部分网络设备不支持pptp（这个没可能吧&#8230;）</p>
<p>2、浙江联通屏蔽了pptp形式的vpn</p>
<p>参考链接：</p>
<p>http://linux.chinaunix.net/bbs/viewthread.php?tid=1162846</p>
]]></content:encoded>
			<wfw:commentRss>http://imxie.net/2011/01/use-3g-device-on-linux.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在ESXi 3.5中安装 sco openserver 5.0.7</title>
		<link>http://imxie.net/2010/11/install-sco-openserver-5-0-7-on-esxi-3-5.htm</link>
		<comments>http://imxie.net/2010/11/install-sco-openserver-5-0-7-on-esxi-3-5.htm#comments</comments>
		<pubDate>Wed, 17 Nov 2010 06:10:35 +0000</pubDate>
		<dc:creator>rem1x</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[esxi]]></category>
		<category><![CDATA[sco]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[vmware]]></category>

		<guid isPermaLink="false">http://imxie.net/?p=352</guid>
		<description><![CDATA[注：本日志提到的安装方法来源于互联网，经本人实际测试后整理呈现，对原作者的共享表示感谢。 想要在现在的服务器上安装sco unix 5系列有时候真的会让你无奈，主要问题在于各种硬件的不支持（有好硬件，却没有驱动支持，这是最悲催的），比如阵列卡、主板、网卡等等。 通常，我们可能会这么解决这个尴尬的问题： 将部分硬件更换为SCO支持的老硬件 找一台旧服务器或者是PC机 不过，随着虚拟化技术的快速发展，我们已经有了新的选择：用虚拟机安装sco unix 5 以前只用过桌面版的虚拟机，比如VirtualBox（一直在使用，主要是为了购物和网银，不过现在有Linux版的支付宝可用啦），VMware Workstation 。 闲话少说，ESXi现在是免费的，你可以在VMware官方网站免费下载。详情请看这里：http://www.vmware.com/cn/products/vsphere-hypervisor/ 由于我的测试机HP DL380 G3只能支持32位，因此选择安装ESXi 3.5 Update 5，如果你的服务器支持64位，完全可以下载ESXi 4.1，它也是免费的。安装ESXi的方法很简单，可以google出一堆，这里主要介绍如何在ESXi 3.5上安装SCO 5.0.7虚拟机。 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 安装步骤分割线 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 1、建虚拟机时Guest OS选 Other—&#62;Other 32位（ESXi 4以上已经有SCO系统的选项），处理器个数选1 ，SCSIAdapter选 BusLogic 2、以SCO 5.0.7光盘引导， BOOT中填写 defbootstr link=blc ，回车 3、片刻后会提示插入软盘，将btld软盘文件挂载到虚拟软驱（下载链接），回车，然后选 a 4、然后一路回车，填序列号（该序列号只用于安装，没法注册） 2ZJ064432 gwncbsby 5、接下来填写主机名、设置密码、设置时区、设定网卡等，根据你自身的需求进行配置。 6、等待片刻又会出现一个关于FLOPPY的选项，此时回车会出现选择项，先选2，再选B，继续安装。 7、耐心等待安装完后重启，重启时请仍然用SCO 5.0.7光盘引导（确保从光盘引导，需修改Bios设置） 。引导时输入： BOOT:  defbootstr  link=blc  root=hd(42) 8、回车运行后系统会出现一个选择项 please enter: &#8220;r&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>注：<strong>本日志提到的安装方法来源于互联网，经本人实际测试后整理呈现，对原作者的共享表示感谢</strong>。</p>
<p>想要在现在的服务器上安装sco unix 5系列有时候真的会让你无奈，主要问题在于各种硬件的不支持（有好硬件，却没有驱动支持，这是最悲催的），比如阵列卡、主板、网卡等等。</p>
<p>通常，我们可能会这么解决这个尴尬的问题：</p>
<ol>
<li>将部分硬件更换为SCO支持的老硬件</li>
<li>找一台旧服务器或者是PC机</li>
</ol>
<p>不过，随着虚拟化技术的快速发展，我们已经有了新的选择：用虚拟机安装sco unix 5</p>
<p><span id="more-352"></span></p>
<p>以前只用过桌面版的虚拟机，比如VirtualBox（一直在使用，主要是为了购物和网银，不过现在有<span style="color: #3366ff;"><a href="http://linuxtoy.org/archives/new-alipay-plugin-leaked.html" target="_blank">Linux版的支付宝</a></span>可用啦），VMware Workstation 。</p>
<p>闲话少说，ESXi现在是免费的，你可以在VMware官方网站免费下载。详情请看这里：<a href="http://www.vmware.com/cn/products/vsphere-hypervisor/" target="_blank">http://www.vmware.com/cn/products/vsphere-hypervisor/</a></p>
<p>由于我的测试机HP DL380 G3只能支持32位，因此选择安装ESXi 3.5 Update 5，如果你的服务器支持64位，完全可以下载ESXi 4.1，它也是免费的。安装ESXi的方法很简单，可以google出一堆，这里主要介绍如何在ESXi 3.5上安装SCO 5.0.7虚拟机。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 安装步骤分割线 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>1、建虚拟机时Guest OS选 Other—&gt;Other 32位（ESXi 4以上已经有SCO系统的选项），处理器个数选1 ，SCSIAdapter选 BusLogic<br />
2、以SCO 5.0.7光盘引导， BOOT中填写 <span style="color: #0000ff;">defbootstr link=blc </span> ，回车<br />
3、片刻后会提示插入软盘，将btld软盘文件挂载到虚拟软驱（<a href="http://www.box.net/shared/q9vyz5r0n4" target="_blank">下载链接</a>），回车，然后选 a<br />
4、然后一路回车，填序列号（该序列号只用于安装，没法注册）</p>
<pre style="padding-left: 30px;"><span style="color: #0000ff;"><strong>2ZJ064432
gwncbsby</strong></span>
</pre>
<p>5、接下来填写主机名、设置密码、设置时区、设定网卡等，根据你自身的需求进行配置。<br />
6、等待片刻又会出现一个关于FLOPPY的选项，此时回车会出现选择项，先选2，再选B，继续安装。<br />
7、耐心等待安装完后重启，重启时请仍然用SCO 5.0.7光盘引导（确保从光盘引导，需修改Bios设置） 。引导时输入：</p>
<pre style="padding-left: 30px;"><span style="color: #0000ff;">BOOT:  defbootstr  link=blc  root=hd(42)</span></pre>
<p>8、回车运行后系统会出现一个选择项</p>
<p style="padding-left: 30px;">please enter:<br />
&#8220;<strong>r</strong>&#8221; if you wish to try relpacement<br />
&#8220;<strong>a</strong>&#8221; if you want to use character major 6 (defualt)&#8230;.</p>
<p>这个时候选择 a 。<br />
9、接下来出现提示按Ctrl+D继续或者输入密码进入维护(maintain)模式，你需要输入安装时设定的密码，目的是进入维护模式手动安装SCSI驱动。<br />
10、进入#号提示符后，引导软驱镜像（将 bltd.flp 挂载到虚拟软驱中即可），输入命令安装SCSI驱动到内核：</p>
<pre style="padding-left: 30px;"><span style="color: #0000ff;">#mount /dev/fd0135ds18 /mnt
#btldinstall /mnt</span></pre>
<p>出现（Y/N）的选择问题时都选Y即可。<br />
11、安装完成后将虚拟光驱中的ISO镜像卸载，然后重启虚拟机。<br />
12、经过上述流程，SCO 5.0.7基本安装完成。</p>
<p>软盘镜像下载：<strong>bltd.flp</strong> <a href="http://www.box.net/shared/q9vyz5r0n4" target="_blank">http://www.box.net/shared/q9vyz5r0n4</a><br />
资料参考：</p>
<p>目前，ChinaUnix的SCO UNIX板块还是比较热闹的，讨论比较多，资料也不少，推荐大家可以去看看。</p>
<p>1、http://bbs2.chinaunix.net/viewthread.php?tid=1736041&amp;extra=page%3D1%26amp%3Bfilter%3Ddigest</p>
<p>2、http://bbs2.chinaunix.net/viewthread.php?tid=1720869</p>
]]></content:encoded>
			<wfw:commentRss>http://imxie.net/2010/11/install-sco-openserver-5-0-7-on-esxi-3-5.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>磁带机的磁带操作</title>
		<link>http://imxie.net/2010/09/control_tape.htm</link>
		<comments>http://imxie.net/2010/09/control_tape.htm#comments</comments>
		<pubDate>Fri, 17 Sep 2010 11:56:13 +0000</pubDate>
		<dc:creator>rem1x</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[mt]]></category>
		<category><![CDATA[tape]]></category>

		<guid isPermaLink="false">http://imxie.net/?p=336</guid>
		<description><![CDATA[这两天发现，对于同样大小的文件，磁带机越往后面用，写入时间就越长。 之前介绍了用tar对磁带机进行数据操作，今天把磁带机的磁带操作简单整理下。 所谓的磁带操作，就是如何进行倒带，擦除磁带，弹出磁带等，来看具体的操作命令： 倒带，将磁带卷至起始位置： # mt -f /dev/st0 rewind 擦除，擦掉磁带上的内容： # mt -f /dev/st0 erase 这里要注意，磁带的擦除是很慢的，而且会对磁带造成损伤，所以一般情况下我们可不会去做这吃力不讨好的事情。 如果你擦除磁带是为了从头开始使用，那可以先倒带到磁带的起始位置，然后tar cvf /dev/st0 file_name来重新写入数据。 当磁带 此外，新的磁带拆封后可以直接放入磁带机使用，不用执行擦除。 出带，将磁带卷至初始位置然后从磁带机内弹出： # mt –f /dev/st0 offline]]></description>
			<content:encoded><![CDATA[<p>这两天发现，对于同样大小的文件，磁带机越往后面用，写入时间就越长。</p>
<p>之前介绍了用tar对磁带机进行数据操作，今天把磁带机的磁带操作简单整理下。</p>
<p>所谓的磁带操作，就是如何进行倒带，擦除磁带，弹出磁带等，来看具体的操作命令：</p>
<p>倒带，将磁带卷至起始位置：</p>
<blockquote><p><span style="color: #ff6600;"># mt -f /dev/st0 rewind</span></p></blockquote>
<p>擦除，擦掉磁带上的内容：</p>
<blockquote><p><span style="color: #ff6600;"># mt -f /dev/st0 erase</span></p></blockquote>
<p>这里要注意，磁带的擦除是很慢的，而且会对磁带造成损伤，所以一般情况下我们可不会去做这吃力不讨好的事情。<br />
如果你擦除磁带是为了从头开始使用，那可以先倒带到磁带的起始位置，然后tar cvf /dev/st0 file_name来重新写入数据。<br />
当磁带<br />
此外，新的磁带拆封后可以直接放入磁带机使用，不用执行擦除。<br />
出带，将磁带卷至初始位置然后从磁带机内弹出：</p>
<blockquote><p><span style="color: #ff6600;"># mt –f /dev/st0 offline</span></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://imxie.net/2010/09/control_tape.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>杂记：python中使用public key做RSA加密</title>
		<link>http://imxie.net/2010/08/use_public_key_to_rsa_in_pytho.htm</link>
		<comments>http://imxie.net/2010/08/use_public_key_to_rsa_in_pytho.htm#comments</comments>
		<pubDate>Sun, 29 Aug 2010 13:54:33 +0000</pubDate>
		<dc:creator>rem1x</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[fetion]]></category>
		<category><![CDATA[rsa]]></category>

		<guid isPermaLink="false">http://imxie.net/?p=326</guid>
		<description><![CDATA[这一个星期在用python实现写一个命令行的飞信发信息小工具，为了放在服务器监控程序中用于短信报警。飞信在做用户认证时会先把一个RSA公钥传给客户端，客户端用这个RSA公钥做加密，然后把加密后的16进制串送到远端去验证。 我是个业余码农，所谓的cryptography，即密码学，那是几乎没接触过。通过wiki和google，对RSA简单了解了一下，然后找了一下如何用python来做RSA加密的方法，多数都提到了pycrypto和M2Crypto这两个模块（都是对openssl的封装）。 飞信传给客户端的公钥key由两部分组成，就是RSA公钥的exponent（俗称e）和modulus（俗称n），通过exponent和modulus来生成真正的public key。我就卡在了如何用现成的python模块来使用e和n做公钥加密。一般情况下，都是通过导入PEM结构的公钥来做RSA加密，而我只有e和n，怎么把它们转化成PEM结构呢？ 后来发现M2Crypto有一个new_pub_key((e, n)) 方法可以导入e和n来生成公钥，可是它有格式的限制： e (string) &#8211; The RSA public exponent; it is a string in OpenSSL&#8217;s MPINT format &#8211; 4-byte big-endian bit-count followed by the appropriate number of bits. n (string) &#8211; The RSA composite of primes; it is a string in OpenSSL&#8217;s MPINT format &#8211; 4-byte big-endian bit-count followed by [...]]]></description>
			<content:encoded><![CDATA[<p>这一个星期在用python实现写一个命令行的飞信发信息小工具，为了放在服务器监控程序中用于短信报警。飞信在做用户认证时会先把一个RSA公钥传给客户端，客户端用这个RSA公钥做加密，然后把加密后的16进制串送到远端去验证。</p>
<p>我是个业余码农，所谓的cryptography，即密码学，那是几乎没接触过。通过wiki和google，对RSA简单了解了一下，然后找了一下如何用python来做RSA加密的方法，多数都提到了pycrypto和M2Crypto这两个模块（都是对openssl的封装）。</p>
<p>飞信传给客户端的公钥key由两部分组成，就是RSA公钥的exponent（俗称e）和modulus（俗称n），通过exponent和modulus来生成真正的public key。我就卡在了如何用现成的python模块来使用e和n做公钥加密。一般情况下，都是通过导入PEM结构的公钥来做RSA加密，而我只有e和n，怎么把它们转化成PEM结构呢？</p>
<p>后来发现M2Crypto有一个new_pub_key((e, n)) 方法可以导入e和n来生成公钥，可是它有格式的限制：</p>
<blockquote><p><strong><span style="color: #ff6600;">e </span></strong>(string) &#8211; The RSA public exponent; it is a string in OpenSSL&#8217;s MPINT format &#8211; 4-byte big-endian bit-count followed by the appropriate number of bits.<br />
<strong><span style="color: #ff6600;">n</span></strong> (string) &#8211; The RSA composite of primes; it is a string in OpenSSL&#8217;s MPINT format &#8211; 4-byte big-endian bit-count followed by the appropriate number of bits.</p></blockquote>
<p>也不知道这OpenSSL&#8217;s MPINT format 是什么标准的格式，我没捣鼓出来。<br />
然后又试用pycrypto模块，它也有一个类似的方法：RSA.construct((n, e))。惊喜的发现它只要传入long型的参数，就能正常工作。可是，飞信登录验证时的RSA加密用到的是RSA_PKCS1_PADDING 填充模式，pycrypto没有提供模式选择（有patch可以实现，未证实）。<br />
懒惰的我最终决定由pycrypto使用e和n生成公钥，导出为PEM格式，再把这个PEM的公钥提供给M2Crypto，是不是很蛋疼？ <img src='http://imxie.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>几行示例：</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> Crypto.<span style="color: black;">PublicKey</span>.<span style="color: black;">RSA</span>
<span style="color: #ff7700;font-weight:bold;">import</span> M2Crypto.<span style="color: black;">BIO</span>
<span style="color: #ff7700;font-weight:bold;">import</span> M2Crypto.<span style="color: black;">RSA</span>
.........................
<span style="color: black;">rsakey</span> = Crypto.<span style="color: black;">PublicKey</span>.<span style="color: black;">RSA</span>.<span style="color: black;">construct</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>n, e<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
public_key = rsakey.<span style="color: black;">publickey</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">exportKey</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
bio = M2Crypto.<span style="color: black;">BIO</span>.<span style="color: black;">MemoryBuffer</span><span style="color: black;">&#40;</span>tmpkey<span style="color: black;">&#41;</span>
rsa = M2Crypto.<span style="color: black;">RSA</span>.<span style="color: black;">load_pub_key_bio</span><span style="color: black;">&#40;</span>bio<span style="color: black;">&#41;</span>
rsa.<span style="color: black;">public_encrypt</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'要加密的东东'</span>,M2Crypto.<span style="color: black;">RSA</span>.<span style="color: black;">pkcs1_padding</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>我还试过用ctypes来调用openssl的函数，结果表示可行。</p>
<p>我知道这样的实现很ugly，在python中有没有更直接的方法使用e和n做RSA公钥加密的呢？</p>
]]></content:encoded>
			<wfw:commentRss>http://imxie.net/2010/08/use_public_key_to_rsa_in_pytho.htm/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Linux命令行查字典</title>
		<link>http://imxie.net/2010/08/cli_dict.htm</link>
		<comments>http://imxie.net/2010/08/cli_dict.htm#comments</comments>
		<pubDate>Sat, 07 Aug 2010 03:24:19 +0000</pubDate>
		<dc:creator>rem1x</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[baidu]]></category>
		<category><![CDATA[cli]]></category>
		<category><![CDATA[dict]]></category>
		<category><![CDATA[sed]]></category>

		<guid isPermaLink="false">http://imxie.net/?p=315</guid>
		<description><![CDATA[这两天想找个CLI命令行的字典小工具，搜到了LinuxTOY的这篇：http://linuxtoy.org/archives/gdict.html 文中提到的gdict.sh是使用curl从google dictionary中查询单词解释，然后sed截取出中文解释。但现在google dictionary已改用袖珍牛津英语词典（见这里），只能查英语－英语了，并且查询结果由于html2text的原因还带有一些特殊字符，影响使用。 看到文章中各位Linuxer的回贴，我简单改写了一个查字典shell，查询的信息来自百度词典。由于我对sed不熟，所以写的比较笨拙，好在还能用用。代码如下： #!/bin/bash ARGS=1 E_BADARGS=65 &#160; if &#91; $# -ne &#34;$ARGS&#34; ] then echo &#34;Usage:`basename $0` word&#34; exit $E_BADARGS fi &#160; w3m -no-cookie -dump 'http://dict.baidu.com/s?wd='$1'&#38;f=3' \ &#124; sed '/以下结果来自互联网网络释义/,$d'&#124; sed '1,15d' &#124; tac \ &#124; sed '1,2d' &#124; tac &#124;sed -r '/^[0-9]+\./N;s/\n//' &#62; /tmp/rxdict.tmp &#160; echo echo -e &#34;--------------------\033[1;40;33m $1 \033[0m--------------------&#34; cat [...]]]></description>
			<content:encoded><![CDATA[<p>这两天想找个CLI命令行的字典小工具，搜到了LinuxTOY的这篇：<a href="http://linuxtoy.org/archives/gdict.html">http://linuxtoy.org/archives/gdict.html</a></p>
<p>文中提到的gdict.sh是使用curl从google dictionary中查询单词解释，然后sed截取出中文解释。但现在google dictionary已改用袖珍牛津英语词典（<a href="http://www.google.org.cn/posts/google-dictionary-changes-provider-to-oxford-pocket-dictionary-of-current-english.html">见这里</a>），只能查英语－英语了，并且查询结果由于html2text的原因还带有一些特殊字符，影响使用。</p>
<p>看到文章中各位Linuxer的回贴，我简单改写了一个查字典shell，查询的信息来自百度词典。由于我对sed不熟，所以写的比较笨拙，好在还能用用。代码如下：</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#!/bin/bash</span>
ARGS<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span>
E_BADARGS<span style="color: #339933;">=</span><span style="color: #0000dd;">65</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#91;</span> $<span style="color: #339933;"># -ne &quot;$ARGS&quot; ]</span>
then
    echo <span style="color: #ff0000;">&quot;Usage:`basename $0` word&quot;</span>
    exit $E_BADARGS
fi
&nbsp;
w3m <span style="color: #339933;">-</span>no<span style="color: #339933;">-</span>cookie <span style="color: #339933;">-</span>dump <span style="color: #ff0000;">'http://dict.baidu.com/s?wd='</span>$<span style="color:#800080;">1</span><span style="color: #ff0000;">'&amp;f=3'</span>  \
<span style="color: #339933;">|</span> sed <span style="color: #ff0000;">'/以下结果来自互联网网络释义/,$d'</span><span style="color: #339933;">|</span> sed <span style="color: #ff0000;">'1,15d'</span> <span style="color: #339933;">|</span> tac \
<span style="color: #339933;">|</span> sed <span style="color: #ff0000;">'1,2d'</span> <span style="color: #339933;">|</span> tac <span style="color: #339933;">|</span>sed <span style="color: #339933;">-</span>r <span style="color: #ff0000;">'/^[0-9]+\./N;s/<span style="color: #000099; font-weight: bold;">\n</span>//'</span> <span style="color: #339933;">&gt;</span> <span style="color: #339933;">/</span>tmp<span style="color: #339933;">/</span>rxdict.<span style="color: #202020;">tmp</span>
&nbsp;
echo
echo <span style="color: #339933;">-</span>e <span style="color: #ff0000;">&quot;--------------------<span style="color: #006699; font-weight: bold;">\033</span>[1;40;33m $1 <span style="color: #006699; font-weight: bold;">\033</span>[0m--------------------&quot;</span>
cat <span style="color: #339933;">/</span>tmp<span style="color: #339933;">/</span>rxdict.<span style="color: #202020;">tmp</span></pre></div></div>

<p>exit 0</p>
<p>效果预览：<br />
<a href="http://tu.6.cn/pic/show-new/id/9646345"><img src="http://i3.6.cn/cvbnm/af/18/f4/a900c5a1fe5b8093c7b5dd76244a5318.png" alt="" width="571" height="358" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://imxie.net/2010/08/cli_dict.htm/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Linux下使用tar操作磁带机的基本方法</title>
		<link>http://imxie.net/2010/08/use_tar_to_control_tape.htm</link>
		<comments>http://imxie.net/2010/08/use_tar_to_control_tape.htm#comments</comments>
		<pubDate>Fri, 06 Aug 2010 07:35:43 +0000</pubDate>
		<dc:creator>rem1x</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[IBM]]></category>
		<category><![CDATA[tape]]></category>
		<category><![CDATA[tar]]></category>

		<guid isPermaLink="false">http://imxie.net/?p=305</guid>
		<description><![CDATA[这是资料整理帖，所有内容来自互联网不同站点的没良心转载（出处无法确定&#8230;），对原作者表示感谢。 我现在可以玩弄一款 IBM 8767-HNX的外置磁带机，在RHEL 4中被认成/dev/st0 （还有一个/dev/nst0），来看一下dmesg输出 # dmesg &#8230;&#8230;&#8230;&#8230; Attached scsi tape st0 at scsi1, channel 0, id 0, lun 0 st0: try direct i/o: yes (alignment 512 B), max page reachable by HBA 4503599627370495 Attached scsi generic sg0 at scsi0, channel 0, id 1, lun 0,  type 0 Attached scsi generic sg1 at scsi0, [...]]]></description>
			<content:encoded><![CDATA[<p>这是资料整理帖，所有内容来自互联网不同站点的没良心转载（出处无法确定&#8230;），对原作者表示感谢。</p>
<p>我现在可以玩弄一款 IBM 8767-HNX的外置磁带机，在RHEL 4中被认成/dev/st0 （还有一个/dev/nst0），来看一下dmesg输出</p>
<p><span style="color: #333333;"># dmesg</span></p>
<p>&#8230;&#8230;&#8230;&#8230;</p>
<p>Attached scsi tape st0 at scsi1, channel 0, id 0, lun 0</p>
<p>st0: try direct i/o: yes (alignment 512 B), max page reachable by HBA 4503599627370495</p>
<p>Attached scsi generic sg0 at scsi0, channel 0, id 1, lun 0,  type 0</p>
<p>Attached scsi generic sg1 at scsi0, channel 0, id 4, lun 0,  type 13</p>
<p>Attached scsi generic sg2 at scsi1, channel 0, id 0, lun 0,  type 1</p>
<p>Attached scsi generic sg3 at scsi4, channel 0, id 0, lun 0,  type 0</p>
<p>Attached scsi generic sg4 at scsi4, channel 0, id 0, lun 1,  type 0</p>
<p>Attached scsi generic sg5 at scsi4, channel 0, id 0, lun 31,  type 0</p>
<p>st0: Block limits 1 &#8211; 16777215 bytes.</p>
<p>&#8230;&#8230;&#8230;&#8230;</p>
<p><span id="more-305"></span></p>
<p>在Linux和UNIX下最常用的磁带机操作命令便是tar，它可以对磁带进行读写、列目录、倒带、擦除等操作，接下来一一介绍。</p>
<p>列出目录：<strong><span style="color: #008000;">tar cvf /dev/st0</span></strong></p>
<p>如若磁带上还没有任何文件，运行上面的命令会出错，不过这个错误可以忽略，并不影响使用。</p>
<p>错误信息如下：</p>
<blockquote><p><span style="color: #ff6600;">英文版：</span></p>
<p>#tar cvf /dev/st0</p>
<p>tar: /dev/st0: Cannot read: Input/output error</p>
<p>tar: At beginning of tape, quitting now</p>
<p>tar: Error is not recoverable: exiting now</p></blockquote>
<blockquote><p><span style="color: #ff6600;">中文版：</span></p>
<p>#tar tvf /dev/st0</p>
<p>tar: /dev/st0：无法 read: 输入/输出错误</p>
<p>tar: 处于磁带的起点，现在退出</p>
<p>tar: 错误是不可恢复的：现在退出</p></blockquote>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;分割线&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>写入数据：<strong><span style="color: #008000;">tar cvf /dev/st0 &lt;要写入的文件名&gt;</span></strong></p>
<p>注：以下文字原封不动copy from internet</p>
<p><span style="text-decoration: underline;"><span style="color: #333333;">写入数据的方法有两种：</span></span></p>
<p><span style="text-decoration: underline;"><span style="color: #333333;">不打包直接写入文件和打包压缩后写入文件。</span></span></p>
<p><span style="text-decoration: underline;"><span style="color: #333333;">二者各有优缺点。不打包直接写入文件的方法，看起来效率低，操作复杂，但是可以提高数据的生存率。磁带是一种线性存储的设备，所有数据紧挨着顺序写入。当磁带的某一点损坏的时候，其余位置的磁带还可以继续读取，其中的文件也都能读出。如果采用了打包压缩后写入的方法，则磁带上存储的只有一个文件。当磁带有任何一个地方发生了故障无法读取，则这个压缩文件将缺少一些细节，即使是一个bit的错误，也将导致压缩文件报告CRC错误无法解压。所以，如果是存储大量的数据，建议直接写入。如果是存取小文件，则最好打包并给文件名加时间标记写入。</span></span></p>
<p>示例：</p>
<blockquote><p><span style="color: #ff6600;"># ls -lh tape_test.tar</span></p>
<p>-rw-r&#8211;r&#8211;  1 root root 50K  8月  6 15:02 tape_test.tar</p>
<p><span style="color: #ff6600;"># time tar cvf /dev/st0 tape_test.tar</span></p>
<p>tape_test.tar</p>
<p><span style="color: #ff6600;">real    0m3.936s</span></p>
<p>user    0m0.000s</p>
<p>sys     0m0.002s</p>
<p># tar tvf /dev/st0</p>
<p>-rw-r&#8211;r&#8211; root/root     51200 2010-08-06 15:02:21 tape_test.tar</p></blockquote>
<p>现在，通过 tar tvf /dev/st0 列目录时不再报错，并看到了刚才写入的tape_test.tar文件。</p>
<p>还可以注意到，写入一个50k大小的文件居然要3.9秒，可见磁带机的写入速度是比较慢的，这也意味着一般的数据备份工作放在后半夜比较合适。</p>
<p>续写数据：<strong><span style="color: #008000;">tar rvf /dev/st0 &lt;要写入的文件名&gt;</span></strong></p>
<p>磁带存储是线性存储的，所有数据依次写入。为了不覆盖前边的内容，在写入时要使用rvf参数。</p>
<p>如果你仍旧使用cvf参数来写入数据，那么之前的数据将会被覆盖：</p>
<blockquote><p><span style="color: #ff6600;"># time tar cvf /dev/st0 tape_test2.tar</span></p>
<p>tape_test2.tar</p>
<p><span style="color: #ff6600;">real    0m3.945s</span></p>
<p>user    0m0.000s</p>
<p>sys     0m0.002s</p>
<p># tar tvf /dev/st0</p>
<p>-rw-r&#8211;r&#8211; root/root     51200 2010-08-06 15:09:50 tape_test2.tar</p></blockquote>
<p>可以看到，tape_test.tar已经被tape_test2.tar文件所覆盖了。</p>
<p>使用rvf参数的示例：</p>
<blockquote><p><span style="color: #ff6600;"># time tar rvf /dev/st0 tape_test3.tar</span></p>
<p>tape_test3.tar</p>
<p><span style="color: #ff6600;">real    0m3.979s</span></p>
<p>user    0m0.000s</p>
<p>sys     0m0.002s</p>
<p># tar tvf /dev/st0</p>
<p>-rw-r&#8211;r&#8211; root/root     51200 2010-08-06 15:09:50 tape_test2.tar</p>
<p>-rw-r&#8211;r&#8211; root/root     51200 2010-08-06 15:10:49 tape_test3.tar</p></blockquote>
<p>新增加的tape_test3.tar和之前写入的tape_test2.tar都存在了。</p>
<div><span style="color: #333333;"><span style="text-decoration: underline;">注意：</span></span></div>
<div><span style="color: #333333;"><span style="text-decoration: underline;">在磁带上如果相同文件写入了多次，在恢复时候会比较麻烦，需要先将磁带卷至文件所存储的地方，而后读取磁带当前位置所存储的文件，操作较为复杂，速度也比较慢。所以不建议在一盘磁带上写入相同文件名的文件。备份前，最好将备份文件的文件名加上时间标记，便于查找备份。例如要备份的文件有test-20100806-1510.tar和test-20100806-1530.tar，写入到磁带上。如此在执行备份和恢复操作的时候，能够更加便利快捷的进行存取操作。</span></span></div>
<div><span style="color: #333333;"> </span></div>
<div>读取数据：<strong><span style="color: #008000;">tar xvf /dev/st0 &lt;要读取的文件名&gt;</span></strong></div>
<div>在读取数据之前，得先查看当前磁带中的内容，获取要恢复的文件名。</div>
<blockquote>
<div>
<p><span style="color: #ff6600;"># tar tvf /dev/st0</span></p>
<p>-rw-r&#8211;r&#8211; root/root     51200 2010-08-06 15:09:50 tape_test2.tar</p>
<p>-rw-r&#8211;r&#8211; root/root     51200 2010-08-06 15:10:49 tape_test3.tar</p>
</div>
</blockquote>
<div>恢复tape_test2.tar文件：</div>
<blockquote>
<div>
<p><span style="color: #ff6600;"># time tar xvf /dev/st0 tape_test2.tar</span></p>
<p>tape_test2.tar</p>
</div>
<div>
<p><span style="color: #ff6600;">real    0m0.024s</span></p>
<p>user    0m0.001s</p>
<p>sys     0m0.001s</p>
<p><span style="color: #ff6600;"># ls -lh tape_test2.tar</span></p>
<p>-rw-r&#8211;r&#8211;  1 root root 50K  8月  6 15:09 tape_test2.tar</p>
</div>
</blockquote>
<div>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;结束分割线&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</div>
<p>使用tar命令的tvf/cvf/rvf/xvf参数，分别可以实现对磁带机的各种不同操作。<br />
接下来，就可以自己写shell脚本，然后扔到crontab里，开始做自动备份吧。</p>
<p>参考资料：<br />
<a href="http://zengmin.blog.51cto.com/406650/324383">http://zengmin.blog.51cto.com/406650/324383</a></p>
]]></content:encoded>
			<wfw:commentRss>http://imxie.net/2010/08/use_tar_to_control_tape.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shell中快速清空文件内容的几种方法</title>
		<link>http://imxie.net/2010/07/some-shell-method-to-clear-file.htm</link>
		<comments>http://imxie.net/2010/07/some-shell-method-to-clear-file.htm#comments</comments>
		<pubDate>Tue, 20 Jul 2010 08:08:59 +0000</pubDate>
		<dc:creator>rem1x</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[echo]]></category>

		<guid isPermaLink="false">http://imxie.net/?p=295</guid>
		<description><![CDATA[闲来蛋疼，简单罗列如下5种快速清空文件内容的方法： $ : &#62; filename           #其中的 : 是一个占位符, 不产生任何输出. $ &#62; filename $ echo &#8220;&#8221; &#62; filename $ echo /dev/null &#62; filename $ echo &#62; filename 怎么习惯就怎么用，以上命令均在bash 3.2版本上通过测试。 如果你想深入学习shell脚本的知识，可以猛点击这里： http://tldp.org/LDP/abs/html/ ABS的中文版在这里：http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/abs-3.9.1_cn/html/index.html]]></description>
			<content:encoded><![CDATA[<p>闲来蛋疼，简单罗列如下5种快速清空文件内容的方法：</p>
<blockquote><p><span style="color: #993300;">$ : &gt; filename           #其中的 : 是一个占位符, 不产生任何输出.</span></p>
<p><span style="color: #993300;">$ &gt; filename</span></p>
<p><span style="color: #993300;">$ echo &#8220;&#8221; &gt; filename</span></p>
<p><span style="color: #993300;">$ echo /dev/null &gt; filename</span></p>
<p><span style="color: #993300;">$ echo &gt; filename</span></p></blockquote>
<p>怎么习惯就怎么用，以上命令均在bash 3.2版本上通过测试。</p>
<p>如果你想深入学习shell脚本的知识，可以猛点击这里： <a href="http://tldp.org/LDP/abs/html/" target="_blank">http://tldp.org/LDP/abs/html/</a></p>
<p>ABS的中文版在这里：<a href="http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/abs-3.9.1_cn/html/index.html" target="_blank">http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/abs-3.9.1_cn/html/index.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://imxie.net/2010/07/some-shell-method-to-clear-file.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.508 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-02-23 05:30:23 -->

