﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-rebel</title><link>http://www.blogjava.net/rebel/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 02:11:36 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 02:11:36 GMT</pubDate><ttl>60</ttl><item><title>vi命令一览表</title><link>http://www.blogjava.net/rebel/archive/2006/12/15/88025.html</link><dc:creator>忆了又忆</dc:creator><author>忆了又忆</author><pubDate>Fri, 15 Dec 2006 10:30:00 GMT</pubDate><guid>http://www.blogjava.net/rebel/archive/2006/12/15/88025.html</guid><description><![CDATA[
		<span class="postbody">文本编辑器是所有计算机系统中最常用的一种工具。UNIX下的编辑器有ex,sed和vi等，其中，使用最为广泛的是vi，而vi命令繁多，论坛里好像这方面的总结不多，以下稍做总结，以资共享！渴望更正和补充！  <br /><br /><span style="FONT-WEIGHT: bold">进入vi的命令</span><br />vi filename :打开或新建文件，并将光标置于第一行首 <br />vi +n filename ：打开文件，并将光标置于第n行首 <br />vi + filename ：打开文件，并将光标置于最后一行首 <br />vi +/pattern filename：打开文件，并将光标置于第一个与pattern匹配的串处 <br />vi -r filename ：在上次正用vi编辑时发生系统崩溃，恢复filename <br />vi filename....filename ：打开多个文件，依次进行编辑 <br /><br /><span style="FONT-WEIGHT: bold">移动光标类命令</span><br />h ：光标左移一个字符 <br />l ：光标右移一个字符 <br />space：光标右移一个字符 <br />Backspace：光标左移一个字符 <br />k或Ctrl+p：光标上移一行 <br />j或Ctrl+n ：光标下移一行 <br />Enter ：光标下移一行 <br />w或W ：光标右移一个字至字首 <br />b或B ：光标左移一个字至字首 <br />e或E ：光标右移一个字至字尾 <br />) ：光标移至句尾 <br />( ：光标移至句首 <br />}：光标移至段落开头 <br />{：光标移至段落结尾 <br />nG：光标移至第n行首 <br />n+：光标下移n行 <br />n-：光标上移n行 <br />n$：光标移至第n行尾 <br />H ：光标移至屏幕顶行 <br />M ：光标移至屏幕中间行 <br />L ：光标移至屏幕最后行 <br />0：（注意是数字零）光标移至当前行首 <br />$：光标移至当前行尾 <br /><br /><span style="FONT-WEIGHT: bold">屏幕翻滚类命令</span><br />Ctrl+u：向文件首翻半屏 <br />Ctrl+d：向文件尾翻半屏 <br />Ctrl+f：向文件尾翻一屏 <br />Ctrl＋b；向文件首翻一屏 <br />nz：将第n行滚至屏幕顶部，不指定n时将当前行滚至屏幕顶部。 <br /><br /><span style="FONT-WEIGHT: bold">插入文本类命令</span><br />i ：在光标前 <br />I ：在当前行首 <br />a：光标后 <br />A：在当前行尾 <br />o：在当前行之下新开一行 <br />O：在当前行之上新开一行 <br />r：替换当前字符 <br />R：替换当前字符及其后的字符，直至按ESC键 <br />s：从当前光标位置处开始，以输入的文本替代指定数目的字符 <br />S：删除指定数目的行，并以所输入文本代替之 <br />ncw或nCW：修改指定数目的字 <br />nCC：修改指定数目的行 <br /><br /><span style="FONT-WEIGHT: bold">删除命令</span><br />ndw或ndW：删除光标处开始及其后的n-1个字 <br />do：删至行首 <br />d$：删至行尾 <br />ndd：删除当前行及其后n-1行 <br />x或X：删除一个字符，x删除光标后的，而X删除光标前的 <br />Ctrl+u：删除输入方式下所输入的文本 <br /><br /><span style="FONT-WEIGHT: bold">搜索及替换命令</span><br />/pattern：从光标开始处向文件尾搜索pattern <br />?pattern：从光标开始处向文件首搜索pattern <br />n：在同一方向重复上一次搜索命令 <br />N：在反方向上重复上一次搜索命令 <br />：s/p1/p2/g：将当前行中所有p1均用p2替代 <br />：n1,n2s/p1/p2/g：将第n1至n2行中所有p1均用p2替代 <br />：g/p1/s//p2/g：将文件中所有p1均用p2替换 <br /><br /><span style="FONT-WEIGHT: bold">选项设置</span><br />all：列出所有选项设置情况 <br />term：设置终端类型 <br />ignorance：在搜索中忽略大小写 <br />list：显示制表位(Ctrl+I)和行尾标志（$) <br />number：显示行号 <br />report：显示由面向行的命令修改过的数目 <br />terse：显示简短的警告信息 <br />warn：在转到别的文件时若没保存当前文件则显示NO write信息 <br />nomagic：允许在搜索模式中，使用前面不带“\”的特殊字符 <br />nowrapscan：禁止vi在搜索到达文件两端时，又从另一端开始 <br />mesg：允许vi显示其他用户用write写到自己终端上的信息 <br /><br /><span style="FONT-WEIGHT: bold">最后行方式命令</span><br />：n1,n2 co n3：将n1行到n2行之间的内容拷贝到第n3行下 <br />：n1,n2 m n3：将n1行到n2行之间的内容移至到第n3行下 <br />：n1,n2 d ：将n1行到n2行之间的内容删除 <br />：w ：保存当前文件 <br />：e filename：打开文件filename进行编辑 <br />：x：保存当前文件并退出 <br />：q：退出vi <br />：q!：不保存文件并退出vi <br />：!command：执行shell命令command <br />：n1,n2 w!command：将文件中n1行至n2行的内容作为command的输入并执行之，若不指定n1，n2，则表示将整个文件内容作为command的输入 <br />：r!command：将命令command的输出结果放到当前行 <br /><br /><span style="FONT-WEIGHT: bold">寄存器操作</span><br />"?nyy：将当前行及其下n行的内容保存到寄存器？中，其中?为一个字母，n为一个数字 <br />"?nyw：将当前行及其下n个字保存到寄存器？中，其中?为一个字母，n为一个数字 <br />"?nyl：将当前行及其下n个字符保存到寄存器？中，其中?为一个字母，n为一个数字 <br />"?p：取出寄存器？中的内容并将其放到光标位置处。这里？可以是一个字母，也可以是一个数字 <br />ndd：将当前行及其下共n行文本删除，并将所删内容放到1号删除寄存器中。</span>
<img src ="http://www.blogjava.net/rebel/aggbug/88025.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rebel/" target="_blank">忆了又忆</a> 2006-12-15 18:30 <a href="http://www.blogjava.net/rebel/archive/2006/12/15/88025.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ls命令选项详解</title><link>http://www.blogjava.net/rebel/archive/2006/12/15/88024.html</link><dc:creator>忆了又忆</dc:creator><author>忆了又忆</author><pubDate>Fri, 15 Dec 2006 10:29:00 GMT</pubDate><guid>http://www.blogjava.net/rebel/archive/2006/12/15/88024.html</guid><description><![CDATA[
		<span class="postbody">
				<span style="COLOR: red">
				</span>
				<font size="2">ls 命令可以说是Linux下最常用的命令之一。它有众多的选项，其中有很多是很有用的，你是否熟悉呢？下面列出了 ls 命令的绝大多数选项。 <br /><br /><br />-a 列出目录下的所有文件，包括以 . 开头的隐含文件。 <br />-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出。 <br />-c 输出文件的 i 节点的修改时间，并以此排序。 <br />-d 将目录象文件一样显示，而不是显示其下的文件。 <br />-e 输出时间的全部信息，而不是输出简略信息。 <br />-f -U 对输出的文件不排序。 <br />-g 无用。 <br />-i 输出文件的 i 节点的索引信息。 <br />-k 以 k 字节的形式表示文件的大小。 <br />-l 列出文件的详细信息。 <br />-m 横向输出文件名，并以“，”作分格符。 <br />-n 用数字的 UID,GID 代替名称。 <br />-o 显示文件的除组信息外的详细信息。 <br />-p -F 在每个文件名后附上一个字符以说明该文件的类型，“*”表示可执行的普通 <br />文件；“/”表示目录；“@”表示符号链接；“|”表示FIFOs；“=”表示套 <br />接字(sockets)。 <br />-q 用?代替不可输出的字符。 <br />-r 对目录反向排序。 <br />-s 在每个文件名后输出该文件的大小。 <br />-t 以时间排序。 <br />-u 以文件上次被访问的时间排序。 <br />-x 按列输出，横向排序。 <br />-A 显示除 “.”和“..”外的所有文件。 <br />-B 不输出以 “~”结尾的备份文件。 <br />-C 按列输出，纵向排序。 <br />-G 输出文件的组的信息。 <br />-L 列出链接文件名而不是链接到的文件。 <br />-N 不限制文件长度。 <br />-Q 把输出的文件名用双引号括起来。 <br />-R 列出所有子目录下的文件。 <br />-S 以文件大小排序。 <br />-X 以文件的扩展名(最后一个 . 后的字符)排序。 <br />-1 一行只输出一个文件。 <br />--color=no 不显示彩色文件名 <br />--help 在标准输出上显示帮助信息。 <br />--version 在标准输出上输出版本信息并退出。</font>
		</span>
		<span class="postbody">
				<br />
		</span>
<img src ="http://www.blogjava.net/rebel/aggbug/88024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rebel/" target="_blank">忆了又忆</a> 2006-12-15 18:29 <a href="http://www.blogjava.net/rebel/archive/2006/12/15/88024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VSFTPD＋MySQL虚拟用户配置</title><link>http://www.blogjava.net/rebel/archive/2006/12/15/88023.html</link><dc:creator>忆了又忆</dc:creator><author>忆了又忆</author><pubDate>Fri, 15 Dec 2006 10:27:00 GMT</pubDate><guid>http://www.blogjava.net/rebel/archive/2006/12/15/88023.html</guid><description><![CDATA[　　VSFTPD是一种在UNIX/Linux中非常安全且快速的FTP服务器，目前已经被许多大型站点所采用。VSFTPD支持将用户名和口令保存在数据库文件或数据库服务器中。VSFTPD称这种形式的用户为虚拟用户。相对于FTP的本地（系统）用户来说，虚拟用户只是FTP服务器的专有用户，虚拟用户只能访问FTP服务器所提供的资源，这大大增强系统本身的安全性。相对于匿名用户而言，虚拟用户需要用户名和密码才能获取FTP服务器中的文件，增加了对用户和下载的可管理性。对于需要提供下载服务，但又不希望所有人都可以匿名下载；既需要对下载用户进行管理，又考虑到主机安全和管理方便的FTP站点来说，虚拟用户是一种极好的解决方案。本文介绍在RedHat Linux 9上如何将VSFTPD的虚拟用户名和密码保存在MySQL数据库服务器中。 <br /><br />　　一、VSFTPD的安装 <br /><br />　　目前，VSFTPD的最新版本是1.2.0版。官方下载地址为ftp://vsftpd.beasts.org/users/cevans/vsftpd-1.2.0.tar.gz。在安装前，需要先做以下准备工作： <br /><br />　　VSFTPD默认配置中需要“nobody”用户。在系统中添加此用户，如果用户已经存在，useradd命令有相应提示。 <br />　　[root@hpe45 root]# useradd nobody <br />　　useradd: user nobody exists <br /><br />　　VSFTPD默认配置中需要“/usr/share/empty”目录。在系统中此目录，如果目录已经存在，mkdir命令有相应提示。 <br />　　[root@hpe45 root]# mkdir /usr/share/empty/ <br />　　mkdir: cannot create directory '/usr/share/empty': File exists <br /><br />　　VSFTPD提供匿名FTP服务时，需要“ftp”用户和一个有效的匿名目录。 <br />　　[root@hpe45 root]# mkdir /var/ftp/ <br />　　[root@hpe45 root]# useradd -d /var/ftp ftp <br />　　接下来的操作对于ftp用户是否已经存在都是有用的。 <br />　　[root@hpe45 root]# chown root.root /var/ftp <br />　　[root@hpe45 root]# chmod og-w /var/ftp <br /><br />　　以上准备工作完成后，我们就可以开始编译源代码了。假定我们下载的vsftpd-1.2.0.tar.gz在/root目录，执行以下命令： <br />　　[root@hpe45 root]# tar zxvf vsftpd-1.2.0.tar.gz <br />　　[root@hpe45 root]# cd vsftpd-1.2.0 <br />　　[root@hpe45 vsftpd-1.2.0]# make <br />　　[root@hpe45 vsftpd-1.2.0]# make install <br /><br />　　上面的“make install”命令将编译好的二进制文件、手册等复制到相应目录。在RHL9上，可能需要手动执行以下复制： <br />　　[root@hpe45 vsftpd-1.2.0]# cp vsftpd /usr/local/sbin/vsftpd <br />　　[root@hpe45 vsftpd-1.2.0]# cp vsftpd.conf.5 /usr/local/share/man/man5 <br />　　[root@hpe45 vsftpd-1.2.0]# cp vsftpd.8 /usr/local/share/man/man8 <br /><br />　　接下来，我们复制一个简单的配置文件作为基础供后面修改。 <br />　　[root@hpe45 vsftpd-1.2.0]# cp vsftpd.conf /etc <br />　　[root@hpe45 vsftpd-1.2.0]# cp RedHat/vsftpd.pam /etc/pam.d/ftp <br />　　复制PAM验证文件，以允许本地用户登录VSFTPD。 <br />　　[root@hpe45 vsftpd-1.2.0]# cp RedHat/vsftpd.pam /etc/pam.d/ftp <br /><br />　　二、创建guest用户 <br /><br />　　VSFTPD采用PAM方式验证虚拟用户。由于虚拟用户的用户名/口令被单独保存，因此在验证时，VSFTPD需要用一个系统用户的身份来读取数据库文件或数据库服务器以完成验证，这就是VSFTPD的guest用户。这正如同匿名用户也需要有一个系统用户ftp一样。当然，我们也可以把guest用户看成是虚拟用户在系统中的代表。下面在系统中添加vsftpdguest用户，作为VSFTPD的guest。 <br />　　[root@hpe45 vsftpd-1.2.0]# useradd vsftpdguest <br />　　当虚拟用户登录后，所在的位置为vsftpdguest的自家目录/home/vsftpdguest。如果要让虚拟用户登录到/var/ftp等其他目录，修改vsftpdguest的自家目录即可。 <br /><br />　　三、设置VSFTPD配置文件 <br /><br />　　在/etc/vsftpd.conf文件中，加入以下选项： <br />　　guest_enable=YES <br />　　guest_username=vsftpdguest <br /><br />　　然后执行以下命令，让VSFTPD在后台运行： <br />　　[root@hpe45 vsftpd-1.2.0]# /usr/local/sbin/vsftpd &amp; <br /><br />　　四、将虚拟用户保存在MySQL数据库服务器中 <br /><br />　　我们建立数据库vsftpdvu，表users，字段name和passwd用于保存虚拟用户的用户名和口令,同时增加两个虚拟用户xiaotong和xiaowang。 <br /><br />　　[root@hpe45 vsftpd-1.2.0]# mysql -p <br />　　mysql&gt;create database vsftpdvu; <br />　　mysql&gt;use vsftpdvu; <br />　　mysql&gt;create table users(name char(16) binary,passwd char(16) binary); <br />　　mysql&gt;insert into users (name,passwd) values ('xiaotong',password('qqmywife')); <br />　　mysql&gt;insert into users (name,passwd) values ('xiaowang',password('ttmywife')); <br />　　mysql&gt;quit <br /><br />　　然后，授权vsftpdguest可以读vsftpdvu数据库的users表。执行以下命令： <br />　　[root@hpe45 vsftpd-1.2.0]# mysql -u root mysql -p <br />　　mysql&gt;grant select on vsftpdvu.users to <a href="mailto:vsftpdguest@localhost"><font color="#808080">vsftpdguest@localhost</font></a> identified by 'i52serial0'; <br />　　mysql&gt;quit <br /><br />　　如果要验证刚才的操作是否成功可以执行下面命令： <br />　　[root@hpe45 vsftpd]#mysql -u vsftpdguest -pi52serial0 vsftpdvu <br />　　mysql&gt;select * from users; <br />　　如果成功，将会列出xiaotong、xiaowang和加密后的密码 <br /><br />　　五、设置MySQL的PAM验证 <br /><br />　　这里我们要用到一个利用mysql进行pam验证的开源项目（http://sourceforge.net/projects/pam-mysql/）。首先从网站下载它的程序包pam_myql-0.5.tar.gz，复制到/root目录中。在编译安装之前，要确保mysql-devel的RPM包已经安装在你的机器上，如果没有请从RHL安装光盘中安装该包。然后，执行以下命令： <br />　　[root@hpe45 root]#tar xvzf pam_mysql-0.5.tar.gz <br />　　[root@hpe45 root]#cd pam_mysql <br />　　[root@hpe45 pam_mysql]#make <br />　　[root@hpe45 pam_mysql]#make install <br />　　make install这一步可能会出现错误，那只好手动将该目录下生成的pam_mysql.o复制到/lib/security目录下。 <br />　　接下来，我们要设置vsftpd的PAM验证文件。打开/etc/pam.d/ftp文件，加入以下内容： <br />　　auth required pam_mysql.o user=vsftpdguest passwd=i52serial0 host=localhost db=vsftpdvu table=users usercolumn=name passwdcolumn=passwd crypt=2 <br />　　account required pam_mysql.o user=vsftpdguest passwd=i52serial0 host=localhost db=vsftpdvu table=users usercolumn=name passwdcolumn=passwd crypt=2 <br />　　上面涉及到的参数，只要对应前面数据库的设置就可以明白它们的含义。这里需要说明的是crypt参数。crypt表示口令字段中口令的加密方式：crypt=0，口令以明文方式（不加密）保存在数据库中；crypt=1，口令使用UNIX系统的DES加密方式加密后保存在数据库中；crypt=2，口令经过MySQL的password()函数加密后保存。 <br /><br />　　六、进一步的虚拟用户设置 <br /><br />　　经过以上的步骤，虚拟用户就可以正常使用了。这里介绍进一步的虚拟用户设置。首先，介绍虚拟用户的权限设置。 <br /><br />　　VSFTPD-1.2.0新添了virtual_use_local_privs参数，当该参数激活（YES）时，虚拟用户使用与本地用户相同的权限。当此参数关闭（NO）时，虚拟用户使用与匿名用户相同的权限，这也就是VSFTPD-1.2.0之前版本对虚拟用户权限的处理方法。这两者种做法相比，后者更加严格一些，特别是在有写访问的情形下。默认情况下此参数是关闭的（NO）。 <br />　　当virtual_use_local_privs=YES时，只需设置write_enable=YES，虚拟用户就可以就拥有写权限。而virtual_use_local_privs=NO时，对虚拟用户权限的设置就更多一些更严格一些。 <br />　　控制虚拟用户浏览目录：如果让用户不能浏览目录，但仍可以对文件操作，那么需要执行以下二个步骤：一，配置文件中，anon_world_readable_only=YES。二，虚拟用户目录的权限改为只能由vsftpdguest操作： <br />　　[root@hpe45 root]# chown vsftpdguest.vsftpdguest /home/vsftpdguest <br />　　[root@hpe45 root]# chmod 700 /home/vsftpdguest <br />　　允许虚拟用户上传文件： <br />　　write_enable=YES <br />　　anon_upload_enable=YES <br />　　允许虚拟用户修改文件名和删除文件： <br />　　anon_other_write_enable=YES <br />　　由于以上选项的设置同样会对匿名用户生效。如果不想匿名用户趁机拥有同样的权限，最好是禁止匿名用户登录。 <br /><br />　　其次，由于虚拟用户在系统中是vsftpdguest身份，所以可以访问到系统的其他目录。为了更加安全，我们可以将虚拟用户限制在自家目录下。有两种做法：一，在配置文件中增加以下选项 <br />　　chroot_local_user=NO <br />　　chroot_list_enable=YES <br />　　chroot_list_file=/etc/vsftpd.chroot_list <br />　　然后，在/etc/vsftpd.chroot_list文件中加入虚拟用户名xiaotong和xiaowang。 <br />　　第二种做法，在配置文件中修改chroot_local_user=YES。 <br />　　经过修改后，虚拟用户登录后其根目录就限制在/home/vsftpdguest下，无法访问其他目录。 <br /><br />　　七、虚拟用户的个人目录 <br /><br />　　大家可以发现，无论是哪个虚拟用户，登录后所在的目录都是/home/vsftpdguest，即都是guest_username用户的自家目录。下面，介绍如何为每个虚拟用户建立自家目录。首先，在主配置文件中加入以下选项： <br />　　user_config_dir=/etc/vsftpd/vsftpd_user_conf <br />　　然后，生成/etc/vsftpd/vsftpd_user_conf目录，并在该目录下建立与特定虚拟用户同名的文件： <br />　　[root@hpe45 root]# mkdir /etc/vsftpd/vsftpd_user_conf <br />　　[root@hpe45 root]# cd /etc/vsftpd/vsftpd_user_conf <br />　　[root@hpe45 vsftpd_user_conf]# touch xiaowang <br />　　以上的操作为虚拟用户xiaowang建立了个人配置文件/etc/vsftpd/vsftpd_user_conf/xiaowang。接下来，在xiaowang的个人配置文件中将xiaowang的自家目录修改为/home/xiaowang，配置选项为： <br />　　local_root=/home/xiaowang <br />　　然后，新建xiaowang目录，并将权限设为vsftpdguest： <br />　　[root@hpe45 vsftpd_user_conf]# mkdir /home/xiaowang <br />　　[root@hpe45 vsftpd_user_conf]# chown vsftpdguest.vsftpdguest ./xiaowang <br />　　[root@hpe45 vsftpd_user_conf]# chmod 600 /home/xiaowang <br />　　经过以上设置，xiaowang登录VSFTPD后，用“pwd”指令就可以发现被自己被定位到自己的“/home/xiaowang”目录。 <br />　　从文件系统层次来看，由于“/home/xiaowang”目录的权限是属于vsftpdguest的，所以其他的虚拟用户同样也可以访问xiaowang的自家目录。解决这个问题也很简单，我们只需要让VSFTPD负责将虚拟用户限制在其自家目录，就可以避免虚拟用户的互相访问。具体做法参照前面第六步中所述，这里不再赘述。经过以上设置后，虚拟用户就可以拥有属于自己的目录了。 <img src ="http://www.blogjava.net/rebel/aggbug/88023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rebel/" target="_blank">忆了又忆</a> 2006-12-15 18:27 <a href="http://www.blogjava.net/rebel/archive/2006/12/15/88023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux关机命令详解</title><link>http://www.blogjava.net/rebel/archive/2006/12/15/88022.html</link><dc:creator>忆了又忆</dc:creator><author>忆了又忆</author><pubDate>Fri, 15 Dec 2006 10:25:00 GMT</pubDate><guid>http://www.blogjava.net/rebel/archive/2006/12/15/88022.html</guid><description><![CDATA[
		<p>    在linux下一些常用的关机/重启命令有shutdown、halt、reboot、及init，它们都可以达到重启系统的目的，但每个命令的内部工作过程是不同的，通过本文的介绍，希望你可以更加灵活的运用各种关机命令。 </p>
		<p>
				<font size="4">1.shutdown</font>
				<br />   shutdown命令安全地将系统关机。 有些用户会使用直接断掉电源的方式来关闭linux，这是十分危险的。因为linux与windows不同，其后台运行着许多进程，所以强制关机可能会导致进程的数据丢失﹐使系统处于不稳定的状态﹐甚至在有的系统中会损坏硬件设备。 </p>
		<p>    而在系统关机前使用shutdown命令﹐系统管理员会通知所有登录的用户系统将要关闭。并且login指令会被冻结﹐即新的用户不能再登录。直接关机或者延迟一定的时间才关机都是可能的﹐还可能重启。这是由所有进程〔process〕都会收到系统所送达的信号〔signal〕决定的。这让像vi之类的程序有时间储存目前正在编辑的文档﹐而像处理邮件〔mail〕和新闻〔news〕的程序则可以正常地离开等等。 </p>
		<p>    shutdown执行它的工作是送信号〔signal〕给init程序﹐要求它改变runlevel。Runlevel 0被用来停机〔halt〕﹐runlevel 6是用来重新激活〔reboot〕系统﹐而runlevel 1则是被用来让系统进入管理工作可以进行的状态﹔这是预设的﹐假定没有-h也没有-r参数给shutdown。要想了解在停机〔halt〕或者重新开机〔reboot〕过程中做了哪些动作﹐你可以在这个文件/etc/inittab里看到这些runlevels相关的资料。 <br />　　 shutdown 参数说明: <br />　　 [-t] 在改变到其它runlevel之前﹐告诉init多久以后关机。 <br />　　 [-r] 重启计算器。 <br />　　 [-k] 并不真正关机﹐只是送警告信号给每位登录者〔login〕。 <br />　　 [-h] 关机后关闭电源〔halt〕。 <br />　　 [-n] 不用init﹐而是自己来关机。不鼓励使用这个选项﹐而且该选项所产生的后果往往不总是你所预期得到的。 <br />　　 [-c] cancel current process取消目前正在执行的关机程序。所以这个选项当然没有时间参数﹐但是可以输入一个用来解释的讯息﹐而这信息将会送到每位使用者。 <br />　　 [-f] 在重启计算器〔reboot〕时忽略fsck。  <br />       [-F] 在重启计算器〔reboot〕时强迫fsck。 <br />　　 [-time] 设定关机〔shutdown〕前的时间。 <br />　　 　　 <br /><font size="4">2.halt----最简单的关机命令</font><br />　　 其实halt就是调用shutdown -h。halt执行时﹐杀死应用进程﹐执行sync系统调用﹐文件系统写操作完成后就会停止内核。 <br />　　 参数说明: <br />　　 [-n] 防止sync系统调用﹐它用在用fsck修补根分区之后﹐以阻止内核用老版本的超级块〔superblock〕覆盖修补过的超级块。 <br />　　 [-w] 并不是真正的重启或关机﹐只是写wtmp〔/var/log/wtmp〕纪录。<br />　　 [-d] 不写wtmp纪录〔已包含在选项[-n]中〕。 <br />　　 [-f] 没有调用shutdown而强制关机或重启。 <br />　　 [-i] 关机〔或重启〕前﹐关掉所有的网络接口。 <br />　　 [-p] 该选项为缺省选项。就是关机时调用poweroff。 <br />　　  <br /><font size="4">3.reboot</font><br />    reboot的工作过程差不多跟halt一样﹐不过它是引发主机重启﹐而halt是关机。它的参数与halt相差不多。 </p>
		<p>
				<font size="4">4.init </font>
				<br />   init是所有进程的祖先﹐它的进程号始终为1﹐所以发送TERM信号给init会终止所有的用户进程﹑守护进程等。shutdown 就是使用这种机制。init定义了8个运行级别(runlevel)， init 0为关机﹐init 1为重启。关于init可以长篇大论﹐这里就不再叙述。另外还有 telinit命令可以改变init的运行级别﹐比如﹐telinit -iS可使系统进入单用户模式﹐并且得不到使用shutdown时的信息和等待时间。</p>
<img src ="http://www.blogjava.net/rebel/aggbug/88022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rebel/" target="_blank">忆了又忆</a> 2006-12-15 18:25 <a href="http://www.blogjava.net/rebel/archive/2006/12/15/88022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下常用压缩格式的压缩与解压方法</title><link>http://www.blogjava.net/rebel/archive/2006/12/15/88021.html</link><dc:creator>忆了又忆</dc:creator><author>忆了又忆</author><pubDate>Fri, 15 Dec 2006 10:23:00 GMT</pubDate><guid>http://www.blogjava.net/rebel/archive/2006/12/15/88021.html</guid><description><![CDATA[
		<p>.tar<br />解包： tar xvf FileName.tar<br />打包：tar cvf FileName.tar DirName<br />（注：tar是打包，不是压缩！）<br />---------------------------------------------<br />.gz<br />解压1：gunzip FileName.gz<br />解压2：gzip -d FileName.gz<br />压缩：gzip FileName<br />.tar.gz<br />解压：tar zxvf FileName.tar.gz<br />压缩：tar zcvf FileName.tar.gz DirName<br />---------------------------------------------<br />.bz2<br />解压1：bzip2 -d FileName.bz2<br />解压2：bunzip2 FileName.bz2<br />压缩： bzip2 -z FileName<br />.tar.bz2<br />解压：tar jxvf FileName.tar.bz2<br />压缩：tar jcvf FileName.tar.bz2 DirName<br />---------------------------------------------<br />.bz<br />解压1：bzip2 -d FileName.bz<br />解压2：bunzip2 FileName.bz<br />压缩：未知<br />.tar.bz<br />解压：tar jxvf FileName.tar.bz<br />压缩：未知<br />---------------------------------------------<br />.Z<br />解压：uncompress FileName.Z<br />压缩：compress FileName<br />.tar.Z<br />解压：tar Zxvf FileName.tar.Z<br />压缩：tar Zcvf FileName.tar.Z DirName<br />---------------------------------------------<br />.tgz<br />解压：tar zxvf FileName.tgz<br />压缩：未知<br />.tar.tgz<br />解压：tar zxvf FileName.tar.tgz<br />压缩：tar zcvf FileName.tar.tgz FileName<br />---------------------------------------------<br />.zip<br />解压：unzip FileName.zip<br />压缩：zip FileName.zip DirName<br />---------------------------------------------<br />.rar<br />解压：rar a FileName.rar<br />压缩：r ar e FileName.rar</p>
		<p>
				<br />rar请到：<a href="http://www.rarsoft.com/download.htm">http://www.rarsoft.com/download.htm</a> 下载！<br />解压后请将rar_static拷贝到/usr/bin目录（其他由$PATH环境变量指定的目录也可以）：<br />[root@www2 tmp]# cp rar_static /usr/bin/rar<br />---------------------------------------------<br />.lha<br />解压：lha -e FileName.lha<br />压缩：lha -a FileName.lha FileName</p>
		<p>lha请到：<a href="http://www.infor.kanazawa-it.ac.jp/.../lhaunix/">http://www.infor.kanazawa-it.ac.jp/.../lhaunix/</a>下载！<br />&gt;解压后请将lha拷贝到/usr/bin目录（其他由$PATH环境变量指定的目录也可以）：<br />[root@www2 tmp]# cp lha /usr/bin/<br />---------------------------------------------<br />.rpm<br />解包：rpm2cpio FileName.rpm | cpio -div<br />---------------------------------------------<br />.tar .tgz .tar.gz .tar.Z .tar.bz .tar.bz2 .zip .cpio .rpm .deb .slp .arj .rar .ace .lha .lzh <br />.lzx .lzs .arc .sda .sfx .lnx .zoo .cab .kar .cpt .pit .sit .sea<br />解压：sEx x FileName.*<br />压缩：sEx a FileName.* FileName</p>
		<p>sEx只是调用相关程序，本身并无压缩、解压功能，请注意！<br />sEx请到： <a href="http://sourceforge.net/projects/sex">http://sourceforge.net/projects/sex</a>下载！<br />解压后请将sEx拷贝到/usr/bin目录（其他由$PATH环境变量指定的目录也可以）：<br />[root@www2 tmp]# cp sEx /usr/bin/</p>
		<p>
				<br />参考文献：Linux 文件压缩工具指南<br />（其实看帮助是最好的方法，一般各个命令都可以用“--help”参数得到常用使用方法！）<br />发布人:会游泳的鱼 来自:LinuxByte</p>
<img src ="http://www.blogjava.net/rebel/aggbug/88021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rebel/" target="_blank">忆了又忆</a> 2006-12-15 18:23 <a href="http://www.blogjava.net/rebel/archive/2006/12/15/88021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wget常用参数</title><link>http://www.blogjava.net/rebel/archive/2006/12/15/88019.html</link><dc:creator>忆了又忆</dc:creator><author>忆了又忆</author><pubDate>Fri, 15 Dec 2006 10:17:00 GMT</pubDate><guid>http://www.blogjava.net/rebel/archive/2006/12/15/88019.html</guid><description><![CDATA[
		<p>wget常用参数如下 </p>
		<p>　　GNY Wget ，一个非交谈式的网路抓档工具. </p>
		<p>　　用法: wget [选项]... [URL]... </p>
		<p>　　命令的引数使用长项目与短项目相同. </p>
		<p>　　启动: </p>
		<p>　　-V, --version显示Wget的版本并且离开. </p>
		<p>　　-h, --help显示这个说明档. </p>
		<p>　　-b, -background在启动之後跳到背景去. </p>
		<p>　　-e, -execute=COMMAND执行一个`.wgetrc'里面的COMMAND指令. </p>
		<p>　　纪录档与输入的档案: </p>
		<p>　　-o, --output-file=FILE纪录讯息到FILE去. </p>
		<p>　　-a, -append-output=FILE增加讯息到FILE去. </p>
		<p>　　-d, --debug显示除错的输出. </p>
		<p>　　-q, --quiet安静模式(不输入任何讯息). </p>
		<p>　　-v, --verbose冗长模式(这是内定值). </p>
		<p>　　-nv, --non-verbose关闭verboseness,但不是安静模式. </p>
		<p>　　-i, --input-file=FILE从FILE读取URL . </p>
		<p>　　-F, --force-html把输入的档案当作HTML. </p>
		<p>　　下载: </p>
		<p>　　-t, --tries=NUMBER设定重复尝试NUMBER次(0是无限制). </p>
		<p>　　-O --output-document=FILE把文件写到FILE里. </p>
		<p>　　-nc, --no-clobber不破坏已经存在的档案. </p>
		<p>　　-c, --continue重新取得一个已经存在的档案. </p>
		<p>　　--dot-style=STYLE设定取回状况的显示风格. </p>
		<p>　　-N, --timestamping不取回比本地旧的档案. </p>
		<p>　　-S, --server-response显示伺服器回应状况. </p>
		<p>　　--spider不下载任何东西. </p>
		<p>　　-T, --timeout=SECONDS设定读取时超过的时间为SECONDS秒. </p>
		<p>　　-w, --wait=SECONDS在取回档案时等待SECONDS秒. </p>
		<p>　　-Y, --proxy=on/off开启或关闭Proxy. </p>
		<p>　　-Q, --quota=NUMBER设定取回档案的定额限制为NUMBER个. </p>
		<p>　　目录: </p>
		<p>　　-nd --no-directories不建立目录. </p>
		<p>　　-x, --force-directories强制进行目录建立的工作. </p>
		<p>　　-nH, --no-host-directories不建立主机的目录. </p>
		<p>　　-P, --directory-prefix=PREFIX把档案存到PREFIX/... </p>
		<p>　　--cut-dirs=NUMBER忽略NUMBER个远端的目录元件. </p>
		<p>　　HTTP选项: </p>
		<p>　　--http-user=USER设http使用者为USER. </p>
		<p>　　--http0passwd=PASS设http使用者的密码为PASS. </p>
		<p>　　-C, --cache=on/off提供/关闭快取伺服器资料(正常情况为提供). </p>
		<p>　　--ignore-length忽略`Content-Length'标头栏位. </p>
		<p>　　--proxy-user=USER设USER为Proxy使用者名称. </p>
		<p>　　--proxy-passwd=PASS设PASS为Proxy密码. </p>
		<p>　　-s, --save-headers储存HTTP标头成为档案. </p>
		<p>　　-U, --user-agent=AGENT使用AGENT取代Wget/VERSION作为识别代号. </p>
		<p>　　FTP选项: </p>
		<p>　　--retr-symlinks取回FTP的象徵连结. </p>
		<p>　　-g, --glob=on/off turn file name globbing on ot off. </p>
		<p>　　--passive-ftp使用"passive"传输模式. </p>
		<p>　　使用递回方式的取回: </p>
		<p>　　-r, --recursive像是吸入web的取回--请小心使用!. </p>
		<p>　　-l, --level=NUMBER递回层次的最大值(0不限制). </p>
		<p>　　--delete-after删除下载完毕的档案. </p>
		<p>　　-k, --convert-links改变没有关连的连结成为有关连. </p>
		<p>　　-m, --mirror开启适合用来映射的选项. </p>
		<p>　　-nr, --dont-remove-listing不要移除`.listing'档. </p>
		<p>　　递回式作业的允许与拒绝选项: </p>
		<p>　　-A, --accept=LIST允许的扩充项目的列表. </p>
		<p>　　-R, --reject=LIST拒绝的扩充项目的列表. </p>
		<p>　　-D, --domains=LIST允许的网域列表. </p>
		<p>　　--exclude-domains=LIST拒绝的网域列表(使用逗号来分隔). </p>
		<p>　　-L, --relative只跟随关联连结前进. </p>
		<p>　　--follow-ftp跟随HTML文件里面的FTP连结. </p>
		<p>　　-H, --span-hosts当开始递回时便到外面的主机. </p>
		<p>　　-I, --include-directories=LIST允许的目录列表. </p>
		<p>　　-X, --exclude-directories=LIST排除的目录列表. </p>
		<p>　　-nh, --no-host-lookup不透过DNS查寻主机. </p>
		<p>　　-np, --no-parent不追朔到起源目录. </p>
		<p>　　范例一：mirror一个网站 </p>
		<p>　　wget -r <a href="http://www.redhat.com">www.redhat.com</a></p>
		<p>　　范例二：mirror一个网站下的某个目录： </p>
		<p>　　wget -r <a href="http://www.redhat.com/mirrors/LDP">www.redhat.com/mirrors/LDP</a></p>
		<p>　　范例三：结合nohup在后台运行，让机器自动下载，并生成nohup.out文件，纪录下载过程的速度。 <br />　　nohup wget -c -t0 -T120 -i list.txt &amp; </p>
<img src ="http://www.blogjava.net/rebel/aggbug/88019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rebel/" target="_blank">忆了又忆</a> 2006-12-15 18:17 <a href="http://www.blogjava.net/rebel/archive/2006/12/15/88019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>扑克发牌算法</title><link>http://www.blogjava.net/rebel/archive/2006/12/05/85704.html</link><dc:creator>忆了又忆</dc:creator><author>忆了又忆</author><pubDate>Tue, 05 Dec 2006 14:36:00 GMT</pubDate><guid>http://www.blogjava.net/rebel/archive/2006/12/05/85704.html</guid><description><![CDATA[
		<p>扑克发牌算法是棋牌游戏中常用的基础算法，也是游戏开发人员需要熟悉的基础算法之一。下面介绍一下该算法的一种实现方式。 <br />首先给扑克牌中每张牌设定一个编号，下面算法实现的编号规则如下： <br />1.红桃按照从小到大依次为： 1-13 <br />2.方块按照从小到大依次为： 14-26 <br />3.黑桃按照从小到大依次为： 27-39 <br />4.梅花按照从小到大依次为： 40-52 <br />5.小王为 53 ，大王为 54 </p>
		<p>算法实现如下： <br />1.首先按照以上编号规则初始化一个包含 108 个数字的数组 <br />2.每次随机从该数组中抽取一个数字，分配给保存玩家数据的数组 </p>
		<p>实现该功能的代码如下所示： </p>
		<p>import java.util.*; </p>
		<p>/** <br /> * 发牌算法的实现 <br /> * 要求：把 2 副牌，也就是 108 张，发给 4 个人，留 6 张底牌 <br /> */ </p>
		<p>public class Exec {<br />    public static void main(String[] args) {<br />        // 存储 108 张牌的数组<br />        int[] total = new int[108];<br />        // 存储四个玩家的牌<br />        int[][] player = new int[4][25];<br />        // 存储当前剩余牌的数量<br />        int leftNum = 108;<br />        // 随机数字<br />        int ranNumber;<br />        // 随机对象<br />        Random random = new Random();<br />        // 初始化数组<br />        for (int i = 0; i &lt; total.length; i++) {<br />            total[i] = (i + 1) % 54;<br />            // 处理大小王编号<br />            if (total[i] == 0) {<br />                total[i] = 54;<br />            }<br />        }<br />        // 循环发牌<br />        for (int i = 0; i &lt; 25; i++) {<br />            // 为每个人发牌<br />            for (int j = 0; j &lt; player.length; j++) {<br />                // 生成随机下标<br />                ranNumber = random.nextInt(leftNum);<br />                // 发牌<br />                player[j][i] = total[ranNumber];<br />                // 移动已经发过的牌<br />                total[ranNumber] = total[leftNum - 1];<br />                // 可发牌的数量减少 1<br />                leftNum--;<br />            }<br />        }<br />        // 循环输出玩家手中的牌<br />        for (int i = 0; i &lt; player.length; i++) {<br />            for (int j = 0; j &lt; player[i].length; j++) {<br />                System.out.print("  " + player[i][j]);<br />            }<br />            System.out.println();<br />        }<br />        // 底牌<br />        for (int i = 0; i &lt; 8; i++) {<br />            System.out.print("  " + total[i]);<br />        }<br />        System.out.println();<br />    }<br />}</p>
<img src ="http://www.blogjava.net/rebel/aggbug/85704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rebel/" target="_blank">忆了又忆</a> 2006-12-05 22:36 <a href="http://www.blogjava.net/rebel/archive/2006/12/05/85704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式笔记</title><link>http://www.blogjava.net/rebel/archive/2006/12/05/85700.html</link><dc:creator>忆了又忆</dc:creator><author>忆了又忆</author><pubDate>Tue, 05 Dec 2006 14:24:00 GMT</pubDate><guid>http://www.blogjava.net/rebel/archive/2006/12/05/85700.html</guid><description><![CDATA[
		<p>1.[] 与 ()的区别 </p>
		<p>[a-zA-Z0-9] 在包含的字符中 , 匹配其中一个 , 可匹配 ”!a!” </p>
		<p>(abc) 在包含的字符中 , 都要逐一匹配 , 而且有顺序 , 其实就是说 ,() 里面就是一个字正则式 , 可匹配 ”3abc93” </p>
		<p>2. 表达式之间千万不能有空格 </p>
		<p>3.构造检查 email的正则表达式 </p>
		<p>    /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/ </p>
		<p>在一个完整的 email 地址中有三个部分 : <br />　1. 用户名 ( 在 '@' 左边的一切 ), <br />　2.'@',<br />　3. 服务器名 ( 就是剩下那部分 ). <br />用户名可以含有大小写字母阿拉伯数字 , 句号 ('.'), 减号 ('-'), and 下划线 ('_'). 服务器名字也是符合这个规则 , 当然下划线除外 . </p>
		<p>现在 , 用户名的开始和结束都不能是句点 . 服务器也是这样 . 还有你不能有两个连续的句点他们之间至少存在一个字符，好现在我们来看一下怎么为用户名写一个匹配模式 : <br />     /^[\w-]+$/ </p>
		<p>现在还不能允许句号的存在 . 我们把它加上 : <br />　 /^[\w-]+(\.[\w-]+) * $/ <br />上面的意思就是说 : " 以至少一个规范字符（除了 . ）开头 , 后面跟着 0 个或者多个 以点开始的字符串 ." </p>
		<p>然后是后面一部分 , 在网上流传的一种做法是 , 后面的一部分是跟前面那部分一样的 , 但是我觉得有点不妥 , 难道 abc@abc 这样也符合一个 email 地址格式吗 ? 我试过不少的系统 , 都不允许这样输入的 , 必需要你输入如 abc@abc.abc 这样的格式才行．所以后面部分是略有不同的． </p>
		<p>   \^[\w-]+(\.[w-]+) ＋ $\ <br />上面的意思就是说 : " 以至少一个规范字符（除了 . ）开头 , 后面跟着 １个或者多个 以点开始的字符串 ." </p>
		<p>好 . 现在只需要用 ”@” 把两部分连接 : <br />　/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[w-]+)+$/</p>
		<p>这就是完整的 email 认证匹配模式了 , 在 JS 中只需要调用 <br />    reg = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[w-]+)+$/; <br />    reg.exec(input); </p>
		<p>返回为 true, 就是说 input 是一个 email 地址 . <br />通过这种方法就可以得到是否为 email 了 ! </p>
		<p> </p>
<img src ="http://www.blogjava.net/rebel/aggbug/85700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rebel/" target="_blank">忆了又忆</a> 2006-12-05 22:24 <a href="http://www.blogjava.net/rebel/archive/2006/12/05/85700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>