九王爷

九王爷的府邸


  • 首页

  • 分类

  • 归档

  • 标签

vsftp配置

发表于 2006-11-23 | 分类于 Linux

一、前言

Vsftp(Very Secure FTP)是一种在Unix/Linux中非常安全且快速稳定的FTP服务器,目前已经被许多大型站点所采用,如ftp.redhat.com,ftp.kde.org,ftp.gnome.org.等。Vsftpd的实现有三种方式

1、匿名用户形式:在默认安装的情况下,系统只提供匿名用户访问

2、本地用户形式:以/etc/passwd中的用户名为认证方式

3、虚拟用户形式:支持将用户名和口令保存在数据库文件或数据库服务器中。相对于FTP的本地用户形式来说,虚拟用户只是FTP服务器的专有用户,虚拟用
户只能访问FTP服务器所提供的资源,这大大增强系统本身的安全性。相对于匿名用户而言,虚拟用户需要用户名和密码才能获取FTP服务器中的文件,增加了
对用户和下载的可管理性。对于需要提供下载服务,但又不希望所有人都可以匿名下载;既需要对下载用户进行管理,又考虑到主机安全和管理方便的FTP站点来
说,虚拟用户是一种极好的解决方案。

二、获取最新版的Vsftp程序

Vsftp官方下载:ftp://vsftpd.beasts.org/users/cevans/vsftpd-2.0.3.tar.gz,目前已经到2.0.3版本。假设我们已经将vsftpd-2.0.3.tar.gz文件下载到服务器的/home/xuchen目录

CODE:
[Copy to clipboard]

cd /home/xuchen

tar xzvf vsftpd-2.0.3.tar.gz //解压缩程序

cd vsftpd-2.0.3

三、三种方式的实现

1、匿名用户形式实现

vi builddefs.h \编辑builddefs.h 文件,文件内容如下:

#ifndef VSF_BUILDDEFS_H

#define VSF_BUILDDEFS_H

#undef VSF_BUILD_TCPWRAPPERS

#define VSF_BUILD_PAM

#undef VSF_BUILD_SSL

#endif / VSF_BUILDDEFS_H /

将以上undef的都改为define,支持tcp_wrappers,支持PAM认证方式,支持SSL

make //直接在vsftpd-2.0.3里用make编译

ls -l vsftpd

-rwxr-xr-x 1 root root 86088 Jun 6 12:29 vsftpd //可执行程序已被编译成功

创建必要的帐号,目录:

useradd nobody //可能你的系统已经存在此帐号,那就不用建立

mkdir /usr/share/empty //可能你的系统已经存在此目录,那就不用建立

mkdir /var/ftp //可能你的系统已经存在此目录,那就不用建立

useradd -d /var/ftp ftp //可能你的系统已经存在此帐号,那就不用建立

chown root:root /var/ftp

chmod og-w /var/ftp

请记住,如果你不想让用户在本地登陆,那么你需要把他的登陆SHELL设置成/sbin/nologin,比如以上的nobody和ftp我就设置成/sbin/nologin

安装vsftp配置文件,可执行程序,man等:

install -m 755 vsftpd /usr/local/sbin/vsftpd-ano

install -m 644 vsftpd.8 /usr/share/man/man8

install -m 644 vsftpd.conf.5 /usr/share/man/man5

install -m 644 vsftpd.conf /etc/vsftpd-ano.conf

这样就安装完成了,那么我们开始进行简单的配置

vi /etc/vsftpd-ano.conf ,将如下三行加入文件

listen=YES

listen_port=21

tcp_wrappers=YES

anon_root=/var/ftp //设置匿名用户本地目录,和ftp用户目录必须相同

listen=YES的意思是使用standalone启动vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推荐使用standalone方式)

/usr/local/sbin/vsftpd-ano /etc/vsftpd-ano.conf & //以后台方式启动vsftpd

注意:每行的值都不要有空格,否则启动时会出现错误,举个例子,假如我在listen=YES后多了个空格,那我启动时就出现如下错误:

500 OOPS: bad bool value in config file for: listen

测试搭建好的匿名用户方式

ftp 127.0.0.1

Connected to 127.0.0.1.

220 (vsFTPd 2.0.3)

530 Please login with USER and PASS.

530 Please login with USER and PASS.

KERBEROS_V4 rejected as an authentication type

Name (127.0.0.1:root): ftp

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp>; pwd

257 “/“

ftp>; quit

221 Goodbye.

#

OK,已经完成了,very nice.

高级配置

细心的朋友可能已经看出来我们只在默认配置文件增加了四行,就实现了FTP连接(也证明了vsftpd的易用性),那么让我们传个文件吧,呀!!传输失败了(见图1)

为什么呢?因为 vsftpd 是为了安全需要,/var/ftp目录不能把所有的权限打开,所以我们这时要建一个目录pub,当然也还是需要继续修改配置文件的。

mkdir /var/ftp/pub

chmod -R 777 /var/ftp/pub

为了测试方便,我们先建立一个名为kill-ano的脚本,是为了杀掉FTP程序的

#!/bin/bash

a=/bin/ps -A | grep vsftpd-ano | awk '{print $1}'

kill -9 $a

那么现在大家看看我的匿名服务器配置文件吧

anonymous_enable=YES //允许匿名访问,这是匿名服务器必须的

write_enable=YES //全局配置可写

no_anon_password=YES //匿名用户login时不询问口令

anon_umask=077 //匿名用户上传的文件权限是-rw—-

anon_upload_enable=YES //允许匿名用户上传文件

anon_mkdir_write_enable=YES //允许匿名用户建立目录

anon_other_write_enable=YES //允许匿名用户具有建立目录,上传之外的权限,如重命名,删除

dirmessage_enable=YES //当使用者转换目录,则会显示该目录下的.message信息

xferlog_enable=YES //记录使用者所有上传下载信息

xferlog_file=/var/log/vsftpd.log //将上传下载信息记录到/var/log/vsftpd.log中

xferlog_std_format=YES //日志使用标准xferlog格式

idle_session_timeout=600 //客户端超过600S没有动作就自动被服务器踢出

data_connection_timeout=120 //数据传输时超过120S没有动作被服务器踢出

chown_uploads=YES

chown_username=daemon //上传文件的属主

ftpd_banner=Welcome to d-1701.com FTP service. //FTP欢迎信息

anon_max_rate=80000 //这是匿名用户的下载速度为80KBytes/s

check_shell=NO //不检测SHELL

现在再测试,先kill掉再启动FTP程序

./kill-ano

/usr/local/sbin/vsftpd-ano /etc/vsftpd-ano.conf &

上传一个文件测试一下,怎么样?OK了吧,下载刚上传的那个文件,恩?不行,提示

550 Failed to open file.

传输已失败!

传输队列已完成

1 个文件传输失败

没有关系,你记得咱们设置了anon_umask=077了吗?所以你下载不了,如果你到服务器上touch 一个文件(644),测试一下,是可以被下载下来的,好了,匿名服务器就说到这里了。

2、本地用户形式实现

cd /home/xuchen/vsftpd-2.0.3 //进入vsftpd-2.0.3的源代码目录

make clean //清除编译环境

vi builddefs.h \继续编辑builddefs.h 文件,文件内容如下:

#ifndef VSF_BUILDDEFS_H

#define VSF_BUILDDEFS_H

#define VSF_BUILD_TCPWRAPPERS

#define VSF_BUILD_PAM

#define VSF_BUILD_SSL

#endif / VSF_BUILDDEFS_H /

将以上define VSF_BUILD_PAM行的define改为undef,支持tcp_wrappers,不支持PAM认证方式,支持SSL,记住啊,如果支持了PAM认证方式,你本地用户是不能登陆的。

make //直接在vsftpd-2.0.3里用make编译

ls -l vsftpd

-rwxr-xr-x 1 root root 84712 Jun 6 18:56 vsftpd //可执行程序已被编译成功

创建必要的帐号,目录:

useradd nobody //可能你的系统已经存在此帐号,那就不用建立

mkdir /usr/share/empty //可能你的系统已经存在此目录,那就不用建立

mkdir /var/ftp //可能你的系统已经存在此目录,那就不用建立

useradd -d /var/ftp ftp //可能你的系统已经存在此帐号,那就不用建立

chown root:root /var/ftp

chmod og-w /var/ftp

请记住,如果你不想让用户在本地登陆,那么你需要把他的登陆SHELL设置成/sbin/nologin,比如以上的nobody和ftp我就设置成/sbin/nologin

安装vsftp配置文件,可执行程序,man等:

install -m 755 vsftpd /usr/local/sbin/vsftpd-loc

install -m 644 vsftpd.8 /usr/share/man/man8

install -m 644 vsftpd.conf.5 /usr/share/man/man5

install -m 644 vsftpd.conf /etc/vsftpd-loc.conf

这样就安装完成了,那么我们开始进行简单的配置

vi /etc/vsftpd-loc.conf ,将如下三行加入文件

listen=YES

listen_port=21

tcp_wrappers=YES //支持tcp_wrappers,限制访问(/etc/hosts.allow,/etc/hosts.deny)

listen=YES的意思是使用standalone启动vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推荐使用standalone方式),注意事项请参看匿名用户的配置。

anonymous_enable=NO

local_enable=YES //这两项配置说不允许匿名用户登陆,允许本地用户登陆

/usr/local/sbin/vsftpd-loc /etc/vsftpd-loc.conf & //以后台方式启动vsftpd

测试搭建好的匿名用户方式,先测试root用户吧 :)

ftp 127.0.0.1

Connected to 127.0.0.1.

220 (vsFTPd 2.0.3)

530 Please login with USER and PASS.

530 Please login with USER and PASS.

KERBEROS_V4 rejected as an authentication type

Name (127.0.0.1:root): root

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp>; pwd

257 “/root”

ftp>; quit

221 Goodbye.

我们看到root用户可以登陆到ftp,他的登陆目录就是自己的主目录。

再测试一个系统用户,那我们先建立一个用户名叫xuchen的

useradd xuchen

passwd xuchen

Changing password for user xuchen.

New UNIX password:

Retype new UNIX password:

passwd: all authentication tokens updated successfully.

建立好了,让我们开始测试吧!!

ftp 127.0.0.1

Connected to 127.0.0.1.

220 (vsFTPd 2.0.3)

530 Please login with USER and PASS.

530 Please login with USER and PASS.

KERBEROS_V4 rejected as an authentication type

Name (127.0.0.1:root): xuchen

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp>; pwd

257 “/home/xuchen”

ftp>; quit

221 Goodbye.

我们看到xuchen用户可以登陆到ftp,他的登陆目录也是自己的主目录。哈哈,又完成了!

高级配置

细心的朋友可能已经看出来如果我们不支持PAM认证方式,那么本地用户就可以登陆,而默认编译的vsftpd支持PAM认证方式,所以是不支持本地用户登陆的。恩,从这点说,这也是vsftp安全的一个表现—-禁止本地用户登陆。

我们登陆后进行测试,传一个文件上去,得,失败了,那下载个文件下来吧,恩,这是成功的(见图2),而且我们发现我们可以进入到系统根目录(见图3),这样很危险。

那么改配置文件吧,为了测试方便,我们先建立一个名为kill-loc的脚本,也是为了杀掉FTP程序的

#!/bin/bash

a=/bin/ps -A | grep vsftpd-loc | awk '{print $1}'

kill -9 $a

现在提供我的本地用户验证服务器配置文件吧(在匿名里写过的注释我就不在这里写了)

listen=YES

listen_port=21

tcp_wrappers=YES

anonymous_enable=NO

local_enable=YES

write_enable=YES

local_umask=022 //本地用户文件上传后的权限是-rw-r-r

anon_upload_enable=NO

anon_mkdir_write_enable=NO

dirmessage_enable=YES

xferlog_enable=YES

xferlog_file=/var/log/vsftpd.log

xferlog_std_format=YES

connect_from_port_20=YES

chroot_local_user=YES //限制用户在自己的主目录

#local_root=/ftp //你可以指定所有本地用户登陆后的目录,如果不设置此项,用户都会登陆于自己的主目录,就跟咱们前面测试的结果是一样的

local_max_rate=500000 //本地用户的下载速度为500KBytes/s

idle_session_timeout=600

data_connection_timeout=120

nopriv_user= nobody //设定服务执行者为nobody,vsftpd推荐使用一个权限很低的用户,最好是没有家目录(/dev/null),没有登陆shell(/sbin/nologin),系统会更安全

ftpd_banner=Welcome to d-1701.com FTP service.

check_shell=NO

userlist_enable=YES

userlist_deny=YES

userlist_file=/etc/vsftpd.denyuser

以上三条设定不允许登陆的用户,用户列表存放在/etc/vsftpd.denyuser中,一行一个帐号如果我把xuchen这个用户加到vsftpd.denyuser里,那么登陆时会出现如下错误:

ftp 127.0.0.1

Connected to 127.0.0.1.

220 Welcome to d-1701.com FTP service.

530 Please login with USER and PASS.

530 Please login with USER and PASS.

KERBEROS_V4 rejected as an authentication type

Name (127.0.0.1:root): xuchen

530 Permission denied.

Login failed.

呵呵,有意思吧,自己测试吧,本地用户登陆方式就介绍到这里吧!

3、虚拟用户形式实现(db及mysql形式)

cd /home/xuchen/vsftpd-2.0.3 //进入vsftpd-2.0.3的源代码目录

make clean //清除编译环境

vi builddefs.h \继续编辑builddefs.h 文件,文件内容如下:

#ifndef VSF_BUILDDEFS_H

#define VSF_BUILDDEFS_H

#define VSF_BUILD_TCPWRAPPERS

#undef VSF_BUILD_PAM

#define VSF_BUILD_SSL

#endif / VSF_BUILDDEFS_H /

将以上define VSF_BUILD_PAM行的undef改为define,支持tcp_wrappers,支持PAM认证方式,支持SSL,和匿名用户形式是一样的。

make //直接在vsftpd-2.0.3里用make编译

ls -l vsftpd

-rwxr-xr-x 1 root root 86088 Jun 6 22:26 vsftpd //可执行程序已被编译成功

创建必要的帐号,目录:

useradd nobody //可能你的系统已经存在此帐号,那就不用建立

mkdir /usr/share/empty //可能你的系统已经存在此目录,那就不用建立

mkdir /var/ftp //可能你的系统已经存在此目录,那就不用建立

useradd -d /var/ftp ftp //可能你的系统已经存在此帐号,那就不用建立

chown root:root /var/ftp

chmod og-w /var/ftp

请记住,如果你不想让用户在本地登陆,那么你需要把他的登陆SHELL设置成/sbin/nologin,比如以上的nobody和ftp我就设置成/sbin/nologin

安装vsftp配置文件,可执行程序,man等:

install -m 755 vsftpd /usr/local/sbin/vsftpd-pam

install -m 644 vsftpd.8 /usr/share/man/man8

install -m 644 vsftpd.conf.5 /usr/share/man/man5

install -m 644 vsftpd.conf /etc/vsftpd-pam.conf

这样就安装完成了,那么我们开始进行简单的配置

对于用DB库存储用户名及密码的方式来说:

(1)查看系统是否有相应软件包

rpm –qa | grep db4

db4-devel-4.2.52-7.1

db4-4.2.52-7.1

db4-utils-4.2.52-7.1

(2)建立一个logins.txt的文件,单行为用户名,双行为密码,例如

vi /home/logins.txt

xuchen

12345

(3)建立数据库文件并设置文件属性

db_load -T -t hash -f /home/logins.txt /etc/vsftpd_login.db

chmod 600 /etc/vsftpd_login.db

(4)建立认证文件

vi /etc/pam.d/ftp 插入如下两行

auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login

account required /lib/security/pam_userdb.so db=/etc/vsftpd_login

(5)建立一个虚拟用户

useradd -d /home/vsftpd -s /sbin/nologin vsftpd

ls -ld /home/vsftpd

drwx—— 3 vsftpd vsftpd 1024 Jun 6 22:55 /home/vsftpd/

(6)编写配置文件(注意事项请参看匿名用户的配置,这里不再赘述)

vi /etc/vsftpd-pam.conf

listen=YES

listen_port=21

tcp_wrappers=YES //支持tcp_wrappers,限制访问(/etc/hosts.allow,/etc/hosts.deny)

listen=YES的意思是使用standalone启动vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推荐使用standalone方式)

anonymous_enable=NO

local_enable=YES //PAM方式此处必须为YES,如果不是将出现如下错误:

500 OOPS: vsftpd: both local and anonymous access disabled!

write_enable=NO

anon_upload_enable=NO

anon_mkdir_write_enable=NO

anon_other_write_enable=NO

chroot_local_user=YES

guest_enable=YES

guest_username=vsftpd //这两行的意思是采用虚拟用户形式

virtual_use_local_privs=YES //虚拟用户和本地用户权限相同

pasv_enable=YES //建立资料联机采用被动方式

pasv_min_port=30000 //建立资料联机所可以使用port 范围的上界,0表示任意。默认值为0。

pasv_max_port=30999 //建立资料联机所可以使用port 范围的下界,0表示任意。默认值为0。

(7)启动程序

/usr/local/sbin/vsftpd-pam /etc/vsftpd-pam.conf &

(8)测试连通及功能

vi /home/vsftpd/test //建立一个文件,内容如下

1234567890

chown vsftpd.vsftpd /home/vsftpd/test

ftp 127.0.0.1

Connected to 127.0.0.1.

220 (vsFTPd 2.0.3)

530 Please login with USER and PASS.

530 Please login with USER and PASS.

KERBEROS_V4 rejected as an authentication type

Name (127.0.0.1:root): xuchen

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp>; pwd

257 “/“

ftp>; size test

213 11

ftp>; quit

221 Goodbye.

OK,用户名为xuchen,密码为12345可以连接到FTP服务器,看不到文件列表,但可以下载已知文件名的文件,不能上传文件,非常安全吧!!

如果我们需要用户看到文件,怎么办?也好办,在配置文件中加入如下语句:

anon_world_readable_only=NO //匿名登入者不能下载可阅读的档案,默认值为YES

如果需要让用户上传文件和下载文件分开,建议如下这么做

vi /home/logins.txt

xuchen

12345

upload

45678

//首先建立虚拟用户upload,密码为45678

db_load -T -t hash -f /home/logins.txt /etc/vsftpd_login.db //更新数据文件

mkdir /home/vsftpd/upload

vi /etc/vsftpd-pam.conf 加入如下语句

user_config_dir=/etc/vsftpd_user_conf

mkdir /etc/vsftpd_user_conf

vi /etc/vsftpd_user_conf/upload 文件内容如下

local_root=/home/vsftpd/upload

write_enable=YES

anon_world_readable_only=NO

anon_upload_enable=YES

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

chmod 700 /home/vsftpd/upload

chown vsftpd.vsftpd /home/vsftpd/upload/

这样,xuchen用户可以下载/home/vsftpd里的文件及upload里的文件,而upload用户可以上传和下载/home/vsftpd/upload文件夹的东西,但不能到/home/vsftpd里下载文件,很简单得实现了分用户上传和下载

对于用Mysql库存储用户名及密码的方式来说:

就是把用户名和密码放在mysql库里,实现起来也相当简单

(1)建立一个库并设置相应权限

mysql –p

mysql>;create database ftpd;

mysql>;use ftpd;

mysql>;create table user(name char(20) binary,passwd char(20) binary);

mysql>;insert into user (name,passwd) values (‘test1’,’12345’);

mysql>;insert into user (name,passwd) values (‘test2’,’54321’);

mysql>;grant select on ftpd.user to ftpd@localhost identified by ‘123456’;

mysql>;flush privileges; 刷新权限设置

mysql>;quit

(2)下载libpam-mysql进行安装编译

下载地址如下:

http://nchc.dl.sourceforge.net/sourceforge/pam-mysql/pam_mysql-0.5.tar.gz

假设我们把它放在了/home/xuchen目录下

cd /home/xuchen

tar xzvf pam_mysql-0.5.tar.gz

cd pam_mysql

make

cp pam_mysql.so /lib/security

(3)建立PAM认证信息

vi /etc/pam.d/ftp ,内容如下

auth required /lib/security/pam_mysql.so user=ftpd passwd=123456
host=localhost db=ftpd table=user usercolumn=name passwdcolumn=passwd
crypt=0

account required /lib/security/pam_mysql.so user=ftpd passwd=123456
host=localhost db=ftpd table=user usercolumn=name passwdcolumn=passwd
crypt=0

注意:

crypt= n

crypt=0: 明文密码

crypt=1: 使用crpyt()函数(对应SQL数据里的encrypt(),encrypt()随机产生salt)

crypt=2: 使用MYSQL中的password()函数加密

crypt=3:表示使用md5的散列方式

(4)建立本地虚拟用户

useradd -d /home/ftpd -s /sbin/nologin ftpd

(5)下面就差修改vsftpd.conf文件了,我把我的提供给大家参考吧:)

vi /etc/vsftpd-pam1.conf

anonymous_enable=NO

local_enable=YES

write_enable=YES

local_umask=022

anon_upload_enable=YES

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

chroot_local_user=YES

guest_enable=YES

guest_username=ftpd

listen=YES

listen_port=21

pasv_enable=YES

pasv_min_port=30000

pasv_max_port=30999

anon_world_readable_only=NO

virtual_use_local_privs=YES

#user_config_dir=/etc/vsftpd_user_conf

可以看出,和前面的用db库来验证没有多大区别,其实就是一个东西,一个用mysql来验证,一个用db库,我个人比较倾向于用db库来验证,在这个环境下,相对于Mysql来说,安全系数更高一点。

(6)# /usr/local/sbin/vsftpd-pam /etc/vsftpd-pam1.conf & //以后台方式启动

(7)测试连通

ftp 127.0.0.1

Connected to 127.0.0.1.

220 (vsFTPd 2.0.3)

530 Please login with USER and PASS.

530 Please login with USER and PASS.

KERBEROS_V4 rejected as an authentication type

Name (127.0.0.1:root): test1

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp>; pwd

257 “/“

ftp>; quit

221 Goodbye.

看,成功了!!这样就实现了mysql的认证方式,很简单吧??

4、为FTP增加磁盘配额,从而避免恶意用户用垃圾数据塞满你的硬盘

我首先要说的是这个功能是系统自带的,而不是vsftp
的功能之一,千万别搞混了。好了,我们先假设我们的系统用户ftpd的主目录是/home/ftpd,它是建立在/home分区中,那么如果我们要对
ftpd用户进行磁盘限额,那我们需要修改/etc/fstab中根分区的记录,将/home分区的第4个字段改成defaults,usrquota,
如下:

LABEL=/home /home ext3 defaults,usrquota 1 2

reboot //重新启动系统使设置生效

也可以用

mount -o remount /dev/sda6 ///dev/sda6的挂接点就是/home,这样可以不用启动系统。

这里我还要说明一下,如果我们对一个组进行磁配额,那我们需要增加参数grpquota,例如

LABEL=/home /home ext3 defaults,grpquota 1 2

也可以

LABEL=/home /home ext3 defaults,usrquota,grpquota 1 2

你想怎么限制都可以,自己组合参数吧。

quotacheck -avu

说明:a-自动开启挂载文件系统的配额,v-显示信息,u-启用用户配额or g-启用组配额

edquota ftpd //为用户ftpd设置磁盘配额

OR

edquota -g grp //为组grp设置磁盘配额

系统会自动打开配额文件,如下:

Disk quotas for user ftpd (uid 502):

Filesystem
blocks soft
hard inodes soft
hard

/dev/sda6
424 0
0
13 0
0

第一列是启用了配额的文件系统的名称。第二列显示了用户当前使用的块数,单位为KB。随后的两列用来设置用户在该文件系统上的软硬块限度。inodes
列显示了用户当前使用的i节点数量。最后两列用来设置用户在该文件系统上的软硬i节点限度.硬限是用户或组群可以使用的磁盘空间的绝对最大值。达到了该限
度后,磁盘空间就不能再被用户或组群使用了。软限定义可被使用的最大磁盘空间量。和硬限不同的是,软限可以在一段时期内被超过。这段时期被称为过渡期
(grace period),默认七天的超越。过渡期可以用秒钟、分钟、小时、天数、周数、或月数表示。如果以上值中的任何一个被设置为
0,那个限度就不会被设置。我设置了硬块限度为1KB,是为了测试方便。

quotaon -avu //打开磁盘配额监控进程,u是用户g是组,这里我没设置g参数

要校验用户的配额是否被设置,我们可以使用以下命令:

quota ftpd

Disk quotas for user ftpd (uid 502):

Filesystem blocks quota
limit grace files
quota limit grace

/dev/sda6 424* 0
1
13 0 0

edquota –t(-g)来设置过渡期(grace period) //当然只针对软限制而言

和另一个 edquota 命令相似,这个命令也会在文本编辑器中打开当前的文件系统配额:

Grace period before enforcing soft limits for users:

Time units may be: days, hours, minutes, or seconds

Filesystem
Block grace period Inode grace period

/dev/sda6
7days
7days

按你的需要修改后存盘退出

用以下命令显示磁盘配额使用状态

repquota -a 或 repquota /dev/sda6(用户配额)

repquota -g -a 或 repquota -a /dev/sda6 (组的配额)

如果一切按照你的意思实施了,那么我们就进行测试了!如下图4

我们传了一个>;1k的文件,没有成功,这样我们就成功的为用户ftpd增添了磁盘配额,要是哪一天你不想加磁盘配额了,怎么办?参看如下命令:

取消某个文件系统的配额限制

#quotaoff -vug /dev/sda6 //删除home分区的磁盘限额

#删除/etc/fstab中设置配额的部分

修改软配额的最大超越时间

注意:

/,/boot/,/proc,/mnt/cdrom等不要使用配额,没用。而且磁盘配额不适合FAT和FAT32系统。

以后当新设置了某个用户的配额,可以使用如下命令,马上生效。

quotacheck -auvgm –是不尝试重新挂载文件系统

备注:

1、vsftpd配置参数详细整理

#接受匿名用户

anonymous_enable=YES

#匿名用户login时不询问口令

no_anon_password=YES

#匿名用户主目录

anon_root=(none)

#接受本地用户

local_enable=YES

#本地用户主目录

local_root=(none)

#如果匿名用户需要密码,那么使用banned_email_file里面的电子邮件地址的用户不能登录

deny_email_enable=YES

#仅在没有pam验证版本时有用,是否检查用户有一个有效的shell来登录

check_shell=YES

#若启用此选项,userlist_deny选项才被启动

userlist_enable=YES

#若为YES,则userlist_file中的用户将不能登录,为NO则只有userlist_file的用户可以登录

userlist_deny=NO

#如果和chroot_local_user一起开启,那么用户锁定的目录来自/etc/passwd每个用户指定的目录(这个不是很清楚,很哪位熟悉的指点一下)

passwd_chroot_enable=NO

#定义匿名登入的使用者名称。默认值为ftp。

ftp_username=FTP

#################用户权限控制###############

#可以上传(全局控制).

write_enable=YES

#本地用户上传文件的umask

local_umask=022

#上传文件的权限配合umask使用

#file_open_mode=0666

#匿名用户可以上传

anon_upload_enable=NO

#匿名用户可以建目录

anon_mkdir_write_enable=NO

匿名用户其它的写权利(更改权限?)

anon_other_write_enable=NO

如果设为YES,匿名登入者会被允许下载可阅读的档案。默认值为YES。

anon_world_readable_only=YES

#如果开启,那么所有非匿名登陆的用户名都会被切换成guest_username指定的用户名

#guest_enable=NO

所有匿名上传的文件的所属用户将会被更改成chown_username

chown_uploads=YES

匿名上传文件所属用户名

chown_username=lightwiter

#如果启动这项功能,则所有列在chroot_list_file之中的使用者不能更改根目录

chroot_list_enable=YES

#允许使用”async ABOR”命令,一般不用,容易出问题

async_abor_enable=YES

管控是否可用ASCII 模式上传。默认值为NO。

ascii_upload_enable=YES

#管控是否可用ASCII 模式下载。默认值为NO。

ascii_download_enable=YES

#这个选项必须指定一个空的数据夹且任何登入者都不能有写入的权限,当vsftpd 不需要file system 的权限时,就会将使用者限制在此数据夹中。默认值为/usr/share/empty

secure_chroot_dir=/usr/share/empty

###################超时设置##################

#空闲连接超时

idle_session_timeout=600

#数据传输超时

data_connection_timeout=120

#PAVS请求超时

ACCEPT_TIMEOUT=60

#PROT模式连接超时

connect_timeout=60

################服务器功能选项###############

#开启日记功能

xferlog_enable=YES

#使用标准格式

xferlog_std_format=YES

#当xferlog_std_format关闭且本选项开启时,记录所有ftp请求和回复,当调试比较有用.

#log_ftp_protocol=NO

#允许使用pasv模式

pasv_enable=YES

#关闭安全检查,小心呀.

#pasv_promiscuous+NO

#允许使用port模式

#port_enable=YES

#关闭安全检查

#prot_promiscuous

#开启tcp_wrappers支持

tcp_wrappers=YES

#定义PAM 所使用的名称,预设为vsftpd。

pam_service_name=vsftpd

#当服务器运行于最底层时使用的用户名

nopriv_user=nobody

#使vsftpd在pasv命令回复时跳转到指定的IP地址.(服务器联接跳转?)

pasv_address=(none)

#################服务器性能选项##############

#是否能使用ls -R命令以防止浪费大量的服务器资源

#ls_recurse_enable=YES

#是否使用单进程模式

#one_process_model

#绑定到listen_port指定的端口,既然都绑定了也就是每时都开着的,就是那个什么standalone模式

listen=YES

#当使用者登入后使用ls -al 之类的指令查询该档案的管理权时,预设会出现拥有者的UID,而不是该档案拥有者的名称。若是希望出现拥有者的名称,则将此功能开启。

text_userdb_names=NO

#显示目录清单时是用本地时间还是GMT时间,可以通过mdtm命令来达到一样的效果

use_localtime=NO

#测试平台优化

#use_sendfile=YES

################信息类设置################

#login时显示欢迎信息.如果设置了banner_file则此设置无效

ftpd_banner=欢迎来到湖南三辰Fake-Ta FTP 网站.

#允许为目录配置显示信息,显示每个目录下面的message_file文件的内容

dirmessage_enable=YES

#显示会话状态信息,关!

#setproctitle_enable=YES

############## 文件定义 ##################

#定义不能更改用户主目录的文件

chroot_list_file=/etc/vsftpd/vsftpd.chroot_list

#定义限制/允许用户登录的文件

userlist_file=/etc/vsftpd/vsftpd.user_list

#定义登录信息文件的位置

banner_file=/etc/vsftpd/banner

#禁止使用的匿名用户登陆时作为密码的电子邮件地址

banned_email_file=/etc/vsftpd.banned_emails

#日志文件位置

xferlog_file=/var/log/vsftpd.log

#目录信息文件

message_file=.message

############## 目录定义 #################

#定义用户配置文件的目录

user_config_dir=/etc/vsftpd/userconf

#定义本地用户登陆的根目录,注意定义根目录可以是相对路径也可以是绝对路径.相对路径是针对用户家目录来说的.

local_root=webdisk #此项设置每个用户登陆后其根目录为/home/username/webdisk

#匿名用户登陆后的根目录

anon_root=/var/ftp

#############用户连接选项#################

#可接受的最大client数目

max_clients=100

#每个ip的最大client数目

max_per_ip=5

#使用标准的20端口来连接ftp

connect_from_port_20=YES

#绑定到某个IP,其它IP不能访问

listen_address=192.168.0.2

#绑定到某个端口

#listen_port=2121

#数据传输端口

#ftp_data_port=2020

#pasv连接模式时可以使用port 范围的上界,0 表示任意。默认值为0。

pasv_max_port=0

#pasv连接模式时可以使用port 范围的下界,0 表示任意。默认值为0。

pasv_min_port=0

##############数据传输选项#################

#匿名用户的传输比率(b/s)

anon_max_rate=51200

#本地用户的传输比率(b/s)

local_max_rate=5120000

########################################

别外,如果要对每个用户进行单独的控制,只需要在user_config_dir中建立username文件,内容为数据传输和用户权利里面设置个人的合适的选项,用户自定义文件同样适合用pam支持的虚拟用户

附: FTP 数字代码的意义

110 重新启动标记应答。

120 服务在多久时间内ready。

125 数据链路埠开启,准备传送。

150 文件状态正常,开启数据连接端口。

200 命令执行成功。

202 命令执行失败。

211 系统状态或是系统求助响应。

212 目录的状态。

213 文件的状态。

214 求助的讯息。

215 名称系统类型。

220 新的联机服务ready。

221 服务的控制连接埠关闭,可以注销。

225 数据连结开启,但无传输动作。

226 关闭数据连接端口,请求的文件操作成功。

227 进入passive mode。

230 使用者登入。

250 请求的文件操作完成。

257 显示目前的路径名称。

331 用户名称正确,需要密码。

332 登入时需要账号信息。

350 请求的操作需要进一部的命令。

421 无法提供服务,关闭控制连结。

425 无法开启数据链路。

426 关闭联机,终止传输。

450 请求的操作未执行。

451 命令终止:有本地的错误。

452 未执行命令:磁盘空间不足。

500 格式错误,无法识别命令。

501 参数语法错误。

502 命令执行失败。

503 命令顺序错误。

504 命令所接的参数不正确。

530 未登入。

532 储存文件需要账户登入。

550 未执行请求的操作。

551 请求的命令终止,类型未知。

552 请求的文件终止,储存位溢出。

553 未执行请求的的命令,名称不正确。

2、VSFTPD官方资料翻译版(不完整版)—摘自中国Linux公社

翻译了部分VSFTPD的官方资料。

有些知道是什么意思,但难于翻译。有些涉及专业的知识,我自己也不懂,只好按字面翻译。有些我自己看不懂,只好尽量翻译。

如果看了其中一部分觉得糊涂,请参阅官方文挡。

安装篇

===============

这个文件详细介绍了如何从VSFTPD的.tar.gz分发包开始,建立和安装并运行VSFTPD。

1)建立VSFTPD

先进入解压.tar.gz文件后产生的目录内。如下:

cd vsftpd-2.0.1

编辑”builddefs.h”以操作compile-time设定。(tcp_wrappers build,等)

输入make,回车(如果它不工作请发邮件通知我 .

这将产生一个二进制文件,你可以验证一下。如下:

[chris@localhost vsftpd]$ ls -l vsftpd

-rwxrwxr-x 1 chris chris 61748 Sep 27 00:26 vsftpd

2)满足VSFTPD安装所需的一些条件

VSFTPD默认设置需要一个”nobody”用户,如果这个用户不存在,那么添加它。如下:

[root@localhost root]# useradd nobody

useradd: user nobody exists

VSFTPD默认设置需要一个空目录:/usr/share/empty.增加这个目录,如果它还不存在的话。如下:

[root@localhost root]# mkdir /usr/share/empty/

mkdir: cannot create directory `/usr/share/empty’: File exists

如果容许匿名用户(anonymous),那么你将需要一个”ftp”用户和其home目录(这个home目录不属于“ftp”用户,而且“ftp”用户也对其没有写权限)在你的系统中存在。

以下命令用来创建一个”ftp”用户,如果它还不存在的话。

[root@localhost root]# mkdir /var/ftp/

[root@localhost root]# useradd -d /var/ftp ftp

(即使你的”ftp”用户已经存在,完成以下这两步也是很有好处的:)

[root@localhost root]# chown root.root /var/ftp

[root@localhost root]# chmod og-w /var/ftp

3)安装VSFTPD的配置、执行和帮助文件。

输入”make install”后会将二进制文件和帮助文件拷贝到适当的目录。

你也可以手工拷贝这些文件:

cp vsftpd /usr/local/sbin/vsftpd

cp vsftpd.conf.5 /usr/local/man/man5

cp vsftpd.8 /usr/local/man/man8

“make install”不会拷贝默认的配置文件,所以建议你手工拷贝:

cp vsftpd.conf /etc

daidong注:根据你系统版本的不同,也可能是 cp vsftpd.conf /etc/vsftpd

4)测试 (无inetd影响)

VSFTPD能运行在独立模式(standalone)或者通过inetd(xinetd)来启动。

你能通过inetd来运行vsftpd以更好地控制它。但我们在首次运行时不这么做,以便检查系统是否现在配置正常。

编辑/etc/vsftpd.conf(daidong注:也可能是/etc/vsftpd/vsftpd.conf),并在最下面加入以下这一行:

listen=YES

这将告诉VSFTPD不要从inetd启动。

OK,现在试着启动FTP。

以ROOT登录。

确定你没有运行其他FTP服务(否则VSFTPD不能占用FTP所需的21端口)。

运行那个二进制文件,如下:

[root@localhost root]# /usr/local/sbin/vsftpd &

[1] 2104

如果一切正常,那么你将连上FTP服务器,如下:

[chris@localhost chris]$ ftp localhost

Connected to localhost (127.0.0.1).

220 (vsFTPd 1.1.1)

Name (localhost:chris): ftp

331 Please specify the password.

Password:

230 Login successful. Have fun.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp>; ls

227 Entering Passive Mode (127,0,0,1,229,133)

150 Here comes the directory listing.

d–x–x–x 2 0 0 4096 Jan 14 2002 bin

d–x–x–x 2 0 0 4096 Apr 21 20:52 etc

drwxr-xr-x 2 0 0 4096 Apr 21 20:52 lib

drwxr-sr-x 2 0 50 4096 Jul 26 22:58 pub

226 Directory send OK.

ftp>;

5)从inetd或者类似方式启动(官方推荐使用standalone方式)

你也许想通过inetd或者类似方式启动VSFTPD,因为这能给你更多的感受。例如xinetd就有很多的设置。

(注意:VSFTPD的内在机制屏蔽了xinetd的大多数的有用的设置)。

如果使用标准的”inetd”,你需要编辑/etc/inetd.conf,在其中加入以下一行:

ftp stream tcp nowait root /usr/sbin/tcpd /usr/local/sbin/vsftpd

(确定你删除或者注释掉一些已存在的FTP服务配置行。如果你没有安装tcp_wrappers,或者不想使用它们,那么请去掉/usr/sbin/tcpd part).

inetd需要指定并重新载入它的配置文件:

kill -SIGHUP pidof inetd

如果你想使用”xinetd”,请参阅我们提供的范例 /EXAMPLE/INTERNET_SITE/README. 而其他范例文件将告诉你如何调配出更强大的xinetd功能。

6)为本地登录配置PAM文件(可选)

如果你在一台激活了PAM的设备上运行VSFTPD,你需要提供一个 /etc/pam.d/ftp 文件。否则非匿名用户将无法登录服务器。

(注:如果你的PAM版本比较老,那么这个文件也许是 /etc/pam.conf).

做为一个标准设置,你可以拷贝一个已提供的范例文件,如下:

cp RedHat/vsftpd.pam /etc/pam.d/ftp

7)自定义你的配置文件

完成以上的配置后,建议你安装一个配置文件。默认的配置文件位置是/etc/vsftpd.conf. 在VSFTPD软件分发包内有一个范例配置文件。

你可以拷贝其为/etc/vsftpd.conf以做进一步修改。

cp vsftpd.conf /etc

(daidong注:也可能是 cp vsftpd.conf /etc/vsftpd ).

这个默认配置即不容许本地登录也不容许匿名用户上传,也许你希望更改这个配置。

其它

===================

测试平台 (已通过)

-流行的,功能完善的平台都能测试通过。在以下平台的较新版本,VSFTPD工作得很好。在其大部分较早的版本下,也运行正常。

  • RedHat Linux

  • RedHat Enterprise Linux

  • Solaris / GNU tools (Solaris 8 or newer)

  • SuSE Linux

  • Debian Linux

  • OpenBSD

  • FreeBSD

  • NetBSD

  • HP-UX / GNU tools

  • IRIX / GNU tools

  • Mac OS X (note; older versions have setgroups() problem. 10.3.4 reported OK)

虚拟用户1

=============

这个例子示范了如何为虚拟用户设置VSFTPD/PAM。

虚拟用户是一个在系统中并不作为一个登录实体而存在的用户。使用虚拟用户比使用真实的用户更安全,因为这个账号只能用于FTP服务器。

虚拟用户经常用来提供给不大可信任的用户访问某些资源,而这些资源通常是其他普通用户不能访问的。

1)创建虚拟用户数据库

我们将使用pam_userdb来认证虚拟用户。这需要提供一个“db”格式(一种通用数据库格式)的用户名/密码文件。

创建一个”db”格式的文件,首先要创建一个标准文本文件,并把用户名,密码以竖直排列方式输入。如logins.txt:

tom

foo

fired

bar

这个例子中,tom用户的密码是foo.fired用户的密码是bar.

以ROOT登录,创建一个数据库文件,如下:

db_load -T -t hash -f logins.txt /etc/vsftpd_login.db

(这要求berkeley db程序已经安装)

(注:一些系统也许安装了多个版本的”db”,所以某些情况下你可能使用”db3_load”才是正确的。对于一些 Debian系统就是这样。

关键在于要让pam_userdb相信它的登录数据库是哪一个db版本所产生(一般都是db3,尽管你的系统里可能安装的是db4).)

这将创建/etc/vsftpd_login.db文件。显然,你希望设定这个文件的权限:

chmod 600 /etc/vsftpd_login.db

要了解更多关于维护你的登录数据库的信息,请在”berkeley DB”察看相关文档:

http://www.sleepycat.com/docs/utility/index.html

2)用你的新数据库创建一个PAM文件

请参考范例vsftpd.pam,它包含2行:

auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login

account required /lib/security/pam_userdb.so db=/etc/vsftpd_login

这是告诉PAM用新的数据库去验证用户。把这个PAM文件拷贝到PAM目录,一般是/etc/pam.d

cp vsftpd.pam /etc/pam.d/ftp

3)为虚拟用户设置home目录

useradd -d /home/ftpsite virtual

ls -ld /home/ftpsite

(which should give):

drwx—— 3 virtual virtual 4096 Jul 30 00:39 /home/ftpsite

我们已经创建了一个名叫”virtual”的用户,home目录是”/home/ftpsite”.

我们拷贝一些东西到这个下载目录:

cp /etc/hosts /home/ftpsite

chown virtual.virtual /home/ftpsite/hosts

4)创建你的vsftpd.conf配置文件

请参考这个目录下的例子。让我们一行行地看一看这些配置:

anonymous_enable=NO

local_enable=YES

安全起见,屏蔽了匿名用户,只启用了非匿名用户(即虚拟用户使用的账号)

write_enable=NO

anon_upload_enable=NO

anon_mkdir_write_enable=NO

anon_other_write_enable=NO

为了安全请确认这几个配置,这将关闭写的权限。

chroot_local_user=YES

这将把虚拟用户锁定在我们在以上设置的/home/ftpsite目录内。

guest_enable=YES

guest_username=virtual

guest_enable非常重要-它激活了虚拟用户!而guest_username说明所有的虚拟用户都对应我们在上面设置的真实用户:“virtual”.

这同时确定了虚拟用户在文件系统中的位置,也就是说,虚拟用户的home目录即”virtual”用户的home目录:/home/ftpsite。

listen=YES

listen_port=10021

这让VSFTPD以独立模式(standalone)运行,而不是从inetd方式启动。也就是说,你运行VSFTPD可执行文件就启动了FTP服务。

同时也让VSFTPD启用非标准端口10021来监听FTP请求(FTP一般使用21端口)。

pasv_min_port=30000

pasv_max_port=30999

这设定了被动模式的FTP请求端口。当你配置了一个防火墙的时候,这个配置就很好用。

拷贝范例配置文件到/etc

cp vsftpd.conf /etc/

(daidong注:也可能是/etc/vsftpd)

5)启动VSFTPD

到VSFTPD二进制文件所在的目录,输入:

./vsftpd

如果一切正常,这个命令将生效。否则,你将会看到一些错误信息的反馈。

6)测试

启动另一个会话。(或者ctrl-z,再输入”bg”,让VSFTPD在后台运行)。

这是一个FTP会话的例子:

ftp localhost 10021

Connected to localhost (127.0.0.1).

220 ready, dude (vsFTPd 1.1.0: beat me, break me)

Name (localhost:chris): tom

331 Please specify the password.

Password:

230 Login successful. Have fun.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp>; pwd

257 “/“

ftp>; ls

227 Entering Passive Mode (127,0,0,1,117,135)

150 Here comes the directory listing.

226 Transfer done (but failed to open directory).

ftp>; size hosts

213 147

ftp>;

注释:

密码是”foo”

出现”failed to open directory“的话,别担心。这是因为/home/ftpsite目录不容许被任意浏览。

(我们可以更改anon_world_readable_only=NO以消除告警,但为了安全,还是保留这个配置)。

我们能通过size命令看到我们已经访问了被我们拷贝到这里的”hosts”文件。

vsftpd.conf

anonymous_enable=NO

local_enable=YES

write_enable=NO

anon_upload_enable=NO

anon_mkdir_write_enable=NO

anon_other_write_enable=NO

chroot_local_user=YES

guest_enable=YES

guest_username=virtual

listen=YES

listen_port=10021

pasv_min_port=30000

pasv_max_port=30999

虚拟用户2

===============

这个例子将演示如何扩展“VIRTUAL_USERS”那个范例,从而实现更复杂一点的配置。

让我们假定我们需要2种不同的虚拟用户:一种只能浏览并下载资源,另一种能上传文件并浏览站内资源。

要激活这个设置,我们将使用VSFTPD的强大的“单个用户配置”功能(是V1.1.0后出现的新功能)。

在前一个虚拟用户范例中,我们创建了2个用户-tom和fred.

我们将实现fred有写权限以上传新文件,同时tom只能下载文件。

1)激活单个用户配置功能。

要激活这个功能,需要增加以下配置行到配置文件:

user_config_dir=/etc/vsftpd_user_conf

并且创建目录:

mkdir /etc/vsftpd_user_conf

2)授予tom读取所有文件和目录的权限

在上一个例子的最后,我们注意到虚拟用户只能浏览所有的完全可读属性的目录和文件。我们使/home/ftpsite完全可读,而且被上传的文件也

赋予了完全可读的权限(daidong注:意思是说这样虚拟用户就能读取所有的文件了)。但实现这个目的的另一个方法是授权tom能下载那些非完全可读的文件。

对于tom,他的配置文件中需要修改一个设置:

anon_world_readable_only:

设为”anon_world_readable_only=NO” >; /etc/vsftpd_user_conf/tom

(daidong注:既把默认配置修改了anon_world_readable_only后,复制到/etc/vsftpd_user_conf下,名字为tom)

验证一下结果-以tom登录,“ls”将返回一个目录列表。如果以fred登录将不会如此。

注意:重启VSFTPD以启用配置文件/etc/vsftpd.conf(高级用户也可以发送SIGHUP给VSFTPD的监听进程).

3)授予freg读取所有文件/目录并创建新文件/目录的权限,但让他不能对已存在的文件/目录进行操作.

echo “anon_world_readable_only=NO” >; /etc/vsftpd_user_conf/fred

echo “write_enable=YES” >;>; /etc/vsftpd_user_conf/fred

echo “anon_upload_enable=YES” >;>; /etc/vsftpd_user_conf/fred

验证一下-以tom登录,将不能上传,而fred就可以.

试图删除一个文件–噢,你们俩都不行!

配置详解

=============

VSFTPD.CONF.5

================

名字

vsftpd.conf :VSFTPD的配置文件

描述:

vsftpd.conf 用来控制VSFTPD的各项功能。默认状态下,它的位置是/etc/vsftpd.conf。

(译者注:也许老的LINUX版本下,配置文件是这个位置,但新的LINUX版本,例如FC2,配置文件是在/etc/vsftpd目录下。

但是也很可能和安装方式有关,RPM包安装,配置文件是/etc/vsftpd.conf. 源码包安装:/etc/vsftpd/vsftpd.conf.我不确定。

但以后我不再特别指出了,真累!!)

然而,你也可以通过修改配置行来指定到其它目录。这一点很有用,因为也许你想使用一些高级inetd功能,例如xinetd,在一个多虚拟主机的机器上调用不同的配置文件。

格式

VSFTPD.conf 的格式非常简单,每行要么是一个注释,要么是一个指令。注释行以#开始并被忽略掉。指令行格式如下:

配置项=参数值

很重要的一点是,这个格式里不存在任何空格。

默认的,每一个配置项在配置文件里都占一编辑行,可以被修改。

布尔选项

参数值的布尔选项可以是:

YES或者NO

allow_anon_ssl

只有ss1_enable激活了才可以启用此项。如果设置为YES,匿名用户将容许使用安全的SSL连接服务器。

默认值:NO

anon_mkdir_write_enable

如果设为YES,匿名用户将容许在指定的环境下创建新目录。如果此项要生效,那么配置write_enable必须被激活,并且匿名用户必须在其父目录有写权限。

默认值:NO

anon_other_write_enable

如果设置为YES,匿名用户将被授予较大的写权限,例如删除和改名。一般不建议这么做,除非想完全授权。

默认值:NO

anon_upload_enable

如果设为YES,匿名用户就容许在指定的环境下上传文件。如果此项要生效,那么配置write_enable必须激活。并且匿名用户必须在相关目录有写权限。

默认值:NO

anon_world_readable_only

启用的时候,匿名用户只容许下载完全可读的文件,这也就容许了ftp用户拥有对文件的所有权,尤其是在上传的情况下。

默认值:YES

anonymous_enable

控制是否容许匿名用户登录。如果容许,那么“ftp”和“anonymous”都将被视为“anonymous”而容许登录。

默认值:YES

ascii_download_enable

启用时,用户下载时将以ASCII模式传送文件。

默认值:NO

ascii_upload_enable

启用时,用户上传时将以ASCII模式传送文件。

默认值:NO

async_abor_enable

启用时,一个特殊的FTP命令”async ABOR”将容许使用。只有不正常的FTP客户端要使用这一点。而且,这个功能又难于操作,所以,

默认是把它关闭了。但是,有些客户端在取消一个传送的时候会被挂死(daidong注:估计是客户端无响应了),那你只有启用这个功能才能避免这种情况。

默认值:NO

background

启用时,并且VSFTPD是“listen”模式启动的(daidong注:就是standalone模式),VSFTPD将把监听进程置于后台。但访问VSFTPD时,控制台将立即被返回到SHELL。

默认值:NO

check_shell

注意:这个选项只对非PAM结构的VSFTPD才有效。如果关闭,VSFTPD将不检查/etc/shells以判定本地登录的用户是否有一个可用的SHELL。

默认值:YES

chmod_enable

启用时,将容许使用SITE CHMOD命令。注意,这只能用于本地用户。匿名用户绝不能使用SITE CHMOD。

默认值:YES

chown_uploads

如果启用,所以匿名用户上传的文件的所有者将变成在chown_username里指定的用户。这对管理FTP很有用,也许也对安全有益。

默认值:NO

chroot_list_enable

如果激活,你要提供一个用户列表,表内的用户将在登录后被放在其home目录,锁定在虚根下(daidong注:进入FTP后,PWD一下,可以看到当前
目录是”/“,这就是虚根。是FTP的根目录,并非FTP服务器系统的根目录)。如果chroot_local_user设为YES后,其含义会发生一点
变化。

在这种情况下,这个列表内的用户将不被锁定在虚根下。

默认情况下,这个列表文件是/etc/vsftpd.chroot_list, 但你也可以通过修改chroot_list_file来改变默认值。

默认值:NO

chroot_local_user

如果设为YES,本地用户登录后将被(默认地)锁定在虚根下,并被放在他的home目录下。

警告:

这个配置项有安全的意味,特别是如果用户有上传权限或者可使用SHELL的话。在你确定的前提下,再启用它。

注意,这种安全暗示并非只存在于VSFTPD,其实是广泛用于所有的希望把用户锁定在虚根下的FTP软件。

默认值:NO

connect_from_port_20

这用来控制服务器是否使用20端口号来做数据传输。为安全起见,有些客户坚持启用。相反,关闭这一项可以让VSFTPD更加大众化。

默认值:NO (但在范例配置文件中,启用了,即YES)

deny_email_enable

如果激活,你要提供一个关于匿名用户的密码E-MAIL表(daidong注:我们都知道,匿名用户是用邮件地址做密码的)以阻止以这些密码登录的匿名用户。

默认情况下,这个列表文件是/etc/vsftpd.banner_emails,但你也可以通过设置banned_email_file来改变默认值。

默认值:NO

dirlist_enable

如果设置为NO,所有的列表命令(daidong注:如ls)都将被返回“permission denied”提示。

默认值:YES

dirmessage_enable

如果启用,FTP服务器的用户在首次进入一个新目录的时候将显示一段信息。默认情况下,会在这个目录中查找.message文件,但你也可以

通过更改message_file来改变默认值。

默认值:NO (但在配置范例文件中启用了它)

download_enable

如果设为NO,下载请求将返回“permission denied”。

默认值:YES

dual_log_enable

如果启用,两个LOG文件会各自产生,默认的是/var/log/xferlog和/var/log/vsftpd.log。前一个是wu-ftpd格式的LOG,能被通用工具分析。

后一个是VSFTPD的专用LOG格式。

默认值: NO

force_dot_files

如果激活,即使客户端没有使用“a”标记,(FTP里)以.开始的文件和目录都会显示在目录资源列表里。但是把”.”和”..”不会显示。(daidong注:即LINUX下

的当前目录和上级目录不会以‘.’或‘..’方式显示)。

默认值:NO

force_local_data_ssl

只有在ssl_enable激活后才能启用。如果启用,所有的非匿名用户将被强迫使用安全的SSL登录以在数据线路上收发数据。

默认值:YES

force_local_logins_ssl

只有在ssl_enable激活后才能启用。如果启用,所有的非匿名用户将被强迫使用安全的SSL登录以发送密码。

默认值:YES

guest_enable

如果启用,所有的非匿名用户登录时将被视为”游客“,其名字将被映射为guest_username里所指定的名字。

默认值:NO

hide_ids

如果启用,目录资源列表里所有用户和组的信息将显示为”ftp”.

默认值:NO

listen

如果启用,VSFTPD将以独立模式(standalone)运行,也就是说可以不依赖于inetd或者类似的东东启动。直接运行VSFTPD

的可执行文件一次,然后VSFTPD就自己去监听和处理连接请求了。

默认值:NO

listen_ipv6

类似于listen参数的功能,但有一点不同,启用后VSFTPD会去监听IPV6套接字而不是IPV4的。这个设置和listen的设置互相排斥。

默认值:NO

local_enable

用来控制是否容许本地用户登录。如果启用,/etc/passwd里面的正常用户的账号将被用来登录。

默认值:NO

log_ftp_protocol

启用后,如果xferlog_std_format没有被激活,所有的FTP请求和反馈信息将被纪录。这常用于调试(debugging)。

默认值:NO

ls_recurse_enable

如果启用,”ls -R”将被容许使用。这是为了避免一点点安全风险。因为在一个大的站点内,在目录顶层使用这个命令将消耗大量资源。

默认值:NO

no_anon_password

如果启用,VSFTPD将不会向匿名用户询问密码。匿名用户将直接登录。

默认值:NO

no_log_lock

启用时,VSFTPD在写入LOG文件时将不会把文件锁住。这一项一般不启用。它对一些工作区操作系统问题,如Solaris / Veritas文件系统共存时有用。

因为那在试图锁定LOG文件时,有时候看上去象被挂死(无响应)了。(daidong注:这我也不是很理解。所以翻译未必近乎原意。原文如下:It exists to workaround

operating system bugs such as the Solaris / Veritas filesystem combination

which has been observed to sometimes exhibit hangs trying to lock log files.)

默认值:NO

one_process_model

如果你的LINUX核心是2.4的,那么也许能使用一种不同的安全模式,即一个连接只用一个进程。只是一个小花招,但能提高FTP的性能。请确定需要后再启用它,而且也请确定你的

站点是否会有大量的人同时访问。

默认值:NO

passwd_chroot_enable (daidong注:这段自己看,无语…)

if enabled, along with

.BR chroot_local_user

, then a chroot() jail location may be specified on a per-user basis. Each

user’s jail is derived from their home directory string in /etc/passwd. The

occurrence of /./ in the home directory string denotes that the jail is at that

particular location in the path.

默认值:NO

pasv_enable

如果你不想使用被动方式获得数据连接,请设为NO。

默认值:YES

pasv_promiscuous

如果你想关闭被动模式安全检查(这个安全检查能确保数据连接源于同一个IP地址)的话,设为YES。确定后再启用它(daidong注:原话是:只有你清楚你在做什么时才启用它!)

合理的用法是:在一些安全隧道配置环境下,或者更好地支持FXP时(才启用它)。

默认值:NO

port_enable

如果你想关闭以端口方式获得数据连接时,请关闭它。

默认值:YES

port_promiscuous

如果你想关闭端口安全检查(这个检查可以确保对外的(outgoing)数据线路只通向客户端)时,请关闭它。确认后再做!

默认值:NO

run_as_launching_user

如果你想让一个用户能启动VSFTPD的时候,可以设为YES。当ROOT用户不能去启动VSFTPD的时候会很有用(daidong注:应该不是说ROOT用户没有权限启动VSFTPD,

而是因为别的,例如安全限制,而不能以ROOT身份直接启动VSFTPD)。强烈警告!!别启用这一项,除非你完全清楚你在做什么(daidong:无语….)!!!随意地启动这一项会导致

非常严重的安全问题,特别是VSFTPD没有或者不能使用虚根技术来限制文件访问的时候(甚至VSFTPD是被ROOT启动的)。有一个愚蠢的替代方案是启用deny_file,将其设置为{/,..*}等,

但其可靠性却不能和虚根相比,也靠不住。

如果启用这一项,其他配置项的限制也会生效。例如,非匿名登录请求,上传文件的所有权的转换,用于连接的20端口和低于1024的监听端口将不会工作。其他一些配置项也可能被影响。

默认值:NO

secure_email_list_enable

如果你想只接受以指定E-MAIL地址登录的匿名用户的话,启用它。这一般用来在不必要用虚拟用户的情况下,以较低的安全限制去访问较低安全级别的资源。如果启用它,匿名用户除非

用在email_password_file里指定的E-MAIL做为密码,否则不能登录。这个文件的格式是一个密码一行,而且没有额外的空格(daidong注:whitespace,译为空格,不知道是否正确)。

默认的文件名是:/etc/vsftpd.email_passwords.

默认值:NO

session_support

这将配置是否让VSFTPD去尝试管理登录会话。如果VSFTPD管理会话,它会尝试并更新utmp和wtmp。它也会打开一个pam会话(pam_session),直到LOGOUT才会关闭它,如果使用PAM进行认证的话。

如果你不需要会话纪录,或者想VSFTPD运行更少的进程,或者让它更大众化,你可以关闭它。

注:utmp和wtmp只在有PAM的环境下才支持。

默认值:NO

setproctitle_enable

如果启用,VSFTPD将在系统进程列表中显示会话状态信息。换句话说,进程名字将变成VSFTPD会话当前正在执行的动作(等待,下载等等)。为了安全目的,你可以关闭这一项。

默认值:NO

ssl_enable

如果启用,vsftpd将启用openSSL,通过SSL支持安全连接。这个设置用来控制连接(包括登录)和数据线路。同时,你的客户端也要支持SSL才行。

注意:小心启用此项.VSFTPD不保证OpenSSL库的安全性。启用此项,你必须确信你安装的OpenSSL库是安全的。

默认值:NO

ssl_sslv2

要激活ssl_enable才能启用它。如果启用,将容许SSL V2协议的连接。TLS V1连接将是首选。

默认值:NO

ssl_sslv3

要激活ssl_enable才能启用它。如果启用,将容许SSL V3协议的连接。TLS V1连接将是首选。

默认值:NO

ssl_tlsv1

要激活ssl_enable才能启用它。如果启用,将容许TLS V1协议的连接。TLS V1连接将是首选。

默认值:YES

syslog_enable

如果启用,系统log将取代vsftpd的log输出到/var/log/vsftpd.log.FTPD的了log工具将不工作。

默认值:NO

tcp_wrappers

如果启用,vsftpd将被tcp_wrappers所支持。进入的(incoming)连接将被tcp_wrappers访问控制所反馈。如果tcp_wrappers设置了

VSFTPD_LOAD_CONF环境变量,那么vsftpd将尝试调用这个变量所指定的配置。

默认值:NO

text_userdb_names

默认情况下,在文件列表中,数字ID将被显示在用户和组的区域。你可以编辑这个参数以使其使用数字ID变成文字。为了保证FTP性能,默认

情况下,此项被关闭。

默认值:NO

tilde_user_enable

如果启用,vsftpd将试图解析类似于~chris/pics的路径名(一个”~”(tilde)后面跟着个用户名)。注意,vsftpd有时会一直解析路径名”~”和”~/“(在这里,~被解析成内部登录目录)。

~用户路径(~user paths)只有在当前虚根下找到/etc/passwd文件时才被解析。

默认值:NO

use_localtime

如果启用,vsftpd在显示目录资源列表的时候,在显示你的本地时间。而默认的是显示GMT(格林尼治时间)。通过MDTM FTP命令来显示时间的话也会被这个设置所影响。

默认值:NO

use_sendfile

一个内部设定,用来测试在你的平台上使用sendfile()系统呼叫的相关好处(benefit).

默认:YES

userlist_deny

这个设置在userlist_enable被激活后能被验证。如果你设置为NO,那么只有在userlist_file里明确列出的用户才能登录。

如果是被拒绝登录,那么在被询问密码前,用户就将被系统拒绝。

默认值:YES

userlist_enable

如果启用,vsftpd将在userlist_file里读取用户列表。如果用户试图以文件里的用户名登录,那么在被询问用户密码前,他们就将被系统拒绝。

这将防止明文密码被传送。参见userlist_deny。

默认值:NO

virtual_use_local_privs

如果启用,虚拟用户将拥有和本地用户一样的权限。默认情况下,虚拟用户就拥有和匿名用户一样的权限,而后者往往有更多的限制(特别是写权限)。

默认值:NO

write_enable

这决定是否容许一些FTP命令去更改文件系统。这些命令是STOR, DELE, RNFR, RNTO, MKD, RMD, APPE 和 SITE。

默认值:NO

xferlog_enable

如果启用,一个log文件将详细纪录上传和下载的信息。默认情况下,这个文件是/var/log/vsftpd.log,但你也可以通过更改vsftpd_log_file来指定其默认位置。

默认值:NO (但在范例配置文件中,启用了这一项)

xferlog_std_format

如果启用,log文件将以标准的xferlog格式写入(wu-ftpd使用的格式),以便于你用现有的统计分析工具进行分析。但默认的格式具有更好的可读性。默认情况下,log文件是在/var/log/xferlog。

但是,你可以通过修改xferlog_file来指定新路径。

默认值:NO

======

数字选项

以下是数字配置项。这些项必须设置为非负的整数。为了方便umask设置,容许输入八进制数,那样的话,数字必须以0开始。

accept_timeout

超时,以秒为单位,设定远程用户以被动方式建立连接时最大尝试建立连接的时间。

默认值:60

anon_max_rate

对于匿名用户,设定容许的最大传送速率,单位:字节/秒。

默认值:0 (无限制)

anon_umask

为匿名用户创建的文件设定权限。注意:如果你想输入8进制的值,那么其中的0不同于10进制的0。

默认值:077

connect_timeout

超时。单位:秒。是设定远程用户必须回应PORT类型数据连接的最大时间。

默认值:60

data_connection_timeout

超时,单位:秒。设定数据传输延迟的最大时间。时间一到,远程用户将被断开连接。

默认值:300

file_open_mode

对于上传的文件设定权限。如果你想被上传的文件可被执行,umask要改成0777。

默认值:0666

ftp_data_port

设定PORT模式下的连接端口(只要connect_from_port_20被激活)。

默认值:20

idle_session_timeout

超时。单位:秒。设置远程客户端在两次输入FTP命令间的最大时间。时间一到,远程客户将被断开连接。

默认值:300

listen_port

如果vsftpd处于独立运行模式,这个端口设置将监听的FTP连接请求。

默认值:21

local_max_rate

为本地认证用户设定最大传输速度,单位:字节/秒。

默认值:0(无限制)

local_umask

设置本地用户创建的文件的权限。注意:如果你想输入8进制的值,那么其中的0不同于10进制的0。

默认值:077

max_clients

如果vsftpd运行在独立运行模式,这里设置了容许连接的最大客户端数。再后来的用户端将得到一个错误信息。

默认值:0(无限制)

max_per_ip

如果vsftpd运行在独立运行模式,这里设置了容许一个IP地址的最大接入客户端。如果超过了最大限制,将得到一个错误信息。

默认值:0(无限制)

pasv_max_port

指定为被动模式数据连接分配的最大端口。可用来指定一个较小的范围以配合防火墙。

默认值:0(使用任何端口)

pasv_min_port

指定为被动模式数据连接分配的最小端口。可用来指定一个较小的范围以配合防火墙。

默认值:0(使用任何端口)

trans_chunk_size

你一般不需要改这个设置。但也可以尝试改为如8192去减小带宽限制的影响。

默认值:0(让vsftpd自行选择)

===========

STRING 配置项

以下是STRING 配置项

anon_root

设置一个目录,在匿名用户登录后,vsftpd会尝试进到这个目录下。如果失败则略过。

默认值:无

banned_email_file

deny_email_enable启动后,匿名用户如果使用这个文件里指定的E-MAIL密码登录将被拒绝。

默认值:/etc/vsftpd.banned_emails

banner_file

设置一个文本,在用户登录后显示文本内容。如果你设置了ftpd_banner,ftpd_banner将无效。

默认值:无

chown_username

改变匿名用户上传的文件的所有者。需设定chown_uploads。

默认值:ROOT

chroot_list_file

这个项提供了一个本地用户列表,表内的用户登录后将被放在虚根下,并锁定在home目录。这需要chroot_list_enable项被启用。

如果chroot_local_user项被启用,这个列表就变成一个不将列表里的用户锁定在虚根下的用户列表了。

默认值:/etc/vsftpd.chroot_list

cmds_allowed

以逗号分隔的方式指定可用的FTP命令(post login. USER, PASS and QUIT 是始终可用的命令)。

其他命令将被屏蔽。这是一个强有力的locking down一个FTP服务器的手段。例如:cmds_allowed=PASV,RETR,QUIT

默认值:无

deny_file

这可以设置一个文件名或者目录名式样以阻止在任何情况下访问它们。并不是隐藏它们,而是拒绝任何试图对它们进行的操作(下载,改变目录层,

和其他有影响的操作)。这个设置很简单,而且不会用于严格的访问控制-文件系统权限将优先生效。然而,这个设置对确定的虚拟用户设置很有用。

特别是如果一个文件能多个用户名访问的话(可能是通过软连接或者硬连接),那就要拒绝所有的访问名。

建议你为使用文件系统权限设置一些重要的安全策略以获取更高的安全性。如deny_file={.mp3,.mov,.private}

默认值:无

dsa_cert_file

这个设置为SSL加密连接指定了DSA证书的位置。

默认值:无(有一个RSA证书就够了)

email_password_file

在设置了secure_email_list_enable后,这个设置可以用来提供一个备用文件。

默认值:/etc/vsftpd.email_passwords

ftp_username

这是用来控制匿名FTP的用户名。这个用户的home目录是匿名FTP区域的根。

默认值:ftp

ftpd_banner

当一个连接首次接入时将现实一个欢迎界面。

默认值:无(默认的界面会被显示)

guest_username

参见相关设置guest_enable。这个设置设定了游客进入后,其将会被映射的名字。

默认:ftp

hide_file

设置了一个文件名或者目录名列表,这个列表内的资源会被隐藏,不管是否有隐藏属性。但如果用户知道了它的存在,

将能够对它进行完全的访问。hide_file里的资源和符合hide_file指定的规则表达式的资源将被隐藏。vsftpd的

规则表达式很简单,例如hide_file={.mp3,.hidden,hide,h?}

默认值:无

listen_address

如果vsftpd运行在独立模式下,本地接口的默认监听地址将被这个设置代替。

需要提供一个数字化的地址。

默认值:无

listen_address6

如果vsftpd运行在独立模式下,要为IPV6指定一个监听地址(如果listen_ipv6被启用的话)。

需要提供一个IPV6格式的地址。

默认值:无

local_root

设置一个本地(非匿名)用户登录后,vsftpd试图让他进入到的一个目录。如果失败,则略过。

默认值:无

message_file

当进入一个新目录的时候,会查找这个文件并显示文件里的内容给远程用户。dirmessage_enable需启用。

默认值:.message

nopriv_user

这是vsftpd做为完全无特权的用户的名字。这是一个专门的用户,比nobody更甚。用户nobody往往用来在一些机器上做一些重要的事情。

默认值:nobody

pam_service_name

设定vsftpd将要用到的PAM服务的名字。

默认值:ftp

pasv_address

当使用PASV命令时,vsftpd会用这个地址进行反馈。需要提供一个数字化的IP地址。

默认值:无(地址将取自进来(incoming)的连接的套接字)

rsa_cert_file

这个设置指定了SSL加密连接需要的RSA证书的位置。

默认值:/usr/share/ssl/certs/vsftpd.pem

secure_chroot_dir

这个设置指定了一个空目录,这个目录不容许ftp user写入。在vsftpd不希望文件系统被访问时,目录为安全的虚根所使用。

默认值: /usr/share/empty

ssl_ciphers

这个设置将选择vsftpd为加密的SSL连接所用的SSL密码。详细信息参见ciphers。

默认值:DES-CBC3-SHA

user_config_dir

这个强大的设置容许覆盖一些在手册页中指定的配置项(基于单个用户的)。用法很简单,最好结合范例。如果你把user_config_dir

改为/etc/vsftpd_user_conf,那么以chris登录,vsftpd将调用配置文件/etc/vsftpd_user_conf/chris。

默认值:无

user_sub_token

这个设置将依据一个模板为每个虚拟用户创建home目录。例如,如果真实用户的home目录通过guest_username为/home/virtual/$USER 指定,

并且user_sub_token设置为 $USER ,那么虚拟用户fred登录后将锁定在/home/virtual/fred下。

默认值:无

userlist_file

当userlist_enable被激活,系统将去这里调用文件。

默认值:/etc/vsftpd.user_list

vsftpd_log_file

只有xferlog_enable被设置,而xferlog_std_format没有被设置时,此项才生效。这是被生成的vsftpd格式的log文件的名字。

dual_log_enable和这个设置不能同时启用。如果你启用了syslog_enable,那么这个文件不会生成,而只产生一个系统log.

默认值:/var/log/vsftpd.log

xferlog_file

这个设置是设定生成wu-ftpd格式的log的文件名。只有启用了xferlog_enable和xferlog_std_format后才能生效。

但不能和dual_log_enable同时启用。

默认值:/var/log/xferlog

3、未完成的实验

his example should quickly show you the possibilites of per-IP configuration

with vsftpd’s tcp_wrappers integration. This is new with v1.1.3.

To use this, you need vsftpd built with tcp_wrappers! This is accomplished

by editing “builddefs.h” and changing

#undef VSF_BUILD_TCPWRAPPERS

to

#define VSF_BUILD_TCPWRAPPERS

And then rebuild. If you are lucky your vendor will have shipped the vsftpd

binary with this already done for you.

Next, to enable tcp_wrappers integration, you need this in your vsftpd.conf:

tcp_wrappers=YES

And you’ll need a tcp_wrappers config file. An example one is supplied in this

directory: hosts.allow. It lives at /etc/hosts.allow.

Let’s have a look at the example:

vsftpd: 192.168.1.3: setenv VSFTPD_LOAD_CONF /etc/vsftpd_tcp_wrap.conf

vsftpd: 192.168.1.4: DENY

The first line:

If a client connects from 192.168.1.3, then vsftpd will apply the vsftpd

config file /etc/vsftpd_tcp_wrap.conf to the session! These settings are

applied ON TOP of the default vsftpd.conf.

This is obviously very powerful. You might use this to apply different

access restrictions for some IPs (e.g. the ability to upload).

Or you could give certain classes of IPs the ability to skip connection

limits (max_clients=0).

Or you could increase / decrease the bandwidth limiter for certain classes

of IPs.

You get the point

The second line:

Denies the ability of 192.168.1.4 to connect. Very useful to take care of

troublemakers. And now you don’t need xinetd to do it - hurrah.

This example shows how you might set up virtual hosts. Virtual hosting is

where different clients access your machine on different IP addresses (virtual

IPs) and get redirected to different ftp sites.

For example, if your machine responds to two IPs - 127.0.0.1 and 127.0.0.2,

you could have the two different IPs represent two totally different FTP sites.

For this example, we are going to build on the “INTERNET_SITE” example.

Step 1) Set up a virtual IP address.

ifconfig eth0:1 192.168.1.10 up

(the standard IP address is 192.168.1.2)

(note - this isn’t quite complete, the route for local connects hasn’t been

added, but it will do for now)

Step 2) Create a user / location for the new virtual site.

useradd -d /var/ftp_site2 ftp_site2

chown root.root /var/ftp_site2

chmod a+rx /var/ftp_site2

umask 022

mkdir /var/ftp_site2/pub

echo “test” >; /var/ftp_site2/pub/content

Step 3) Modify the existing site to respond to the primary IP.

Edit /etc/xinetd.d/vsftpd, and add the config line:

This example shows how you might set up virtual hosts. Virtual hosting is

where different clients access your machine on different IP addresses (virtual

IPs) and get redirected to different ftp sites.

For example, if your machine responds to two IPs - 127.0.0.1 and 127.0.0.2,

you could have the two different IPs represent two totally different FTP sites.

For this example, we are going to build on the “INTERNET_SITE” example.

Step 1) Set up a virtual IP address.

ifconfig eth0:1 192.168.1.10 up

(the standard IP address is 192.168.1.2)

(note - this isn’t quite complete, the route for local connects hasn’t been

added, but it will do for now)

Step 2) Create a user / location for the new virtual site.

useradd -d /var/ftp_site2 ftp_site2

chown root.root /var/ftp_site2

chmod a+rx /var/ftp_site2

umask 022

mkdir /var/ftp_site2/pub

echo “test” >; /var/ftp_site2/pub/content

Step 3) Modify the existing site to respond to the primary IP.

Edit /etc/xinetd.d/vsftpd, and add the config line:

bind = 192.168.1.2

Step 4) Create the new site, responding on the virtual IP.

cp /etc/xinetd.d/vsftpd /etc/xinetd.d/vsftpd2

Edit vsftpd2, and change

  • The bind line to refer to the IP address 192.168.1.10

  • Add the line

server_args = /etc/vsftpd_site2.conf

This launches this FTP site with a different vsftpd configuration file.

cp /etc/vsftpd.conf /etc/vsftpd_site2.conf

Add two lines:

ftp_username=ftp_site2

ftpd_banner=This is the alternative FTP site.

Step 5) Restart xinetd and test!

/etc/rc.d/init.d/xinetd restart

[chris@localhost vsftpd]$ ftp 192.168.1.2

Connected to 192.168.1.2 (192.168.1.2).

220 ready, dude (vsFTPd 1.1.0: beat me, break me)

Name (192.168.1.2:chris): [chris@localhost vsftpd]$

[chris@localhost vsftpd]$ ftp 192.168.1.2

Connected to 192.168.1.2 (192.168.1.2).

220 ready, dude (vsFTPd 1.1.0: beat me, break me)

Name (192.168.1.2:chris):

530 This FTP server is anonymous only.

Login failed.

ftp>; quit

221 Goodbye.

[chris@localhost vsftpd]$ ftp 192.168.1.10

Connected to 192.168.1.10 (192.168.1.10).

220 This is the alternative FTP site.

Name (192.168.1.10:chris):

530 This FTP server is anonymous only.

Login failed.

ftp>;

ssh配置权威指南

发表于 2006-11-23 | 分类于 Linux

ssh配置权威指南

Pogo Linux (Shanghai) Forums > Linux 入门及系统管理 > Ssh权威指南(转)


PDA
查看完整版本 : Ssh权威指南(转)


James
2006-01-15, 00:27
我的评价:
本书是一本介绍通信安全的书籍,如果你想保障你的通信安全,本书能给你一个很好的解决
方案。本书从ssh协议介绍起,到具体的开源实现和商业实现。但本书同时介绍开源实现和
商业实现,给人感觉比较乱。

注意:由于openssh是开源软件,各版间的配置方法和设置参数可能会不同,所以设置时要
以最新版的手册为准,不要硬套书本的设置。

第一章 SSH简介
ssh(secure shell)是一种通用,功能强大的基于软件的网络安全解决方案,计算机每次向网络
发送数据时,SSH都会自动对其进行加密。数据到达目的地时,SSH自动对加密数据进行
解密。整个过程都是透明的。它使用了现代的安全加密算法,足以胜任大型公司的任务繁重
的应用程序的要求。

SSH协议内容涉及认证AUTHENTICATION,加密ENCRYPTION,和网络上传输数据的完整
性INTEGRITY。

SSH特性概述
1、远程登录
$ ssh -l root host.example.com
2、安全文件传输
$ scp myfile [email protected]
3、安全执行远程命令,能确保传输的数据安全。
4、密钥和代理
基于密钥的认证方法不用记住多个帐号密码。
5、访问控制,能授权别人访问自已帐号。
6、端口转发
$ ssh -L 3002:localhost:119 xxx.xxx.com

相关安全技术
rsh命令族,rsh,rlogin and rcp。连接不加密,认证模型十分脆弱。
PGP加密程序。它是基于文件的。
Kerberos认证系统,用于网络可能被监视,而且计算机不是中心控制的环境。基于麻省理工
学院的Athena项目。它SSH不是,SSH是轻量级的,容易部署。Kerberos使用前必须构建
一些重要基础。
IPSEC,Internet安全协议。
SRP,安全远程密码协议,是Stanford大学开发的。是一种专用的认证协议。
SSL,安全套接字。
stunnel,是一种SSL工具,它为UNIX环境现有的基于TCP的服务(POP,IMAP等)增加
SSL保护,而不用修改服务器源程序。

第二章 SSH客户端的基本用法
最常用功能,1、经由安全连接登录到远程计算机。2、通过安全连接在计算机间拷贝文件。

当你第一次连接SSH服务器时,出现问答时要回答“yes”,把已知名主机的密钥的公共部
分拷贝一份存在本地。之后你每次连接这台服务器,就用这个公钥来验证远程主机。最好是
能在首次连接前就能获得这个公钥,否则第一次连接服务器时你可能已受到中间人攻击。

使用密钥进行认证,SSH支持公钥认证,可以使用加密密钥,密钥比密码更安全。
SSH证书使用一对密钥,一个私钥,一个公钥,私钥只保存你独有的一些秘密信息。SSH
用其向服务器证明自已的身份。公钥是公开的,可以随便将其放入SSH服务器上自已的帐
号中,在认证时,进行私钥和公钥协商,如果匹配,那么身份就得以证明,认证就成功。

在使用公钥认证以前,首先要进行一些设置:
1、需要一对密钥,还需要使用一个口令来保护自已的私钥。
使用ssh-keygen程序生成一对密钥。如果不存在SSH目录,程序为自动创建本地SSH目录
~/.ssh,并将所生成的密钥分成两个文件存储,公有部份identity.pub,私有部分identity,或
id_dsa_1024_a,id_dsa_1024_a.pub(ssh2)。
2、需要在SSH服务器上安装自已的公钥。
通过配置SSH目录中的一个文件实现,对于SSH1 AND OPENSSH来说该文件是
~/.ssh/authorized_keys。对SSH2来说是~/.ssh2/authorization。OPENSSH中的SSH-2连接自
3.0版本起也一同使用authorized_keys文件。3.0版本前的使用authorized_keys2。把用户本
地机器生成identity.pub文件内容加入其中。对SSH2来说,用户需编辑两个文件,一个客
户端一个在服务器端,
在客户端,要创建或编辑文件~/.ssh2/identification并在其中插入一行,说明自已的私钥文件
名: IdKey id_dsa_1024_a.
在服务器端,要创建或编辑文件~/.ssh2/authorization,该文件包含有公钥信息,每行一个,
但和SSH1的authorized_keys文件不同(authorized_keys中包含有公钥的拷贝),authorization
中只给出公钥文件名:Key id_dsa_1024_a.pub。最后,把这个文件从本地机器上拷贝到服务
器~/.ssh2中。为安全起见,要确保ssh目录的安全,只有所有者才有权写入。如果远程用户
的SSH配置文件的权限设置不当,服务器可能会拒绝进行认证。

公钥认证比密码认证更安全,因为:
1、 公钥认证需要两个加密部份(磁盘上的identify文件和用户头脑中的口令),入侵都必须
2、 具备两种条件才行。密码认证只需要一个部份,那就是密码,它可能更容易被窃取。
3、 在公钥认证中,口令和密钥都不用发给远程主机,只要把前面讨论的认证者发给远程主
4、 机就可以了,因此,并没有秘密信息传出客户端。
3、机器生成的密钥是不可能猜测出来的,而人生成的密码容易受到字典攻击。
通过禁用密码认证并只允许使用密钥认证能极大提高主机的安全性。

如果要修改密钥
如果已经生成一个密钥对,并把公钥拷贝到多个SSH服务器上了,用户有一天决定修改自
已的身份,因为再运行ssh-keygen。这样,就会覆盖identify and identify.pub文件,用户之
前的公钥就没用了,必须把新公钥再次拷贝到各个服务器上。这是很头疼的,所以建议:
1、 不能局限于仅仅使用一个密钥对,可随意生一此密钥对,将其保存在不同的文件中,并
2、 将其用作不同的用途。
3、 如果只是想修改口令,就不必重新生成一个密钥对,ssh-keygen有一个命令行选项可以
4、 替换现有的密钥口令。ssh1 and openssh是-p,对于ssh2是-e。这样,因为私钥没变,所以
5、 公钥依然不效,中需使用新口令对私钥进行解密就可以了。

ssh代理
它可以把私钥保存在内存中,为认证提供服务,不用重复输入密码。直到用户退出为止。代
理程序是ssh-agent。可手工运行也可编辑~/.login 或~/.xsession来自动运行。
$ ssh-agent $SHELL 其中SHELL是用户登录shell的环境变量。运行该命令后,打开另外
一个shell,在这个shell中可以访问代理。
接着用ssh-add命令装入私钥。这样,使用ssh and scp命令就不用再提醒输入口令了。口令
装入内存中。如果用户正运行x window系统,并设置了DISPLAY环境变量,而标准输入
不是终端,那么ssh-add就使用一个图形化X程序ssh-askpass来读取口令。要强制ssh-add
使用X来读取口令,请在命令行中输入ssh-add < /dev/null。
-l 参数显示内存中的密钥
-d 参数从代理中删除密钥 $ ssh-add -d ~/.ssh/id_xxx.pub
-D 是删除所有密钥
-t 对加载的密钥设置超时时间,超时代理将自动卸载密钥。
-L -U 对代理进行加锁和解锁,当你离开计算机而不想退出登录时有用。

代理转发
可能通过代理转发功能,可以用SCP把文件从远程SSH服务器上拷贝到第三方SSH主机上。
条件是你在第三方SSH主机上必须有一个帐号。具体操作是这样的:
1、 在本地主机上运行命令:# scp [email protected]:print-me
2、 [email protected]:other-print-me
2、这个scp进程与本地代理进行联系,并让用户和shell.isp.com进行认证。
3、自动在shell.isp.com上执行第二个scp,用来把文件拷贝到other.host.net主机上。
3、 由于启用了代理转发(SSH1 AND SSH2默认是打开的,openssh默认是关闭的),因此
4、 shell.isp.com上的SSH服务器就充当一个代理。
5、第二个scp进程通过联系shell.isp.com上的代理试图让用户和other.host.net进行认证。
5、 shell.isp.net上ssh服务器秘密与用户的本地代理进行通信,从而构建出一个认证者来提
6、 供用户的证书并将其传回服务器。
7、服务器为第二个scp进程验证用户的身份,other.host.net上的认证获得成功。
8、开始拷贝文件。
由于代理转发不会把私钥发送到远程主机上,而是把认证返回第一台机进行处理,因此密钥
是安全的。

不用密码或口令进行连接方式
1、使用代理的公钥认证。
2、可信主机认证。
3、Kerberos认证。
在后文中将会讨论这些方式的优缺点。

sftp
它是在SSH上的一个独立文件传输工具,操作与ftp类似,可以在一个会话中调用多个命令
进行文件拷贝和处理,而scp每次调用时都要打开一个会话。sftp不区分ascii and binary传
输模式,只使用二进制模式,因此,如果使用它在windows and unix之间拷贝ascii文件,
那么就不能正确转换行结束符。

第三章 SSH内幕
SSH协议的主要特性和优点:
1、 使用强加密技术来保证数据的私密性。端到端通信用随机密钥进行加密,随机密钥为会
话进行安全协商,会话结束后被丢弃。支持的算法有ARCFOUR,Blowfish,DES,IDEA,3DES等。
2、通信完整性,确保通信不会被修改。SSH-2基于MD5 AND SHA-1的加密hash算法。
3、认证,即发送者和接收者的身份证明。客户机和服务器双向认证。
4、授权,即对账号进行访问控制。
5、使用转发或隧道技术对其它基于tcp/ip的会话进行加密。支持三种转发,tcp端口转发,
X转发,代理转发。

SSH可以防止的攻击
1、网络窃听,SSH通信是加密的,即使截获会话内容,也不能将其解密。
2、名字服务和IP伪装,SSH通过加密验证服务器主机身份可避免这类风险。
3、连接劫持,SSH的完整性检测负责确定会话在传输过程是否被修改,如果被修改过,就
关闭连接。
4、 中间人攻击,SSH利用两种方法防止这种攻击,第一种是服务器主机认证。除非攻击者
已经成功攻击了服务器主机,获得服务器的私有主机密钥。第二种是限制使用容易受到
这种攻击的认证方法,密码认证容易受到中间人攻击,而公钥和基于主机的/RhostsRSA
则对中间人攻击可以免疫。
5、插入攻击,这种攻击可以客户和服务器之间发送的正文数据流之间插入任意数据。ssh1
1.2.25后和openssh的所有版本都专门进行了设计,来检测并防止这种攻击。这种检测程序
增大了插入攻击的难度,但是并不能完全防止。ssh2使用强加密完整性检测手段来防止这个
问题。可以用3DES算法来防止这种攻击。

SSH不能防止的攻击
1、 密码崩溃,密码认证是一种脆弱的认证形式,尽量使用公钥认证方式。如果必须要密码
认证,可考虑使用S/Key之类的一次性密码机制。
2、 IP AND TCP攻击,由于SSH是在TCP之上进行操作的,因此容易受到针对TCP和IP
缺陷而发起的攻击。SYN flood,TCP不同步和TCP劫持等。只能通过更低层的防护措施
来保护。
3、流量分析。
4、隐秘通道。
5、粗心大意。安全是一个过程,而不是一个产品,不要认为装上SSH就安全了。

第四章 SSH的安装和编译时配置

第五章 服务器范围的配置
sshd可以在三个层次上进行配置,第一层次是上面的安装和编译时配置;第二层次是本章的
服务器范围配置;第三层次是每账号配置(第八章),前者是服务器编译时就指定了包含哪
些特定功能,不包含哪些功能,后者则是由终端用户来修改自已账号所使用的服务器的行为。

以普通用户身份运行SSH服务器
1、得到管理员许可。
2、生成一个主机密钥。
$ ssh-keygen -N ‘’ -b 1024 -f ~/myserver/hostkey 生成hostkey and hostkey.pub两个文件
3、选择端口号。 要选择大于或等1024的端口,因为只有超级用户才有权使用小于
1024的端口 。
4、创建服务器配置文件(可选) 可创建自已的配置文件,否则,服务就使用内建的特性或使
用服务器范围的配置文件。
启动服务器方式:$ sshd -h ~/myserver/hostkey -p 2345 -f ~/myserver/config
由普通用户运行的服务器有一些缺点:
1、由于不是由root的uid下运行,因此只能连接到用户自已的账号上。
2、它需手工调用,不能自启动。
3、 日志用户没权看到,因为服务器把它写到syslog日志系统中,但可用调试模式运行服务
4、 器,这样信息就显示在终端机上。

服务器配置文件
SSH1 AND OPENSSH的配置文件通常是/etc/sshd_config,而SSH2的配置文件通常是
/etc/ssh2/sshd2_config。

以非缺省的配置文件来调用sshd,可以使用命令 -f 选项。$ sshd -f /usr/local/ssh/my_config。

以*号作为标号的语名都会被sshd忽略。

修改完配置后,修改不会马上影响到服务器,可重启服务器或发送SIGHUP信号。$ kill -HUP
cat /etc/sshd.pid

如果在命令行改动了配置,用SIGHUP信号重启服务器不能覆盖命令行的配置,它的优先
级高。

主机密钥,sshd主机密钥向SSH客户端唯一地标识SSH服务器。主机密钥保存在一对文件
中,一个文件包含私钥,一个文件包含公钥。对于SSH1 AND OPENSSH,它是
/etc/ssh_host_key。文件位置可用HostKey关键字修改 HostKey /usr/local/ssh/key。服务器的
公钥保存在.pub文件中。
OPENSSH服务器有一个SSH-2的主机密钥,缺省是在/etc/ssh_host_dsa_key。其位置可用
HostDsaKey /usr/local/openssh/key2修改。

对于SSH2,如果服务器是由超级用户运行,缺省私钥文件是/etc/ssh2/hostkey。如果是其它
用户运行,则在~/.ssh2/hostkey。可用HostKeyFile /etc/local/ssh/key修改。公钥是hostkey.pub
文件,可用publicHostKeyFile关键字修改。

可以用命令行选项指定私钥文件:$ sshd -h /usr/local/ssh/key。

随机数种子文件
如果用户的系统中有一个随机位源,如/dev/urandom,那么OPENSSH就不能创建随机数种
子文件。

服务器配置文件
通常是/etc/sshd_config /etc/ssh2/ssh2_config,可以用-f 选项重新指定其配置文件。可用于一
台机器运行多个sshd的情况。

每账号认证文件。~/.ssh/authorized_keys 。

文件权限
由于配置文件的权限设置错误,会降低系统的安全性,所以可以设置StrictModes YES/NO
关键字,对sshd的重要文件和目录的权限进行检查,如果检查失败,服务器就拒绝对该用
户的SSH连接。

在多宿主主机上,使用ListenAddress xxx.xxx.xxx.xxx来限制SSH只监听一个网络接口。

空闲连接时间,IdleTimeout xx 如果是0代表什么都不做,保持连接。否则,超时就断开连
接,可以用s,m,h,d,w表示。

KeepAlive YES/NO 可以断开失效的连接,比如客户端崩溃。

失败的登录
LogingGraceTime 60 限定用户必须在60秒内成功进行认证。 0值表禁用。命令行选项用
-g

PasswordGuesses 5 如果连接请求使用密码认证,那么sshd2就只允许客户端尝试五次。
(SSH2)

限制并发连接
MaxConnections 32 最大32个连接(SSH2)

逆向IP映射
SSH2服务器可以根据客户端地址进行逆向DNS查询,以确保客户端的地址就是这个地址。
如果检查失败,连接拒绝。
RequireReverseMapping yes (ssh2)

转发
AllowTcp-Forwarding yes
X11Forwarding yes

服务器密钥生成
该密钥用来对客户端/服务器之间的通信进行保护。是临时的,永远不会保存在磁盘上。服
务器在启动时生成这个密钥。并以固定的周期重新生成。缺省长度是768位,最小为512,
可以ServerKeyBits 2048 指定长度。用KeyRegenerationInterval 1200指定周期。 命令行选
项:-k

加密算法
Ciphers any 允许所有支持算法。其它算法包括
3des-cbc,blowfish-cbc,twofish-cbc,arcfour,none

mac算法
MAC关键字可以让用户选择sshd2进行完整性检测所使用的算法,称为消息认证代码。用
于sshd2的有hmac-sha1,hmac-md5,hmac-md5-96。

在OPENSSH中,用户可以用Protocol关键字选择支持SSH-1 AND SSH-2,1 代表SSH-1,2 代
表SSH-2, 1,2 代表都支持。

允许用户登录:认证和访问控制
1、认证负责对发起连接请求的用户的身份进行验证。
密码认证
PasswordAuthentication yes AllowedAuthentications password (ssh2)
公钥认证
RSAAuthentication yes (ssh1,openssh/1)
AllowedAuthentications publickey (ssh2)
DEAAuthentication yes (openssh/2)
Rhosts认证,可信主机认证通过检查远程主机名和相关用户名来实现对客户端的身份认证。
RhostsAuthentication yes (ssh1,openssh)
IgnoreRhosts yes (ssh1,ssh2,openssh)不使用系统的hosts.equiv and ~/.rhosts,使用SSH专用
的/etc/shosts.equiv and ~/.shosts
强可信主机认证。
RhostsRSAAuthentication yes ssh1,openssh
AllowedAuthentications hostbased ssh2
提取已知名主机的公钥
UserKnownHosts no ssh2
IgnoreUserKnownHosts yes openssh
PGP认证
Kerberos认证
S/key认证
SecurID认证
PAM认证

2、访问控制负责允许或禁止来自特定用户、机器在或INTERNET域的SSH连接到服务器
上。
通常,只要设置正确,任何账号都可以接收SSH连接,这种访问权限可以使用服务器关键
字AllowUsers and DenyUsers覆盖。
AllowUsers smith
如果配置文件中单独出现一个AllowUsers,后面没有任何内容,就表示禁止所有没提到的用
户连接,如果没有AllowUsers这个关键字,则所有用户都可连接。DenyUsers表示禁止连接。
可用通配符,

可以用组访问控制AllowGroups DenyGroups

主机名访问控制
AllowHosts hostname
DenyHosts hostname

超级用户的访问控制
sshd对超级用户专门使用一种特殊的访问机制,PermiRootLogin来允许或禁止使用SSH来
访问root账号。

显示用户的欢迎信息
PrintMotd yes/no default is yes

显示邮件信息
CheckMail yes/no default is yes

空密码
PermitEmptyPasswords yes/no 如果使用密码认证,并且有个账号没有设定密码,那么服务
器就可以拒绝访问这个账号

如果系统中存在/etc/nologin,那么sshd就只允许root用户登录,其它都不能登录。因此,touch
/etc/nologin是把访问权只授给系统管理员的一种快速方法。这样并不需要重新配置ssh。也
不需要重启ssh。

子系统
定义和调用远程命令的一个抽象层,用户可以通过在客户端命令行中给出命令来调用远程命
令,如:ssh server.examply.com /bin/tar c /home 这个命令调用tar,远程把/home拷贝到磁带上。
子系统是服务器机器上预定义的一组远程命令,这样就可以方便地执行。在服务器配置文档
中定义:subsystem backups /bin/tar c /home,要在服务器上运行该命令,可以使用 -s 选项。
ssh -s backups server.example.com。缺省情况下,sshd_config中定义了一个子系统,subsystem
sftp 。不要删除这个子系统,这是scp2和sftp必须的。

日志
Fascisl Logging mode 把调试信息打印到系统日志文件中,可以使用FascistLogging关键字
启用。
调试模式 可以使用-d命令选项启用
安静模式 只能输出严重错误,而不能输出 普通日志,可以使用QuietMode关键字或-q
命令行启用。
openssh中的日志配置关键字是SyslogFacility and LogLevel。SyslogFacility设置syslog的
facility(KERN,DAEMON,USER,AUTH,MAIL等),LogLevel记录日志提供的详细程度,该
值从低到高顺序是:QUIET,FATAL,ERROR,INFO,VERBOSE,DEBUG,使用DEBUG会侵犯用
户的隐私权,这个级别只能用于诊断,而不能用于普通操作。

第六章 密钥管理与代理
一个身份标识由两部份组成,分别称为私钥(Private Key)和公钥(Public Key),合称一个
密钥对。

SSH1,SSH2 AND OPENSSH身份标识文件的格式各不相同。
SSH1缺省设置中,私钥存储在文件identity中,公钥存储在文件identity.pub中。这个密钥
对存放在~/.ssh目录下,在使用前,把公钥拷贝到服务器上的一个认证文件里,如SSH1 AND
OPENSSH中的~/.ssh/authorized_keys,此后,当客户请求连接到你的服务器上的帐号时,就
会用一个私钥作为证明身份的标识,服务器则在authorized_keys文件中寻找与之匹配的公
钥。

SSH2密钥对文件的命名通常是根据该密钥使用的加密算法的性质来起的,例如一个用DSA
加密的1024位密钥生成时其缺省文件名是id_dsa_1024_a and id_dsa_1024_a.pub。用户必须
把私钥放在identification文件中,缺省是~/.ssh2/目录,一个私钥在这个文件中占一行,在公
钥认证中,每一行的开头都有一个关键字IdKey,后跟一个私钥文件名。如:
IdKey id_dsa_1024_a
IdKey my-other-ssh2-key
在服务器端的认证文件~/.ssh2/authorization中,SSH2不包含公钥的实际拷贝,只是把公钥
文件列出来,前面用关键字kEY标识。如:
Key id_dsa_1024_a.pub
Key something-else.pub
这样维护起来更容易,更方便。

OPENSSH对SSH-1连接使用的标识和授权文件与SSH1完全相同,对于SSH-2连接,缺省
的密钥则存储在~/.ssh/id_dsa(private key)和~/.ssh/id_dsa.pub(public key)中,服务器上的授权
文件是~/.ssh/authorized_keys。

创建身份标识用ssh-keygen命令。

OPENSSH的ssh-keygen可以支持SSH1中相应程序的所有功能和选项,它还新增了为SSH-2
连接生成DSA密钥的能力。
$ ssh-keygen -t dsa -b 1024
-e -x 选项可把OPENSSH格式的密钥存储格式转换成SSH2格式 (直接回车,按提示输入转
换文件名)
-i -X 选项把SSH2格式的密钥转换成OPENSSH格式。这样可用SSH2客户端连接
OPENSSH服务器。(直接回车,按提示输入转换文件名)
-y 如果不小心删掉了OPENSSH的公钥,可用-y恢复。
-l 可计算出公钥的指纹,指纹是鉴别位置不同的两个密钥是否相同的常用的一种密码学技
术。这项技术用于不可能逐位对比两个密钥的情况。OPENSSH AND SSH2都能计算指纹。
它是根据密钥计算出来一个长度较短的值,它是原理与校验和类似,用于验证一串信息(在
我们的例子中是密钥)的不可替换性。

启动代理
1、单shell方式,使用当前登录的shell. $ eval ssh-agent
2、子shell方式,派生出一个子shell,并继承父shell的某些环境变量。 $ ssh-agent $SHELL
不要想当然运行 $ ssh-agent,这样客户端是无法有代理联系的。删除代理用kill命令就可以
了。

SSH-1 与 SSH-2代理的兼容性
SSH-1的代理不能处理SSH-2的代理,SSH-2的代理却可以处理SSH-1的代理请求。

第七章 客户端的高级用法
$ ssh -a -p 220 -c blowfish -l sally -i myself server.example.com 可通过配置文件简化命令
输入

Host myserver
ForwardAgent no
Port 220
Cipher blowfish
User sally
IdentifyFile myself
HostName server.example.com
配置了该文件后,就可以在客户端简单地输入
$ ssh myserver

全局文件和本地文件
全局文件通常是由管理员创建的,用来维护整台计算机上的客户行为。该文件通常位于
/etc/ssh_config or /etc/ssh2/ssh2_config。每个客户也可以在自已账号中创建本地客户配置文
件,通常是~/.ssh/config or ~/.ssh2/ssh2_config。本地配置文件优先级高于全局配置文件。命
令行选项的优先级又高于本地配置文件。

scp有关命令参数
-r 递归拷贝目录
-p 保持文件权限和时间戳
-u 拷贝完成后删除源文件
-d 防止覆盖文件
-n 描述操作
-q 不显示统计信息

第八章 每账号服务器配置
这种配置可以让SSH服务器区分每个服务器上的各个用户。利用服务器目标账号的认证文
件(authorized_keys)配置。局限有两点,它不能覆盖编译时配置和服务器范围配置所采用
的安全措施,第二,如果使用公钥认证,每账号配置是十分灵活的,如果采用可信主机和密
码认证,提供的选择范围就很小。

基于公钥的配置
1、认证文件的完全格式 依次包含三项内容,一些选项,公钥和注释。多个选项用逗号分
开。
2、用于限制客户端可以在服务器上调用的程序的强制命令。如客户端请求执行/bin/ls命令,
而服务器端强制命令却运行/bin/who命令,它十分有用,可用于加强安全性,了为授权提供
方便。如要让你的助手每次连接上来都运行email命令程序pine,则可以这样:
command= “/usr/local/bin/pine” …key…。最多可给每个密钥关联一个强制命令,要关联多个命
令可把这些命令放入远程主机的一个脚本中,并将该脚本作为强制命令运行。如果强制命令
有shell出口,那会存在安全问题,等于没有强制,客户可以运行任何程序。以下规则可以
用来判断一个程序是否适合用作强制命令。
a、 避免使用具有shell出口的程序(如:文件编辑器vi,Emacs; 分页程序 more,less;调用分
b、 页的man,新闻阅读程序rn,邮件阅读程序pine以及调试程序adb,非交互的程序find,xargs
c、 等)。
b、避免使用编译器,解释器或其它可以让用户生成并运行任意执行代码的程序。
c、可创建或删除文件的程序,如cp,mv,rm,scp,ftp等。
d、避免使用setuid or setgid的程序,特别是setuid 是root的程序。
d、 如果使用脚本作为强制命令,就要遵循编写安全脚本的传统规则,在一个脚本之内,要
限制使用相对路径作为搜索路径,应该使用绝对路径来调用所有的程序;不要盲目地把
用户提供的字符串作为命令来执行;不要让脚本执行任何setuid的工作。不要调用具有
shell出口的程序。
e、考虑使用受限shell。
f. 为一个单独的、专用的SSH密钥(不要用你登录的那个密钥)关联一个强制命令。这样
不会影响你的登录能力就可以方便地禁用该密钥。
g、禁用不必要的SSH特性。如no-port-forwarding,no-agent-forwarding,no-pty(禁用tty分配)。
几个常用的强制命令介绍:
使用定制消息拒绝连接:command=”/bin/echo Sorry,buddy,but you’ve terminated!” …key… 千万
不要用more and less之类的分页程序
显示命令菜单:利用脚本
检查客户端的原始程序:command=”/bin/echo you tried to invoke
$SSH_ORIGINAL_COMMAND” …key… $SSH_ORIGINAL_COMMAND环境变量保存着
客户连接时运行的原始命令。
限制客户端的原始命令,创建一个脚本,该脚本根据$SSH_ORIGINAL_COMMAND内容选
择不同的操作。
把客户端的原始命令记录在日志中:也是根据$SSH_ORIGINAL_COMMAND变量来做的一
个脚本。脚本内容如一:

#!/bin/sh
if [ -n “$SSH_ORIGINAL_COMMAND” ]
then
echo “/bin/date: $SSH_ORIGINAL_COMMAND” >> $HOME/ssh-command-log
exec $SSH_ORIGINAL_COMMAND
fi

3、限制来自特定主机的连接。由from选项完成。from=”client.example.com” …key…。强制
连接必须来自client.example.com。否则断开。from=”!client.example.com” …key…表示拒绝该
地址的连接。支持通配符。SSH2不支持该功能。但可以通过$SSH2_CLIENT变量提取客户
ip,编写强制命令脚本达到同样效果。
4、为远程程序设置环境变量。environment=”EDITOR=emacs” …key…,为每个连接修改默认的
环境变量。
5、设置空闲超时时间,这样如果客户端用户不再发送数据就强制将其断开。idle-timeout=5m,
该选项会覆盖服务器范围配置。
6、对到达的SSH连接禁用某些特性,例如端口转发和tty分配。禁用tty分配会使客户端没
有交互会话的能力。$SSH_TTY变量可显示tty情况。

用户的rc文件
ssh服务器会在每个连接到达时调用shell脚本/etc/sshrc,用户可把一些登录后想运行的脚本
写到这个文件中。用户可以在自已的目录下定义类似的脚本,如果有自定义的~/.ssh/rc则
/etc/sshrc则不会执行。

第九章 端口转发与X转发
使用SSH对其它应用程序在别的TCP端口上建立的TCP/IP传输进行加密和解密,这一过
程称为端口转发,其绝大多数操作都是透明的,功能非常强大。TELNET,SMTP,NNTP,IMAP
和一些基于TCP的不安全协议都可变得安全,只要将其连接通过SSH转发即可。端口转发
有时又叫做隧道传输。
例子:一个运行IMAP的服务器S,在家里的主机H上运行一个email程序,现在想用ssh
保护IMAP连接。
$ ssh -L2001:localhost:143 S
-L 表明是本地转发,,上面这命令可完成登录到S的功能,现在的这个SSH会话同时将H
的2001端口转发到S的143端口,在退出会话之前一直有效。并告知email程序使用被转
发的端口,通常邮件程序连接服务器的143端口,即套接字 (S,143)。现在要令其连接
本地主机H自已的2001端口,也就是套接字(localhost,2001)。创建本地转发时可以不用-L
选项,而在客户端配置文件中用LocalForward关键字。
LocalForward 2001 localhost:143 ssh1 openssh
LocalForward “2001:localhost:143” ssh2

-g 选项和GatewayPorts yes/no关键字可以配置除本地主机外的机器是否能使用本地的端口
转发功能。出于安全问题,该禁止这个功能。

远程转发端口与本地转发几乎完全相同,只是方向相反。此时服务器在本地,转发连接由远
程主机发起。假设你已登录进服务器S。则
$ ssh -R2001:localhost:143 H
-R代表远程转发。命令执行后,一条从远程主机H的2001端口到服务器S的143端口的安
全隧道就建立起来了。H上的任何程序都可以通过连接(localhost,2001)来使用此安全隧道。
而在客户端配置文件中用RemoteForward关键字.
RemoteForward 2001 S:143 ssh openssh
RemoteForward “2001:S:143” ssh2

$ ssh -o ClearAllForwardings=yes server.example.com 阻止第二条命令建立隧道

本地转发与远程转发
在本地转发中,应用程序客户端与监听端同SSH客户端在一起,应用程序服务器与连接端
同SSH服务器在一起。
在远程转发中,应用程序客户端与监听端同SSH服务器在一起,应用程序服务器与连接端
同SSH客户端在一起。

无远程登录的端口转发,连接时带-f参数。一次性转发用-fo,ssh1与openssh不支持这个功
能,但可用以下语句实现:
$ ssh -f -L2001:localhost:143 server sleep 10

终止
如果一个SSH会话现在还在活动当中,终止会出错。在SSH2中,如果退出有活动转发连
接的会话,该会话会依然打开,但会转到后台运行。直到转发连接终止。ssh1 and openssh
与此相反,如果要断开还在活动的会话,会出现警告,仍然在前台运行。

TIME_WAIT问题。在某些情况下,TCP连接断连时,其一端的套接字在很短一段时间内变
得不可用,所以在断连过程结束前不能把该端口用于TCP转发。

第十章 推荐配置
服务器范围配置
1、禁用其它访问方式。
关掉r-命令,方法如下:删除/etc/hosts.equiv文件,或改为只读空文件。禁用rshd,rlogind and
rexecd,通过修改inetd.conf文件。
2、/etc/sshd_config配置
HostKey /etc/ssh_host_key
PidFile /etc/sshd.pid
RandomSeed /etc/ssh_random_seed

StrictModes yes 要求用户保护其与SSH有关的文件及目录
Umask 0077 保证所有SSHD1创建是文件和目录都只能由其所有者(SSHD 运行的
UID)读取

port 22
ListenAddress 0.0.0.0
IdleTimeout 15m 15分钟空闲超时
KeepAlive yes 客户机死机时连接将会终止,而不会长期挂起。

LoginGraceTime 30 登录时成功认证的时限为30秒。

ServerKeyBits 768 服务器密钥长度
KeyRegenerationInterval 3600 服务器密钥一小时重新生成一次

PasswordAuthentication no 禁用密码认证
RhostsAuthentication no 禁用可信主机认证
RhostsRSAAuthentication no 禁用增强可信主机认证
RSAAuthentication yes 启用公钥认证

IgnoreRhosts yes 完全禁止SSHD使用.rhosts文件
IgnoreRootRhosts yes

UseLogin no 禁用UseLogin,防止万一使用了其它登录程序

AllowHosts xxx 根据需要设置
SilentDeny yes 任何被DenyHosts拒绝的连接都不会向用户返回消息,不必告诉攻击
者发生了什么,可以增加了排错的难度。

PermitRootLogin nopwd 允许超级用户通过SSH连接,但不能用密码认证

FascistLogging no 禁用FascistLogging日志方式,因为它会在日志中记录用户特定信息,对
攻击者有用。
QuietMode no 禁用QuietMode日志方式,使用日志更详细,敏感度更低

AllowTcpForwarding yes 允许tcp端口转发和X转发,保护其它的tcp连接
X11Forwarding yes

3、/etc/ssh2/sshd2_config配置
HostKeyFile /etc/ssh2/hostkey
PublicHostKeyFile /etc/ssh2/hostkey.pub
RandmoSeedFile /etc/ssh2/random_seed

UserConfigDirectory
IdentityFile
AuthorizstionFile

StrictModes yes

port 22
listenAddress 0.0.0.0
KeepAlive yes
RequireReverseMapping no

LoginGraceTime 30

由于sshd2没有设置服务器密钥的位数的关键字,用户得在启动时使用 -b 选项 $ sshd2 -b
1024 ….

AllowedAuthentications publickey
RequiredAuthentications publickey

IgnoreRhosts yes
UserKnownHosts no 禁用该项可防止用户给未知主机提供信任权限。

PermitRootLogin nopwd

Ciphers any 不能选none

QuietMode no
VerboseMode yes

Ssh1Compatibility no 禁用SSH-1兼容模式

#Ssh1Path /usr/local/ssh1/sshd1 出于实用原因,也可以启用此模式,之前要指明ssh1服
务器可执行文件位置

4、每账号配置
对于SSH1 AND OPENSSH,~/.ssh/authorized_keys中的每一个密钥都必须用适当的选项进
行限制,from选项限制只能从特定的主机访问特定的密钥。例如,假设文件中包含你家那
台pc(myhome.isp.net)的公钥,而其它机器根本不可能用那个密钥来认证,我们就可以明确
限定这一关系:from = “myhome.isp.net” …key…。还要对适当的密钥设置空闲超时时间:from
= “myhome.isp.net” ,idle-timeout=5m …key…。
最后,考虑每一个密钥是否需要对到达的连接使用端口转发,代理转发以及分配tty等,如
果不需要,就可以分别用no-port-forwarding,no-agent-forwarding and no-pty禁用这些特性。

5、密钥管理
至少创建1024位长的用户密钥,并用好的口令对密钥进行保护。

6、客户端配置
离开正在运行的ssh客户端时,一定要用密码保护。
在客户端配置文件中启用某些安全功能,并将其设置为最强
Host *
FallBackToRsh no 禁止使用不安全的r-命令(ssh2)没有这个问题。
UseRsh no
GatewayPorts no 禁止远程客户端连接本地的转发端口
StrictHostKeyChecking ask 在主机密钥发生变化时提醒你。请求你的处理意见。
配置“/etc/ssh/ssh_config”文件 
“/etc/ssh/ssh_config”文件是OpenSSH系统范围的配置文件,允许你通过设置不同的选项
来改变客户端程序的运行方式。这个文件的每一行包含“关键词-值”的匹配,其中“关键
词”是忽略大小写的。下面列出来的是最重要的关键词,用man命令查看帮助页(ssh (1))
可以得到详细的列表。 

编辑“ssh_config”文件(vi /etc/ssh/ssh_config),添加或改变下面的参数: 

# Site-wide defaults for various options 
Host * 
ForwardAgent no 
ForwardX11 no 
RhostsAuthentication no 
RhostsRSAAuthentication no 
RSAAuthentication yes 
PasswordAuthentication yes 
FallBackToRsh no 
UseRsh no 
BatchMode no 
CheckHostIP yes 
StrictHostKeyChecking no 
IdentityFile ~/.ssh/identity 
Port 22 
Cipher blowfish 
EscapeChar ~ 

下面逐行说明上面的选项设置: 

Host  
选项“Host”只对能够匹配后面字串的计算机有效。“
”表示所有的计算机。 

ForwardAgent no 
“ForwardAgent”设置连接是否经过验证代理(如果存在)转发给远程计算机。 

ForwardX11 no 
“ForwardX11”设置X11连接是否被自动重定向到安全的通道和显示集(DISPLAY set)。 

RhostsAuthentication no 
“RhostsAuthentication”设置是否使用基于rhosts的安全验证。 

RhostsRSAAuthentication no 
“RhostsRSAAuthentication”设置是否使用用RSA算法的基于rhosts的安全验证。 

RSAAuthentication yes 
“RSAAuthentication”设置是否使用RSA算法进行安全验证。 

PasswordAuthentication yes 
“PasswordAuthentication”设置是否使用口令验证。 

FallBackToRsh no 
“FallBackToRsh”设置如果用ssh连接出现错误是否自动使用rsh。 

UseRsh no 
“UseRsh”设置是否在这台计算机上使用“rlogin/rsh”。 

BatchMode no 
“BatchMode”如果设为“yes”,passphrase/password(交互式输入口令)的提示将被禁止。
当不能交互式输入口令的时候,这个选项对脚本文件和批处理任务十分有用。 

CheckHostIP yes 

“CheckHostIP”设置ssh是否查看连接到服务器的主机的IP地址以防止DNS欺骗。建议设
置为“yes”。 

StrictHostKeyChecking no 
“StrictHostKeyChecking”如果设置成“yes”,ssh就不会自动把计算机的密匙加入
“$HOME/.ssh/known_hosts”文件,并且一旦计算机的密匙发生了变化,就拒绝连接。 

IdentityFile ~/.ssh/identity 
“IdentityFile”设置从哪个文件读取用户的RSA安全验证标识。 

Port 22 
“Port”设置连接到远程主机的端口。 

Cipher blowfish 
“Cipher”设置加密用的密码。 

EscapeChar ~ 
“EscapeChar”设置escape字符。 

配置“/etc/ssh/sshd_config”文件 
“/etc/ssh/sshd_config”是OpenSSH的配置文件,允许设置选项改变这个daemon的运行。
这个文件的每一行包含“关键词-值”的匹配,其中“关键词”是忽略大小写的。下面列出
来的是最重要的关键词,用man命令查看帮助页(sshd (8))可以得到详细的列表。 

编辑“sshd_config”文件(vi /etc/ssh/sshd_config),加入或改变下面的参数: 

# This is ssh server systemwide configuration file. 
Port 22 
ListenAddress 192.168.1.1 
HostKey /etc/ssh/ssh_host_key 
ServerKeyBits 1024 
LoginGraceTime 600 
KeyRegenerationInterval 3600 
PermitRootLogin no 
IgnoreRhosts yes 
IgnoreUserKnownHosts yes 
StrictModes yes 
X11Forwarding no 
PrintMotd yes 
SyslogFacility AUTH 
LogLevel INFO 
RhostsAuthentication no 
RhostsRSAAuthentication no 
RSAAuthentication yes 
PasswordAuthentication yes 
PermitEmptyPasswords no 
AllowUsers admin 

下面逐行说明上面的选项设置: 

Port 22 
“Port”设置sshd监听的端口号。 

ListenAddress 192.168.1.1 
“ListenAddress”设置sshd服务器绑定的IP地址。 

HostKey /etc/ssh/ssh_host_key 

“HostKey”设置包含计算机私人密匙的文件。 

ServerKeyBits 1024 
“ServerKeyBits”定义服务器密匙的位数。 

LoginGraceTime 600 
“LoginGraceTime”设置如果用户不能成功登录,在切断连接之前服务器需要等待的时间(以
秒为单位)。 

KeyRegenerationInterval 3600 
“KeyRegenerationInterval”设置在多少秒之后自动重新生成服务器的密匙(如果使用密匙)。
重新生成密匙是为了防止用盗用的密匙解密被截获的信息。 

PermitRootLogin no 
“PermitRootLogin”设置root能不能用ssh登录。这个选项一定不要设成“yes”。 

IgnoreRhosts yes 
“IgnoreRhosts”设置验证的时候是否使用“rhosts”和“shosts”文件。 

IgnoreUserKnownHosts yes 
“IgnoreUserKnownHosts”设置ssh daemon是否在进行RhostsRSAAuthentication安全验证
的时候忽略用户的“$HOME/.ssh/known_hosts” 

StrictModes yes 
“StrictModes”设置ssh在接收登录请求之前是否检查用户家目录和rhosts文件的权限和所
有权。这通常是必要的,因为新手经常会把自己的目录和文件设成任何人都有写权限。 

X11Forwarding no 
“X11Forwarding”设置是否允许X11转发。 

PrintMotd yes 
“PrintMotd”设置sshd是否在用户登录的时候显示“/etc/motd”中的信息。 

SyslogFacility AUTH 
“SyslogFacility”设置在记录来自sshd的消息的时候,是否给出“facility code”。 

LogLevel INFO 
“LogLevel”设置记录sshd日志消息的层次。INFO是一个好的选择。查看sshd的man帮
助页,已获取更多的信息。 

RhostsAuthentication no 
“RhostsAuthentication”设置只用rhosts或“/etc/hosts.equiv”进行安全验证是否已经足够了。 

RhostsRSAAuthentication no 
“RhostsRSA”设置是否允许用rhosts或“/etc/hosts.equiv”加上RSA进行安全验证。 

RSAAuthentication yes 
“RSAAuthentication”设置是否允许只有RSA安全验证。 

PasswordAuthentication yes 
“PasswordAuthentication”设置是否允许口令验证。 

PermitEmptyPasswords no 
“PermitEmptyPasswords”设置是否允许用口令为空的帐号登录。 

AllowUsers admin 
“AllowUsers”的后面可以跟着任意的数量的用户名的匹配串(patterns)或user@host这样
的匹配串,这些字符串用空格隔开。主机名可以是DNS名或IP地址。

vim 技巧集

发表于 2006-11-23 | 分类于 Linux

vi技巧集

技巧1:关于帮助的帮助
查找帮助: 键入 “:help word”, 接着键入 CTRL-D 可以看到匹配”word” 的帮助主题.
类别 前缀 例子
普通模式命令 (无) :help x
Visual 模式命令 v_ :help vu
插入模式命令 i
:help i
命令行模式命令 : :help :quit
命令行编辑 c
:help c_
Vim 命令参数 - :help -r
选项 ‘ :help ‘textwidth’

技巧2:vi初学者30分钟教程
键入:vimtutor [语言]
语言参数可以是:fr it等,rh9有繁体的教程,暂时没有简体中文教程。

技巧3:确定你的位置
方法1:使用 命令。此命令显示vi状态信息,包括正在编辑的文件名、是否修改过、当前行号、文件的行数以及光标之前的行占整个文件的百分比。有时你会看到一个“裂开”的列号,是由于使用了Tab字符。
方法2:设置’number’选项。
在每行的前面加上一个行号:“:set number”;
要重新关闭这个选项:“:set nonumber”。
方法3:设置’ruler’选项。这会在Vim窗口的右下角显示当前光标的位置:
:set ruler

技巧4: 中止命令
比如:输入”f“后发现应该是“F”,就可以用来中止f命令。

技巧5: 让最后一行处于屏幕的中间
当到达了最后一行的时候,光标会行处于屏幕的底部。
“zz”命令能让最后一行显示在屏幕中间;
“zt”把光标所在行移动到屏幕的顶部;
“zb”则移动到屏幕的底部。

技巧6: 显示标记
你可以用如下命令取得所有的标记的列表:“ :marks”
用这个命令后,你会发现有一下特殊的标记,包括:
‘ 跳转前的位置
“ 最后编辑的位置
[ 最后修改的位置的开头
] 最后修改的位置的结尾

技巧7: 操作符与动作
你可以使用“dw”命令来删除一个单词,它是命令“d”+动作“w”。还可以加上数字,如“d4w”或者“4dw”来删除4个单词。
类似的常用命令有:
x 表示 dl (删除当前光标下的字符)
X 表示 dh (删除光标左边的字符)
D 表示 d$ (删除到行尾)
C 表示 c$ (修改到行尾)
s 表示 cl (修改一个字符)
S 表示 cc (修改一整行)

技巧8: 替换单个字符
“rx”命令,使用x替换当前字符,x可以是任意字符,键也可以;
“nrx”命令,可以用一个字符替换多个字符,如”4ra”;

技巧9: 重复命令“.”的使用
例如,假设你在编辑一个HTML文件,你想删除所有的标记。你把光标移到第一个“”命令删除,然后你就可以移到的”)。要删除下一个标记,移动到下一个<的位置,再执行“.”命令即可。 技巧10: 关于put的更多知识 “P”命令象“p”一样也是插入字符,但位置在光标前面。当你用“dd”删除一行,“P”会把它查回到光标所在行的前一行。而当你用“dw”删除一个单词,“P”会把它插回到光标前面。 你还可以执行这个命令多次,每次会插入相同的文本。 “p”和“P”命令接受个数前缀,被插入的文本就会被插入指定的次数。所以“dd”后加一个“3p”会把删除行的三个拷贝插入到文本中。 技巧11: 交换两个字符 当输入“teh”时,可以用“xp”命令左右交换光标处两字符的位置来得到“the”。 ddp 上下交换光标处两行的位置。技巧12: “daw”和“dw”,“daw”和“diw”的区别当光标在一个词的中间时,用“dw”来删除整个单词,需要先把光标移动到单词到开头;而“daw”可以直接完成这个操做。 “daw”包括单词后面的空白字符而“iw”不包括。 这里的“aw”“iw”是两个文本对象,即 “a word”“Inner Sentence”。 文本对象还有:“as”,“is”,即“A Sentence”“ Inner Sentence”。 技巧1. 我在那个文件? 使用“:args”就行了。 显示类似: one.c [two.c] three.c,[ ]表示当前文件。要移动到最后一个文件:“:last” 要移动到第一个文件: “:first”] 技巧2. 编辑另一个文件列表 我想编辑另一个文件列表而不想退出 Vim 。 用如下命令编辑另三个文件: :args five.c six.c seven.h 技巧3. “mx”和“mX”的区别 “mx”命令(x表示小写字母):此标记只在此一个文件中有效。每个文件都有一个自己的标记集,这些标记都由这个文件专用。 “mX”命令(X表示大写字母):这种标记是全局的,他们可以在任何文件中使用。 技巧4. 另存为….. “:saveas xxx” xxx是你要保存的文件名。 技巧5. 对全部窗口进行操作 “:qall”和“:qall!”用于退出全部窗口; “:wall”全部保存; “:wqall”全部保存后退出vim; 技巧6. 很多编辑另一个文件的命令都有一个分割窗口的变量。对于命令模式,这通过前置一个“s”实现。例如“:tag”跳到一个标记,“stag”分割出一个新窗口并跳到那个标记。 对于普通模式,前置一个 CTRL-W 可以完成这个功能。例如,CTRL-^ 跳到备选文件,而 CTRL-W CTRL-^ 打开一个新窗口并编辑备选文件。 技巧7. 使用记录命令 现在看看你可以怎么用这些命令。假设你有如下文件名列表: stdio.h fcntl.h unistd.h stdlib.h 而你想它变成这样: #include “stdio.h” #include “fcntl.h” #include “unistd.h” #include “stdlib.h” 先移动到第一行,接着执行如下命令: qa 启动记录,并使用寄存器a ^ 移到行首 i#include “ 在行首输入“#include “”
$ 移到行末
a” 在行末加上双引号“””
j 移到下一行
q 结束记录
现在,你已经完成一个修改了,你可以通过重复三次“@a”完成余下的修改。

技巧8. 寄存器的扩展技巧
记录到一个大写寄存器表示扩展命令到对应的小写寄存器。
假设已经记录了一个修改一个单词的命令到寄存器c中。它可以正常工作,现在你需要加一个搜索命令以便找到下一个单词来修改。这可以通过如下命令来完成:
qC/wordq
这种方法在宏记录,拷贝和删除命令中都有效。例如,你需要把选择一些行到一个寄存器中,可以先这样拷贝第一行:
“aY
然后移到下一个要拷贝的地方,执行:
“AY
如此类推。这样在寄存器a中就会包括所有你要拷贝的行。

技巧1.替换命令中的范围的确定
方法1. 使用行号:
例如,“n,m” –从第n行到第m行;
“n” –第n行
“-3,$+5” –从上面第三行到文末倒数第五行的范围;
方法2. 使用匹配模式:
例如,“:?^Chapter?,/^Chapter/s=grey=gray=g”,为了避免斜杠使用的混淆,在这种情况下,“=”字符用于代替斜杠。使用斜杠或使用其他字符也是可以的。
方法3. 使用标记:
例如,先用“mt”标记开头,再用“mb”标记结尾。然后就可以用标记表示一个范围(包括标记的那一行):
:’t,’b
方法4. 使用可视模式:
先用V选定范围,再输入“:”会出现“:’”,现在,只需要输入剩下的命令;
注意:
如果使用可视模式选中行的一部分,或者用 CTRL-V 选中一个文本块,然后
执行冒号命令,命令仍作用于行范围,而不是选中的范围。这可能会在以后
的版本中修正。

技巧2. 使用全局命令
它允许你找到一个匹配点并且在上面执行一个命令。它的一般形式是:
“:[range]global/{pattern}/{command}”
例如:把“foobar”修改为“barfoo”,但只需要修改C++风格的注释中的内容。这种注释以“//”开头。所以可以使用如下命令:
“:g+//+s/foobar/barfoo/g”
注意:global中只能使用冒号命令。普通命令不能在这里使用,如果需要,可以使用normal命令。

技巧3. 改变大小写
“gu”–改为小写;“gugu”“guu”是把一行变为小写;
“gU”–改为大写;“gUgU”“gUU”是把一行变为大写;
“g~”–改变大小写;“g~g~”“g~~”是改变一行。
这三个命令都可以作用于“动作”命令,文本对象和可视模式。

技巧4. 使用外部命令的例子
例子1:对1到5行进行排序。
先把光标定位在第一行,然后执行下面的命令: “!5G”
现在光标移到了屏幕的底部,并显示一个“!”作提示符。
现在你可以输入过滤程序的名字,在本例中就是“sort”了。因此,你整个命令将是: !5Gsort
例子2:“!!date”
用“date”的输出代替当前行。这在为文件加入时间戳的时候非常有用。

技巧5. 读入一个命令的输出
要把当前目录的内容读进来,可以用如下命令:“:read !ls”;
加上一个“!”让Vim知道后面是一个命令。这些命令还可以带参数。
而且前面还可以带一个范围用于告诉Vim把这行放在什么地方:“:0read !date -u”

技巧6. 把文本输出到一个命令
要统计当前文件有多少行,可以这样:
“:write !wc”
注意不要错写成: :write! wc
这会强制把当前文件存到当前目录的“wc”中。在这里空白字符的位置是非常重要的。

技巧7. 单词统计
如果你需要计算的是整个文件的字数,先移到文件第一行开头,然后用这个命令:
“g”“CTRL-G”
可以使用可视模式,选中要计算字数的文本,然后输入“g CTRL-G”;

技巧8. 查阅man信息
把光标移到对应的单词上然后输入:“K”
如果需要在新窗口中打开Man手册,则需要使用加载man文件类型的外挂:
“:source $VIMRUNTIME/ftplugin/man.vim”
然后用“:Man”命令打开一个显示man手册的窗口。如“Man feof”“Man 3 echo”;
现在,还可以用“K”开个新窗口显示Man手册了。

快速键入命令行命令

技巧0. 更快速的键入命令
Vim 具备若干基本功能,以简化键入命令的工作。 你可以缩写,编辑和重复分号命令,
而补全功能几乎可以用于所有的场合。

当你用分号(:)命令或者用 / 或 ? 搜索一个字符串时, Vim 就会把光标置于屏幕下方,
你在那儿键入命令或者搜索模式, 此处即称为命令行, 也是用来输入搜索命令的地方。

技巧1. 移动

命令行上移动光标时最常用的键:

左移一个字符
右移一个字符
或 左移一个单词
或 右移一个单词
CTRL-B 或 命令行首位
CTRL-E 或 命令行末位

注意:
并非在所有键盘上都有效。其它 Shift 和 Control组合键也有这个问题。

技巧2 删除
除了删除键,外,还可以用;
CTRL-W 删除光标前整个单词用 ;
CTRL-U 删除命令行上全部文字, 从而让你从头开始;

技巧3. 取消
方法1:用键删除全部字符;
方法2: 用取消;
方法3: 用CTRL+C取消;

技巧4. 命令行缩写
有些 “:” 分号命令确实很长。幸运的是所有 “:” 分号命令都可以被缩写。
比如可以把置换命令 “:substitute”缩写成”:s”。
“:s”是“:substitute”的缩写,而不是“:set”的缩写,它的缩写是“:se”。
“:substitute”最简形式是 “:s”,不可能更简单,但可以更复杂,即 “:su” 和 “:sub” 都有效。
最短的有效缩写形式可以在帮助文件里找到。

技巧5. 命令行补全
命令和文件都能用补全,并且能针对上下文做智能判断。
比如:键入“:e”,会出现“:edit”,再按一次,成了“:echo”,这和shell中的不一样;
假设要编辑的文件是:“foo.txt”,则键入“:edit f”,就会显示出以“f”开头的文件。
再最后一个匹配文件名上按,会出现最初键入的内容,vim会在匹配表内周而复始地循环。
:依相反方向循环匹配列表;
:显示全部匹配;
:把词补全为最长无歧义字符串;

技巧6. 命令行历史
:用在命令行上已经键入的文本去跟历史记录里的命令作比较, 只有匹配的命令才被显示出来;
:回到较晚的命令,命令能帮你消除光标前的字符以便重新输入;
“:history” :显示”:” 分号命令的历史记录;
“:history /”:显示搜索命令的历史记录;
“q:”:打开命令行窗口;

离开和回来

技巧1. 挂起和继续
方法1:用 CTRL-Z 挂起vim程序,进入shell,最后用 “fg” 命令回到 Vim ;
方法2:当 CTRL-Z 不起作用时,可以用“:suspend”;
注意:别忘了把 Vim 引导回前台,否则你会失去所有的修改!

技巧2. 执行shell命令
方法1:使用CTRL+Z 挂起Vim;
方法2:“:shell”命令重开一个终端,“exit”退出后就返回;
方法2:”:!{command}”,比如:“:!ls”;
常用的“!”命令有:
:!{program} 执行 {program}
:r !{program} 执行 {program} 并读取其输出
:w !{program} 执行 {program} 传送文本至其输入
:[range]!{program} 经由 {program} 过滤文本

技巧3. 在编辑模式下执行命令
方法1:用退出编辑模式,进入命令模式;
方法2:用进入命令模式,执行完命令后返回编辑模式;

文件浏览器

技巧1. 文件浏览器怎么用?
“:edit .”:“.”表示当前路径,用其他路径也行;
编辑文件:移动到一个文件名上并按下 键;
进入该目录:移动到目录上并按下 键;
常用键:
“-“ 键 进入父目录“..”
o 开启一个新窗口
O 利用最近访问过的窗口
p 利用预览窗口, 并把光标撤回浏览器窗口

技巧2. 排序
i 显示文件大小和日期. 再执行一次 i 命令将隐藏这些信息
s 根据光标所在的字段排序, 先以 i 命令显示文件大小和日期,
然后把光标移到任一文件的一个字段上, 并按 s 键
r 逆转排列顺序 (大小或日期二者择一)

技巧3. 常用操作
c 把当前目录改成显示在窗口中的那个目录
:cd 改变当前目录
:pwd 发现哪个目录是当前目录
R 为光标下文件改名
D 删除光标下文件

技巧4. 查找文件
假设有一个 C 程序, 该程序有这样一行:

#include “inits.h”
想要查看文件 “inits.h” 里有些什么。
把光标移到该文件名上, 并键入: “gf”
Vim 就会找到并打开这个文件。

技巧5. 加密
方法1: “-x” 参数,比如“vim -x foo.txt”,读加密文件是不要加上“-x”参数;
方法2:“:set key=xxx”命令。“key”“key=”“key=”xxx””都是去掉密码的意思;
技巧:“””“”等有特殊意义的符号,写成“””“\”;
方法3:“:X”命令,好处在于不会以明文显示密码,同时也不用输入多余的“”符号;

技巧6. 加密的麻烦
麻烦1:Vim 采用的加密算法有弱点的,防止偷窥者是绰绰有余了, 但不足以防止一个手上有大量时间的密码专家
麻烦2:交换文件是不加密的; 所以当你在编辑文件时, 拥有超级用户权限的人是能够读取未经加密的来自这个文件的交换文件文本的,
可以使用“vim -x -n file.txt”或者“:setlocal noswapfile”来防止产生交换文件;
麻烦3:打开一个加密文件,然后输入错误密码,再对文件进行“:X”操作,这样,谁都没法看文件了。

二进制文件的一些技巧

技巧1. 打开二进制文件
打开二进制文件,要使用“-b”的参数,
这是为了不让vim对文件做任何改动,
vim是个聪明的程序,但不能用在这里;

技巧2. 用 Hex 格式来阅读字符
方法1:“:set display=uhex”命令;
方法2:“ga”命令显示光标下的字符值;

技巧3. 显示当前字节位置,和移到
“g CTRL-G”;
要移到文件中某个指定的字节,用“go”命令,

技巧4. 使用xxd外部程序
首先以二进制方式编辑这个文件:“vim -b datafile”
然后用 xxd把文件转换成十六进制:“:%!xxd”
显示效果:
0000000: 1f8b 0808 39d7 173b 0203 7474 002b 4e49 ….9..;..tt.+NI
0000010: 4b2c 8660 eb9c ecac c462 eb94 345e 2e30 K,.`…..b..4^.0
Vim 把这些信息当作普通文本来对待,
注意,修改了十六进制部分并不导致可打印字符部分的改变, 反之亦然(能理解吗?);
最后, 记得把它转换回来:“:%!xxd -r”;
注意,只有十六进制部分的修改才会被采用,右边可打印文本部分的修改忽略不计。

技巧5. 可视模式下的重复
“gv” 命令再次选择上次选过的文本;

技巧6. 查找时忽略大小写
默认情况下, Vim 的查找是大小写敏感的;
方法1:
“:set ignorecase”关闭大小写敏感;
“:set noignorecase”重新开启;
“:set ignorecase smartcase”:
如果键入的字符串全是小写,说明忽略大小写;如果出现了大写字母,则说明是大小写敏感的;
方法2:
在模式前附加 “c” 字符串表示忽略一个特定的模式里的大小写;
附加 “C” 将使该模式的匹配大小写敏感;

技巧7. 折叠命令“zi”实用的操作方法:

  • 创建折叠, 以获取文件的全貌
  • 移动到要操作的地方
  • 执行“zi”以便一边看着文本, 一边编辑
  • 再执行“zi”以便移动到另一处

技巧8. 复制, 删除和粘贴折叠
可以把折叠看成一个单行来对其进行操作,比如这个实用操作:

  • 把光标置于被移文本的首行
  • 用“V”键开始可视模式
  • 把光标置于被移文本的末行
  • 用“d”键删除被选中的行
  • 把光标移到新位置, 用“p” 键把文本粘贴在那儿

技巧9. “%”使用技巧
假设有这样一段代码:

#ifdef USE_POPEN
fd = popen(“ls”, “r”)

#else
fd = fopen(“tmp”, “w”)

#endif
在“#ifdef” 处按“ %”,Vim 会跳转到“#else”;继续按“%”会跳转到“#endif”;再次按下“%”又回到“#ifdef”;
注意,使用“%”需要光标在“#”所在行;如果光标在代码内部,可以用“[#”“]#”命令向前向后跳转;

技巧10. 键入任意编码
编码 键入 范围
8-bit CTRL-V 123 decimal 0-255
8-bit CTRL-V x a1 hexadecimal 00-ff
16-bit CTRL-V u 013b hexadecimal 0000-ffff
31-bit CTRL-V U 001303a4 hexadecimal 00000000-7fffffff

技巧11. 在类内部用“[m” 找到前一个方法的开始;“]m” 找到下一个方法的开始。

技巧1. “.”的使用例子
假设要把“four”修改成“five”,有好几个地方要作这种修改。
操作步骤:
/four 找到第一个“four”
cwfive 修改成“five”
n 找下一个“four”
. 重复修改操作
n 找下一个“four”
. 重复修改
如此类推……

技巧2. 分割窗口的技巧
很多编辑另一个文件的命令都有一个分割窗口的变量。
对于命令模式,这通过前置一个“s”实现。例如“:tag”跳到一个标记,“stag”分割出一个新窗口并跳到那个标记。
对于普通模式,前置一个 CTRL-W 可以完成这个功能。例如,CTRL-^ 跳到备选文件,而 CTRL-W CTRL-^ 打开一个新窗口并编辑备选文件。

技巧3. 使用.vimrc文件
这个文件放在“~/” 下;
常用设置:
set fileencodings=cp936
set encoding=cp936
source $VIMRUNTIME/ftplugin/man.vim 用“:Man”“K”开个新窗口查看man手册
set incsearch 增量匹配
set showcmd 窗口右下角,标尺的右边显示未完成的命令
set display=uhex 以形式显示不可打印字符
set showmatch 显示匹配,如“()”“[]”
set ignorecase smartcase 智能忽略大小写,可以用“c”“C”指点是否忽略;

Linux-关于locale的设定

发表于 2006-11-23 | 分类于 Linux

关于locale的设定

locale是国际化与本土化过程中的一个非常重要的概念,个人认为,对于中文用户来说,通常会涉及到的国际化或者本土化,大致包含三个方面:看中文,写中文,与window中文系统的兼容和通信。从实际经验上看来,locale的设定与看中文关系不大,但是与写中文,及window分区的挂载方式有很密切的关系。本人认为就像一个纯英文的Windows能够浏览中文,日文或者意大利文网页一样,你不需要设定locale就可以看中文。那么,为什么要设定locale呢?什么时候会用到locale呢?

Tags: locale 设定 原因 解释
一、为什么要设定locale
正如前面我所讲的,设定locale与你能否浏览中文的网页没有直接的关系,即便你把locale设置成 en_US.ISO-8859-1这样一个标准的英文locale你照样可以浏览中文的网页,只要你的系统里面有相应的字符集(这个都不一定需要)和合适的字体(如simsun),浏览器就可以把网页翻译成中文给你看。具体的过程是网络把网页传送到你的机器上之后,浏览器会判断相应的编码的字符集,根据网页采用的字符集,去字体库里面找合适的字体,然后由文字渲染工具把相应的文字在屏幕上显示出来。

在下文本人会偶尔把字符集比喻成密码本,个人觉得对于一些东西比较容易理解,假如你不习惯的话,把全文copy到任何文本编辑器,用字符集替换密码本即可。

那有时候网页显示乱码或者都是方框是怎么回事呢?个人认为,显示乱码是因为设定的字符集不对(或者没有相应的字符集),例如网页是用UTF-8 编码的,你非要用GB2312去看,而系统根据GB2312去找字体,然后在屏幕上显示,当然是一堆的乱码,也就是说你用一个错误的密码本去翻译发给你的电报,当然内容那叫一个乱;至于有些时候浏览的网页能显示一部分汉字,但有很多的地方是方框,能够显示汉字说明浏览器已经正确的判断出了网页的编码,并在字体库里面找到了相应的文字,但是并不是每个字体库都包含某个字符集全部的字体的缘故,有些时候会显示不完全,找一个比较全的支持较多字符集的字体就可以了。

既然我能够浏览中文网页,那为什么我还要设定locale呢?

其实你有没有想过这么一个问题,为什么gentoo官方论坛上中文论坛的网页是用UTF-8编码的(虽然大家一直强烈建议用GB2312编码),但是新浪网就是用GB2312编码的呢?而Xorg的官方网页竟然是ISO-8859-15编码的,我没有设定这个locale怎么一样的能浏览呢?这个问题就像是你有所有的密码本,不论某个网站是用什么字符集编码的,你都可以用你手里的密码本把他们翻译过来,但问题是虽然你能浏览中文网页,但是在整个操作系统里面流动的还是英文字符。所以,就像你能听懂英语,也能听懂中文。
最根本的问题是:你不可以写中文。

当你决定要写什么东西的时候,首先要决定的一件事情是用那种语言,对于计算机来说就是你要是用哪一种字符集,你就必须告诉你的linux系统,你想用那一本密码本去写你想要写的东西。知道为什么需要用GB2312字符集去浏览新浪了吧,因为新浪的网页是用GB2312写的。

为了让你的Linux能够输入中文,就需要把系统的locale设定成中文的(严格说来是locale中的语言类别LC_CTYPE ),例如zh_CN.GB2312、zh_CN.GB18030或者zh_CN.UTF-8。很多人都不明白这些古里古怪的表达方式。这个外星表达式规定了什么东西呢?这个问题稍后详述,现在只需要知道,这是locale的表达方式就可以了。

二、到底什么是locale?
locale这个单词中文翻译成地区或者地域,其实这个单词包含的意义要宽泛很多。Locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。

这个用户环境可以按照所涉及到的文化传统的各个方面分成几个大类,通常包括用户所使用的语言符号及其分类(LC_CTYPE),数字 (LC_NUMERIC),比较和排序习惯(LC_COLLATE),时间显示格式(LC_TIME),货币单位(LC_MONETARY),信息主要是提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等(LC_MESSAGES),姓名书写方式(LC_NAME),地址书写方式(LC_ADDRESS),电话号码书写方式 (LC_TELEPHONE),度量衡表达方式(LC_MEASUREMENT),默认纸张尺寸大小(LC_PAPER)和locale对自身包含信息的概述(LC_IDENTIFICATION)。

所以说,locale就是某一个地域内的人们的语言习惯和文化传统和生活习惯。一个地区的locale就是根据这几大类的习惯定义的,这些locale定义文件放在/usr/share/i18n/locales目录下面,例如en_US, zh_CN and de_DE@euro都是locale的定义文件,这些文件都是用文本格式书写的,你可以用写字板打开,看看里边的内容,当然出了有限的注释以外,大部分东西可能你都看不懂,因为是用的Unicode的字符索引方式。

对于de_DE@euro的一点说明,@后边是修正项,也就是说你可以看到两个德国的locale:
/usr/share/i18n/locales/de_DE@euro
/usr/share/i18n/locales/de_DE
打开这两个locale定义,你就会知道它们的差别在于de_DE@euro使用的是欧洲的排序、比较和缩进习惯,而de_DE用的是德国的标准习惯。

上面我们说到了zh_CN.GB18030的前半部分,后半部分是什么呢?大部分Linux用户都知道是系统采用的字符集。

三、什么是字符集?
字符集就是字符,尤其是非英语字符在系统内的编码方式,也就是通常所说的内码,所有的字符集都放在 /usr/share/i18n/charmaps,所有的字符集也都是用Unicode编号索引的。Unicode用统一的编号来索引目前已知的全部的符号。而字符集则是这些符号的编码方式,或者说是在网络传输,计算机内部通信的时候,对于不同字符的表达方式,Unicode是一个静态的概念,字符集是一个动态的概念,是每一个字符传递或传输的具体形式。就像Unicode编号U59D0是代表姐姐的“姐”字,但是具体的这个字是用两个字节表示,三个字节,还是四个字节表示,是字符集的问题。例如:UTF-8字符集就是目前流行的对字符的编码方式,UTF-8用一个字节表示常用的拉丁字母,用两个字节表示常用的符号,包括常用的中文字符,用三个表示不常用的字符,用四个字节表示其他的古灵精怪的字符。而GB2312字符集就是用两个字节表示所有的字符。需要提到一点的是Unicode除了用编号索引全部字符以外,本身是用四个字节存储全部字符,这一点在谈到挂载windows分区的时候是非常重要的一个概念。所以说你也可以把Unicode看作是一种字符集(我不知道它和UTF-32的关系,反正UTF-32就是用四个字节表示所有的字符的),但是这样表述符号是非常浪费资源的,因为在计算机世界绝大部分时候用到的是一个字节就可以搞定的26个字母而已。所以才会有UTF-8,UTF-16等等,要不然大同世界多好,省了这许多麻烦。

四、zhCN.GB2312到底是在说什么?
Locale 是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory) 和字符集(Codeset)。一个locale的书写格式为: 语言[
地域[.字符集]]. 所以说呢,locale总是和一定的字符集相联系的。下面举几个例子:

1、我说中文,身处中华人民共和国,使用国标2312字符集来表达字符。
zhCN.GB2312=中文中华人民共和国+国标2312字符集。

2、我说中文,身处中华人民共和国,使用国标18030字符集来表达字符。
zhCN.GB18030=中文中华人民共和国+国标18030字符集。

3、我说中文,身处中华人民共和国台湾省,使用国标Big5字符集来表达字符。
zhTW.BIG5=中文台湾.大五码字符集

4、我说英文,身处大不列颠,使用ISO-8859-1字符集来表达字符。
enGB.ISO-8859-1=英文大不列颠.ISO-8859-1字符集

5、我说德语,身处德国,使用UTF-8字符集,习惯了欧洲风格。
deDE.UTF-8@euro=德语德国.UTF-8字符集@按照欧洲习惯加以修正

注意不是de[email protected],所以完全的locale表达方式是
[语言[
地域][.字符集] [@修正值]

生成的locale放在/usr/lib/locale/目录中,并且每个locale都对应一个文件夹,也就是说创建了[email protected] locale之后,就生成/usr/lib/locale/[email protected]/目录,里面是具体的每个locale的内容。

五、怎样去自定义locale
在gentoo生成locale还是很容易的,首先要在USE里面加入userlocales支持,然后编辑locales.build文件,这个文件用来指示glibc生成locale文件。
很多人不明白每一个条目是什么意思。 其实根据上面的说明现在应该很明确了。

File: /etc/locales.build
en_US/ISO-8859-1
en_US.UTF-8/UTF-8

zh_CN/GB18030
zh_CN.GBK/GBK
zh_CN.GB2312/GB2312
zh_CN.UTF-8/UTF-8

上面是我的locales.build文件,依次的说明是这样的:

en_US/ISO-8859-1:生成名为enUS的locale,采用ISO-8859-1字符集,并且把这个locale作为英文美国locale类的默认值,其实它和en_US.ISO-8859-1/ISO-8859-1没有任何区别。

en_US.UTF-8/UTF-8:生成名为en_US.UTF-8的locale,采用UTF-8字符集。

zh_CN/GB18030:生成名为zhCN的locale,采用GB18030字符集,并且把这个locale作为中文中国locale类的默认值,其实它和zh_CN.GB18030/GB18030没有任何区别。

zh_CN.GBK/GBK:生成名为zh_CN.GBK的locale,采用GBK字符集。
zh_CN.GB2312/GB2312:生成名为zh_CN.GB2312的locale,采用GB2312字符集。
zh_CN.UTF-8/UTF-8:生成名为zh_CN.UTF-8的locale,采用UTF-8字符集。

关于默认locale,默认locale可以简写成en_US或者zh_CN的形式,只是为了表达简单而已没有特别的意义。

Gentoo在locale定义的时候掩盖了一些东西,也就是locale的生成工具:localedef。
在编译完glibc之后你可以用这个localedef 再补充一些locale,就会更加理解locale了。具体的可以看 localedef 的manpage。

$localedef -f 字符集 -i locale定义文件 生成的locale的名称
例如
$localedef -f UTF-8 -i zh_CN zh_CN.UTF-8

上面的定义方法和在locales.build中设定zh_CN.UTF-8/UTF-8的结果是一样一样的。

六、locale的五脏六腑

刚刚生成了几个locale,但是为了让它们生效,必须告诉Linux系统使用那(几)个locale。这就需要对locale的内部机制有一点点的了解。在前面我已经提到过,locale把按照所涉及到的文化传统的各个方面分成12个大类,这12个大类分别是:
1、语言符号及其分类(LC_CTYPE)
2、数字(LC_NUMERIC)
3、比较和排序习惯(LC_COLLATE)
4、时间显示格式(LC_TIME)
5、货币单位(LC_MONETARY)
6、信息主要是提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等(LC_MESSAGES)
7、姓名书写方式(LC_NAME)
8、地址书写方式(LC_ADDRESS)
9、电话号码书写方式(LC_TELEPHONE)
10、度量衡表达方式(LC_MEASUREMENT)
11、默认纸张尺寸大小(LC_PAPER)
12、对locale自身包含信息的概述(LC_IDENTIFICATION)。

其中,与中文输入关系最密切的就是 LC_CTYPE, LC_CTYPE 规定了系统内有效的字符以及这些字符的分类,诸如什么是大写字母,小写字母,大小写转换,标点符号、可打印字符和其他的字符属性等方面。而locale定义zh_CN中最最重要的一项就是定义了汉字(Class “hanzi”)这一个大类,当然也是用Unicode描述的,这就让中文字符在Linux系统中成为合法的有效字符,而且不论它们是用什么字符集编码的。

LC_CTYPE
% This is a copy of the “i18n” LC_CTYPE with the following modifications: - Additional classes: hanzi

copy “i18n”

class “hanzi”; /
% ..;/
..;/
;;;;;;;;/
;;;;;;;;/
;;;;
END LC_CTYPE

在en_US的locale定义中,并没有定义汉字,所以汉字不是有效字符。所以如果要输入中文必须使用支持中文的locale,也就是zh_XX,如zh_CN,zh_TW,zh_HK等等。

另外非常重要的一点就是这些分类是彼此独立的,也就是说LC_CTYPE,LC_COLLATE和 LC_MESSAGES等等分类彼此之间是独立的,可以根据用户的需要设定成不同的值。这一点对很多用户是有利的,甚至是必须的。例如,我就需要一个能够输入中文的英文环境,所以我可以把LC_CTYPE设定成zh_CN.GB18030,而其他所有的项都是en_US.UTF-8。

七、怎样设定locale呢?

设定locale就是设定12大类的locale分类属性,即 12个LC_。除了这12个变量可以设定以外,为了简便起见,还有两个变量:LC_ALL和LANG。它们之间有一个优先级的关系:
LCALL>LC
>LANG
可以这么说,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值。
1、如果你设定了LC_ALL=zhCN.UTF-8,那么不管LC和LANG设定成什么值,它们都会被强制服从LC_ALL的设定,成为 zh_CN.UTF-8。
2、假如你设定了LANG=zhCN.UTF-8,而其他的LC
=en_US.UTF-8,并且没有设定LCALL的话,那么系统的locale设定以LC=en_US.UTF-8。
3、假如你设定了LANG=zhCN.UTF-8,而其他的LC
,和LCALL均未设定的话,系统会将LC设定成默认值,也就是LANG的值 zh_CN.UTF-8 。
4、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_CTYPE=enUS.UTF-8,其他的LC
,和LC_ALL均未设定的话,那么系统的locale设定将是:LC_CTYPE=en_US.UTF-8,其余的 LC_COLLATE,LC_MESSAGES等等均会采用默认值,也就是LANG的值,也就是LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=zh_CN.UTF-8。

所以,locale是这样设定的:
1、如果你需要一个纯中文的系统的话,设定LC_ALL= zh_CN.XXXX,或者LANG= zh_CN.XXXX都可以,当然你可以两个都设定,但正如上面所讲,LC_ALL的值将覆盖所有其他的locale设定,不要作无用功。
2、如果你只想要一个可以输入中文的环境,而保持菜单、标题,系统信息等等为英文界面,那么只需要设定LC_CTYPE=zh_CN.XXXX,LANG= en_US.XXXX就可以了。这样LC_CTYPE=zh_CN.XXXX,而LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=enUS.XXXX。
3、假如你高兴的话,可以把12个LC
一一设定成你需要的值,打造一个古灵精怪的系统:
LC_CTYPE=zh_CN.GBK/GBK(使用中文编码内码GBK字符集);
LC_NUMERIC=en_GB.ISO-8859-1(使用大不列颠的数字系统)
[email protected](德国的度量衡使用ISO-8859-15字符集)
罗马的地址书写方式,美国的纸张设定……。估计没人这么干吧。
4、假如你什么也不做的话,也就是LCALL,LANG和LC
均不指定特定值的话,系统将采用POSIX作为lcoale,也就是C locale。

MySQL数据库备份

发表于 2006-11-23 | 分类于 Linux

1.备份整个数据库


mysqldump –all-databases >/path/dbname.sql -uroot -p

mysqldump –opt database > db.sql


2.备份一个单独或者几个表


mysqldump db_name tab_name >/path/sqlname.sql -uroot -p


3.恢复数据库


mysql -D db_name < db.sql -uroot -p


mysqldump部分选项如

–add-locks
在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(为了使得更快地插入到MySQL)。
–add-drop-table
在每个create语句之前增加一个drop table。
–allow-keywords
允许创建是关键词的列名字。这由表名前缀于每个列名做到。
-c, –complete-insert
使用完整的insert语句(用列名字)。
-C, –compress
如果客户和服务器均支持压缩,压缩两者间所有的信息。
–delayed
用INSERT DELAYED命令插入行。
-e, –extended-insert
使用全新多行INSERT语法。(给出更紧缩并且更快的插入语句)
-#, –debug[=option_string]
跟踪程序的使用(为了调试)。
–help
显示一条帮助消息并且退出。
–fields-terminated-by=…

–fields-enclosed-by=…

–fields-optionally-enclosed-by=…

–fields-escaped-by=…

–fields-terminated-by=…
这些选择与-T选择一起使用,并且有相应的LOAD DATA INFILE子句相同的含义。
LOAD DATA INFILE语法。
-F, –flush-logs
在开始导出前,洗掉在MySQL服务器中的日志文件。
-f, –force,
即使我们在一个表导出期间得到一个SQL错误,继续。
-h, –host=..
从命名的主机上的MySQL服务器导出数据。缺省主机是localhost。
-l, –lock-tables.
为开始导出锁定所有表。
-t, –no-create-info
不写入表创建信息(CREATE TABLE语句)
-d, –no-data
不写入表的任何行信息。如果你只想得到
一个表的结构的导出,这是很有用的!
–opt
同–quick –add-drop-table –add-locks –extended-insert –lock-tables。
应该给你为读入一个MySQL服务器的尽可能最快的导出。
-pyour_pass, –password[=your_pass]
与服务器连接时使用的口令。如果你不指定“=your_pass”部分,mysqldump需要来自终端的口令。
-P port_num, –port=port_num
与一台主机连接时使用的TCP/IP端口号。(这用于连接到localhost以外的主机,因为它使用 Unix套接字。)
-q, –quick
不缓冲查询,直接导出至stdout;使用mysql_use_result()做它。
-S /path/to/socket, –socket=/path/to/socket
与localhost连接时(它是缺省主机)使用的套接字文件。
-T, –tab=path-to-some-directory
对于每个给定的表,创建一个table_name.sql文件,它包含SQL CREATE 命令,和一个table_name.txt文件,它包含数据。 注意:这只有在mysqldump运行在mysqld守护进程运行的同一台机器上的时候才工作。.txt文件的格式根据–fields-xxx和– lines–xxx选项来定。
-u user_name, –user=user_name
与服务器连接时,MySQL使用的用户名。缺省值是你的Unix登录名。
-O var=option, –set-variable var=option设置一个变量的值。可能的变量被列在下面。
-v, –verbose
冗长模式。打印出程序所做的更多的信息。
-V, –version
打印版本信息并且退出。
-w, –where=’where-condition’
只导出被选择了的记录;注意引号是强制的!
“–where=user=’jimf’” “-wuserid>1” “-wuserid<1”

Linux日志

发表于 2006-11-23 | 分类于 Linux

1. 日志简介
日志对于安全来说,非常重要,他记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。日志主要的功能有:审计和监测。他还可以实时的监测系统状态,监测和追踪侵入者等等。
在Linux系统中,有三个主要的日志子系统:
连接时间日志–由多个程序执行,把纪录写入到/var/log/wtmp和/var/run/utmp,login等程序更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统。
进程统计–由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct或acct)中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。
错误日志–由syslogd(8)执行。各种系统守护进程、用户程序和内核通过syslog(3)向文件/var/log/messages报告值得注意的事件。另外有许多UNIX程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志。
常用的日志文件如下:
access-log 纪录HTTP/web的传输
acct/pacct 纪录用户命令
aculog 纪录MODEM的活动
btmp 纪录失败的纪录
lastlog 纪录最近几次成功登录的事件和最后一次不成功的登录
messages 从syslog中记录信息(有的链接到syslog文件)
sudolog 纪录使用sudo发出的命令
sulog 纪录使用su命令的使用
syslog 从syslog中记录信息(通常链接到messages文件)
utmp 纪录当前登录的每个用户
wtmp 一个用户每次登录进入和退出时间的永久纪录
xferlog 纪录FTP会话
utmp、 wtmp和lastlog日志文件是多数重用UNIX日志子系统的关键–保持用户登录进入和 退出的纪录。有关当前登录用户的信息记录在文件utmp中;登录进入和退出纪录在文件 wtmp中;最后一次登录文件可以用lastlog命令察看。数据交换、关机和重起也记录在w
tmp文件中。所有的纪录都包含时间戳。这些文件(lastlog通常不大)在具有大量用户 的系统中增长十分迅速。例如wtmp文件可以无限增长,除非定期截取。许多系统以一天 或者一周为单位把wtmp配置成循环使用。它通常由cron运行的脚本来修改。这些脚本重
新命名并循环使用wtmp文件。通常,wtmp在第一天结束后命名为wtmp.1;第二天后wtmp .1变为wtmp.2等等,直到wtmp.7。
每 次有一个用户登录时,login程序在文件lastlog中察看用户的UID。如果找到了,则把 用户上次登录、退出时间和主机名写到标准输出中,然后login程序在lastlog中纪录新 的登录时间。在新的lastlog纪录写入后,utmp文件打开并插入用户的utmp纪录。该纪录
一直用到用户登录退出时删除。utmp文件被各种命令文件使用,包括who、w、users和finger。
下一步,login程序打开文件wtmp附加用户的utmp纪录。当用户登录退出时,具有更新时 间戳的同一utmp纪录附加到文件中。wtmp文件被程序last和ac使用。
2. 具体命令
wtmp 和utmp文件都是二进制文件,他们不能被诸如tail命令剪贴或合并(使用cat命令)。用户需要使用who、w、users、last和ac来使用这 两个文件包含的信息。 who:who命令查询utmp文件并报告当前登录的每个用户。Who的缺省输出包括用户名、终端类型、登录日期及远程主机。例如:who(回车)显示
chyang pts/0 Aug 18 15:06
ynguo pts/2 Aug 18 15:32
ynguo pts/3 Aug 18 13:55
lewis pts/4 Aug 18 13:35
ynguo pts/7 Aug 18 14:12
ylou pts/8 Aug 18 14:15
如果指明了wtmp文件名,则who命令查询所有以前的纪录。命令who /var/log/wtmp将报告自从wtmp文件创建或删改以来的每一次登录。
w:w命令查询utmp文件并显示当前系统中每个用户和它所运行的进程信息。
例如:w(回车)显示:3:36pm up 1 day, 22:34, 6 users, load average: 0.23, 0.29, 0.27
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
chyang pts/0 202.38.68.242 3:06pm 2:04 0.08s 0.04s -bash
ynguo pts/2 202.38.79.47 3:32pm 0.00s 0.14s 0.05s w
lewis pts/3 202.38.64.233 1:55pm 30:39 0.27s 0.22s -bash
lewis pts/4 202.38.64.233 1:35pm 6.00s 4.03s 0.01s sh /home/users/
ynguo pts/7 simba.nic.ustc.e 2:12pm 0.00s 0.47s 0.24s telnet mail
ylou pts/8 202.38.64.235 2:15pm 1:09m 0.10s 0.04s -bash
users:users用单独的一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数。
例如:users(回车)显示:chyang lewis lewis ylou ynguo ynguo
last:last命令往回搜索wtmp来显示自从文件第一次创建以来登录过的用户。例如:
chyang pts/9 202.38.68.242 Tue Aug 1 08:34 - 11:23 (02:49)
cfan pts/6 202.38.64.224 Tue Aug 1 08:33 - 08:48 (00:14)
chyang pts/4 202.38.68.242 Tue Aug 1 08:32 - 12:13 (03:40)
lewis pts/3 202.38.64.233 Tue Aug 1 08:06 - 11:09 (03:03)
lewis pts/2 202.38.64.233 Tue Aug 1 07:56 - 11:09 (03:12)
如果指明了用户,那么last只报告该用户的近期活动,例如:last ynguo(回车)显示
:
ynguo pts/4 simba.nic.ustc.e Fri Aug 4 16:50 - 08:20 (15:30)
ynguo pts/4 simba.nic.ustc.e Thu Aug 3 23:55 - 04:40 (04:44)
ynguo pts/11 simba.nic.ustc.e Thu Aug 3 20:45 - 22:02 (01:16)
ynguo pts/0 simba.nic.ustc.e Thu Aug 3 03:17 - 05:42 (02:25)
ynguo pts/0 simba.nic.ustc.e Wed Aug 2 01:04 - 03:16 1+02:12)
ynguo pts/0 simba.nic.ustc.e Wed Aug 2 00:43 - 00:54 (00:11)
ynguo pts/9 simba.nic.ustc.e Thu Aug 1 20:30 - 21:26 (00:55)
ac:ac命令根据当前的/var/log/wtmp文件中的登录进入和退出来报告用户连结的时间(小时),如果不使用标志,则报告总的时间。例如:ac(回车)显示:total 5177.47
ac -d(回车)显示每天的总的连结时间
Aug 12 total 261.87
Aug 13 total 351.39
Aug 14 total 396.09
Aug 15 total 462.63
Aug 16 total 270.45
Aug 17 total 104.29
Today total 179.02
ac -p (回车)显示每个用户的总的连接时间
ynguo 193.23
yucao 3.35
rong 133.40
hdai 10.52
zjzhu 52.87
zqzhou 13.14
liangliu 24.34
total 5178.24
lastlog: lastlog文件在每次有用户登录时被查询。可以使用lastlog命令来检查某特定用户上次登录的时间,并格式化输出上次登录日志 /var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlo
g显示”Never logged。注意需要以root运行该命令,例如:
rong 5 202.38.64.187 Fri Aug 18 15:57:01 +0800 2000
dbb Never logged in
xinchen Never logged in
pb9511 Never logged in
xchen 0 202.38.64.190 Sun Aug 13 10:01:22 +0800 2000
另外,可一加一些参数,例如,last -u 102将报告UID为102的用户;last -t 7表示限
制上一周的报告。
3. 进程统计
UNIX 可以跟踪每个用户运行的每条命令,如果想知道昨晚弄乱了哪些重要的文件,进程统计子系统可以告诉你。它对还跟踪一个侵入者有帮助。与连接时间日志不同,进 程统计子系统缺省不激活,它必须启动。在Linux系统中启动进程统计使用accton命令,必须用root身份来运行。Accton命令的形式 accton file,file必须先存在。先使用touch命令来创建pacct文件:touch /var/log/pacct,然后运行accton: accton /var/log/pacct。一旦accton被激活,就可以使用lastcomm命令监测系统中任何时候执行的命令。若要关闭统计,可以使用不带任何 参数的accton命令。
lastcomm命令报告以前执行的文件。不带参数时,lastcomm命令显示当前统计文件生命周期内纪录的所有命令的有关信息。包括命令名、用户、 tty、命令花费的CPU时间和一个时间戳。如果系统有许多用户,输入则可能很长。下面的例子:
crond F root ?? 0.00 secs Sun Aug 20 00:16
promisc_check.s S root ?? 0.04 secs Sun Aug 20 00:16
promisc_check root ?? 0.01 secs Sun Aug 20 00:16
grep root ?? 0.02 secs Sun Aug 20 00:16
tail root ?? 0.01 secs Sun Aug 20 00:16
sh root ?? 0.01 secs Sun Aug 20 00:15
ping S root ?? 0.01 secs Sun Aug 20 00:15
ping6.pl F root ?? 0.01 secs Sun Aug 20 00:15
sh root ?? 0.01 secs Sun Aug 20 00:15
ping S root ?? 0.02 secs Sun Aug 20 00:15
ping6.pl F root ?? 0.02 secs Sun Aug 20 00:15
sh root ?? 0.02 secs Sun Aug 20 00:15
ping S root ?? 0.00 secs Sun Aug 20 00:15
ping6.pl F root ?? 0.01 secs Sun Aug 20 00:15
sh root ?? 0.01 secs Sun Aug 20 00:15
ping S root ?? 0.01 secs Sun Aug 20 00:15
sh root ?? 0.02 secs Sun Aug 20 00:15
ping S root ?? 1.34 secs Sun Aug 20 00:15
locate root ttyp0 1.34 secs Sun Aug 20 00:15
accton S root ttyp0 0.00 secs Sun Aug 20 00:15
进 程统计的一个问题是pacct文件可能增长的十分迅速。这时需要交互式的或经过cron机制运行sa命令来保持日志数据在系统控制内。sa命令报告、清理 并维护进程统计文件。它能把/var/log/pacct中的信息压缩到摘要文件/var/log/savacct和 /var/log/usracct
中。这些摘要包含按命令名和用户名分类的系统统计数据。sa缺省情况下先读它们,然后读pacct文件,使报告能包含所有的可用信息。sa的输出有下面一些标记项:
avio–每次执行的平均I/O操作次数
cp–用户和系统时间总和,以分钟计
cpu–和cp一样
k–内核使用的平均CPU时间,以1k为单位
ksec–CPU存储完整性,以1k-core秒
re–实时时间,以分钟计
s–系统时间,以分钟计
tio–I/O操作的总数
u–用户时间,以分钟计
例如:
842 173.26re 4.30cp 0avio 358k
2 10.98re 4.06cp 0avio 299k find
9 24.80re 0.05cp 0avio 291k **
other
105 30.44re 0.03cp 0avio 302k ping
104 30.55re 0.03cp 0avio 394k sh
162 0.11re 0.03cp 0avio 413k security.sh
154 0.03re 0.02cp 0avio 273k ls
56 31.61re 0.02cp 0avio 823k ping6.pl

2 3.23re 0.02cp 0avio 822k ping6.pl
35 0.02re 0.01cp 0avio 257k md5sum
97 0.02re 0.01cp 0avio 263k initlog
12 0.19re 0.01cp 0avio 399k promisc_check.s
15 0.09re 0.00cp 0avio 288k grep
11 0.08re 0.00cp 0avio 332k awk
用户还可以根据用户而不是命令来提供一个摘要报告。例如sa -m显示如下:
885 173.28re 4.31cp 0avk
root 879 173.23re 4.31cp 0avk
alias 3 0.05re 0.00cp 0avk
qmailp 3 0.01re 0.00cp 0avk
4. Syslog设备
Syslog已被许多日志函数采纳,它用在许多保护措施中–任何程序都可以通过syslog 纪录事件。Syslog可以纪录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能纪录本地事件或通过网络纪录另一个主机上的事件。
Syslog 设备依据两个重要的文件:/etc/syslogd(守护进程)和/etc/syslog.conf配置文件,习惯上,多数syslog信息被写到 /var/adm或/var/log目录下的信息文件中(messages.*)。一个典型的syslog纪录包括生成程序的名字和一个文本信息。它还包 括一个设备和一个优先级范围(但不在日之中出现)。
每个syslog消息被赋予下面的主要设备之一:
LOG_AUTH–认证系统:login、su、getty等
LOG_AUTHPRIV–同LOG_AUTH,但只登录到所选择的单个用户可读的文件中
LOG_CRON–cron守护进程
LOG_DAEMON–其他系统守护进程,如routed
LOG_FTP–文件传输协议:ftpd、tftpd
LOG_KERN–内核产生的消息
LOG_LPR–系统打印机缓冲池:lpr、lpd
LOG_MAIL–电子邮件系统
LOG_NEWS–网络新闻系统
LOG_SYSLOG–由syslogd(8)产生的内部消息
LOG_USER–随机用户进程产生的消息
LOG_UUCP–UUCP子系统
LOG_LOCAL0~LOG_LOCAL7–为本地使用保留
Syslog为每个事件赋予几个不同的优先级:
LOG_EMERG–紧急情况
LOG_ALERT–应该被立即改正的问题,如系统数据库破坏
LOG_CRIT–重要情况,如硬盘错误
LOG_ERR–错误
LOG_WARNING–警告信息
LOG_NOTICE–不是错误情况,但是可能需要处理
LOG_INFO–情报信息
LOG_DEBUG–包含情报的信息,通常旨在调试一个程序时使用
syslog.conf 文件指明syslogd程序纪录日志的行为,该程序在启动时查询配置文件。该文件由不同程序或消息分类的单个条目组成,每个占一行。对每类消息提供一个选 择域和一个动作域。这些域由tab隔开:选择域指明消息的类型和优先级;动作域指明syslogd接收到一个与选择标准相匹配的消息时所执行的动作。每个 选项是由设备和优先级组成。当指明一个优先级时,syslogd将纪录一个拥有相同或更高优先级的消息。所以如果指明 “crit”,那所有标为crit、alert和emerg的消息将被纪录。每行的行动域指明当选择域选择了一个给定消息后应该把他发送到哪儿。例如,如 果想把所有邮件消息纪录到一个文件中,如下:

#Log all the mail messages in one place
mail.* /var/log/maillog
其他设备也有自己的日志。UUCP和news设备能产生许多外部消息。它把这些消息存到自己的日志(/var/log/spooler)中并把级别限为”err”或更高。例如:

Save mail and news errors of level err and higher in aspecial file.

uucp,news.crit /var/log/spooler
当一个紧急消息到来时,可能想让所有的用户都得到。也可能想让自己的日志接收并保存。

#Everybody gets emergency messages, plus log them on anther machine
.emerg
*.emerg @linuxaid.com.cn
alert消息应该写到root和tiger的个人账号中:

#Root and Tiger get alert and higher messages
*.alert root,tiger
有时syslogd将产生大量的消息。例如内核(”kern”设备)可能很冗长。用户可能想把内核消息纪录到/dev/console中。下面的例子表明内核日志纪录被注释掉了:

#Log all kernel messages to the console

#Logging much else clutters up the screen

#kern.* /dev/console
用户可以在一行中指明所有的设备。下面的例子把info或更高级别的消息送到/var/log
/messages,除了mail以外。级别”none”禁止一个设备:

#Log anything(except mail)of level info or higher

#Don log private authentication messages!
*.info:mail.none;authpriv.none /var/log/messages
在有些情况下,可以把日志送到打印机,这样网络入侵者怎么修改日志都没有用了。通常要广泛纪录日志。Syslog设备是一个攻击者的显著目标。一个为其他主机维护日志的系统对于防范服务器攻击特别脆弱,因此要特别注意。
有个小命令logger为syslog(3)系统日志文件提供一个shell命令接口,使用户能创建日志文件中的条目。

用法:logger

例如:logger This is a test!
它将产生一个如下的syslog纪录:Aug 19 22:22:34 tiger: This is a test!
注意不要完全相信日志,因为攻击者很容易修改它的。
5. 程序日志
许多程序通过维护日志来反映系统的安全状态。su命令允许用户获得另一个用户的权限,所以它的安全很重要,它的文件为sulog。同样的还有 sudolog。另外,想Apache有两个日志:access_log和error_log。

如何在Linux下调整网卡的工作模式

发表于 2006-11-23 | 分类于 Linux

1. 查看网卡的工作模式,输入命令:

#mii-tool -v

eth0: negotiated 100baseTx-FD,link ok

product info:Vendor 00:05:be,model 8 rev 0

basic status: autonegotiation complete,link ok

basic mode:autonegotiation enabled.

Capabilities: …………..

从以上信息中可以看出,这块网卡工作在100M全双工自适应模式下,“100BaseTx-FD”意为100M Full Duplex。

2. 更改网卡的工作模式,输入命令:

#mii-tool -F media [interface]

media可选的模式有100baseTx-FD、100baseTx-HD、10baseT-FD、10baseT-HD等。 Interface代表所选择的网卡,如eth0、eth1等,默认为eth0。

例如,设置网卡工作在10M半双工模式下,输入命令:

#mii-tool -F 10baseT-HD eth0

3. 恢复网卡的自适应工作模式,输入命令:

#mii-tool -r eth0

更详细的使用方法可以用mii-tool -h来获得。

nmap使用手册

发表于 2006-11-23 | 分类于 Linux

nmap是一个网络探测和安全扫描程序,系统管理者和个人可以使用这个软件扫描大型的网络,获取那台 主机正在运行以及提供什么服务等信息。nmap支持很多扫描技术,例如:UDP、TCP connect()、TCP SYN(半开扫描)、ftp代理 (bounce攻击)、反向标志、ICMP、FIN、ACK扫描、圣诞树(Xmas Tree)、SYN扫描和null扫描。从扫描类型一节可以得到细 节。nmap还提供了一些高级的特征,例如:通过TCP/IP协议栈特征探测操作系统类型,秘密扫描,动态延时和重传计算,并行扫描,通过并行ping扫 描探测关闭的主机,诱饵扫描,避开端口过滤检测,直接RPC扫描(无须端口影射),碎片扫描,以及灵活的目标和端口设定.

1.名称

nmap-网络探测和安全扫描工具

2.语法

nmap [Scan Type(s)] [Options]

3.描述

   nmap是一个网络探测和安全扫描程序,系统管理者和个人可以使用这个软件扫描大型的网络,获取那台主机正在运行以及提供什么服务等信息。nmap支持 很多扫描技术,例如:UDP、TCP connect()、TCP SYN(半开扫描)、ftp代理(bounce攻击)、反向标志、ICMP、FIN、 ACK扫描、圣诞树(Xmas Tree)、SYN扫描和null扫描。从扫描类型一节可以得到细节。nmap还提供了一些高级的特征,例如:通过 TCP/IP协议栈特征探测操作系统类型,秘密扫描,动态延时和重传计算,并行扫描,通过并行ping扫描探测关闭的主机,诱饵扫描,避开端口过滤检测, 直接RPC扫描(无须端口影射),碎片扫描,以及灵活的目标和端口设定。

  为了提高nmap在non-root状态下的性能,软件的设计者付出了很大的努力。很不幸,一些内核界面(例如raw socket)需要在root状态下使用。所以应该尽可能在root使用nmap。

   nmap运行通常会得到被扫描主机端口的列表。nmap总会给出well known端口的服务名(如果可能)、端口号、状态和协议等信息。每个端口的 状态有:open、filtered、unfiltered。open状态意味着目标主机能够在这个端口使用accept()系统调用接受连接。 filtered状态表示:防火墙、包过滤和其它的网络安全软件掩盖了这个端口,禁止 nmap探测其是否打开。unfiltered表示:这个端口关 闭,并且没有防火墙/包过滤软件来隔离nmap的探测企图。通常情况下,端口的状态基本都是unfiltered状态,只有在大多数被扫描的端口处于 filtered状态下,才会显示处于unfiltered状态的端口。

  根据使用的功能选项,nmap也可以报告远程主机的下列特征:使用的操作系统、TCP序列、运行绑定到每个端口上的应用程序的用户名、DNS名、主机地址是否是欺骗地址、以及其它一些东西。

4.功能选项

  功能选项可以组合使用。一些功能选项只能够在某种扫描模式下使用。nmap会自动识别无效或者不支持的功能选项组合,并向用户发出警告信息。

  如果你是有经验的用户,可以略过结尾的示例一节。可以使用nmap -h快速列出功能选项的列表。

4.1 扫描类型

  -sT
   TCP connect()扫描:这是最基本的TCP扫描方式。connect()是一种系统调用,由操作系统提供,用来打开一个连接。如果目标端口有 程序监听, connect()就会成功返回,否则这个端口是不可达的。这项技术最大的优点是,你勿需root权限。任何UNIX用户都可以自由使用这个 系统调用。这种扫描很容易被检测到,在目标主机的日志中会记录大批的连接请求以及错误信息。
  -sS
  TCP同步扫描 (TCP SYN):因为不必全部打开一个TCP连接,所以这项技术通常称为半开扫描(half-open)。你可以发出一个TCP同步包(SYN),然 后等待回应。如果对方返回SYN|ACK(响应)包就表示目标端口正在监听;如果返回RST数据包,就表示目标端口没有监听程序;如果收到一个 SYN|ACK包,源主机就会马上发出一个RST(复位)数据包断开和目标主机的连接,这实际上有我们的操作系统内核自动完成的。这项技术最大的好处是, 很少有系统能够把这记入系统日志。不过,你需要root权限来定制SYN数据包。
  -sF -sF -sN
  秘密FIN数据 包扫描、圣诞树(Xmas Tree)、空(Null)扫描模式:即使SYN扫描都无法确定的情况下使用。一些防火墙和包过滤软件能够对发送到被限制端口 的SYN数据包进行监视,而且有些程序比如synlogger和courtney能够检测那些扫描。这些高级的扫描方式可以逃过这些干扰。这些扫描方式的 理论依据是:关闭的端口需要对你的探测包回应RST包,而打开的端口必需忽略有问题的包(参考RFC 793第64页)。FIN扫描使用暴露的FIN数据 包来探测,而圣诞树扫描打开数据包的FIN、URG和PUSH标志。不幸的是,微软决定完全忽略这个标准,另起炉灶。所以这种扫描方式对 Windows95/NT无效。不过,从另外的角度讲,可以使用这种方式来分别两种不同的平台。如果使用这种扫描方式可以发现打开的端口,你就可以确定目 标注意运行的不是Windows系统。如果使用-sF、-sX或者-sN扫描显示所有的端口都是关闭的,而使用SYN扫描显示有打开的端口,你可以确定目 标主机可能运行的是Windwos系统。现在这种方式没有什么太大的用处,因为nmap有内嵌的操作系统检测功能。还有其它几个系统使用和windows 同样的处理方式,包括Cisco、BSDI、HP/UX、MYS、IRIX。在应该抛弃数据包时,以上这些系统都会从打开的端口发出复位数据包。
  -sP
   ping扫描:有时你只是想知道此时网络上哪些主机正在运行。通过向你指定的网络内的每个IP地址发送ICMP echo请求数据包,nmap就可以完 成这项任务。如果主机正在运行就会作出响应。不幸的是,一些站点例如:microsoft.com阻塞ICMP echo请求数据包。然而,在默认的情况 下nmap也能够向80端口发送TCP ack包,如果你收到一个RST包,就表示主机正在运行。nmap使用的第三种技术是:发送一个SYN包,然后等 待一个RST或者SYN/ACK包。对于非root用户,nmap使用connect()方法。
  在默认的情况下(root用户),nmap并行使用ICMP和ACK技术。
  注意,nmap在任何情况下都会进行ping扫描,只有目标主机处于运行状态,才会进行后续的扫描。如果你只是想知道目标主机是否运行,而不想进行其它扫描,才会用到这个选项。
  -sU
  UDP扫描:如果你想知道在某台主机上提供哪些UDP(用户数据报协议,RFC768)服务,可以使用这种扫描方法。nmap首先向目标主机的每个端口发出一个0字节的UDP包,如果我们收到端口不可达的ICMP消息,端口就是关闭的,否则我们就假设它是打开的。
   有些人可能会想UDP扫描是没有什么意思的。但是,我经常会想到最近出现的solaris rpcbind缺陷。rpcbind隐藏在一个未公开的 UDP端口上,这个端口号大于32770。所以即使端口111(portmap的众所周知端口号) 被防火墙阻塞有关系。但是你能发现大于30000的哪 个端口上有程序正在监听吗?使用UDP扫描就能!cDc Back Orifice的后门程序就隐藏在Windows主机的一个可配置的UDP端口中。不 考虑一些通常的安全缺陷,一些服务例如:snmp、tftp、NFS 使用UDP协议。不幸的是,UDP扫描有时非常缓慢,因为大多数主机限制ICMP错 误信息的比例(在RFC1812中的建议)。例如,在Linux内核中 (在net/ipv4/icmp.h文件中)限制每4秒钟只能出现80条目标不可 达的ICMP消息,如果超过这个比例,就会给1/4秒钟的处罚。 solaris的限制更加严格,每秒钟只允许出现大约2条ICMP不可达消息,这样,使 扫描更加缓慢。nmap会检测这个限制的比例,减缓发送速度,而不是发送大量的将被目标主机丢弃的无用数据包。
  不过Micro$oft忽略了RFC1812的这个建议,不对这个比例做任何的限制。所以我们可以能够快速扫描运行Win95/NT的主机上的所有65K个端口。
  -sA
  ACK扫描:这项高级的扫描方法通常用来穿过防火墙的规则集。通常情况下,这有助于确定一个防火墙是功能比较完善的或者是一个简单的包过滤程序,只是阻塞进入的SYN包。
   这种扫描是向特定的端口发送ACK包(使用随机的应答/序列号)。如果返回一个RST包,这个端口就标记为unfiltered状态。如果什么都没有返 回,或者返回一个不可达ICMP消息,这个端口就归入filtered类。注意,nmap通常不输出unfiltered的端口,所以在输出中通常不显示 所有被探测的端口。显然,这种扫描方式不能找出处于打开状态的端口。
  -sW
  对滑动窗口的扫描:这项高级扫描技术非常类 似于ACK扫描,除了它有时可以检测到处于打开状态的端口,因为滑动窗口的大小是不规则的,有些操作系统可以报告其大小。这些系统至少包括:某些版本的 AIX、Amiga、BeOS、BSDI、Cray、Tru64 UNIX、DG/UX、OpenVMS、Digital UNIX、OpenBSD、 OpenStep、QNX、Rhapsody、SunOS 4.x、Ultrix、VAX、VXWORKS。从nmap-hackers邮件3列表的文档 中可以得到完整的列表。
  -sR
  RPC扫描。这种方法和nmap的其它不同的端口扫描方法结合使用。选择所有处于打开状 态的端口向它们发出SunRPC程序的NULL命令,以确定它们是否是RPC端口,如果是,就确定是哪种软件及其版本号。因此你能够获得防火墙的一些信 息。诱饵扫描现在还不能和RPC扫描结合使用。
  -b
  FTP反弹攻击(bounce attack):FTP协议 (RFC 959)有一个很有意思的特征,它支持代理FTP连接。也就是说,我能够从evil.com连接到FTP服务器target.com,并且可以 要求这台 FTP服务器为自己发送Internet上任何地方的文件!1985年,RFC959完成时,这个特征就能很好地工作了。然而,在今天的 Internet 中,我们不能让人们劫持FTP服务器,让它向Internet上的任意节点发送数据。如同Hobbit在1995年写的文章中所说的, 这个协议”能够用来做投递虚拟的不可达邮件和新闻,进入各种站点的服务器,填满硬盘,跳过防火墙,以及其它的骚扰活动,而且很难进行追踪”。我们可以使用 这个特征,在一台代理FTP服务器扫描TCP端口。因此,你需要连接到防火墙后面的一台FTP服务器,接着进行端口扫描。如果在这台FTP服务器中有可读 写的目录,你还可以向目标端口任意发送数据(不过nmap不能为你做这些)。
  传递给-b功能选项的参数是你要作为代理的FTP服务器。语法格式为:
  -b username:password@server:port。
  除了server以外,其余都是可选的。如果你想知道什么服务器有这种缺陷,可以参考我在Phrack 51发表的文章。还可以在nmap的站点得到这篇文章的最新版本。

4.2 通用选项

  这些内容不是必需的,但是很有用。

  -P0
  在扫描之前,不必ping主机。有些网络的防火墙不允许ICMP echo请求穿过,使用这个选项可以对这些网络进行扫描。microsoft.com就是一个例子,因此在扫描这个站点时,你应该一直使用-P0或者-PT 80选项。
  -PT
   扫描之前,使用TCP ping确定哪些主机正在运行。nmap不是通过发送ICMP echo请求包然后等待响应来实现这种功能,而是向目标网络(或 者单一主机)发出TCP ACK包然后等待回应。如果主机正在运行就会返回RST包。只有在目标网络/主机阻塞了ping包,而仍旧允许你对其进行扫描 时,这个选项才有效。对于非 root用户,我们使用connect()系统调用来实现这项功能。使用-PT 来设定目标端口。默 认的端口号是80,因为这个端口通常不会被过滤。
  -PS
  对于root用户,这个选项让nmap使用SYN包而不是ACK包来对目标主机进行扫描。如果主机正在运行就返回一个RST包(或者一个SYN/ACK包)。
  -PI
   设置这个选项,让nmap使用真正的ping(ICMP echo请求)来扫描目标主机是否正在运行。使用这个选项让nmap发现正在运行的主机的同 时,nmap也会对你的直接子网广播地址进行观察。直接子网广播地址一些外部可达的IP地址,把外部的包转换为一个内向的IP广播包,向一个计算机子网发 送。这些IP广播包应该删除,因为会造成拒绝服务攻击(例如 smurf)。
  -PB
  这是默认的ping扫描选项。它使用ACK(-PT)和ICMP(-PI)两种扫描类型并行扫描。如果防火墙能够过滤其中一种包,使用这种方法,你就能够穿过防火墙。
  -O
   这个选项激活对TCP/IP指纹特征(fingerprinting)的扫描,获得远程主机的标志。换句话说,nmap使用一些技术检测目标主机操作系 统网络协议栈的特征。nmap使用这些信息建立远程主机的指纹特征,把它和已知的操作系统指纹特征数据库做比较,就可以知道目标主机操作系统的类型。
  -I
  这个选项打开nmap的反向标志扫描功能。Dave Goldsmith 1996年向bugtap发出的邮件注意到这 个协议,ident协议(rfc 1413)允许使用TCP连接给出任何进程拥有者的用户名,即使这个进程并没有初始化连接。例如,你可以连接到HTTP 端口,接着使用identd确定这个服务器是否由root用户运行。这种扫描只能在同目标端口建立完全的TCP连接时(例如:-sT扫描选项)才能成功。 使用-I选项是,远程主机的 identd精灵进程就会查询在每个打开的端口上监听的进程的拥有者。显然,如果远程主机没有运行identd程序,这种扫 描方法无效。
  -f
  这个选项使nmap使用碎片IP数据包发送SYN、FIN、XMAS、NULL。使用碎片数据包增加 包过滤、入侵检测系统的难度,使其无法知道你的企图。不过,要慎重使用这个选项!有些程序在处理这些碎片包时会有麻烦,我最喜欢的嗅探器在接受到碎片包的 头36个字节时,就会发生 segmentation faulted。因此,在nmap中使用了24个字节的碎片数据包。虽然包过滤器和防火墙不能防这 种方法,但是有很多网络出于性能上的考虑,禁止数据包的分片。
  注意这个选项不能在所有的平台上使用。它在Linux、FreeBSD、OpenBSD以及其它一些UNIX系统能够很好工作。
  -v
  冗余模式。强烈推荐使用这个选项,它会给出扫描过程中的详细信息。使用这个选项,你可以得到事半功倍的效果。使用-d选项可以得到更加详细的信息。
  -h
  快速参考选项。
  -oN
  把扫描结果重定向到一个可读的文件logfilename中。
  -oM
   把扫描结果重定向到logfilename文件中,这个文件使用主机可以解析的语法。你可以使用-oM -来代替logfilename,这样输出就被 重定向到标准输出stdout。在这种情况下,正常的输出将被覆盖,错误信息荏苒可以输出到标准错误 stderr。要注意,如果同时使用了-v选项,在 屏幕上会打印出其它的信息。
  -oS    thIs l0gz th3 r3suLtS of YouR ScanZ iN a s|   THe fiL3 U sPecfy 4s an arGuMEnT! U kAn gIv3 the 4rgument -
  (wItHOUt qUOteZ) to sh00t output iNT0 stDouT!@!! 莫名其妙,下面是我猜着翻译的,相形字?
  把扫描结果重定向到一个文件logfilename中,这个文件使用一种”黑客方言”的语法形式(作者开的玩笑?)。同样,使用-oS -就会把结果重定向到标准输出上。
  -resume
   某个网络扫描可能由于control-C或者网络损失等原因被中断,使用这个选项可以使扫描接着以前的扫描进行。logfilename是被取消扫描的 日志文件,它必须是可读形式或者机器可以解析的形式。而且接着进行的扫描不能增加新的选项,只能使用与被中断的扫描相同的选项。nmap会接着日志文件中 的最后一次成功扫描进行新的扫描。
  -iL
  从inputfilename文件中读取扫描的目标。在这个文件中要有一个主机或者网络的列表,由空格键、制表键或者回车键作为分割符。如果使用-iL -,nmap就会从标准输入stdin读取主机名字。你可以从指定目标一节得到更加详细的信息。
  -iR
  让nmap自己随机挑选主机进行扫描。
  -p
   这个选项让你选择要进行扫描的端口号的范围。例如,-p 23表示:只扫描目标主机的23号端口。-p 20-30,139,60000-表示:扫描 20到30号端口,139号端口以及所有大于60000的端口。在默认情况下,nmap扫描从1到1024号以及nmap-services文件(如果使 用RPM软件包,一般在/usr/share/nmap/目录中)中定义的端口列表。
  -F
  快速扫描模式,只扫描在nmap-services文件中列出的端口。显然比扫描所有65535个端口要快。
  -D
   使用诱饵扫描方法对目标网络/主机进行扫描。如果nmap使用这种方法对目标网络进行扫描,那么从目标主机/网络的角度来看,扫描就象从其它主机 (decoy1,等)发出的。从而,即使目标主机的IDS(入侵检测系统)对端口扫描发出报警,它们也不可能知道哪个是真正发起扫描的地址,哪个是无辜 的。这种扫描方法可以有效地对付例如路由跟踪、response-dropping等积极的防御机制,能够很好地隐藏你的IP地址。
  每 个诱饵主机名使用逗号分割开,你也可以使用ME选项,它代表你自己的主机,和诱饵主机名混杂在一起。如果你把ME放在第六或者更靠后的位置,一些端口扫描 检测软件几乎根本不会显示你的IP地址。如果你不使用ME选项,nmap会把你的IP地址随机夹杂在诱饵主机之中。
  注意:你用来作为诱 饵的主机应该正在运行或者你只是偶尔向目标发送SYN数据包。很显然,如果在网络上只有一台主机运行,目标将很轻松就会确定是哪台主机进行的扫描。或许, 你还要直接使用诱饵的IP地址而不是其域名,这样诱饵网络的域名服务器的日志上就不会留下关于你的记录。
  还要注意:一些愚蠢的端口扫描检测软件会拒绝路由试图进行端口扫描的主机。因而,你需要让目标主机和一些诱饵断开连接。如果诱饵是目标主机的网关或者就是其自己时,会给目标主机造成很大问题。所以你需要慎重使用这个选项。
  诱饵扫描既可以在起始的ping扫描也可以在真正的扫描状态下使用。它也可以和-O选项组合使用。
  使用太多的诱饵扫描能够减缓你的扫描速度甚至可能造成扫描结果不正确。同时,有些ISP会把你的欺骗包过滤掉。虽然现在大多数的ISP不会对此进行限制。
  -S
  在一些情况下,nmap可能无法确定你的源地址(nmap会告诉你)。在这种情况下,可以使用这个选项给出你的IP地址。
  在欺骗扫描时,也使用这个选项。使用这个选项可以让目标认为是其它的主机对自己进行扫描。
  -e
  告诉nmap使用哪个接口发送和接受数据包。nmap能够自动对此接口进行检测,如果无效就会告诉你。
  -g
   设置扫描的源端口。一些天真的防火墙和包过滤器的规则集允许源端口为DNS(53)或者FTP-DATA(20)的包通过和实现连接。显然,如果攻击者 把源端口修改为20或者53,就可以摧毁防火墙的防护。在使用UDP扫描时,先使用53号端口;使用TCP扫描时,先使用20号端口。注意只有在能够使用 这个端口进行扫描时,nmap才会使用这个端口。例如,如果你无法进行TCP扫描,nmap会自动改变源端口,即使你使用了-g选项。
  对于一些扫描,使用这个选项会造成性能上的微小损失,因为我有时会保存关于特定源端口的一些有用的信息。
  -r
  告诉nmap不要打乱被扫描端口的顺序。
  –randomize_hosts
  使nmap在扫描之前,打乱每组扫描中的主机顺序,nmap每组可以扫描最多2048台主机。这样,可以使扫描更不容易被网络监视器发现,尤其和–scan_delay 选项组合使用,更能有效避免被发现。
  -M
  设置进行TCP connect()扫描时,最多使用多少个套接字进行并行的扫描。使用这个选项可以降低扫描速度,避免远程目标宕机。

4.3 适时选项

  通常,nmap在运行时,能够很好地根据网络特点进行调整。扫描时,nmap会尽量减少被目标检测到的机会,同时尽可能加快扫描速度。然而,nmap默认的适时策略有时候不太适合你的目标。使用下面这些选项,可以控制nmap的扫描timing:

-T
   设置nmap的适时策略。Paranoid:为了避开IDS的检测使扫描速度极慢,nmap串行所有的扫描,每隔至少5分钟发送一个包; Sneaky:也差不多,只是数据包的发送间隔是15秒;Polite:不增加太大的网络负载,避免宕掉目标主机,串行每个探测,并且使每个探测有 0.4 秒种的间隔;Normal:nmap默认的选项,在不是网络过载或者主机/端口丢失的情况下尽可能快速地扫描;Aggressive:设置5分钟 的超时限制,使对每台主机的扫描时间不超过5分钟,并且使对每次探测回应的等待时间不超过1.5秒钟;b>Insane:只适合快速的网络或者你不 在意丢失某些信息,每台主机的超时限制是75秒,对每次探测只等待0.3秒钟。你也可是使用数字来代替这些模式,例如:-T 0等于- T Paranoid,-T 5等于-T Insane。
  这些适时模式不能下面的适时选项组合使用。
–host_timeout
  设置扫描一台主机的时间,以毫秒为单位。默认的情况下,没有超时限制。
–max_rtt_timeout
  设置对每次探测的等待时间,以毫秒为单位。如果超过这个时间限制就重传或者超时。默认值是大约9000毫秒。
–min_rtt_timeout
  当目标主机的响应很快时,nmap就缩短每次探测的超时时间。这样会提高扫描的速度,但是可能丢失某些响应时间比较长的包。使用这个选项,可以让nmap对每次探测至少等待你指定的时间,以毫秒为单位。
–initial_rtt_timeout
  设置初始探测的超时值。一般这个选项只在使用-P0选项扫描有防火墙保护的主机才有用。默认值是6000毫秒。
–max_parallelism
  设置最大的并行扫描数量。–max_parallelism 1表示同时只扫描一个端口。这个选项对其它的并行扫描也有效,例如ping sweep, RPC scan。
–scan_delay
  设置在两次探测之间,nmap必须等待的时间。这个选项主要用于降低网络的负载。

4.4 目标设定

   在nmap的所有参数中,只有目标参数是必须给出的。其最简单的形式是在命令行直接输入一个主机名或者一个IP地址。如果你希望扫描某个IP地址的一个 子网,你可以在主机名或者IP地址的后面加上/掩码。掩码在0(扫描整个网络)到32(只扫描这个主机)。使用/24扫描C类地址,/16扫描B类地址。

  除此之外,nmap还有更加强大的表示方式让你更加灵活地指定IP地址。例如,如果要扫描这个B类网络 128.210..,你可以使用下面三种方式来指定这些地址:128.210..、128.21-.0-255.0-255或者 128.210.0.0/16这三种形式是等价的。

5.例子

  本节将由浅入深地举例说明如何使用nmap。

nmap -v target.example.com
扫描主机target.example.com的所有TCP端口。-v打开冗余模式。

nmap -sS -O target.example.com/24
发起对target.example.com所在网络上的所有255个IP地址的秘密SYN扫描。同时还探测每台主机操作系统的指纹特征。需要root权限。

nmap -sX -p 22,53,110,143,4564 128.210.*.1-127
对B类IP地址128.210中255个可能的8位子网的前半部分发起圣诞树扫描。确定这些系统是否打开了sshd、DNS、pop3d、imapd和4564端口。注意圣诞树扫描对Micro$oft的系统无效,因为其协议栈的TCP层有缺陷。

nmap -v –randomize_hosts -p 80 ..2.3-5
只 扫描指定的IP范围,有时用于对这个Internet进行取样分析。nmap将寻找Internet上所有后两个字节是.2.3、.2.4、.2.5的 IP地址上的WEB服务器。如果你想发现更多有意思的主机,你可以使用127-222,因为在这个范围内有意思的主机密度更大。

host -l company.com | cut -d -f 4 | ./nmap -v -iL -
列出company.com网络的所有主机,让nmap进行扫描。注意:这项命令在GNU/Linux下使用。如果在其它平台,你可能要使用 其它的命令/选项。

定时 MYSQL 动作(原创)

发表于 2006-11-23 | 分类于 Linux

LINUX下用CRON实现定时执行脚本

有的我们希望在指定时间运行数据库的相关操作,如果这些在WEB前台来执行将会非常浪费服务器资源,因为网页需要不停的刷新继而判断时间来执行操作。。。

我是用的这样的方法

1. 在/etc 创建一个目录 crond.my

2.编辑/etc/crontab

分 小时 天 月 星期 root run-parts /etc/cron.my

3. 在cron.my中创建delete_table_msg.sh

内容如下:

/usr/local/mysql/bin/mysql -hlocalhost -uroot -pwowangle < /etc/cron.12/job.sql

上边为什么要下MYSQL的绝对路径?因为我的MYSQL是自己编译的,而这个MYSQL命令并没有在crontab的PATH中存在.

请看一下/etc/crontab文件的PATH就完全明白了!

有的时候时候定时脚本没有运行就请选查看你的命令是否在path当中!

那个job.sql当中就是要执行的sql语句

!(题外话了)

你要对SQL有更多的了解!才会能完成更多的任务!所以SQL很重要!对WEB开发人员更是如此,我不相信一个用DW的可以成为什么优秀的WEB程序人员,如是你只是会简单的select * from table 这样类似的语句那你和我一样也该好好反醒一下了!

我的这个A.SQL中是如下内容

`use xfcz;
delete from t;

`

看就这么两条简单的语句,因为这个T表中的数据在每天固定的一个时间是必须全部清除的

发挥你的想象力,重头戏就在这Publish)个sql当中……

grep 命令的使用

发表于 2006-11-23 | 分类于 Linux

grep 命令

用途

在文件中搜索模式。

语法

grep [ -E | -F ] [ -i ] [ -h ] [ -H ] [ -L ] [ -r | -r ] [ -s ] [ -v ] [ -w ] [ -x ] [ -y ] [ [ [ -b ] [ -n ] ] | [ -c | -l | -q ] ] [ -p [ Separator ] ] { [ -e PatternList … ] [ -f PatternFile … ] | PatternList … } [ File … ]

描述

grep 命令用于搜索由 Pattern 参数指定的模式,并将每个匹配的行写入标准输出中。这些模式是具有限定的正则表达式,它们使用 ed 或 egrep 命令样式。grep 命令使用压缩的不确定算法。

如果在 File 参数中指定了多个名称,grep 命令将显示包含匹配行的文件的名称。对 shell 有特殊含义的字符 ($, , [, |, ^, (, ), ) 出现在 Pattern 参数中时必须带双引号。如果 Pattern 参数不是简单字符串,通常必须用单引号将整个模式括起来。在诸如 [a-z] 之类的表达式中,-(减号)cml 可根据当前正在整理的序列来指定一个范围。整理顺序可以定义等价的类以供在字符范围中使用。如果未指定任何文件,*grep 会假定为标准输入。

注:

  1. 请勿对特殊文件运行 grep 命令,这样做可能产生不可预计的结果。
  2. 输入行不应包含空字符。
  3. 输入文件应该以换行符结束。
  4. 换行符不会与正则表达式匹配。
  5. 虽然一些标志可以同时被指定,但其中的某些标志会覆盖其他标志。例如,-l 选项将优先于所有其他标志。另外,如果您同时指定了 -E 和 -F 标志,则后指定的那个会有优先权。

标志

-b

在每行之前添加找到该行时所在的块编号。使用这个标志有助于通过上下文来找到磁盘块号码。-b 标志不能用于来自标准输入和管道的输入。

-c

仅显示匹配行的计数。

-E

将每个指定模式视作扩展的正则表达式(ERE)。ERE 的空值将匹配所有的行。

注:带有 -E 标志的 grep 命令等价于 egrep 命令,只不过它们的错误和使用信息不同以及 -s 标志的作用不同。

-e PatternList

指定一个或多个搜索模式。其作用相当于一个简单模式,但在模式以 -(减号)开始的情况下,这将非常有用。模式之间应该用换行符分隔。连续使用两个换行符或者在引号后加上换行符 (”n) 可以指定空模式。除非同时指定了 -E 或 -F 标志,否则每个模式都将被视作基本正则表达式(BRE)。grep 可接受多个 -e 和 -f 标志。在匹配行时,所有指定的模式都将被使用,但评估的顺序没有指定。

-F

将每个指定的模式视作字符串而不是正则表达式。空字符串可匹配所有的行。
注: 带有 -F 标志的 grep 命令等价于 fgrep 命令,只不过它们的错误和使用信息不同以及 -s 标志具有不同的作用。

-f PatternFile

指定包含搜索模式的文件。模式之间应该用换行符加以分隔,空行将被认为是空模式。每种模式都将被视作基本的正则表达式(BRE),除非同时指定了 -E 或 -F 标志。

-h

禁止在匹配行后附加包含此行的文件的名称。当指定多个文件时,将禁止文件名。

-H

如果指定了 -r 或 -R 选项并且在命令行上指定了引用文件类型目录的符号链接,则 grep 将搜索符号链接所引用的目录文件以及文件层次结构中在它以下的所有文件。

-i

在进行比较时忽略字母的大小写。


-l

仅列出(一次)包含匹配行的文件的名称。文件名之间用换行符加以分隔。如果搜索到标准输入,将返回(标准输入)的路径名。-l 标志同 -c 和 -n 标志的任意组合一起使用时,其作用类似于仅使用了 -l 标志。

-L

如果指定了 -r 或 -R 选项,并且引用文件类型目录的符号链接在命令行上指定或在文件层次结构转移过程中遇到,则 grep 将搜索符号链接所引用的目录文件以及文件层次结构中在它以下的所有文件。如果同时指定了 -H 和 -L,则命令行上最近指定的选项将生效。

-n

在每一行之前放置文件中相关的行号。每个文件的起始行号为 1,在处理每个文件时,行计数器都将被复位。

-p[ Separator]

显示包含匹配行的整个段落。段落之间将按照 Separator 参数指定的段落分隔符加以分隔,这些分隔符是与搜索模式有着相同格式的模式。包含段落分隔符的行将仅用作分隔符,它们不会被包含在输出中。缺省的段落分隔符是空白行。

-q

禁止所有写入到标准输出的操作,不管是否为匹配行。如果选择了输入行,则以零状态退出。-q 标志同 -c 和 -l、-n 标志的任意组合一起使用时,其作用类似于仅使用了 -q 标志。

-r

递归地搜索目录。在缺省情况下,按照到目录的链接。

-r

递归地搜索目录。在缺省情况下,不按照到目录的链接。

-s

禁止通常因为文件不存在或不可读取而写入的错误信息。其他的错误信息并未被禁止。

-v

显示所有与指定模式不匹配的行。

-w

执行单词搜索。

-x

显示与指定模式精确匹配而不含其他字符的行。

-y

当进行比较时忽略字符的大小写。

PatternList

指定将在搜索中使用的一个或多个模式。这些模式将被视作如同是使用 -e 标志指定的。

File

指定将对其进行模式搜索的文件的名称。如果未给出 File 变量,将使用标准输入。


退出状态

此命令返回以下出口值:

0

找到匹配项。

1

未找到匹配项。

>1

发现语法错误,或者文件不可访问(即使找到了匹配项)。


示例

  1. 若使用包含以下模式匹配字符的模式:*, ^, ?, [, ], (, ), { 和 },请输入:

    grep  “^[a-zA-Z]”  pgm.s

    这将显示 pgm.s 中第一个字符为字母的所有行。

  2. 若显示所有与模式不匹配的行,请输入:

grep -v “^#” pgm.s
这将显示 <tt><span style="font-family: 新宋体">pgm.s</span></tt> 中首字母不是 <tt><span style="font-family: 新宋体">#</span></tt>(井字符)的所有行。
  1. 若显示文件 file1 中与abc 或 xyz 字符串匹配的所有行,请输入:
grep -E “abc|xyz” file1
  1. 若在名为 test2 的文件中搜索 $(美元符号),请输入:
    grep $ test2

为了强制 shell 将 $(单反斜杠和美元符号)传递给 grep 命令,必须要使用 \(双反斜杠)。(单反斜杠)字符可通知 grep 命令将其后的字符(本例中为 $)视作原义字符而不是表达式字符。如果使用 fgrep 命令,则可以不必使用反斜杠之类的转义字符。

  1. 通过 /tmp 递归地搜索以找到含有字 IBM 的文件,而不是通过指向目录的链接进行递归搜索,请输入:

    grep –R IBM /tmp
    或
    grep –r -H IBM /tmp
  2. 要通过 /tmp 递归地搜索以找到含有词 IBM 的文件,同时也通过链接进行递归搜索,请输入:

    grep –r IBM /tmp
    或
    grep -R -L IBM /tmp
1…252627
九王爷

九王爷

这里是外宅,备份用的

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