九王爷

九王爷的府邸


  • 首页

  • 分类

  • 归档

  • 标签

《Unix Shell 实例精解》学习笔记之grep篇

发表于 2008-03-21 | 分类于 Linux

1.grep的含义是“全局搜索正则表达式(RE)并打印该行”
2.grep 的选项
选项 功能
-b 在各行之前放置它发现的块号。有时在根据上下文定位磁盘字块时有用
-c 显示匹配行数而不是内容
-h 不显示文件名
-I 在座比较时忽略字母大小写
-n 文件中每行之前给出它的相关行号
-s 无声操作。即除了错误消息外不做任何显示。用于检查退出状态
-v 把搜索翻转为只显示不匹配的行
-w 把表达式当作一个次来搜索,相当于用<和>括起来
3.grep命令的退出状态
如果grep操作成功,则状态是0,如果模式没找到,状态是1,如果文件没找到,状态是2。如果操作被取消,则状态是130。
查看状态的方法:
在csh中用echo $status。
在sh和ksh中用echo $? 。
例如
$ echo $? 0
5
4.带正则表达式的grep举例:
用于这些例子的文本文件叫datafile,位于chap03目录(你也可以放在别的目录下)。datafile内容如下:
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
1) % grep NW datafile
解释:打印datafile中包含NW的行
2) grep NW d
解释:打印所有以d开头的文件中含有NW的文件。
3) % grep ‘^n’ datafile
解释:打印文件datafile中所有以字母n开头的行
4) % grep TB Savage datafile
解释:在Savage和datafile文件中查找有TB的行
5) % grep ‘TB Savage’ datafile
解释:在datafile文件中查找含有TB Savage的行并打印。
6) % grep ‘^[we]’ datafile
解释:打印datafile中以w或者e开头的行
7) % grep ‘ss
‘ datafile
northwest NW Charles Main 3.0 .98 3 34
southwest SW Lewis Dalsass 2.7 .8 2 18
解释:打印所有包含一个s并跟0个或者多个s,然后跟一个空格的行
6.用管道的grep.
grep 可以从管道得到输入。
% ls –l
drwxr-xr-x 6 oracle dba 512 4月 3 21:49 chap10
drwxr-xr-x 2 oracle dba 512 4月 10 22:23 exam
-rwxr–r– 1 oracle dba 1842 4月 3 21:51 readme.txt
-rwxr–r– 1 oracle dba 1801 4月 3 21:51 unix_readme.txt
% ls –l | grep ‘^d’
drwxr-xr-x 6 oracle dba 512 4月 3 21:49 chap10
drwxr-xr-x 2 oracle dba 512 4月 10 22:23 exam
% ls -l |grep ‘^[^d]’
-rwxr–r– 1 oracle dba 1842 4月 3 21:51 readme.txt
-rwxr–r– 1 oracle dba 1801 4月 3 21:51 unix_readme.txt
7.带选项的grep举例:
% grep –c ‘west’ datafile
3
解释:计算datafile中含有west的总数。
8.egrep (扩展的grep)
egrep可以使用额外的正则表达式,如下表。
元字符 功能 例子 解释

  • 匹配一个或多个前驱字符 ‘[a-z]+ove’ 匹配一个或多个小写字母,后跟ove
    ? 匹配0个或者1个前驱字符 ‘lo?ve’ 将找到love或love
    a|b 匹配a或者b ‘love|hate’ 与love或hate匹配
    () 组字符 ‘lov(ely|able) 与lovely或lovable匹配
    9.egrep 举例:
    % egrep ‘2.?[0-9]’ datafile
    解释:打印所有这样的行:它包含一个2,后跟0个或者一个句号,然后跟一个数字。
    10. fgrep
    fgrep 把所有的元字符都当作字符本身,只代表自己。
    11. UNIX 工具试验参考答案(内容参考datebook)
    (1) 打印包含San的行
    % grep ‘San’ datebook
    (2) 打印所有以J开头的人名所在的行
    % grep ‘^J’ datebook
    (3) 打印以700结尾的行
    % grep ‘700$’ datebook
    (4) 打印所有不包含834的行
    % grep -v ‘834’ datebook
    (5) 打印出生在12月(December)的行
    % grep ‘/12’ datebook
    (6) 打印工资是6位数的行,并给出行号
    % grep -n ‘[0-9]{6,}$’ datebook

自己使用的VIM配置文件和插件

发表于 2008-03-20 | 分类于 Other

见附件vim.zip

http://insenvim.sourceforge.net/

只是这个目前只能在windows下面用,试过的,好用
支持Java
C++
C#
JSP
XML
HTML
SQL

本站插件-wp-CJK-excerpt

发表于 2008-03-20 | 分类于 Other

转自:Yskin’s blog
我刚接触Wordpress的时候——大约在今年3月份或者更早吧——除了Wordpress自带的插件,最先装的插件应该就是桑葚的中文WordPress工具箱中文WordPress工具箱了。(一个小发现,我用紫光V5打出来的是“桑椹”,而他的网站上写出来的是“桑葚”,在金山词霸查了一下,好像紫光打出来的是正确的,桑椹——英文mulberry…汗了)

这个插件提供了很多功能,都是一些国人喜欢的功能——最新文章,最新评论,评论数最多的文章,发表评论最多的网友,随机文章以及适合中文环境的摘要功能。这些功能我感觉并不实用,虽然国内的大多BSP都提供这些功能。最新文章功能Wordpress自带,最新评论功能倒还有点用,随机文章功能对于专门讨论某个方面的Blog还行,而我一直的观点是一个Blog对应一个人,个人的所有文章应该发在同一个Blog上,文章的分类应该靠Blog系统的分类功能解决,而非建立多个Blog。我的研究方向比较多,所以我的Blog分类很广,这样的情况下,一个设计的比较好的相关文章功能可能比随机文章好的多。

最近一直困扰于百度的收录问题。我的策略是:存档页、分类页、tag页、搜索页都不应该被搜索引擎收录,因为搜索引擎会进行重复页面检测。(桑葚的网站好像没有做这方面的设置,经常在Google里搜到他的tag页)对于Google,可以在所有要禁止收录的页面设置meta标签robots为”noindex,follow”,这样Google就会只访问这些页面而不收录,既禁止了收录,又可以让Google顺着这些页面查找独立文章页面。不过,同样的办法对百度就行不通,因为百度不支持meta标签robots,所以只好用 robots.txt文件。分类页和tag页分别在category和tag目录下,只要禁止这两个目录就可以了,而存档页却是类似”http://yskin.net/2006/07/"这样的结构,禁了这些目录,下面的独立文章页面也会被一起禁掉,百度又只支持 Disallow,不支持Allow。

解决的办法嘛,狠一点的话就在存档页中检测来访的是不是百度,如果是就直接输出个404。我想的权宜之计是:由于存档页显示的是文章的摘要,想办法让摘要更短一些,这样可能就检测不出来重复了。我弟弟的Blog用了中文WordPress工具箱,他那儿显示的摘要就很短,所以跑去下了这个插件,研究一下Wordpress的摘要算法。

研究的结果是这样:在中文WordPress工具箱的说明里有提到:

某些情况下需要输出摘要,比如搜索结果、档案,还有 rss 输出,这样可以节省流量资源。但是,如果你的文章是中文的话,官方 WordPress 输出的其实并不是摘要,它只是把文章里的 html 代码过滤掉了,但所有文字都还是原样输出了。

激活这个插件后,输出的就是真正截断的摘要了。

(顺便提一下,rss输出还是不要用摘要方式的好,人家订阅了你的rss不是为了看个摘要的,节约流量可以用feedburner烧录一下嘛。当然,由于网站放置了广告而希望用户访问页面的除外,够狠的话也可以把广告加到rss里)

桑葚的这段话是有错误地。Wordpress输出摘要时,先将文章里的html代码过滤掉了,然后对文章进行了摘要并输出,并没有因为你写的是中文就不摘要了。不过,摘要算法只考虑了英文以及其他西方语言,因为这些语言用空格做单词的分隔符,所以就用空格做区分,截取前55个单词。但是这个算法对中文日文这些不用空格分隔单词的语言就不合适了,中文文章里很难找到一个空格,摘要算法要找够55个空格才截断,所以最终只会输出整篇文章。

Wordpress通过the_excerpt()函数输出摘要(rss里通过the_excerpt_rss()函数输出摘要),这个函数中只有一行代码:echo apply_filters(‘the_excerpt’, get_the_excerpt());就是说对get_the_excerpt()函数返回的字符串执行转换器操作并输出。the_excerpt有转换字符、转换表情、加

标签等几个默认转换器。get_the_excerpt()函数中检验了一下文章是否有密码,然后将用户自定的文章摘要传给 wp_trim_excerpt()函数。wp_trim_excerpt()函数收到用户自定的文章摘要则直接返回,否则根据文章内容生成摘要。他先把文章过一遍文章内容的转换器,再用strip_tags()函数去掉所有html和PHP标签,再用explode()函数以一个空格做分隔符,把文章分成最多56段。如果不够56段则原样输出,否则就把最后一段替换成”[…]”,用implode()函数以空格做分隔符重新组装起来。很明显,这个方法对英文文章很有效,而对不用空格做单词间分隔符的中文则没什么作用。很少有中文文章包含55个空格,所以给大家以中文文章摘要无效的印象。(好像代码里没有对

阅读全文 »

几款Firefox扩展

发表于 2008-03-19 | 分类于 Other
  • Adblock plus
    可以过滤网页广告,是 Adblock 的增强版。增加了白名单和过滤规则同步功能。

  • Download Statusbar

    实际使用除了好看没有什么意义,所以删除掉了
    在浏览器底部显示一个状态栏,可以方便地查看和管理下载项。

主要功能:

* 没有下载时自动隐藏

* 单击暂停/恢复

* 通过操作扩展的上下文菜单暂停、恢复、取消全部下载和移除完成的下载项

* 双击完成对话框可以运行一个下载完的文件。

* 更新的工具提示能提供当前下载的比较详细的内容,包括源、目的、大小和剩余时间

* 能在选项中定制查看完成百分比、下载速度、完成量和剩余时间

* 从上下文菜单复制源 URL

* 可以停止下载并保存,下次浏览器启动时重新下载

* 通过系统的上下文菜单删除一个文件

* 定制和查看保留最后 N 条下载项

* 在选项中设置当一个下载完成时启动病毒扫描

* 在选项中设置当浏览器关闭时继续在下载管理器中下载

  • IE Tab

    让您可以直接在 Firefox 的标签页中以内嵌的 IE 引擎浏览网页。

  • User Agent Switcher
    增加一个菜单项和一个工具栏按钮来转换浏览器的用户标识。通过改变浏览器标识,你可以访问一些禁止非 IE 浏览器访问的网址。它是为
    Firefox、Flock 以及 Mozilla 设计的,而且可以在 Windows、Mac OS X 及 Linux 等任意平台上运行。特别是和IE TAB配合,可以说任何地方都不需要再开IE了

  • Web Develope

在菜单和工具栏加上多种网页开发工具。

  • ScribeFire
    使用了Emacs,写日志也不用这个写了,所以删除掉了

Scribefire(以前叫做 Performancing for Firefox)是一个嵌入在 Firefox 浏览器中的全功能博客编辑器,他可以方便您提交博客。您可以从当前正在浏览的页面中拖放格式化文字到编辑器中,象提交博客那样方便地保存草稿…

适用于:
















Firefox2.0 - 3.0b4ALL
1.0 - 1.1.*ALL
  • MediaWrap

    实际使用的机会很少,所以一般都处于禁用状态

mediawrap 是一个很小的 Firefox 扩展。它能够将 ActiveX 控件方式的网页内嵌媒体转换成 Firefox 能够支持的
Plugin 方式,从而使 Firefox 也能够象 IE 一样正常播放 Wmplayer、Rmplayer、QtPlayer 和
FlashPlayer 格式的媒体文件。当然,你的系统中首先要安装过相应的播放软件及解码器,比如,Windows Media Player 和
RealPlayer 等。

很多网站使用了 ActiveX 控件方式来播放网页内嵌媒体,但是Firefox 浏览器本身并不支持 ActiveX
控件。如果你经常在这样的网站观看视频或者听音乐,那么 mediawrap 扩展绝对是有用的。而且,mediawrap 不会给你带来任何安全问题。

0.1.7.0 版:

1、兼容 Firefox 3.0b4;

2、修复了一些 bug;

3、支持语言:en-US,es-ES,de-DE,fr-FR,it-IT,pt-BR , nl-NL ,zh-CN,zh-TW。

  • FireFTP

    兼容性不是很好,功能也不是很强,所以卸载掉了,使用MzillaFTP作为FTP工具

FireFTP 是一个基于 Mozilla Firefox 的免费, 安全, 跨平台 FTP 客户端。

  • FlashGot

允许 Firefox、Mozilla Suite、Netscape 和 Thunderbird 使用大多数流行的外部下载管理器处理单一的和全部(“全部” 和 “选择”)下载,支持 Windows, Mac OS X, Linux 和 FreeBSD 系统。

  • All-In-One Sidebar 0.7.4
    (后来删除了,感觉用处不大)

AIOS(All-In-One Sidebar)
使您在侧边栏中就可以快速切换书签、下载项和扩展等面板,或者在侧边栏登陆网站、查看源代码;另外,AIOS
还拥有侧栏切换柄和工具栏,单击浏览器一侧的突起边缘,即可打开/关闭 AIOS。所有这些都允许用户自由定制。AIOS 支持众多扩展,
包括Translation Panel, ScrapBook, Sage, Enhanced History Manager,
Advanced Search Sidebar, QuickNote 等等。

注意! 在安装 AIOS 新版本前一定要先卸载 0.5.5 以前的版本! 否则将损坏配置文件! 请千万小心,不要在旧版上自动更新升级。如果忘记卸载而导致配置文件损坏,您在作者主页上可以找到补救方法。

补救方法: http://firefox.exxile.net/aios/knownissues.php#destroyedprofile

  • ViewSourceWith(我主要用来设置用VIM查看和编辑源码)
    主要的目的是使用外部程序浏览页面原代码,但是你还可以⋯⋯

- 以 DOM 文件的方式打开页面原代码,参见 faq

  • 打开页面使用的 CSS 和 JS 文件
  • 用你指定的图像浏览软件(比如 GIMP 或者 ACDSee)打开图像
  • 用 Acrobat Reader 或 Foxit Reader 或者你指定的程序打开 PDF 链接
  • 用你喜欢的文本编辑器编辑 textbox 中的内容,并且在将焦点切换回 textbox 的时候你可以在浏览器中立刻看见修改后的文字,简化了 wiki 页面的编辑,参见 faq
  • 打开服务器端生成浏览器内容的页面,简化了 web 开发者的 debug 工作,参见 server-faq
  • 打开 Javascript 控制台中列出

linux用户的权限管理详细说明

发表于 2008-03-16 | 分类于 Linux

只能有一个ROOT帐号。 想要普通用户有权限,以ROOT帐号登陆,然后输入chmod o +rw [fileName]。建议你用man chmod看看chmod的详细说明。  

修改权限:  
1)管理用户(user)的工具或命令;  
useradd 注:添加用户  
adduser 注:添加用户  
passwd 注:为用户设置密码  
usermod 注:修改用户命令,可以通过usermod 来修改登录名、用户的家目录等等;  
pwcov 注:同步用户从/etc/passwd 到/etc/shadow  
pwck 注:pwck是校验用户配置文件/etc/passwd 和/etc/shadow 文件内容是否合法或完整;  
pwunconv 注:是pwcov 的立逆向操作,是从/etc/shadow和 /etc/passwd 创建/etc/passwd ,然后会删除 /etc/shadow 文件;  
finger 注:查看用户信息工具  
id 注:查看用户的UID、GID及所归属的用户组  
chfn 注:更改用户信息工具  
su 注:用户切换工具  
sudo  注:sudo 是通过另一个用户来执行命令(execute a command as another user),su 是用来切换用户,然后通过切 换到的用户来完成相应的任务,但sudo 能后面直接执行命令,比如sudo 不需要root 密码就可以执行root 赋与的执行只有root才能执行 相应的命令;但得通过visudo 来编辑/etc/sudoers来实现;  
visudo 注:visodo 是编辑 /etc/sudoers 的命令;也可以不用这个命令,直接用vi 来编辑 /etc/sudoers 的效果是一样的;  
sudoedit 注:和sudo 功能差不多。  

2)管理用户组(group)的工具或命令;  
groupadd 注:添加用户组;  
groupdel 注:删除用户组;  
groupmod 注:修改用户组信息  
groups 注:显示用户所属的用户组  
grpck  
grpconv 注:通过/etc/group和/etc/gshadow 的文件内容来同步或创建/etc/gshadow ,如果/etc/gshadow 不存在则创建;  
grpunconv 注:通过/etc/group 和/etc/gshadow 文件内容来同步或创建/etc/group ,然后删除gshadow文件。 

proftpd+mysql用户认证+quota磁盘限额

发表于 2008-03-14 | 分类于 Server
proftpd+mysql用户认证+quota磁盘限额 整理编辑:mars ([email protected]) 网上关于proftpd的安装文章实在是不少,我只是稍微整理了一下,并且使用了新的 quota磁盘限额模块 由于proftpd最新版1.2.8目前还是RC版,加上有些设置不能通用, 所以在这里还是使用1.2.7版

阅读全文 »

proftpd + mysql 安装参考资料

发表于 2008-03-14 | 分类于 Server

proftpd + mysql 安装流水笔记

<div id="postmessage_626939" class="t_msgfont">一。准备工做

1。你的机器上已调试好了apache+php+mysql环境
2。下载PROFTPD
wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.2.10rc3.tar.bz2
因为发现1.2.10直接支持sql和quota
二。安装
tar -jxvf proftpd-1.2.10rc3.tar.bz2
cd proftpd*

> ./configure –prefix=/usr/local/proftpd \

–with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql \
–with-includes=/usr/local/mysql/include/mysql \
–with-libraries=/usr/local/mysql/lib/mysql
make
make install
修改proftpd配置
vim /usr/local/proftpd/etc/proftpd.conf
内容改为:
ServerName “mail2004.3322.org”
ServerType standalone
DefaultServer on

用户登陆时不显示ftp服务器版本信息

ServerIdent off

Port 21 is the standard FTP port.

Port 21

Umask 022 is a good standard umask to prevent new dirs and files

from being group and world writable.

Umask 022
MaxLoginAttempts 3
TimeoutLogin 120
TimeoutIdle 600
TimeoutNoTransfer 900
TimeoutStalled 3600
MaxClients 100

设置每台主机最多并发连接数

MaxClientsPerHost 3
AllowOverwrite no
AllowStoreRestart on
UseReverseDNS off

设置如果shell为空时允许用户登录

RequireValidShell off

将用户限制在自己的主目录下

DefaultRoot ~

To prevent DoS attacks, set the maximum number of child processes

to 30. If you need to allow more than 30 concurrent connections

at once, simply increase this value. Note that this ONLY works

in standalone mode, in inetd mode you should use an inetd server

that allows you to limit maximum number of processes per service

(such as xinetd).

MaxInstances 30

Set the user and group under which the server will run.

User nobody
Group nobody

Normally, we want files to be overwriteable.

<Directory />
AllowOverwrite on
</Directory>

A basic anonymous configuration, no upload directories.

匿名登录设置。匿名用户目录为/ftp

<Anonymous /ftp>
User ftp
Group ftp

We want clients to be able to login with “anonymous” as well as “ftp”

UserAlias anonymous ftp    停了它

Limit the maximum number of anonymous logins

MaxClients 10

We want ‘welcome.msg’ displayed at login, and ‘.message’ displayed

in each newly chdired directory.

DisplayLogin welcome.msg
DisplayFirstChdir .message

Limit WRITE everywhere in the anonymous chroot

#<Limit WRITE>

DenyAll

#</Limit>
</Anonymous>
以上是PROFTPD.conf

下面加入sql和quota

数据库联接的信息,proftpdb是数据库名,localhost是主机名,proftpd是连接数据库的用户名,

#proftpdb是密码

#(如果没有密码留空)
SQLConnectInfo proftpdb@localhost proftp proftpdb  

数据库认证的类型

SQLAuthTypes Backend Plaintext

数据库的鉴别

SQLAuthenticate users groups

指定用来做用户认证的表的有关信息。

SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLGroupInfo ftpgroup groupname gid members

如果home目录不存在,则系统会根据它的home项新建一个目录

SQLHomedirOnDemand on
这是目录所有者,我觉得这个很重要。所以我用nobody来做,在此我的nobody为99.
SQLDefaultGID        99
SQLDefaultUID        99

SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE “count=count+1,accessed=now() WHERE userid=’%u’” ftpuser

Update modified everytime user uploads or deletes a file

SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE “modified=now() WHERE userid=’%u’” ftpuser

启用磁盘限额

QuotaDirectoryTally on

磁盘限额单位 b”|”Kb”|”Mb”|”Gb”

QuotaDisplayUnits “Kb”
QuotaEngine on

磁盘限额日志记录

QuotaLog “/var/log/quota.log”

打开磁盘限额信息,当登陆FTP帐户后,使用命令 “quote SITE QUOTA” 后可显示当前用#户的磁盘限额

QuotaShowQuotas on
以下为sql语句:
SQLNamedQuery get-quota-limit SELECT “name, quota_type, per_session, limit_type, bytes_in_avail,bytes_out_ava
il, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = ‘%{0
}’AND quota_type = ‘%{1}’”

SQLNamedQuery get-quota-tally SELECT “name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files
_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = ‘%{0}’ AND quota_type = ‘%{1}’”
SQLNamedQuery update-quota-tally UPDATE “bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = ‘%{6}’ AND quota_type = ‘%{7}’” ftpquotatallies

SQLNamedQuery insert-quota-tally INSERT “%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}” ftpquotatallies

QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

下面可以用phpmyadmin在mysql里加入,我的sql为以下
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default ‘’,
gid smallint(6) NOT NULL default ‘99’,
members varchar(16) NOT NULL default ‘’,
KEY groupname (groupname)
) TYPE=MyISAM COMMENT=’ProFTP group table’;

INSERT INTO ftpgroup VALUES (‘nobody’, 99, ‘nobody’);

CREATE TABLE ftpquotalimits (
name varchar(30) default NULL,
quota_type enum(‘user’,’group’,’class’,’all’) NOT NULL default ‘user’,
per_session enum(‘false’,’true’) NOT NULL default ‘false’,
limit_type enum(‘soft’,’hard’) NOT NULL default ‘soft’,
bytes_in_avail float NOT NULL default ‘0’,
bytes_out_avail float NOT NULL default ‘0’,
bytes_xfer_avail float NOT NULL default ‘0’,
files_in_avail int(10) unsigned NOT NULL default ‘0’,
files_out_avail int(10) unsigned NOT NULL default ‘0’,
files_xfer_avail int(10) unsigned NOT NULL default ‘0’
) TYPE=MyISAM;

CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL default ‘’,
quota_type enum(‘user’,’group’,’class’,’all’) NOT NULL default ‘user’,
bytes_in_used float NOT NULL default ‘0’,
bytes_out_used float NOT NULL default ‘0’,
bytes_xfer_used float NOT NULL default ‘0’,
files_in_used int(10) unsigned NOT NULL default ‘0’,
files_out_used int(10) unsigned NOT NULL default ‘0’,
files_xfer_used int(10) unsigned NOT NULL default ‘0’
) TYPE=MyISAM;

CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default ‘’,
passwd varchar(32) NOT NULL default ‘’,
uid smallint(6) NOT NULL default ‘99’,
gid smallint(6) NOT NULL default ‘99’,
homedir varchar(255) NOT NULL default ‘’,
shell varchar(16) NOT NULL default ‘/sbin/nologin’,
count int(11) NOT NULL default ‘0’,
accessed datetime NOT NULL default ‘0000-00-00 00:00:00’,
modified datetime NOT NULL default ‘0000-00-00 00:00:00’,
PRIMARY KEY (id)
) TYPE=MyISAM COMMENT=’ProFTP user table’ ;启动proftpd
/usr/local/proftpd/sbin/proftpd start
在数据数中的ftpuser中加入用户,密码他路径就可以了。
以上只是一个流水笔记

Blogged with the Flock Browser

bitdefenderV10最新注册码

发表于 2008-03-13 | 分类于 Other

最新BitDefender Antivirus Plus v10注册码用到2010.01.14
注册码:6C672565540A021DDDAA
注册码:5401DEF806AF0B8A5B11
注册码:19E4243E56FFCADCC83C
注册码:A2AF1ED8ADAFAAAB94D8
注册码:366A693F50A77BD98D17

将FireFox伪装成MSIE的方法

发表于 2008-03-12 | 分类于 Other

在firefox地址栏输入about:config
在filter(过滤)栏中输入general.useragent.extra.firefox
双击value项中的firefox字样,弹出修改value的对话框
将其值改为Mozilla/4.0 (compatible; MSIE 6.0)

在 Linux 上进行自动备份

发表于 2008-03-10 | 分类于 Other

级别: 初级

Carlos Justiniano ([email protected]), 软件设计师, Ecuity Inc.

2004 年 8 月 08 日

重要数据的丢失可能意味着致命的破坏。尽管如此,还是有无数专业人员忽视了对他们的数据的备份。虽然原因可能各不相同,但是,最常见的一个解释是,执行例行备份确实烦琐。由于机器擅长于完成普通而重复的任务,因此,自动化备份的过程是降低工作内在的枯燥性和人们与生俱来的拖延倾向的关键所在。
如果您使用 Linux,那么您就已经可以使用那些创建定制备份解决方案的极其强大的工具。本文中的方案,可以让您使用几乎每个 Linux 发行版本都附带的开放源代码工具来执行从简单的到更高级而且安全的网络备份。

简单备份

本文按照一步一步的方法来进行讲述,只要您遵循那些基本的步骤,此方法会是非常直观的。

在研究更高级的分布式备份解决方案之前,让我们首先来看一个简单而强大的存档机制。让我们来分析一个名为 arc 的方便的脚本,它可以让我们在 Linux shell 提示符中创建备份快照。

清单 1. arc shell 脚本

#!/bin/sh
tar czvf $1.$(date +%Y%m%d%-H%M%S).tgz $1
exit $?

arc 脚本接收一个单独的文件或目录名作为参数,创建一个压缩的存档文件,同时将当前日期嵌入到生成的存档文件的名字之中。例如,如果您有一个名为 beoserver 的目录,您可以调用 arc 脚本,将 beoserver 目录名传递给它以创建一个压缩的存档文件,如: beoserver.20040321-014844.tgz

使用 date 命令是为了嵌入一个日期和时间戳以帮助您组织存档文件。日期的格式是年、月、日、小时、分、秒 —— 虽然秒域的使用有一些多余。查看 data 命令的手册( man date )来了解其他选项。另外,在清单 1 中,我们向 tar 传递了 -v (verbose)选项。这就使得 tar 显示出它正在存档的文件。如果您喜欢静默地进行备份,那么删除这个 -v 选项。

清单 2. 存档 beoserver 目录
$ ls
arc beoserver
$ ./arc beoserver
beoserver/
beoserver/bookl.dat
beoserver/beoserver_ab_off
beoserver/beoserver_ab_on
$ ls
arc beoserver beoserver.20040321-014844.tgz

高级备份

这个简单备份是实用的;不过,它仍然包含一个人工备份的过程。行业最佳经验通常建议将数据备份到多个媒体上,并备份到分开的不同地理位置。中心思想是避免依赖于任何一个单独的存储媒体或单独的位置。

在下一个例子中我们将应对这一挑战,我们将分析一个如图 1 所示的假想的分布式网络,它展示了对两台远程服务器和一台离线存储服务器的系统管理。

图 1. 分布式网络

服务器 #1 和 #2 上的备份文件将安全地传输到离线存储服务器上,而且整个分布式备份过程将在没有人工干涉的情况下定期进行。我们将使用一组标准的工具(开放安全 shell 工具套件(OpenSSH)的一部分),以及磁带存档器(tar)和 cron 任务调度服务。我们的全部计划是,使用 cron 进行调度,使用 shell 程序和 tar 应用程序完成备份过程,使用 OpenSSH 安全 shell(ssh)加密进行远程访问、认证、安全 shell 拷贝(scp)以自动完成文件传输。要获得另外的资料请务必查看每个工具的手册。

使用公钥/私钥进行安全的远程访问

在数字安全的上下文中,密钥(key)指的是用来加密或解密其他数据片断的一个数据片断。公钥私钥模式的有趣之处在于,使用公钥加密的数据,只有用相应的私钥才可以解密。您可以自由地发布一个公钥,这样别人就可以对发送给您的消息进行加密。公钥/私钥模式彻底改变了数字安全的原因之一是,发送者和接收者不必再共享一个通用的密码。除了其他方面的贡献,公钥/私钥加密使用电子商务和其他安全传输成为可能。在本文中,我们将创建并使用公钥和私钥来创建一个非常安全的分布式备份解决方案。

要进行备份过程的每台机器都必须运行 OpenSSH 安全 shell 服务(sshd),同时让 22 端口可以通过任何内部防火墙被访问。如果您访问远程的服务器,那么很有可能您正在使用安全 shell。

我们的目标将是,不需要人工提供密码就可以安全地访问机器。一些人认为最简单的办法是设置无密码的访问:不要这样做。这样做不安全。不用那样,本文中我们将使用的方法可能会占用您大约一个小时的时间,建立起一个与使用“无密码”帐号同样方便的系统 —— 不过它是公认非常安全的。

让我们首先确保 OpenSSH 已经安装,接下来查看它的版本号。完成本文时,最新的发行的 OpenSSH 是 2004 年 2 月 24 日发布的版本 3.8。您应该考虑使用一个较新的而且稳定的发布版本,至少所用的版本应该要比版本 2.x 新。访问 OpenSSH Security 网页以获得关于特定旧版本的缺陷的细节(请参阅本文后面的 参考资料 中的链接)。到目前为止,OpenSSH 是非常稳定的,而且已经证明不存在其他 SSH 工具所报告的很多缺陷。

在 shell 提示符中,输入 ssh 并给出重要的 V 选项来检查版本号:

$ ssh -V
OpenSSH_3.5p1, SSH protocols 1.5/2.0, OpenSSL 0x0090701f

如果 ssh 返回的版本号大于 2.x,则机器处于相对良好的状态。无论如何,建议您所有的软件都使用最新的稳定版本,这对于安全相关的软件来说尤其重要。

我们的第一个步骤是,使用将会有特权访问服务器 1 和 2 的帐号登录到离线存储服务器机器(见图 1)。

$ ssh [email protected]

登录到离线存储服务器以后,使用 ssh-keygen 程序并给出 -t dsa 选项来创建一个公钥/密钥对。 -t 选项是必须的,用来指定我们要生成的密钥类型。我们将使用数字签名算法(Digital Signature Algorithm,DSA),它让我们可以使用更新的 SSH2 协议。参阅 ssh-keygen 手册以获得更多细节。

在 ssh-keygen 执行的过程中,在询问您口令(passphrase)之前,将提示您输入 ssh 密钥存储的位置。当询问在何处存储密钥时只需要按下回车键,然后 ssh-keygen 程序将创建一个名为 .ssh 的隐藏目录(如果原来不存在),以及两个文件,一个公钥文件和一个私钥文件。

ssh-keygen 的一个有趣特性是,当提示输入一个口令时,它让您可以只是简单地按下回车键。如果您没有给出口令,那么 ssh-keygen 将生成没有加密的密钥!如您所想,这不是个好主意。当要求输入口令时,确保输入一个足够长的字符消息,最好包含混合字符而不仅仅是一个简单的密码字符串。

清单 3. 永远选择好的口令
[offsite]:$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/accountname/.ssh/id_dsa):
Enter passphrase (empty for no passphrase): (enter passphrase)
Enter same passphrase again: (enter passphrase)
Your identification has been saved in /home/accountname/.ssh/id_dsa.
Your public key has been saved in /home/accountname/.ssh/id_dsa.pub.
The key fingerprint is:
7e:5e:b2:f2:d4:54:58:6a:fa:6b:52:9c:da:a8:53:1b accountname@offsite

由于 ssh-keygen 生成的 .ssh 目录是一个隐藏的“dot”目录,所以要给 ls 命令传入一个 -a 选项来查看新创建的目录:

[offsite]$ ls -a
. .. .bash_logout .bash_profile .bashrc .emacs .gtkrc .ssh

进入隐藏的 .ssh 目录并列出其内容:

[offsite]$ cd .ssh
[offsite]$ ls -lrt
id_dsa id_dsa.pub

现在,在隐藏的 .ssh 目录中,我们已经拥有了一个私钥(id_dsa)和一个公钥(id_dsa.pub)。您可以使用 vi 或 emacs 等文本编辑工具或者简单地使用 less 或 cat 命令来分析每个密钥文件的内容。您将看到由混合字符构成的内容已经经过了 base64 编码。

然后,我们需要将公钥拷贝并安装到服务器 1 和 2 上。不要使用 ftp。更合理的是,使用安全拷贝程序来将公钥传送到每一台远程机器上。

清单 4. 将公钥安装到远程服务器上
[offsite]$ scp .ssh/id_dsa.pub [email protected]:offsite.pub
[email protected]’s password: (enter password, not new
passphrase!)
id_dsa.pub 100% |*| 614 00:00
[offsite]$ scp .ssh/id_dsa.pub [email protected]:offsite.pub
[email protected]’s password: (enter password, not new
passphrase!)
id_dsa.pub 100% |*| 614 00:00

在安装完新的公钥后,我们就可以使用创建私钥和公钥时指定的口令来登录到每一台机器。现在,登录到每台机器,并将 offsite.pub 文件的内容附加到一个名为 authorized_keys 的文件中,这个文件存储在每台远程机器的 .ssh 目录下。我们可以使用一个文本编辑器或者简单地使用 cat 命令来将 offsite.pub 文件的内容附加到 authorized_keys 文件:

清单 5. 将 offsite.pub 添加到已授权密钥列表
[offsite]$ ssh [email protected]
[email protected]’s password: (enter password, not new
passphrase!)
[server1]$ cat offsite.pub >> ./ssh/authorized_keys

接下来的步骤是考虑一些额外的安全性。首先,我们修改 .ssh 的访问权限,以使得只有所有者有读、写和执行的权限。然后,我们确保 authorized_keys 文件只能由所有者来访问。最后,将先前上传的 offsite.pub 密钥文件删除,因为再也不需要它了。确保设置适当的访问权限很重要,因为 OpenSSH 服务器可能会拒绝使用具有不安全访问权限的密钥。

清单 6. 使用 chmod 修改权限
[server1]$ chmod 700 .ssh
[server1]$ chmod 600 ./ssh/authorized_keys
[server1]$ rm offsite.pub
[server1]$ exit

在服务器 2 上完成同样的步骤后,我们就可以返回到离线存储机器上来测试新的口令类型的访问。在离线服务器上您可以输入下面的内容:

[offsite]$ ssh -v [email protected]

在检验您的帐号现在可以使用新的口令而不是原来的密码来访问远程的服务器时,使用 -v 或 verbose 标记选项来显示调试信息。调试输出除了能让您在一个高的层面上观察到认证过程是如何工作的之外,还可以显示出您可以以其他方式无法得到的重要信息。在以后的连接中您可能并不需要指定 -v 标记;但是在测试连接时它相当有用。

使用 ssh-agent 自动化机器访问

ssh-agent 程序如同一个看门人,它根据需要安全地提供对安全密钥的访问。ssh-agent 启动后,它就会在后台运行,并且可以由 ssh 和 scp 程序等其他 OpenSSH 应用程序所使用。这就使得 ssh 程序可以请求一个已经解密了的密钥,而不是在每次需要时向您询问私钥的安全口令。

让我们来仔细研究一下 ssh -agent。ssh-agent 运行时它会输出 shell 命令:

清单 7. ssh-agent 应用
[offsite]$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-XX1O24LS/agent.14179; export SSH_AUTH_SOCK;
SSH_AGENT_PID=14180; export SSH_AGENT_PID;
echo Agent pid 14180;

我们可以使用 shell 的 eval 命令来让 shell 执行 ssh-agent 显示的输出命令:

[offsite]$ eval ssh-agent
Agent pid 14198

eval 命令告诉 shell 去评价(执行)ssh-agent 程序生成的命令。确保您指定的是反引号()而不是单引号!执行后, evalssh-agent` 语句将返回代理的进程标识符。在幕后, SSH_AUTH_SOCK 和 SSH_AGENT_PID shell 变量已经被导出而可以使用。您可以将它们显示在 shell 控制台中来查看它们的值:

[offsite]$ echo $SSH_AUTH_SOCK
/tmp/ssh-XX7bhIwq/agent.14197

$SSH_AUTH_SOCK (SSH Authentication Socket 的缩写)是一个本地套接字的位置,应用程序可以通过它来与 ssh-agent 通信。将 eval ssh-agent 语句加入到您的 ~/.bash_profile 文件以确保 SSH_AUTH_SOCK 和 SSH_AGENT_PID 始终被注册。

ssh-agent 现在就已经成为一个后台进程,可以用 top 和 ps 命令查看得到。

现在我们就已经可以使用 ssh-agent 共享我们的口令。为此,我们必须使用一个名为 ssh-add 的程序,这个程序将我们的口令添加(发送)到运行着的 ssh-agent 程序。

清单 8. 用于免口令登录的 ssh-add
[offsite]$ ssh-add
Enter passphrase for /home/accountname/.ssh/id_dsa: (enter passphrase)
Identity added: /home/accountname/.ssh/id_dsa
(/home/accountname/.ssh/id_dsa)

现在,当我们访问 server1 时,不会再被提示输入口令:

[offsite]$ ssh [email protected]
[server1]$ exit

如果您还不相信,那么尝试去掉( kill -9 )ssh-agent 进程,然后重新连接 server1。这一次,您将注意到,server1 将会询问存储在 .ssh 目录下 id_dsa 中的私钥的口令:

[offsite]$ kill -9 $SSH_AGENT_PID
[offsite]$ ssh [email protected]
Enter passphrase for key ‘/home/accountname/.ssh/id_dsa’:

使用 keychain 简化密钥访问

到现在为止,我们已经了解了几个 OpenSSH 程序(ssh、scp、ssh-agent 和 ssh-add),而且我们已经创建并安装了私钥和公钥来启用一个安全而且自动的登录过程。您可能已经意识到,大部分设置工作只需要进行一次。例如,创建密钥、安装密钥、通过 .bash_profile 执行 ssh-agent 的过程在每台机器只需要进行一次。那真是好消息。

不太理想的消息是,我们每次登录到离线的机器上时,都必须调用 ssh-add,而且,ssh-agent 与我们将要用来自动化备份工作的 cron 调度进程并不直接兼容。cron 进程不能与 ssh-agent 通信的原因是,cron 作业是作为 cron 的子进程来执行,这样它们就不会继承 $SSH_AUTH_SOCK shell 变量。

幸运的是,有一个解决方案不但可以消除 ssh-agent 和 ssh-add 的局限,而且可以让我们使用 cron 来自动进行各种需要对其他机器进行安全地无密码访问的过程。在他 2001 年发表的三篇 developerWorks 系列文章中,即 OpenSSH key management(参阅 参考资料 以获得链接),Daniel Robbins 介绍了一个名为 keychain 的 shell 脚本,它是 ssh-add 和 ssh-agent 的一个前端,简化了整个无密码的过程。随着时间的过去,keychain 脚本已经经历了很多改进,现在由 Aron Griffis 维护,其最新的 2.3.2-1 发布版本公布于 2004 年 6 月 17 日。

keychain shell 脚本太长以致于无法在本文中列出,因为精心编写的脚本中包括了很多错误检测、丰富的文档以及非常多的跨平台代码。不过,keychain 可以自项目的 Web 站点上方便地下载得到(参阅 参考资料以获得链接)。

下载并安装了 keychain 后,使用它就很简单了。只需要登录到每台机器并将下面两行添加到每个 .bash_profile 文件:

keychain id_dsa
. ~/.keychain/$HOSTNAME-sh

在您第一次重新登录到每台机器时,keychain 将向您询问口令。不过,除非机器被重新启动,否则,以后再登录时,keychain 将不会再要求您重新输入口令。最好的是,cron 任务现在可以使用 OpenSSH 命令来安全地访问远程的机器,而不需要交互地使用口令。更好的安全和更容易的使用,现在我们已经兼得。

清单 9. 在每台机器上初始化
KeyChain 2.3.2; http://www.gentoo.org/projects/keychain
Copyright 2002-2004 Gentoo Technologies, Inc.; Distributed under the
GPL

  • Initializing /home/accountname/.keychain/localhost.localdomain-sh
    file…
  • Initializing /home/accountname/.keychain/localhost.localdomain-csh
    file…
  • Starting ssh-agent
  • Adding 1 key(s)…
    Enter passphrase for /home/accountname/.ssh/id_dsa: (enter passphrase)

脚本化备份过程

我们的下一个任务是创建执行必要的备份过程的 shell 脚本。目标是执行服务器 1 和 2 的完全数据库备份。在我们的例子中,每个服务器都运行着 MySQL 数据库服务器,我们使用 mysqldump 命令行工具来将一些数据库表导出到一个 SQL 输入文件中。

清单 10. 服务器 1 的 dbbackup.sh shell 脚本

#!/bin/sh

change into the backup_agent directory where data files are stored.

cd /home/backup_agent

use mysqldump utility to export the sites database tables

mysqldump -u sitedb -pG0oDP@sswrd –add-drop-table sitedb –tables
tbl_ccode tbl_machine tbl_session tbl_stats > userdb.sql

compress and archive

tar czf userdb.tgz userdb.sql

在服务器 2 上,我们将设置一个类似的脚本来备份站点数据库中给出的独有表单。每个脚本都通过下面的步骤标记为可执行的:

[server1]:$ chmod +x dbbackup.sh

在服务器 1 和 2 上设置了 dbbackup.sh 后,我们返回到离线的数据服务器,在那里我们将创建一个 shell 脚本来调用各个远程 dbbackup.sh 脚本并随后传输压缩的(.tgz)数据文件。

清单 11. 用在离线的数据服务器上的 backup_remote_servers.sh shell 脚本

#!/bin/sh

use ssh to remotely execute the dbbackup.sh script on server 1

/usr/bin/ssh [email protected] “/home/backup_agent/dbbackup.sh”

use scp to securely copy the newly archived userdb.tgz file

from server 1. Note the use of the date command to timestamp

the file on the offsite data server.

/usr/bin/scp [email protected]:/home/backup_agent/userdb.tgz
/home/backups/userdb-$(date +%Y%m%d-%H%M%S).tgz

execute dbbackup.sh on server 2

/usr/bin/ssh [email protected] “/home/backup_agent/dbbackup.sh”

use scp to transfer transdb.tgz to offsite server.

/usr/bin/scp [email protected]:/home/backup_agent/transdb.tgz
/home/backups/transdb-$(date +%Y%m%d-%H%M%S).tgz

backup_remote_servers.sh shell 脚本使用 ssh 命令来执行远程服务器上的脚本。由于我们已经设置的无密码的访问,ssh 命令可以通过离线的服务器在服务器 1 和 2 上远程地执行命令。感谢 keychain,整个认证过程现在可以自动完成。

调度

我们的下一个步骤,也是最后一个步骤,是调度 backup_remote_servers.sh shell 脚本在离线的数据存储服务器上的执行。我们将向 cron 调度服务器中添加两个条目,以要求每天执行备份脚本两次,3:34 执行一次,8:34 再执行一次。在离线的服务器上使用 edit( -e )选项调用 crontab 程序。

[offsite]:$ crontab -e

crontab 调用 VISUAL 或 EDITOR shell 环境变量所指定的默认的编辑器。然后,输入两个条目并保存和关闭文件。

清单 12. 离线的服务器上的 Crontab 条目
34 3 /home/backups/remote_db_backup.sh
34 20
/home/backups/remote_db_backup.sh

一个 crontab 行包括两个主要部分,时间表部分和后面的命令部分。时间表分为多个域,用来指定一个命令应该何时执行:

清单 13. Crontab 格式
+—- minute
| +—– hour
| | +—— day of the month
| | | +—— month
| | | | +—- day of the week
| | | | | +– command to execute
| | | | | |
34 3 * /home/backups/remote_db_backup.sh

检验您的备份

您应该对备份进行例行地检查,以确保程序正确进行。自动程序可以使烦琐的工作得到避免,但是永远不能因此而懒惰。如果您的数据值得备份,那么它也值得您时常进行抽样检查。

考虑添加一个 cron 作业来提醒您自己至少每个月对备份进行一次检查。另外,经常修改安全密钥也是一个好主意,同样您也可以调度一个 cron 作业来提醒您做这件事。

另外的安全防范

要获得更高的安全性,可以考虑在每台机器上安装并配置一个入侵检测系统(ntrusion Detection System,IDS),比如 Snort。可以预见,当入侵正在发生或者近期发生过时,IDS 将会通知您。IDS 到位后,您将可以添加其他层次上的安全,比如对您的备份进行数字签名和加密。

GNU Privacy Guard(GnuPG)、OpenSSL 和 ncrypt 等流行的开放源代码工具可以支持通过 shell 脚本对存档文件进行加密,不过不建议在没有 IDS 提供的额外层次保护的情况下这样做(参阅 参考资料 以获得关于 Snort 的更多信息)。

结束语

本文向您展示了如何让您的脚本在远程服务器执行以及如何执行安全自动的文件传输。我希望您能由此得到灵感而开始考虑保护您自己的重要数据,并使用 OpenSSH 和 Snort 等开放源代码工具来构建新的解决方案。

1…171819…27
九王爷

九王爷

这里是外宅,备份用的

269 日志
19 分类
41 标签
© 2017 九王爷
由 Hexo 强力驱动
主题 - NexT.Pisces