Archive for the '黄嘴企鹅|linux' Category

Pure-FTPd配置笔记

Sunday, July 6th, 2008

以前曾用过Pure-FTPd提供的ftp服务,作为ftp的服务器端,其类似linux下useradd/usermod/passwd工具的用户管理方式,令人印象深刻。最近正好需要配置一台ftp服务器,当然首选这款有良好安全性口碑的Pure-FTPd。

基本需求是这样的:
虚拟用户 - 也就是说提供的ftp用户在系统里并不存在
权限 - 每个用户对自己目录拥有读写权限,但不允许访问其他目录
虚拟目录 - 每个用户目录下面需要添加一个只读的公有目录

以下为配置过程:
1. 安装
当前最新版本为1.0.21,可从官方网站下载。
wget http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.21.tar.gz
tar zxvf pure-ftpd-1.0.21.tar.gz
cd pure-ftpd-1.0.21
./configure --prefix=/usr/local/stow/pure-ftpd-1.0.21 --with-puredb
make
sudo make install

其中,–with-puredb 选项代表虚拟用户支持

2. 创建用户
出于安全以及管理方便,我们让虚拟用户共享同一个系统用户。
首先,在系统中添加相应的用户和组,这里以ftpuser和ftpgroup为例:
/usr/sbin/groupadd ftpgroup
/usr/sbin/useradd -g ftpgroup -d /dev/null -s /etc ftpuser

创建虚拟用户的命令是这样的:
pure-pw useradd smzz -u ftpuser -d /home/ftpusers/smzz
其中, -u将虚拟用户 smzz 同系统用户 ftpuser 关联在一起。-d参数使 smzz 只能访问其 home 目录。而如果想让他访问整个文件系统,可以用 -D 选项。

此外,pure-pw useradd 的选项还有:

-t 下载带宽限制
-T 上传带宽限制
-n 最大文件数目
-N 磁盘配额(单位M)
-q 上传速度限制
-Q 下载速度限制
-r 允许某些ip/网段的客户端访问
-R 拒绝某些ip/网段的客户端访问
-i 允许本地某些ip/网段访问(allow local host)
-I 拒绝本地某些ip/网段访问(deny local host)
-y 同时最大连接数目
-z 允许连接服务器的时间段,格式hhmm-hhmm,如 -z 0412-1618代表用户只能在凌晨4点12分至下午4点18分连接服务器
-f passwd_file
-F puredb_file
-m

2. 更改用户
pure-pw adduser 唯一不同的是,使用 pure-pw usermod 不是创建一个用户,而是更改已经存在用户的某些属性。
如果想禁用某些属性,可直接添加空值,比如pure-pw usermod -n ‘’代表不限制文件数目

3. 更改密码
pure-pw passwd smzz -m
所有这些参数都有一个共同选项 -m ,它代表修改完毕之后不必重启Pure-FTPd以及重新生成puredb_file文件

此外,还有类似userdel命令的子选项pure-pw userdel

4. 提交更改
所有用户操作必须提交更改,方能生效。目前有两种形式
a) 通过pure-pw mkdb重新生成数据文件(/etc/pureftpd.pdb)
b) 用户操作时带上-m选项,比如 pure-pw passwd smzz -m

5. 开启服务
/usr/local/sbin/pure-ftpd -j -lpuredb:/etc/pureftpd.pdb &
其中,-j代表用户第一次登录将会创建自己的home目录,-l代表验证方式
此外,匿名、配额、发呆设置、日志文件等选项均可通过相关参数在pure-ftpd启动时设置

6. 虚拟目录
Pure-FTPd并不支持类似windows下ftp服务器那样的虚拟目录,但可以通过其他方式变相实现,比如
mount –bind /home/my_apps/lib /home/ftpusers/smzz/lib

todo:
pure-ftpd的诸多参数

参考:
man pure-ftpd
man pure-pw
pure-ftpd用户管理

根据搜索结果下载驱动之家某型号笔记本驱动程序

Friday, June 6th, 2008

以Sony VGN-CR31这款为例,本脚本(实为命令集,笔者注)通过分析搜索页面、下载页面,最后将结果存放于相应文件(drivers_*.txt)中,同时并下载相应文件。详细见源文件:

#!/bin/bash

mkdir drivers
cd drivers/
echo > /tmp/zgq.txt
echo -n > drivers_url.txt
echo > drivers_id.txt
echo > drivers_title.txt

for i in $(seq 1 4); do
        curl http://drivers.mydrivers.com/drivers-1102-875-Sony/VGN-CR31/0-0-0-0/$i >> /tmp/zgq.txt
done

iconv -f gbk -t utf8 /tmp/zgq.txt > /tmp/zgq_1.txt

cat /tmp/zgq_1.txt | grep '<a href="/drivers/' | awk -F'</a>' '{print $1}' | grep desc > /tmp/zgq.txt

cat /tmp/zgq.txt | awk -F/ '{print $3}' > drivers_id.txt
cat /tmp/zgq.txt | awk -F'>' '{print $3}' > drivers_title.txt

for i in `cat drivers_id.txt`; do
        curl http://drivers.mydrivers.com/download/$i > /tmp/zgq.txt 2>/dev/null
        cat /tmp/zgq.txt | grep dizhi | awk -F\" '{print $6}' | awk -F= '{print $3}' | head -n 1 >> drivers_url.txt
done

wget -i drivers_url.txt -N

注:本文章仅供学习研究之用,切勿用作非法用途,否则后果自负。
吃水不忘打井人,还是建议多点点人家的广告,如果有时间的话。:)

通过grub4dos引导vista和linux的双系统

Thursday, June 5th, 2008

机子里以前装的是Win XP和Linux双系统,出于追mm以及紧跟潮流的考虑,我重新格式化装有XP的C盘,并安装了Vista。双系统的引导成了问题,从网上搜索发现,grub4dos也在与时俱进,支持vista的引导。于是我决定通过在Vista下面安装groub4dos引导Linux。

根据grub4dos的教程,我先在命令提示符下运行
bcdedit /create /d “GRUB for DOS” /application bootsector
得到了一个类似{05d33150-3fde-11dc-a457-00021cf82fb0}的id字符串
紧接着运行如下命令,

	bcdedit /set {id} device boot
	bcdedit /set {id} path grldr.mbr
	bcdedit /displayorder {id} /addlast

其中,{id}就是先前得到的带花括号的id字符串。

然后,将GRLDR.MBR拷贝至Vista系统盘的根目录下,如C:\。同时,也将GRLDR和menu.lst拷到系统盘的根目录下(readme文件里说的是任意FAT16/FAT32/EXT2/NTFS分区的根目录下均可,不过我没来得及尝试)。

需要注意的是,C:\GRLDR文件本来就存在,任意改个名字即可。

然后修改Grub4dos的菜单文件(C:\menu.lst)和配置Windows的系统启动(系统属性 / 高级 / 启动故障和恢复)即可。

附上我的menu.lst文件内容,均可以正常启动:

color black/cyan yellow/cyan
timeout 30
default /default

title Windows Vista
find --set-root /bootmgr
chainloader /bootmgr

title Slackware 12.0
root (hd0,6)
kernel /boot/vmlinuz root=/dev/sda7 ro vga=791

与2k/xp不同的是,先进入grub4dos的界面,然后可进入Vista的引导界面。文件名等种种迹象标明,vista的启动管理器似乎是将grub4dos写在MBR里了。

Update:
某激活软件用的也是grub4dos,进行上面某一项设置的时候可能会导致无法激活。如果是多系统,建议通过Linux将Grub重新写在MBR,再通过Grub引导windows。不推荐使用grub4dos,感觉更混乱。

btw,通过live cd或硬盘进入linux,运行grub进入grub>提示符界面后,可通过如下命令恢复mbr:

grub>root (hd0,3) #指定linux分区所在位置
grub>setup  (hd0) #将grub装到/dev/hda的MBR区。
grub>quit #大功告成,退出grub界面

Linux Shell学习笔记

Monday, June 2nd, 2008

年后准备的会议材料,一直没用上。本着共享的精神,拿出来晒晒吧。

Linux Shell ABC
0. 关于shell
0.1 常见的shell
    ---------------------------------------------
        shell               path            name
    ---------------------------------------------
    rc                  /usr/bin/rc         rc
    Bourne shell        /usr/bin/sh         sh
    C shell             /usr/bin/csh        csh
    Bourne Again shell  /bin/bash           bash
    Z shell             /usr/local/bin/zsh  zsh
    Korn shell          /usr/bin/ksh        ksh
    TC shell            /usr/bin/tcshell    tcsh
0.2 shell的启动、更改和退出
    更换shell:
        输入相应的命令可更改
    退出:
        - 输入exit后按
        - 在空行上键入< ^D>
0.3 shell环境变量
    可通过set命令查看,常见的有:
    HOME
    HOSTNAME
    LANG
    LC_CTYPE
    MAIL
    PS1
    PATH
    PWD
    SHELL
    TERM
    UID
    MAIL
0.4 shell元字符
    ————————————————————–
    元字符          作用                            举例
    ————————————————————–
    New Line    结束命令行
    Space       分隔命令行中的元素
    Tab         分隔命令行中的元素
    #           注释
    ”           引用多字符,允许替换
    $           结束一行;间接引用shell变量         uid:”$UID”
    &           让命令到后台执行                    command &
    ‘           引用多字符                          ‘$UID’
    ( )         执行子shell中的命令列表
    *           匹配0个或多个字符                   ls /etc/p*sswd
    [ ]         插入通配符                          ls /etc/rc[0-6].d
    ^           开始一行以及否定符号
    `           命令替换                            NAME=`echo zgq`
    { }         在当前shell中执行命令列表
    |           创建命令之间的管道                  ls | wc -l
    ;           顺序执行命令                        date; sleep 1; date
    >           命令的重定向输出                    echo > /tmp/test.txt
    < 命令的重定向输入                    wc -l < /tmp/test.txt
    ?           通配符为单个字符                    ls /etc/pass??
    /           路径分隔符
               转义字符
    !           启动历史列表中指定的事件以及当前事件 !vi
    ~           home目录                            echo ~

0.5 Bash相关配置文件
    /etc/profile
        登录时的系统初始化文件
    ~/.bash_profile
        登录时用户专有的初始化文件
    ~/.bashrc
        登录以及每打开一个交互shell,用户专有的初始化文件
    ~/.bash_logout
        用户退出时执行的文件
    ~/.inputrc
        Individual readline initialization file 

1.运行Shell脚本
    - 增加文件可执行权限
        $ chmod +x script_file
    - 直接通过shell命令执行
        $ /bin/sh script_file
        $ /bin/bash script_file
    - 脚本文件开头指定shell
        #!/bin/bash
2. Shell变量及其相关命令
    - 可写环境变量
    - 只读环境变量
        环境变量    含义
        $0          程序名
        $1 - $9     第1-9个命令行参数的值
        $*          所有命令行参数的值
        $@          所有命令行参数的值(如果它被包含在引号中,如"$@",
                    则每个参数也将各自被包含在引号中)
        $#          命令行参数的总数
        $$          当前的进程ID(PID)
        $?          上一条命令的退出状态(0 - 成功,其他输出 - 失败)
        $!          最近后台进程(在后台运行的最后一个进程)的进程ID
     - 相关命令
        - set
        - env(不如set命令完整)
    2.1 读写shell变量
        variable1=value1 [variable2=value2 ... variableN=valueN]
        注意:
            - 等号(=)前后没有空格,如果值中含有空格,须使用引号将这个值括起。
            - 多个赋值语句可写在一行,但必须用空格或分号分隔
        $ name=Guoqiang
        $ echo $name
        Guoqiang
        $ name='Zhou Guoqiang'
        $ echo $name
        Zhou Guoqiang

        $ my_uid='$UID'
        $ echo $my_uid
         $UID
        $ my_uid="$UID"
        $ echo $my_uid
        1000
    2.2 命令替换
        `command`
        $ echo now: `date`
        now: Sun Mar 23 17:44:36 CST 2008

        $ now="date: `date`"
        $ echo $now
        date: Sun Mar 23 17:45:45 CST 2008

        $ now='date: `date`'
        $ echo $now
        date: `date`
    2.3 导出环境变量
        命令export可以向后继shell进程传递变量的值
        export [name-list]
    2.4 重置变量
        unset [name-list]
    2.5 创建只读用户自定义变量
        readonly [name-list]
        类似PHP中的常量
        $ name=zgq gender=male
        $ readonly name gender
        $ echo $name $gender
        zgq male
        $ name=zhang3 gender=female
        bash: name: readonly variable
    2.6 读取标准输入
        read variable-list
3. 脚本参数传递
    - 9个参数($1 - $9)有时不够用
      可以使用shift命令将参数左移N个位置
        shift [N]
    - set [options] [argument-list]
      依次将各位置参数的值设为argument-list中指定的参数
      如果不带任何参数,set将显示所有shell变量以及他们当前的值
4. 注释与程序头
    #!/bin/bash
    #
    #
    #
5. 程序控制
    1. if-then-elif-else-fi语句
        if expiression
        then
            elif expression
            then
                ...
            else
                ...
        fi
      - expression可以使用test命令也可以使用括号
        if test $# -eq 0
        等价为:
        if [ $# -eq 0 ]
        (注意[和]前后的空格)
    2. for语句
        for variable [in argument-list]
        do
            command-list
        done

        如果没有提供argument-list,参数由命令行提供
    3. while语句
        while expression
        do
            command-list
        done

        如果死循环,就<^C>吧
    4. until语句
        until expiression
        do
            command-list
        done
    5. break和continue命令
    6. case语句
        case test-string in
            pattern1)
                command-list1
            ;;
            pattern2)
                command-list2
            ;;
            patternN)
                command-listN
            ;;
            *)
                end-command-list
            ;;
        esac

6. 常用命令集锦
    - 杀死firefox进程
      $ ps aux | grep firefox | grep -v grep |cut -c 9-15 |xargs kill -9
    - 将当前目录下php文件中的foo题换成bar
      $ sed *php -in-place -e’s/foo/bar/g’
    - 根据ip查看bbs.insenz.com的访问次数
      $ cat  bbs.insenz.com-access_log  | awk ‘{print $1}’ | sort | uniq -c | sort -nr
    - 查看远程服务器的磁盘空间状况
      $ ssh zhouguoqiang@10.0.1.33 ‘df -h’
    - 查看svn副本中某两个目录下的代码总行数
      $  find src/ tests/ -type f | grep -v .svn | xargs wc -l | awk ‘{ sum += $1; } END { print sum; }’

6. 参考资料
    - Unix教程(第二版)
        http://www.douban.com/subject/1809210/
    - man bash, man test

搭建svn://模式的svn服务器

Sunday, June 1st, 2008

svn可支持file:///、http://、https://、svn://、svn+ssh://等多种模式访问,其中file:///模式无须任何配置,http://和https://模式需要通过配置Subversion的Apache服务器的WebDAV协议实现。下面我们配置基于svn://模式的svn服务器。

1. 安装svn相关的软件
一般linux发行版都自带,如果没有,可去官方下载安装。

2. 创建资源库
svnadmin create /home/svnroot/repos

3. 运行svn服务
svnserve -d -r /home/svnroot/repos

4. 授权
编辑 /home/svnroot/repos/conf/svnserve.conf,去掉如下两行开头的#符号,以便禁止匿名用户的读写
anon-access = none
auth-access = write
password-db = passwd

5. 添加svn用户
编辑conf/passwd文件,可以明文形式添加密码:
yourName = yourPasswd

6. 导入仓库
为了便于以后维护,建议每个项目使用三个顶级目录(branches、tags和trunk):
mkdir /tmp/myproject/{branches,tags,trunk} -p

可以在本地通过file:///方式导入至仓库里:
svn import /tmp/myproject file:///home/svnroot/repos/myproject -m “initial import”

7. 检出项目
svn svn://192.168.1.118/myproject/trunk myproject
需要输入用户名密码

至此,完成了svn服务的基本配置。

参考资料:
1. svn服务端搭建
2. svn手册

禁用Vim中鼠标点击时的虚拟选中模式(visual mode)

Friday, December 14th, 2007

自从升级操作系统后,Vim相应也升级到了当时的最新版7.1。可是这个Vim7.1使用鼠标时会默认进入虚拟选中模式(visual mode),就好像通过v选中的一样。搜索一下,有人碰到过这个问题,原来可以通过下面的方式禁用:
1.命令行
:set mouse-=a
2.添加:set mouse-=a至配置文件~/.vimrc

都是\n惹的祸

Tuesday, December 4th, 2007

昨天郁闷了半天。自从发现echo和wc命令的组合可以省去我数某个字符串的长度时,我就一直使用这个超级无敌的命令组合。但是echo 之后默认带换行(\n)有时也会带来意想不到的麻烦。

比如
echo 123456789 | wc --chars
10

去掉echo后面默认带的换行符,就对了:
echo -n 123456789 | wc --chars
9

升级2.6.18内核后停止启动的问题

Friday, June 1st, 2007

自从升级2.6.18内核后,几乎每次启动时都停在这个画面:
cs: IO port probe 0xc00-0xcff: clean
cs: IO port probe 0×820-0×8ff: clean
cs: IO port probe 0×800-0×80f: _

然后就没反应了。

根据LQ论坛的说法,在lilo.conf文件里加上一项:append=”pci=nomsi”。重启,似乎没有效果。google之,发现编译内核时MSI(Message Signaled Interrupts)是PCI support下面的一个选项,“信号中断处理”,《Linux 2.6.19.x 内核编译配置选项简介》的解释是:充许设备通过PCI总线写入内存堆栈产生一个中断而不是使用默认的IRQ中断,建议不选。

感觉就是和这个有关,但是尝试多次,依然失败。继续google之,SLAX用户提供两种方法
1.启动时加载linux copy2ram nopcmcia noacpi nohotplug等选项
2.修改/etc/pcmcia/config.opts,找到相应端口(0×800-0×80f),删除。

方法1里noacpi选项似乎可以解决启动时卡死的问题,但不加载这个电源管理模块的直接后果就是无法查看笔记本的电池信息、手动按电源关机。根据方法2,删除端口,重启,good! 简直一针见血!

笔记本电脑上常用的几个内核模块

Tuesday, May 22nd, 2007

标题:笔记本电脑上常用的几个内核模块
作者:windrose
来源:http://www.linuxsir.org/bbs/showthread.php?t=194374

笔记本电脑由于节省电力的需要,在设计上对于电源管理非常重视。以前常用的apm是通过bios进行电源管理,而新式的acpi作为apm的后继者,把电源管理的任务交给了操作系统。

以往大家常常会认为笔记本电脑的节能功能在linux中不如在windows中的,但我最近在dell inspiron 700m上安装linux之后,发现其实linux对于acpi的支持已经非常完善了,对于intel处理器的speedstep模式的支持也很好,能做到动态调整cpu的频率。这里介绍一下在2.6.10内核中,我用到的与电源管理和显示系统状态有关的几个内核模块:

  1. AC
    用法: /sbin/modprobe ac
    用途:这个模块很简单,就是显示外接交流电源连接的状态。加载这个模块后,在 /proc/acpi/中会新建 ac_adapter/ADPx/目录,其中的state文件内容即是电源连接状态。
  2. BATTERY
    用法: /sbin/modprobe battery
    用途:监视电池充放电状态、当前容量等。加载模块后,在/proc/acpi/中建立 battery/BATx/目录,其中的文件内容记录了电池的信息(info文件)、状态(state文件)等。
  3. THERMAL
    用法: /sbin/modprobe thermal
    用途: 监视CPU和主板等的温度。加载后,/proc/acpi/目录中建立thermal_zone/THRx/目录,其中的temperature文件中记录了温度值,还有其他的文件定义了在某个温度值系统应该采取的行动等信息。
  4. BUTTON
    用法: /sbin/modprobe button
    用途:定义不同按钮对应的系统行为,例如,可以设置按电源键系统关机、合上屏幕系统休眠等。可以指定在这些键的状态发生变化时执行相应的系统命令,具体内容可以参照 /etc/acpi/目录中的脚本,这里就不展开讲了。
  5. PROCESSOR
    用法: /sbin/modprobe processor
    用途:显示CPU的信息、状态,并能设置对CPU限速(throttling)。在/proc/acpi/processor/CPUx/目录中的文件有cpu 的信息,也定义了在不同电源供应情况下对应的cpu状态以及对cpu限速的规则。假如cpu支持频率调节,则可以通过一些软件利用有关文件实现这一功能。
  6. cpufreq
    用法: 在 /lib/modules/`uname -r`/kernel/arch/i386/kernel/cpu/cpufreq/目录中有许多针对不同移动CPU进行频率调节的模块,需要根据你的 CPU进行选择,有针对intel的speedstep的,也有针对amd的powernow的,还有针对transmeta的longrun的。我的是迅驰dothan 1.6G,所以我加载 speedstep-centrino 模块: /sbin/modprobe speedstep-centrino,加载之后 /sys/devices/system/cpu/cpu0/cpufreq/里面的文件就是与频率调节有关的。

加载了上述模块之后要通过一些软件才能更方便地监视系统状态和使用模块提供的功能,gkrellm有很多有关的插件,windowmaker也有很多dockapps实现同样的功能。我就是用的dockapps。

.bash_profile及.bashrc

Sunday, November 19th, 2006

不像其他发行版本,本来slackware下面的bash配置文件很简单:shell启动时只认.bash_profile文件。可是我的slackware,不管是.bash_profile还是.bashrc都不生效。

怀疑是此前修改~/权限时的后遗症,ls -l ~/\.bash*查看没有x权限,于是chmod u+x ~/\.bash*、退出后满怀欣喜地查看,依然不奏效。

无奈,只好霸王硬上弓,在/etc/profile里source了一遍:

#Get the aliases and function
   if [ -f ~/.bash_profile ];then
    . ~/.bash_profile
  fi
#User specific environment and startup programs

以防万一,把.bashrc的也加上去了。btw, 感觉linux实在是个好东东,特意添加了黄嘴企鹅分类。