今天在工作室用VNC连接宿舍的ubuntu,开Eva的时候突然被断掉,然后一直连不上去
本以为是网络断了,可是囧然发现机子上开着的FTP能上
然后更囧的是,FTP少挂了一个文件夹,结果没法弄了,又不想回宿舍囧
试着用putty连SSH,不成,才想起ubuntu似乎默认不开ssh服务
回到宿舍后显示器点不亮,提示频率超标,重启X后一登录就黑屏。好在切换到虚拟终端重启后就可以了
好囧……
突然想到,在Linux下这种情况还可以正常重启,在Win下铁定要直接冷重启了
于是不得不赞一下Linux图形界面与内核分离的设计,以及方便的虚拟终端
一、vsftpd 简介
Vsftpd是一个基于GPL发布的类UNIX系统的ftp服务器软件。其全称是Very Secure FTP Deamon,在安全性、速度和稳定性都有着不俗的表现。在安全性方面,vsftpd针对程序的权限来设计,以一般身份启动服务,对Linux系统的使用 权限较低;在千兆以太网上,vsftpd的速度可以达到86MB/s;在稳定性上更是优秀,资料表明,完全工作24小时,传输数据达2.6TB,平均并发 连接为1500用户,峰值达4000用户,而这些还是在单机上实现的。此外,vsftpd 还包括以下特性:
基于IP的虚拟服务器
虚拟用户,结合数据库的用户验证
每个用户独立配置文件
速率限制
IPV6支持
支持SSL加密传输
……
哪些站点在使用vsftpd
以下站点一直在使用vsftpd(这仅仅是很少很少的一部分站点)
ftp.redhat.com
ftp.suse.com
ftp.debian.org
ftp.openbsd.org
ftp.freebsd.org
ftp.gnu.org
ftp.gnome.org
ftp.kde.org
ftp.kernel.org
rpmfind.net
ftp.linux.org.uk
ftp.gimp.org
ftp-stud.fht-esslingen.de
gd.tuwien.ac.at
ftp.sunet.se
ftp.ximian.com
ftp.engardelinux.org
ftp.sunsite.org.uk
ftp.isc.org
以上内容摘自vsftpd官方网站http://vsftpd.beasts.org/
二、软件安装和卸载
获得软件
vsftpd目前最新版本为2.0.5,下载地址:ftp://vsftpd.beasts.org/users/cevans/vsftpd-2.0.5.tar.gz
软件安装
解压软件,编辑builddefs.h文件
找到下面三行,其含义如右所示
#undef VSF_BUILD_TCPWRAPPERS //是否允许使用TCP Wrappers
#define VSF_BUILD_PAM //是否允许使用PAM认证
#undef VSF_BUILD_SSL //是否允许使用SSL
如果要允许以上所示某项功能,使把undef改为define即可,注意每行前的“#“号不是注释,不能去掉(熟悉C语言的同志应该知道这个“#”是什么 意思)。其中TCP Wrappers是一个验证IP地址合法性的程序,PAM认证让vsftpd支持本地用户登陆服务器,使用SSL可以建立一个加密的数据传输。这里我们把 三项都启用。
编译安装。如果系统中安装有旧版vsftpd,请先卸载它。默认安装执行文件在/usr/local/sbin中,man page放在/usr/local/man/man5与/usr/local/man/man8中。
# make
# make install
将默认配置文件考贝到/etc/vsftpd/
# mkdir /etc/vsftpd/
# cp vsftpd.conf /etc/vsftpd/
为了认vsftpd支持本地用户登录,我们将身份认证模块文件考入系统中。
# cp RedHat/vsftpd.pam /etc/pam.d/vsftpd
建立ftp用户及主目录:
# mkdir /var/ftp
# useradd -d /var/ftp ftp
如果本来就已经存在ftp用户,则执行下面两条命令:
# chown root:root /var/ftp
# chmod 755 /var/ftp
建立vsftpd需要的特殊目录:
# mkdir /usr/share/empty/
软件卸载
如果需要卸载,使用如下命令:
# rm /usr/local/sbin/vsftpd
# rm /usr/local/man/man5/vsftpd.conf.5
# rm /usr/local/man/man8/vsftpd.8
# rm /etc/xinetd.d/vsftpd
# rm -rf /etc/vsftpd
服务的启动与停止
启动服务之前,我们先编辑配置文件/etc/vsftpd/vsftpd.conf. 打开配置文件后可以看到许多以“#”开始的行,这些行都是注释行,大多是帮助信息,可以仔细阅读。vsftpd.conf文件的所有项目都是以“参数= 值”来设置的,对格式要求比较严格,必须严格区分大小写,等号两边不能有空格,每行的最后也不能有空格。每个参数都有一个默认值,没有在配置文件中明确指 定的参数就会使用默认值。我们这里不理会配置文件本来的信息,把所有内容都删掉或注释掉,最后加上下面四行,每行右边的//及后的文字是含义说明,不要输 入到文件中:
listen=yes //vsftpd工作在standalone 模式下
anonymous_enable=yes //允许匿名用户登陆服务器
local_enable=yes //允许本地用户登录到服务器
pam_service_name=vsftpd //使用PAM认证
vsftpd有两种工作模式,standalone模式和xinetd守护进程模式,第1行就是让其工作在standalone模式下。此种模式中,每次 修改配置文件必须重新启动vsftpd服务才能生效,关于两种模式在后面有详细介绍。我们安装时还把 Redhat 目录下的 vsftpd.pam 文件复制成了/etc/pam.d/vsftpd 文件。这个文件就是本地用户登陆的 pam 验证配置文件。关于这个文件我们会在后面具体介绍。这里我们要知道,必须得有这个配置文件,而且主配置文件里要加上pam_service_name= vsftpd语句,我们才能让本地用户登陆。用以下命令启动服务:
# /usr/local/sbin/vsftpd /etc/vsftpd/vsftpd.conf &
为保证服务确实启动,我们用如下命令检测:
# netstat -an |grep 21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
我们看到服务器已经打开了tcp21端口,表明ftp确实已经启动。再登录服务器:
# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
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.
这时我们已经用匿名用户(用户名ftp或anonymous,密码任意)登录到服务器了,还可以用本地用户登录。我们做测试时建议使用如上所示的ftp命 令(windows、Linux及Unix都带这个命令,用法都是一样的)来登录服务器,这样可以看到更详细的信息,对于我们调试服务器是非常有帮助的。 最简单的ftp服务器就已经达建起来了。使用如下命令关闭ftp服务:
# killall vsftpd
服务启动脚本的制作
在standalone 模式中,经常用上面的命令启动服务比较麻烦,我们做一个脚本来启动和停止服务。
建立一个新文件/etc/rc.d/init.d/vsftpd,把以下内容复制到文件中:
#!/bin/bash
#
# vsftpd This shell script takes care of starting and stopping
# standalone vsftpd.
#
# chkconfig: - 60 50
# description: Vsftpd is a ftp daemon, which is the program \
# that answers incoming ftp service requests.
# processname: vsftpd
# config: /etc/vsftpd/vsftpd.conf
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x /usr/local/sbin/vsftpd ] || exit 0
RETVAL=0
prog="vsftpd"
start() {
# Start daemons.
if [ -d /etc/vsftpd ] ; then
for i in `ls /etc/vsftpd/*.conf`; do
site=`basename $i .conf`
echo -n $"Starting $prog for $site: "
/usr/local/sbin/vsftpd $i &
RETVAL=$?
[ $RETVAL -eq 0 ] && {
touch /var/lock/subsys/$prog
success $"$prog $site"
}
echo
done
else
RETVAL=1
fi
return $RETVAL
}
stop() {
# Stop daemons.
echo -n $"Shutting down $prog: "
killproc $prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
return $RETVAL
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
RETVAL=$?
;;
condrestart)
if [ -f /var/lock/subsys/$prog ]; then
stop
start
RETVAL=$?
fi
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
exit 1
esac
exit $RETVAL
保存文件,再给该文件加上执行权限:
# chmod 755 /etc/rc.d/init.d/vsftpd
这样我们就可以通过下面的方法来管理服务了:
# service vsftpd {start|stop|restart|condrestart|status}
例如重新启动服务:
# service vsftpd restart
Shutting down vsftpd: [OK ]
Starting vsftpd for vsftpd: [OK ]
vsftpd配置文件只有一个,就是/etc/vsftpd/vsftpd.conf,上一小节我们就已经加入了两行参数了。在修改了配置文件之后,需要重新启动服务才能生效。下面我们就来详细解释其中的参数。
1. 匿名及本地用户共同参数
write_enable=yes/no //是否允许全局可写
download_enable=yes/no //是否允许所有用户可以下载
dirlist_enable=yes/no //是否允许所有用户可以浏览(列出文件列表)
我们将write_enable=no、download_enable=yes两行加入配置文件,再测试:
# ftp 127.0.0.1
……
ftp> ls
227 Entering Passive Mode (127,0,0,1,230,192)
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 4 May 13 11:43 ioo_file
226 Directory send OK.
ftp> get ioo_file
local: ioo_file remote: ioo_file
227 Entering Passive Mode (127,0,0,1,160,26)
150 Opening BINARY mode data connection for ioo_file (4 bytes).
226 File send OK.
4 bytes received in 0.062 seconds (0.063 Kbytes/s)
ftp> put scsrun.log
local: scsrun.log remote: scsrun.log
227 Entering Passive Mode (127,0,0,1,176,84)
550 Permission denied.
如上所示,我们看到了ftp上的文件,可以下载文件,但不可以上传文件。如果把dirlist_enable=no 也加上,便无法看到ftp上的文件(无法列出文件列表),但是如果你知道具体的文件名及路径,仍然可以下载文件的。实验结果就不贴上来了。
再看下一组:
ftpd_banner=欢迎语字符串
banner_file=文件
dirmessage_enable=yes/no
message_file=文件
参数ftpd_banner设置的欢迎语字符串将在登录时看到,如果想做出多行欢迎语,就要把内容单独存为banner_file参数指定的文件,应用中 这两个参数二选一即可。dirmessage_enable和message_file参数是进入某个目录后显示的欢迎信息,用法与前两个参数一样。
local_root=/path //本地用户登陆服务器后直接进入的目录
local_umask=八进制数 //本地用户上传档案权限的 umask值
local_max_rate=数字 //本地用户传输速率单位为 bps
chmod_enable=yes/no // 是否允许本地用户改变ftp 服务器上档案的权限
我们知道使用本地用户登录ftp后进入的是用户的主目录,locla_root这个参数允许我们登录服务器后直接进入其它的目录。此功能结合Apache 的userdir模块来实现网站内容更新上传是非常方便的。Linux系统中的任何文件都是有权限值的,上传的文件也不例外,这个默认的权限值就由 local_umask参数指定。其计算方法为:
默认建立文件的权限+local_umask =0666
默认建立目录的权限+local_umask =0777
由此我们可以看出,上传的文件无论如何都不可能有执行权限的。这也是vsftp安全性的体现啊!
local_max_rate参数限定了数据传输速率,包括上传和下载。chmod_enable参数限制用户是否可以改变档案权限(使用chmod, site命令)。
我们可能想让为每个用户进行单独的配置,或者想配置个别用户的权限。这样就得为每个本地用户配置一个文件。这些配置文件必须是在同一个目录下,所以我们可以设置本地用户单独配置文件所在的目录:
user_config_dir=/path //用户单独配置文件所在目录
我们在配置文件中加入以下几行:
local_umask=077
local_max_rate=20000
user_config_dir=/etc/vsftpd/vsftpd_user_dir
给予用户上传权限:
write_enable=yes
新建一个普通用户ioo,再新建一个目录/etc/vsftpd/vsftpd_user_dir,其下建一个文件ioo,里面加入下面几行:
local_root=/var/www/html
local_umask=022
local_max_rate=50000
把/var/www/html的所有者改为ioo:
chown ioo:ioo /var/www/html
测试之后我们发现,使用ioo用户登录后就直接进入var/www/html了,上传的文件(夹)权限为644(755),传输速率为50k,自定义的设置覆盖了主配置文件中的设置。
在我们的服务器上本来就有很多的本地用户,这些本地用户应该都是可以登陆 ftp 服务器的。但是 ftp 服务是以明文传输的,如果允许管理员登陆的话,这种机制显然不好。又或者我们想让一些本地用户可以登陆,或者一些不能登陆我们的 ftp 服务器,这样我们可以怎么设置呢?
Vsftpd 提供了 userlist 功能。它使用一个文件来保存一些用户名,然后根据配置来决定是文件中的用户可以登录还是文件中没有列出的用户可以登陆 ftp 服务器,这样就对本地用户的登陆起到了限制作用。其配置参数有如下几个:
userlist_enable=yes/no //是否启用 userlist 功能模块
userlist_deny=yes/no //是否拒绝 userlist 文件中用户登陆 ftp 服务
userlist_file=/path/to/file //指定的 userlist 文件名
当第1个参数值为yes时,第2、3行才起作用。我们将配置文件加上如下3行:
userlist_enable=yes
userlist_deny=yes
userlist_file=/etc/vsftpd/vsftpd.userlist
然后再新建一个文件/etc/vsftpd/vsftpd.userlist,在里面加入用户名,每个用户名一行,比如我这里加入用户root,再登录服务时出现以下信息:
# ftp 127.0.0.1
Connected to 127.0.0.1.
……
Name (127.0.0.1:root): root
530 Permission denied.
Login failed.
root用户已经不能登录了,在输入密码之前就被拒绝,但其它用户还可以登录的。如果把userlist_deny的值改为no,则只有文件中的用户才可以登录服务器。
大家再来看下面这一段:
# ftp 127.0.0.1
……
Name (127.0.0.1:root): ioo
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/ioo"
ftp> cd /
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (127,0,0,1,163,193)
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 May 12 21:22 bin
drwxr-xr-x 3 0 0 4096 Apr 30 19:57 boot
drwxr-xr-x 12 0 0 3840 May 13 10:29 dev
……
是不是感到吃惊了!我们用本地用户登录ftp服务器,却可以看到整个服务器的目录和文件,甚至还可以把/etc/passwd文件下载下来,这是非常不安全的,我们应该禁止这个功能,限制用户只能在自己的目录里浏览,这就要用到chroot功能。看下面三个参数:
chroot_list_enable=yes/no //是否启用 chroot_list 文件
chroot_local_user=yes/no //是否限制本地用户的根目录为自己的主目录
chroot_list_file=/path/to/file //设置 chrootlist 文件名
我们新建一个用户woo,再新建一个文件/etc/vsftpd/vsftpd.chroot_list,其中加入woo。然后在配置文件中添加以下几行:
chroot_list_enable=yes
chroot_local_user=yes
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list
登录服务器测试:
# ftp 127.0.0.1
……
Name (127.0.0.1:root): woo
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/woo"
Name (127.0.0.1:root): ioo
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
我们看到,在文件中的用户woo根目录仍然是系统根目录,但文件外的用户根目录已经变成了“/”,就是说列在文件外的用户已经不能在自己主目录范围外浏览了。
更改chroot_list_enable和chroot_local_user的值,得到以下几种组合:
参数 | 取值 | 取值 | 取值 | 取值 |
chroot_list_enable | yes | yes | no | no |
chroot_local_user | yes | no | yes | no |
意义 | 文件中列出的用户根目录为系统根目录,其它用户根目录为自己主目录。 | 文件中列出的用户根目录为自己主目录,其它用户根目录为系统根目录。 | 全部用户根目录都是自己主目录。 | 全部用户根目录都是系统根目录。 |
我们可以认为,本地用户进入自己主目录本身就应有比较大的权限,所以我们看到本地用户受限的语句不多。但是匿名用户通常涉及到一个公开、公共的互联网环境,所以限制匿名用户的权限语句就比较多,限制也比较细致。看看这一组参数:
anon_upload_enable=yes/no //是否允许匿名用户上传
anon_mkdir_write_enable=yes/no //是否允许匿名用户建立文件夹
anon_other_write_enable=yes/no //是否允许匿名用户可以使用除了建立文件夹和上传文件以外其他的ftp写操作命令。例如:delete、rename 等等
anon_world_readable_only=yes/no //匿名用户是否允许下载所有用户都可以访问的文件
我们先把配置文件清理一下,现在配置文件只有下面几行:
listen=yes
anonymous_enable=yes
write_enable=yes
download_enable=yes
dirlist_enable=yes
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
我们希望匿名用户有上传文件的权限,但这里还只是在ftp服务里给了写权限,还必须在文件权限考虑实现。于是我们给/var/ftp加上写权限:
chmod a+w /var/ftp
然后登录服务器:
# ftp 127.0.0.1
……
Name (127.0.0.1:root): ftp
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable anonymous root
Login failed.
421 Service not available, remote server has closed connection
结果我们连服务器都登陆不了了!这是因为vsftpd出于在安全方面的考虑,不允许匿名用户对根目录有写权限。为此,我们只有去掉/var/ftp的写权限,再在其中新建一个目录,给予其写权限,让匿名用户上传文件到这个目录中。
# chmod 755 /var/ftp
# mkdir /var/ftp/upload
# chmod 777 /var/ftp/upload
现在我们可以匿名在upload里上传文件、建立文件夹、还可以删除改名等,但是却无法将上传的文件下载回来。如果你上传的文件是在一个新建的文件夹里,那么上传的文件不但下载不下来,而且连看都看不到:
ftp> mkdir asm
257 "/upload/asm" created
ftp> cd asm
250 Directory successfully changed.
ftp> put file1
local: file1 remote: file1
227 Entering Passive Mode (127,0,0,1,135,56)
150 Ok to send data.
226 File receive OK.
5 bytes sent in 0.063 seconds (0.077 Kbytes/s)
ftp> get file1
local: file1 remote: file1
227 Entering Passive Mode (127,0,0,1,20,101)
550 Failed to open file.
ftp> ls
227 Entering Passive Mode (127,0,0,1,133,186)
150 Here comes the directory listing.
226 Transfer done (but failed to open directory).
ftp>
这就要研究anon_world_readable_only这个参数了,它的默认值是yes。如果其值为yes,则匿名用户只可以下载所有用户都可访问的文件。比如:
# ll
total 40
-rw----r-- 1 ftp ftp 34935 05-13 17:38 install.log
-rw------- 1 ftp ftp 209 05-13 18:16 scsrun.log
这里install.log文件权限其它位上有r权限,那么这个文件就可以被下载;scsrun.log文件其它位上没有任何权限,所以这个文件就不能被匿名用户下载。
因此解决方法有两个,一是把参数anon_world_readable_only的值改为no;二是把上传文件默认权限的其它位上加上执行权限,这就用到下面这个参数:
anon_umask=八进制数
这个参数值的计算方法与本地用户local_umask参数一样,不在赘述。
在以上的实验中,大家可能已经注意到匿名用户上传的档案所有者为ftp,这们也可能用下面两个参数来改变档案所有者:
chown_uploads=yes/no //是否开启修改默认匿名上传档案所有者的功能
chown_username=本地用户名 //匿名上传档案的所有者名
匿名用户使用任何密码都是可以登陆服务器的,那么我们可以免了匿名用户登陆必须输入密码的步骤,只要我们在配置文件中加入:
no_anon_password=yes
匿名用户的参数还有很多,我们就不一一介绍了
到此,我们已经可以达建出的ftp服务器已经可以满足很多场合的需要了,如果有要求更加苛刻的场合,那就还需要进一步设置。
vsftpd工作在独立模式(standalone)下的启动参数有两项:
listen=yes/no
listen_ipv6=yes/no
其中第一条已经前面已经提过了,第二条应用在ipv6网络环境中,这两相参数只能有一条值为yes。
在实际的网络环境中,服务器通常都有多个IP地址,而每个IP地址连接不同的网段,我们可能并不希望在所有网段的上的计算机都能访问服务器。而默认情况下,vsftpd将在所有的IP地址上监听,因此,我们需要下面两行:
listen_address=监听 ip
listen_address6=监听 ip
这两行分别是针对IPv4和IPv6环境的。
下面的两项是vsftpd并发连接控制:
max_clients=数字
max_per_ip=数字
参数max_clients设置了服务器可以接受的最大并发连接数量,max_per_ip设置了每个客户端IP可以发起的最大连接数。针对服务器性能适当设置这两个参数,可以在服务器可接受的连接数量和连接速度之间找到平衡点。这两项默认值均为0,表示无限制。
accept_timeout=数字
connect_timeout=数字
data_connection_timeout=数字
idle_session_timeout=数字
上面的数字都是以秒为单位的。其中 access_timeout 代表以 pasv数据连接模式的时候,数据连接的超时;connect_timeout 表示以 port模式连接数据连接时的超时时间;关于ftp服务连接模式下面会有详细介绍。data_connection_timeout 表示数据连接后数据连接等待的空闲时间超时,超过时间后,数据连接将断开连接;idle_session_timeout 设置发呆时间,也就是客户端隔多长时间不与服务器有交互 ftp 命令,将自动断开 ftp 服务连接。
我们知道 ftp 服务有一点是不同于其他的服务的是,ftp 服务使用的是 tcp 双连接通道,也就是ftp-server 和 ftp-data 连接。我们可以这么理解:ftp-server 连接接受客户端连接请求、并发控制、身份和权限认证以及传输客户端下达的命令。ftp-data连接负责传输数据,也就是说当有数据传输的时候才会有这条连接。我们先来看一下 ftp-server 的设置:
listen_port=端口号
那么这条设置可以设置 ftp-server 端口号,默认为21,如果我们指定了其它端口号,那么客户端连接服务器上时就得使用指定端口号了。我们将这一行加入主配置文件中:
listen_port=2121
# ftp 127.0.0.1
ftp: connect: Connection refused
ftp> open 127.0.0.1 2121
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
……
已经看到效果了,接下来我们讨论ftp-data连接的问题。
FTP数据传输有两种模式:FTP Port模式和FTP Passive模式,两种工作方式截然不同。
FTP Port模式
在FTP Port模式下,客户端与服务器建立ftp-server连接之后,如果某条指令涉及到数据传送,就需要建立ftp-data连接。其实连接步骤如下:
(1) 客户端启用另一个高于1024的空闲端口xx做连接准备,并且使用port命令利用ftp-server信道向服务器发送一个数据包,数据包里包含客户端的IP地址和xx端口,告诉服务器客户端xx端口已做好连接准备。Port命令还支持第三方(third-party)模式,第三方模式是客户端告诉服务器端打开与另台主机的连接。
(2) 服务器以ftp-data端口(默认为20)主动向客户端xx端口进行连接。
(3) 客户端响应服务器连接,并继续完成三次握手后,ftp-data连接建立,开始传送数据。当数据传输完毕后,服务器ftp-data端口就处于等待关闭状态。
很多事情需要参考文档解决,与其一次次搜索,不如做个整理,把遇到的都放上来:
Apache2.2中文文档
PHP官方中文文档
MySQL5.1中文文档
Automake与Autoconf:
Using Automake and Autoconf with C++ The Goat Book 中文版第五章
EDE(Emacs Development Environment/Extension)官方文档
CC Mode
装完ubuntu后用evince看PDF居然乱码,上网找了下,可以通过安装xpdf-chinese-simplified来解决大部分乱码问题
但是很可惜我是属于小部分的,这就要装poppler encoding data了,方法如下:
转自http://hi.baidu.com/yilinghl/blog/item/5dc7d55cb4271f43faf2c069.html
用emacs写程序也有5个年头了,深切地体会到Emacs的强大。程序员有三种,一种是用vi的,一种是用emacs的,还有一种是其他。或许有些夸张,但也颇能体现出emacs在程序员中的地位。
emacs最大的问题在于入门门槛较高。它看起来和多数人想象中的IDE相差甚远,很多人看到emacs的第一眼就觉得它是个记事本(还是个非常难用的记事本),稍微好些的往往觉得emacs也就是个ultraEditor而已,真是暴殄天物了。
我是个懒人,不喜欢记太多的快捷键,相信很多人和我一样。所以从我后面的叙述可以看出来,除了常用的命令都是快捷键外,其他命令多数都是用M-x执行或者用鼠标点菜单。这仅仅是个人风格问题,先说明一下。
我的基本编程环境是:
后面的叙述都基于上述环境。另外,本文主要针对C/C++程序开发,对其他语言有些也适用,从难度上说,本文主要针对入门者。
本文肯定会有很多错误,请指正,谢谢。
写C++程序基本上是这么几个步骤:
当然,往往还需要阅读别人的代码。
根据上述步骤,本文主要针对以下几个方面:
要写C++程序,当然要用到cc-mode插件。CC-Mode原本是支持C语言的,但现在也能支持很多语言,比如C++,Java, Objective-C,CORBA,AWK,Pike等等。CC-Mode是gnu-emacs的标准插件。如果您要求不高,那么默认的配置或许就能满 足。CC-Mode的各种行为都可以自由地定制,您可以参考这里的文档:CC-Mode参考文档
这里是我的.emacs文件中关于CC-Mode配置的部分,仅供参考:
注意一下,上面最后两行是代码自动补齐的快捷键。后面我会提到代码自动补齐。
自动补齐通常用的都是hippie-expand,我也用了很长时间。不过有时候会觉得这个自动补齐“傻”了一点,常会补齐出一些毫不相干的东西,因为hippie-expand是根据你敲过的词和kill-ring等进行判断的,并不对程序语法进行分析。
所以你还需要安装一个代码分析工具,然后把它加进hippie-expand的扩展策略里去。我们可以用semantic。实际上,hippie-expand+semantic是我所发现的最好的选择了,如果您有更好的,请您也告诉我一声:)
Semantic是CEDET中的一个工具,CEDET是Collection of Emacs Development Environment Tools的缩写,它包含了好几个工具,都挺不错的。可惜我只会用其中两个。
您可以在.emacs中对Semantic进行配置,下面是我的.emacs相关的配置,仅供参考:
导入cedet:
配置Semantic的检索范围:
自定义自动补齐命令,这部分是抄hhuu的,如果在单词中间就补齐,否则就是tab。
hippie的自动补齐策略,优先调用了senator的分析结果:
注意一下我前面CC-Mode配置中有这么两行:
这样,我们在CC-Mode中就可以调用自定义的hippie补全了,快捷键是Tab。
另外,我还把快捷键“Alt + / ”绑定到了semantic-ia-complete-symbol-menu命令上,这是semantic的命令,它会根据分析结果弹出补齐的菜单,效果如图显示:
CEDET中还有一个不错的工具是speedbar,你可以用它在多个文件中快速切换。在我的.emacs配置文件里,我把speedbar关联到了F5上:
这样用F5就可以调出speedbar,效果如下:
不过说实话,我自己很少用到speedbar,我通常都是用dired配合bookmark使用:)
按上面的配置,写完程序和Makefile文件后,在Emacs源代码窗口中按F7就可以进行编译。因为在my-c-mode-common-hook()函数里,有这么一行:
默认情况下,emacs的compile命令是调用make -k,我把它改成了make。你也可以把它改成其他的,比如gcc之类的。改下面的“make”就行了。
Emacs会划分一个窗格显示编译的消息,在编译结束后,emacs会自动将编译器的输出和程序关联起来,告诉你第几行的程序有问题。直接在出错的行号上按Enter,就可以跳转到相应文件的相应行。其实我通常都是用鼠标中键去点出错行号:)
搞定了编译错误后,接着要和逻辑错误斗争了。其实对简单的程序来说,把中间结果打印到终端是最简单好用的调试办法:)不过稍微复杂点的程序就会晕菜了,这时我们就需要拿gdb跟踪程序流程了。
你用下面的命令就可以启动gdb了。
通常我喜欢进入gdb-many-windows模式,这样就会把一个Frame划分为5个窗格,同时显示:gdb命令窗口,当前局部变量,程序文本,调用栈和断点。
gdb的命令就不在这里说了,它的文档几乎到处都是。emacs把gdb的命令和快捷键做了绑定,对于常用的命令,还是输入快捷键比较方便。比如,C-c C-n是Next line,C-c C-s是step in,其实用的最多的快捷键也就是这两个。
下面是我的gdb效果图:
在emacs下读代码通常有三种工具,最简单的是etags,最复杂的是ecb(emacs code browser),位于中间的是cscope。
etags和ctags一样,只不过前者是用于emacs的,后者是用于vi的。我个人觉得etags功能稍稍显得不够用一点,当然,也可能是我用的不好:) 欢迎大牛指导。
使用tags之前要先对源代码分析建立tags文件,在代码所在目录中运行:etags -R 即可。
我常用的就这几个命令和快捷键:
ecb据说功能强大,但是太复杂了,我懒得折腾它。谁搞定了教教我吧:) 下面是一张ecb的效果图。
cscope是我感觉比较合适的一个工具。它其实是一个独立的软件,完全可以脱离vi和emacs使用。但是结合emacs的强大功能, cscope就显得更加方便了。GNU Emacs默认自带cscope的支持。在使用之前,cscope也需要对代码进行索引。在emacs中可以这样做:
建完索引之后,你就可以用cscope在代码里游荡了。常用的一些命令如下:
上面这些快捷键其实我自己也常常记不全,没关系,抬头看看上面的菜单栏,有一栏就是Cscope,这些命令里头都有:)
贴一个cscope的效果图吧:
首先是安装Apache,输入
安装后的Apache就已经直接可以运行了,可以输入http://127.0.0.1查看效果。 之后是根据自己需要配置了 Apache的配置文件在/etc/apache2/apache2.conf中 Apache的默认站点配置文件在/etc/apache2/sites-enabled/000-default中 Apache的默认站点目录在/var/www/中 要为站点建立子目录,可以在/var/www/下建立相应的目录,也可以在/etc/apache2/sites-enabled创建专用的配置文件。
接下来是设置虚拟站点。我是直接在/etc/apache2/sites-enabled下创建专用的配置文件的。
在其中任意创建一个文件,然后写入别名站点信息:
Alias的作用是为地址创建别名。假设主机地址是localhost,那么http://localhost/test/就会被Apache映射到/home/www目录下
接着就是写入权限设置了,使用<Directory />段来配置:
相关选项的含义如下:
Options: 提供一系列权限选项,有Indexes(允许列出目录)、MultiViews(多种内容显示方法)、FollowSymLinks(使用符号链接)。其 中Indexes是非常危险的,如果不是作为调试或者个人使用,最好去除。FollowSymLinks应该是指能把Linux的符号链接当作一个正常的 文件吧,没仔细研究。
AllowOverride:是否启用.htaccess配置文件。
Order:控制默认的访问状态与Allow和Deny指令生效的顺序。
Allow、Deny:设置授权和禁止列表,格式为 Allow(Deny) from
all|host|env=env-variable [host|env=env-variable] ...。一般主要用All和host,其中host可以有以下几种用法:
示例:
Allow from apache.org
Allow from .net example.edu
主机名与给定字符串匹配或者以给定字符串结尾的主机允许访问。只有完整的名字组成部分才被匹配,因此上述例子将匹配foo.apache.org
但不能匹配fooapache.org
。这样的配置将导致Apache不管HostnameLookups
指令是如何设置的,对一个对客户IP地址都要执行两次DNS查询:一次正查询保证IP没有伪造,一次反查询保证主机名没有伪造。只有两次查询的结果都吻合,并且主机名能够被匹配,访问才被允许。
示例:
Allow from 10.1.2.3
Allow from 192.168.1.104 192.168.1.205
;允许拥有这些IP地址的主机进行访问。
示例:
Allow from 10.1
Allow from 10 172.20 192.168.2
IP地址的开始1到3个字节,用于子网限制。
示例:
Allow from 10.1.0.0/255.255.0.0
一个网络"a.b.c.d"和一个掩码"w.x.y.z",用于更精确的子网限制。
示例:
Allow from 10.1.0.0/16
同前一种情况相似,除了掩码由nnn个高位字节构成。
注意以上例子中的后三个匹配完全相同的一组主机。
IPv6地址和IPv6子网可以像下面这样指定:
Allow from 2001:db8::a00:20ff:fea7:ccea
Allow from 2001:db8::a00:20ff:fea7:ccea/10
安装PHP很简单,直接用apt-get就行:
安装后自动与Apache集成,不用进行额外设置,很方便。
首先安装MySQL:
安装过程中会要求设置root账号。 然后是安装PHP对MySQL的支持:
安装:
安完就能用了
要重启ssh,可以使用这个命令
要启动和停止ssh,只要把restart换成start和stop就行了
安装vsftpd
安装:
为了使用虚拟帐户,还要安装Berkeley Database Utilities:
编辑配置文件:
内容如下:
建立相关配置目录:
创建编辑虚拟用户文件
内容为一行用户名一行密码,如
就创建了两个虚拟用户,一个是upload,密码为up;另一个是anim,密码为manga
生成账号文件对应的db文件,要用上刚才安装的Berkeley Database Utilities:
编辑vsftpd的pam服务,用于账号验证:
注意服务的文件名是由vsftpd.conf的pam_service_name决定的
把服务替换成如下内容
这个文件原来可能有其他内容,必须去掉,不然会产生认证冲突无法登录
要注意的是,这样做之后就无法用本地账号登录了,如果在配置里没有开启virtual_use_local_privs,虚拟账号的权限等同于匿名用户
为每个账号作特别配置:
账号配置文件要放在vsftpd.conf的user_config_dir段所指定的目录下,在这里是/etc/vsftpd/vsftpd_user_dir
以upload账号为例,编辑文件
格式与vsftpd的配置文件相同,不过只能设置与用户相关的选项。在这里设置上传权限和根目录:
注意anon_upload_enable,如果没有配置virtual_use_local_privs=YES,则虚拟账号相当于匿名用户,所以只设write_enable是不够的
研究中……
安装配置程序开发的相关环境: emacs、eclipse、GTK、doxygen、svn
把Ubuntu重装了一遍,配置起来挺麻烦的,于是干脆记录一下,以免以后又忘记。
安装完成后,最重要的是网络问题。学校使用802.1x认证,需要特殊的软件来登录。我用的是华为的H3C。
以下是别人给的一份文档,很有用,我就不自己写了XD
在Ubuntu Linux下面使用H3C认证客户端上网,这需要华为公司专门为Linux开发的软件h3c802.1xclient.tar.gz
1)下载了H3C后,解压文件:
这会解压到当前目录下,生成一个h3c802.1xClient目录。
或者可以指定解压路径:
2)转到此目录下:$cd h3c802.1xClient
运行里面的pre.ps文件:
再运行里面的linux1x文件(可以查看里面的说明文档):
3)如果里面的链接库缺少H3C必要的libstdc++-libc6.2-2.so.3文件,会报错.
根据提示信息,先转到链接库目录:
$cd lib
在里面找到一个相似的文件,与所需的文件建立硬链接:
4)再次运行linux1x文件,可以上网了!:
其中,参数-p表示注销当前帐号信息,重新验证;-d表示通过验证后返回控制
台继续执行其他命令;-k表示断开网络连接。
5)PS:经常出现这种情况--不知道什么时候网络断了,而用户无法及时得知。解决办法之一是:按
下Ctrl+Alt+F1切换到命令行控制台,使用任何一个本地帐户登录联网,然后输入命令:
在此命令下,如果网络畅通,会一直有数据包返回。
在运行时千万不能忘了sudo,我之前就是因为忘了sudo导致老是提示“ERROR! Can't initial authentication program !”,搞得我还以为软件坏了OTL……
然后就是设置更新的源,用官方的源会慢死的……
apt的源列表文件保存在/etc/apt/source.list文件中,可以用任意文本编辑器编辑,注意要用root权限来编辑,也就是用sudo。编辑前最好保存一份复本:
$sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup
然后就可以编辑了:
$sudo gedit /etc/apt/sources.list
因为在教育网里,所以用中科大的源会很爽:
另外cn99也很重要:
把这两个源加到source.list的最前端就行,不用像有些教程说的那样要把其它的覆盖掉。
把文泉驿正黑更新到了夸父正式版(0.5 Final),终于可以正常显示9pt的“/”号了
话说文泉驿确实挺美观的,不必再用Win下的版权字体了。
衷心希望文泉驿越做越好
附:文泉驿正黑相关页面:http://wenq.org/index.cgi?ZenHei
这个Ubuntu弄了一两个星期,现在终于可以干不少事了:
我用它听歌、看电影
用它上网、查资料
用它写程序
用它开FTP、WEB服务
用它聊天,收发邮件
还差什么?
文档,最重要的就是文档,我还要写作业啊
于是昨天用Open Office Dia写了一次,越来越觉得图形化的拖拉选按不能满足我的要求
果然还是可以自己完全精确控制的脚本语言王道,要下定决心学LaTex和MetaPost了...