建立GIT私有服务器

取得客户端公钥

在客户端上生成SSH key

1
>> ssh-keygen -t rsa -C "your_email@example.com"

把公钥复制到粘贴板

1
2
>> clip < ~/.ssh/id_rsa.pub   ; Windows 上
>> echo ~/.ssh/id_rsa.pub     ; Linux 上

或者把公钥上传到Git服务器的/tmp目录下

1
>> scp .ssh/id_rsa.pub user@<host>:/tmp

配置服务器

(1) 配置用户, 一般意义上而言, git用户是默认创建的, 如果没有就按照如下创建, 并给git用户指定密码, 以方便进入git用户配置

1
2
>> sudo adduser -d /home/git -G httpd,users -m git
>> passwd git

(2) 配置用户默认目录

1
2
3
4
>> sudo usermod -d /home/git git
>> sudo mkdir -p /home/git
>> sudo chown -R git:users /home/git
>> sudo chmod -R 700 /home/git

(3) 切换到git用户, 配置公钥

1
2
3
>> su git
>> mkdir .ssh
>> cat /tmp/id_rsa.pub >> .ssh/authorized_keys

创建库

(1) 创建库文件夹

1
2
>> mkdir -p INC/sns
>> chown -R git:users INC

(2) git 初始化

1
2
>> cd INC/sns
>> git --bare init

客户端配置

建立本地库

1
2
3
4
5
6
7
8
>> mkdir p && cd p
>> git init
>> touch README
>> git add .                                        ; 加入提交等待列表
>> git cimmit -m "Init the project"                 ; 本地提交数据
>> git remote add origin git@<host>:INC/sns         ; 增加远程分支
>> git push origin master                           ; 推送数据
>> git brach --set-upstream-to=origin/master master ; 跟踪分支

问题

(1) 在推送的过程中出现如下问题

1
Permissions 0644 for ‘/root/.ssh/id_rsa’ are too open

需要把 .ssh/id_rsa 的权限降到 0600

1
>> chmod 600 ~/.ssh/id_rsa

(2) 在CyWin中, 无论怎么使用上一条命令都无法修改.ssh/id_rsa的权限到0600,其原因是CyWin中的文件属性中没有group属性, 全为None, 因此做如下修改

1
>> chown -R ming:users ~/.ssh/

(3) 无论怎么配置都只能使用密码登录, 会出现 Permission denied (publickey..) 的错误, 其原因是权限问题, 按如下权限修改

服务器上

1
2
3
/home/git                       0700
/home/git/.ssh                  0755
/home/git/.ssh/authorized_keys  0600

本机上

1
/home/users/.ssh/id_rsa.pub     0600

(*) 如果已经配置了git用户, 则需要配置默认shell, 以防止git用户登陆计算机

1
>> sudo usermod -s /usr/bin/git-shell git

(**) 如果希望增加 http 或者 https 协议的 Git 服务器, 参考Apache上搭建git服务器

参考

[1] 密钥不识别, 无法登陆

[2] CygWin上无法修改权限

[3] 安装指导

[4] 公钥无法登陆

Windows 8.1 下 计算机的管理功能失效了, 按如下方法回复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage]
@=hex(2):40,00,25,00,73,00,79,00,73,00,74,00,65,00,6d,00,72,00,6f,00,6f,00,74,\
00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,00,\
79,00,63,00,6f,00,6d,00,70,00,75,00,74,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,\
00,34,00,30,00,30,00,00,00
"MUIVerb"=hex(2):40,00,25,00,73,00,79,00,73,00,74,00,65,00,6d,00,72,00,6f,00,\
6f,00,74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,\
00,6d,00,79,00,63,00,6f,00,6d,00,70,00,75,00,74,00,2e,00,64,00,6c,00,6c,00,\
2c,00,2d,00,34,00,30,00,30,00,00,00
"SuppressionPolicy"=dword:4000003c
"HasLUAShield"=""
[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\command]
@=hex(2):25,00,77,00,69,00,6e,00,64,00,69,00,72,00,25,00,5c,00,73,00,79,00,73,\
00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,00,6d,00,63,00,2e,00,65,00,78,00,\
65,00,20,00,2f,00,73,00,20,00,25,00,77,00,69,00,6e,00,64,00,69,00,72,00,25,\
00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,63,00,6f,00,\
6d,00,70,00,6d,00,67,00,6d,00,74,00,2e,00,6d,00,73,00,63,00,00,00

参考

[1] 百度知道

问题: 在VBox上创建ArchLinux虚拟机的时候就想着如果硬盘不够用, 就到时候再想办法扩容, 因此当时就只搞了8G的硬盘, 其中还有1G的Swap分区; 没想到这个问题这么快就出现了, 因此就有了一下的解决方案

问题分析:

由于虚拟磁盘采用的是 VirtualBox Disk Image, 同时在ArchLinux中没有逻辑磁盘(LVM)还有就是就是系统只有单个分区, 所以不适合采用另加磁盘的挂载方式来解决。

问题解决方案:

总体方案: 给 / 分区扩容, 分两步, 1) 先给虚拟磁盘扩容; 2) 再想办法给 / 分区扩容

VBox 的虚拟磁盘扩容

在 VBox 中有一个管理工具可以对磁盘扩容, 支持命令行, 操作更加简便

查看 VBox 下注册的虚拟磁盘

1
2
3
4
5
6
7
8
>> VBoxManage list hdds
UUID:           a314bb2f-c879-4e1d-9669-251a5e49f54f
Parent UUID:    base
State:          locked write
Type:           normal (base)
Location:       C:\OS\Arch_Box\ArchV.vdi
Storage format: VDI
Capacity:       20480 MBytes

便可得到磁盘的UUID为 a314bb2f-c879-4e1d-9669-251a5e49f54f

使用磁盘的UUID给磁盘扩容

1
>> VBoxManage modifyhd a314bb2f-c879-4e1d-9669-251a5e49f54f --resize 20480

此时磁盘中被扩展的那部分空间还没被分配, 需要在系统中操作

分区扩展

虽然说ext4分区的收缩和扩展技术是成熟的, 但由于之前的分区是老版的cfdisk创建的, 引导区的大小是62个扇区, 分区是从63扇区开始的, 而现在所有的Linux上的工具都默认从2048个扇区开始分配空间, 因此会造成根分区被删除后重建时, 分区上的数据信息会丢失, 目前对此没有找到可行的方案; 因此采用如下方案, 同时也会记录原方案, 方便以后对2,3,4分区的扩展; 采用的方案是: 采用Linux的逻辑卷(LVM)的管理办法。

LVM解决方案

简单的说就是重构现在的磁盘结构, 全面换成LVM磁盘

(1) 创建一个新磁盘, 和安装盘一起连接到虚拟机上, 重启, 进入安装系统

(2) 开始新磁盘的分区操作

由于要采用LVM的磁盘管理办法, 首先要对安装系统做如下操作

安装lvm2

1
2
>> pacman -Syy
>> pacman -S lvm2

加载 dm_mod

1
>> modprobe dm_mod

物理分区, 和以前一样, 这次采用fdisk来处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
>> fdisk /dev/sdb
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039):

Created a new partition 1 of type 'Linux' and of size 20 GiB.

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

>> fdisk -l /dev/sdb

Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device    Boot Start       End   Blocks  Id System
/dev/sdb1       2048  41943039 20970496  8e Linux LVM

开始设置LVM磁盘系统

创建物理卷 Physical Volume

1
2
3
4
5
6
7
8
9
10
11
12
>> pvcreate /dev/sdb1
>> pvdisplay
--- Physical volume ---
  PV Name               /dev/sda1
  VG Name               root
  PV Size               20.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              5119
  Free PE               0
  Allocated PE          5119
  PV UUID               BduFVm-tKMn-JDPf-b1U8-vcs8-8YDk-FNsW0e

创建卷组 Volume Group

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>> vgcreate root /dev/sdb1
>> vgdisplay
  --- Volume group ---
  VG Name               root
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               20.00 GiB
  PE Size               4.00 MiB
  Total PE              5119
  Alloc PE / Size       5119 / 20.00 GiB
  Free  PE / Size       0 / 0
  VG UUID               kROehq-qYhI-U21s-Guaq-FFns-bv3R-8cIzDA

创建逻辑卷 Logical Volume, 及以后操作的卷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>> lvcreate -l +100%FREE root -n root
>> lvdisplay
  --- Logical volume ---
  LV Path                /dev/root/root
  LV Name                root
  VG Name                root
  LV UUID                YtEeaf-sqJJ-8VAq-MdYo-es8Q-uTtO-QulEHJ
  LV Write Access        read/write
  LV Creation host, time archiso, 2014-11-10 03:41:50 +0000
  LV Status              available
  # open                 1
  LV Size                20.00 GiB
  Current LE             5119
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:0

(3) 磁盘格式化, 选定磁盘系统(和以前一样)

1
>> mkfs.ext4 /dev/mapper/root-root

(4) 拷贝数据(不建议挂载磁盘后用cp命令来执行, 建议采用如下命令完成, 虽然步骤有点多, 但胜在可靠)

采用 dd 来镜像拷贝磁盘

1
>> dd if=/dev/sda1 of=/dev/mapper/root-root

这时候你用 df -h 去查看 /dev/mapper/root-root 的容量时会发现 /dev/mapper/root-root 的磁盘大小和 /dev/sda1 的是一样的, 由于拷贝的时候连同分区表信息都一起拷贝过来了(这个问题还是在正式进入系统后才发现的), 需要做如下处理来扩展磁盘

1
>> resize2fs /dev/mapper/root-root 20476M

(5) 新系统设置

生成新的分区表信息

1
>> genfstab -U -p /mnt

把生成的信息写入 /etc/fstab, 删除以前的分区信息

进入新系统

1
>> arch-chroot /mnt/new /bin/zsh

设置系统内核, 配合LVM文件系统

1
>> vim /etc/mkinitcpio.conf

确保 udev 和 lvm2 被 mkinitcpio 加载, 确保 lvm2 在 block 和 filesystem 之间

1
HOOKS="base udev ... block lvm2 filesystems"

以及确保 dm-mod 被加载

1
MODULES="dm_mod ..."

安装系统引导

1
>> grub-install --modules=lvm --target=i386-pc --recheck /dev/sda

会出现如下错误, 是由于/run在arch-chroot环境下不可用导致的, 但不会影响正常安装

1
2
  /run/lvm/lvmetad.socket: connect failed: No such file or directory
  WARNING: Failed to connect to lvmetad. Falling back to internal scanning.

更新grub列表

1
>> grub-mkconfig -o /boot/grub/grub.cfg

在正式进入系统后, 再重新执行一边

Basic 解决方案

简单的来说就是基于基本磁盘的收缩和扩容方案, 这个方法在这里不适用的原因是前后引导区的大小不一致(扩容时需要把分区删掉重建, 由于删除重建前后的引导区大小不一致, 使得分区起始位置不同, 而导致的分区信息丢失, 磁盘类别不可识别, 引起扩容失败), 但对于第2, 3, 4分区的扩容以及引导分区大小不会变化的磁盘, 此方案可行, 已测试过

(1) 收缩磁盘

1
>> resize2fs /dev/sdaX size

注意: 1) size 小于实际分区大小且大于已用大小; 2) 此命令可能造成数据丢失, 谨慎操作; 3) 操作前, 可用 e2fsck -f /dev/sdaX 强制检查磁盘

(2) 扩充磁盘

采用 fdisk /dev/sdaX 来删除重建分区, 只要初始位置不变, 容量扩大, 不必担心删除时数据丢失, 之后再适用上条命令完成磁盘扩容

参考

[1] http://www.2cto.com/os/201306/222822.html

[2] https://wiki.archlinux.org/index.php/Lvm

[3] http://www.byywee.com/page/M0/S834/834847.html

[4] http://bbs.chinaunix.net/thread-1972006-1-1.html

[5] http://linux.cn/article-3218-1.html

(1) 安装Yourt包管理器, 首先添加软件源, sudo vim /etc/pacman.conf, 在文件尾增加如下内容

1
2
3
4
[archlinuxcn]
# The Chinese Arch Linux communities packages.
SigLevel = Optional TrustAll
Server   = http://repo.archlinuxcn.org/$arch

(2) 更新缓存, sudo pacman -Syy

(3) 安装Yourt, sudo pacman -S yaourt

(4) 安装Aurvote, sudo pacman -S aurvote

(5) 配置aurvote, aurvote --configure

为了方便BBS测试的文件上传, 就此搭建FTP服务器

Install

安装 vsftpd

1
>> sudo pacman -S vsftpd

启动 vsftpd 和 设置开机自启

1
2
>> sudo systemctl enable vsftpd
>> sudo systemctl start vsftpd

Configuration

大多数的设置在 /etc/vsftpd.conf, 打开配置文件

1
>> sudo vim /etc/vsftpd.conf

启用上传功能, write_enable=YES

开启本地用户登录功能, local_enable=YES

开启IPV6支持

1
2
listen=NO
listen_ipv6=YES

自定义端口, 增加配置 listen_port=2211, 打开防火墙

1
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 2211 -j ACCEPT

增加用户设置

1
2
3
>> sudo htpasswd -c /etc/vsftpd/.passwd Username
New password:
Re-type new password:

若以后想增加用户, 可以使用 sudo htpasswd /etc/vsftpd/.passwd Username

这种方式增加的用户应该是不能被认证的, 用如下命令生成的密码替换

1
>> openssl passwd -1

向PAM service注册认证数据库, sudo vim /etc/pam.d/vsftpd, 并增加如下内容

1
2
auth required pam_pwdfile.so pwdfile /etc/vsftpd/.passwd
account required pam_permit.so

同时需要安装PAM对pwdfile的认证支持库, sudo yaout pam_pwdfile, Yaourt的安装见Arch Linux 安装Aur包管理器Yaourt

在系统中增加ftp虚拟用户

1
>> sudo useradd -d /srv/ftp -s/usr/bin/nologin -G ftp -M ftp

更改文件夹的所有人, sudo chown -R ftp:ftp /srv/ftp

配置文件里增加如下信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# pointing to the correct PAM service file
pam_service_name=vsftpd
write_enable=YES
hide_ids=YES
listen=YES
connect_from_port_20=YES
anonymous_enable=NO
local_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
chroot_local_user=YES
guest_enable=YES
guest_username=virtual
virtual_use_local_privs=YES

在用的过程中发现 FTP 不支持软链接的方式, 因此换成mount的方式来实现

1
>> sudo mount --bind /path/to/source /srv/ftp/

======================Add @2014/11/15 ===============================

在使用中发现, 只有命令和FTP工具(xftp)可以连接, Windows资源管理器、浏览器都不能访问, 查阅资料后发现是由于FTP的数据传输方式导致的, FTP的被动模式要求服务器能放过高端口的数据传输的包, 在测试中本机无法搞定ip_conntrack模式的配置, 只能限制FTP数据传输的端口, 并在防火墙上开放对应端口

在Vsftp上限制端口, sudo vim /etc/vsftp.conf, 在文件尾部增加如下部分

1
2
pasv_min_port=2222
pasv_max_port=2225

并开放这些端口

1
>> sudo iptables -A INPUT -p tcp --dport 2222:2225 -j ACCEPT

接着重启vsftpd服务器就行了

=======================Add @2014/11/16 ==============================

同时发现PSAV模式上传的时候, 发现无法上传和修改文件, 只能下载, 因此做如下修改

打开配置文件, sudo vim /etc/vsftp.conf

1
pasv_enable=YES

参考

(1) https://wiki.archlinux.org/index.php/Very_Secure_FTP_Daemon

(2) http://www.cnblogs.com/acpp/archive/2010/02/08/1665876.html

(3) http://blog.chinaunix.net/uid-26263042-id-3230479.html

(4) http://blog.csdn.net/moreorless/article/details/5289147

(5) http://www.2cto.com/os/201307/227994.html

(6) http://blog.csdn.net/highball/article/details/8521954

本地环境的LAMP环境安装见ArchLinux上搭建LAMP环境

这个地方主要讲bbs的备份和本地还原

服务器备份

文档数据的备份

1
2
>> cd /var/www
>> tar czvf sns-data.tar.gz sns/

数据库的备份

1
2
>> mysqldump -hHOSTNAME -uUSER -pPASSWORD DATABASENAME > sns-date.sql
>> du -h sns-date.sql       ; 查看文件大小

本地还原

文档数据还原

1
2
>> rm -rf /srv/http/*
>> tar zxvf sns-date.tar.gz -C /srv/http/sns

数据库还原

1
2
3
4
5
>> mysql -uUSER -p
mysql> create database `sns`;
mysql> exit
Bye
>> mysql -uUSER -p sns < sns-date.sql

本地配置

(1) 虚拟主机配置

以ArchLinux为例, apache是ArchLinux的默认安装

打开配置文件, sudo vim /etc/httpd/conf/extra/httpd-vhosts.conf, 做如下修改

1
2
3
4
5
6
7
8
9
10
<VirtualHost *:80>
    DocumentRoot "/srv/http/sns"
    ServerName "bbs.winterxq.me"
    <Directory "/srv/http/sns">
        Options Indexes FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

重启服务, sudo systemctl restart httpd

(2) 设置apache和mysql的开机自启

1
2
>> sudo systemctl enable httpd
>> sudo systemctl enable mysqld

(3) 设置文件夹所有权

1
2
3
4
>> sudo chown -R http:http data/
>> sudo chown -R http:http config/
>> sudo chown -R http:http uc_server/data/
>> sudo chown -R http:http uc_client/data/cache/

很久以前记得Windows下是没有硬链接、软连接这个功能的, 前段时间, 在关注Windows的WinSxS的时候, 有篇文章提到硬链接时才去查阅后才发现Windows支持这个特性了

在一些相关的资料中表明, Windows的这项特性其实很早就存在了, 只是不为别人所知, 在Win7的WinSxS中应用了这个技术, 使得我们以为这个是个新技术, 其实在XP中以及支持这一特性了

注意点:

(1) Windows的链接技术只支持NTFS文件系统

(2) 硬链接不能跨卷, 简单的说不能把C盘的文件链接到D盘

(3) 软链接和符号链接不能跨磁盘

三种文件夹的异同

主要关注 硬链接软连接

1) Symbolic Link(符号链接)

  • 图标与快捷方式很像
  • 在系统中不占用空间
  • 在文件系统中不是独立文件
  • 在操作系统层解析
  • 源文件丢失, 链接失效
  • 两者互不影响

2) Hard Link(硬链接)

  • 占用同一个空间, 引用同一个对象(不是拷贝)
  • 在操作系统层解析
  • 移除硬链接, 源文件不受影响
  • 源文件移除, 硬链接不受影响
  • 两者修改的是同一份文件

3) Shortcut(快捷方式)

Windows XP 下的实现

文件硬链接的实现

1
>> fsutil hardlink create newFileName fileName

文件夹的硬链接实现, 通过 junction.exe 来实现, 具体程序网上下载

1
2
>> junction.exe Link Target     // 创建硬链接
>> junction.exe target /d       // 删除文件夹

注意:

1) 创建文件夹硬连接, 这个可以跨分区

2) 删除硬链接必须使用 junction 文件夹连接名 /d, 否则会删掉源文件

Vista, Windows 7及以上版本下的实现

使用 mklink 来实现, 功能比 fsutil 强多了

1
2
3
4
5
6
7
8
9
10
>> mklink
MKLINK [[/D] | [/H] | [/J]] Link Target

        /D      Creates a directory symbolic link.  Default is a file
                symbolic link.
        /H      Creates a hard link instead of a symbolic link.
        /J      Creates a Directory Junction.
        Link    specifies the new symbolic link name.
        Target  specifies the path (relative or absolute) that the new link
                refers to.

简单的说:

  • /D 创建目录符号链接, 默认为文件符号链接
  • /H 创建硬链接
  • /J 创建目录联接

第三方工具 Link Shell Extension

在Windows下点击操作完成文件夹链接的工具Link Shell Extension

这个工具对文件夹可以完成以下7个功能: 1) Symbolic Link 2) Junction 3) Smart Copy 4) Smart Mirror 5) DeLorean Copy 6) Hardlink Clone 7) Symbolic Link Clone

每个功能的具体看这个工具的官网说明

参考

1) http://www.cnblogs.com/heqichang/archive/2012/04/26/241774.html

2) http://chenkegarfield.blog.163.com/blog/static/62330008201231153049164/

3) http://blog.csdn.net/wzy0623/article/details/3596572

4) http://www.cnblogs.com/plusium/archive/2010/03/17/1688511.html

POSIX1 定义了两种正则表达式语法:

1) BRE 基本正则表达式(Basic Regular Expression);

2) ERE 扩展的正则表达式(Extended Regular Expression)

大多数的Linux程序符合BRE规则

sed 只支持大部分 BRE, 因为主要是受到速度的限制;

grep 可以支持 ERE, 只是需要增加额外参数 -E

gwak 使用 BRE

Regular Expression 中的基本字符集

BRE定义语法符号

符号 模式含义
. 匹配任何一个字符
[] 字符集匹配
[^] 字符集(取反)匹配
^ 匹配开始位置
$ 匹配结束位置
() 定义子表达式
\n 子表达式向前引用, 即表示重复, n在{1,9}之间
* 多次或者重复匹配(包括0次重复)
\ 转义符
[] 匹配括号内出现的字符, 如 [a-zA-Z0123]
p{n} 匹配p出现n次
p{n,} 匹配p至少出现n次
p{n,m} 匹配所有p出现的次数大于n小于m的情况

ERE修改的语法符号

符号 状态 模式含义
? 新增 多次匹配(包括0次)
+ 新增 至少一次匹配
新增 | 或运算, 匹配两个子表达式的合集
() /{m,n} 修改 注释: 不需要转义 (, ), {, } 这些符号
\n 取消 ……

BRE 和 ERE 共享, 额外的一些定义:

特殊符号:

表一:

POSIX类 perl类 描述
[:alnum:] 数字集+字母集
[:alpha:] \a 字母集
[:lower:] \l 小写字母集
[:upper:] \u 大写字母集
[:blank:] 空白字符集(空格+制表符)
[:space:] \s 所有空白字符(包括[:blank:])
[:cntrl:] 不可打印的控制字符集(退格, 删除….)
[:digit:] \d 十进制数字
[:xdigit:] \x 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] \p 可打印的字符
[:pumct:] 标点符号

表二:

perl类 等效POSIX 描述
\o [0-7] 八进制数字
\O [^0-7] 非八进制
\w [[:alnum:]] 单词
\W [^[:alnum:]] 非单词
\A [^[:alphha:]] 非字母
\L [^[:lower:]] 非小写字母
\U [^[:upper:]] 非大写字母
\S [^[:space:]] 非空白字符
\D [^[:digit:]] 非十进制数字
\X [^[:xdigit:]] 非十六进制数字
\P [^[:print:]] 非可打印字符

一些特殊定义:

转义定义: \r (回车), \n (换行), \b (退格), \t (制表符), \v (垂直制表符), \"\'

Regular Express 使用例子

1) 匹配任何单一字符(ASCII) .

2) 匹配行首 ^, 例子如下

1
2
3
>> ls -l | grep '^d'
drwxr-xr-x 6 xmq users   4096 10月 12 15:53 Code/
drwxr-xr-x 2 xmq users   4096 9月  30 02:41 pic/

3) 匹配行尾 $

1
2
^$   ---  匹配空行
^.%  ---  匹配单字符行

4) 匹配重复字符 *

1
ro*t  <- 其中 rot, root, rooot 都符合其匹配结果

5) 特殊字符, 需要转义 \

6) 匹配一个范围 []

1
2
3
4
[0-9] or [0123456789]       <- 匹配数字
[a-zA-Z]                    <- 匹配所有大小写字母
[a-zA-Z0-9]                 <- 匹配字母和数字
[a-zA-Z]*                   <- 匹配所有单词

注意: 在 [] 中, ^ 表示否定的意思

1
2
[^A-Za-z]                   <- 匹配非字母
[^0-9]                      <- 匹配非数字

7) 匹配重复出现多次 \{\}

1
2
3
A\{2\}B                     <- 匹配 AAB
A\{2,\}B                    <- 匹配 AAB AAAB AAAAB ...
A\{2,3\}B                   <- 匹配 AAB AAAB

参考文档

1) http://blog.csdn.net/wklken/article/details/6429526

2) http://blog.chinaunix.net/uid-23045379-id-2562051.html

3) http://blog.csdn.net/a627088424/article/details/15435873


  1. Portable Operating System Interface, 即可移植操作系统接口, 定义了操作系统应该为应用程序提供的接口标准, 是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称, 其正式称呼为IEEE 1003, 而国际标准名称为ISO/IEC 9945, 信息来自百度百科

为了给基于Discuz模板的BBS增加一个小功能而在本地ArchLinux虚拟机里搭建一个BBS的测试平台

Apache And PHP Installation

分别安装 apache php 和 php-apache组件

1
>> sudo pacman -S apache php php-apache

启动 apache, sudo systemctl start httpd

测试 php 环境

1
>> sudo vim /srv/http/info.php

在文件中写下如下信息

1
<?php phpinfo(); ?>

打开网页测试效果

测试结果未生效, 在 apache 中启用 php

1
>> sudo vim /etc/httpd/conf/httpd.conf

查找 LoadModule dir_module modules/mod_dir.so 下增加

1
LoadModule php5_module modules/libphp5.so

同时在 Include 列表末尾增加

1
Include conf/extra/php5_module.conf

由于在 ArchLinux 中 php-apache 下的 libphp5.so 无法和 mod_mpm_event 一起工作, 会有如下错误

1
2
3
Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP.
AH00013: Pre-configuration failed
httpd.service: control process exited, code=exited status=1

有如下两种解决办法:

1) 对 apache php 等重新编译, 启用 thread safety(没试过)

2) 采用替换方法

使用 mod_mpm_prefork, 打开 /etc/httpd/conf/httpd.conf, 把

1
LoadModule mpm_event_module modules/mod_mpm_event.so

替换成

1
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

重启 apache, sudo systemctl restart httpd, 打开网页测试 info.php 页面, 看到如下画面说明 PHP 启用成功

PHPinfo

Mysql or MariaDB Installation

安装 Mysql/MariaDB, sudo pacman -S mysql

启用 pdo_mysql.so 和 mysqli.so, 打开 sudo vim /etc/php/php.ini, 分别去掉如下两条配置的注释符

1
2
extension=pdo_mysql.so
extension=mysqli.so

目前的配置到此结束。

关于Discuz的配置

=====增加于 2014/11/4=======

首先把Discuz的文件放置到站点文档目录下, 初步配置一下权限

1
2
3
4
>> sudo chmod -R 744 upload/    ; 把所有文件文件夹的权限调低
>> sudo chmod -R -x upload
>> sudo chmod -R +x upload      ; 这两个命令完成 取消文件的执行权限
>> sudo mv upload/* /sur/http/

出现三个问题:

(1) GD库没安装

(2) 文件权限需要重启配置

(3) PHP不能正确连接mysql

解决方案

(1) 安装GD库

1
>> sudo pacman -S php-gd

配置php, 打开 sudo vim /etc/php/php.ini, 取消 extension=gd.so

重启apache服务, sudo systemctl retstart httpd

(2) 配置文件权限

1
2
3
4
>> sudo chown -R http:http config
>> sudo chown -R http:http data
>> sudo chown -R http:http uc_client/data/cache
>> sudo chown -R http:http uc_server/data

(3) 检查mysql与php的情况

编辑php.ini, sudo vim /etc/php/php.ini, 确保一下三条处于打开的状态

1
2
3
extension=mysql.so
extension=mysqli.so
extension=pdo_mysql.so

此外还要解决数据库初始化的问题

1
2
>> sudo mysql_secure_installation
>> sudo systemctl restart mysqld

参考文献

https://wiki.archlinux.org/index.php/Apache

在DigitalOcean上搭建好Droplet后的第一件事就是搭建ShadowSocks服务, 用ShadowSocks翻墙时最受不了的就是服务器失效, 所以最靠谱的就是自己搭建一个

采用ShadowSocks的libev版本, 这个版本的特点是内存占用小(600k左右),使用libev和C编写,低CPU消耗,甚至可以安装在基于OpenWRT的路由器上1

这篇博客有借鉴价值, 对于Debian、Ubuntu、Arch等意义并不大, 这个发行版都有源

Install

关于之前提到的三个发行版(Debian, Ubuntu, Arch), Debian和Ubuntu的情况差不多, 不过Ubuntu已经很久不玩了, 也不清楚什么状况, Arch相关的安装配置以后补上

Debian源的配置

ShadowSocks不在官方源里, 需要额外配置2

1
>> sudo vim /etc/apt/sources.list

按照系统的版本增加源, Debian Wheezy指的是Debian 7

1
2
3
4
5
# Debian Wheezy, Ubuntu 12.04 or any distribution with libssl > 1.0.1
deb http://shadowsocks.org/debian wheezy main

# Debian Squeeze, Ubuntu 11.04, or any distribution with libssl > 0.9.8, but < 1.0.0
deb http://shadowsocks.org/debian squeeze main

增加完后更新缓存

1
>> sudo apt-get update

Install && Configure && Start Service

Debian

采用如下命令安装shadowsocks-libev

1
>> sudo apt-get install shadowsocks

安装完后, 编辑配置文件, 设定监听地址、端口、密码以及加密方式, 然后启动服务

1
2
3
4
5
# Edit the configuration
>> sudo vim /etc/shadowsocks/config.json

# Start the service
>> sudo /etc/init.d/shadowsocks start

检测

通过如下命令检测服务是否开启

1
>> ps -ef | grep ss-server | grep -v ps | grep -v grep

也可以检测端口是否被监听来判断

1
>> netstat -antl

Configure

General

配置文件的内容如下

1
2
3
4
5
6
7
8
9
10
11
{
    "server":"my_server_ip",
    "server_port":8388,
    "local_address": "127.0.0.1",
    "local_port":1080,
    "password":"mypassword",
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": false,
    "workers": 1
}

其中 server 是ShadowSocks监听的ip, 一般设置成服务器的公网IP; server_port 是ShadowSocks监听的端口, 据说拉低端口号会提高速度, 有一些人比较极端的会设置成443(https的端口); password 应该不用说了; method ShadooSocks支持很多中加密方式, 有些安全但速度比较慢, 有些不太安全但速度快, 看你怎么选择3

IPV4 And IPV6

因为在学校里有IPV6的环境, 方便在没有网络的时候可以采用IPV6来上网

如果把 server 设置成服务器的公网IP, 那就只能适用IPV4连接, 如果设置成服务器的IPV6地址, 那就只能IPV6连接, 为此还查了一番, 这个问题比较好解决, 按照这样设置即可 "server": "::"

如此设置时的确可以完成同时响应IPV4和IPV6, 但是在查看端口监听的时候只能发现程序监听了IPV6

1
2
>> netstat -antl | grep "server_port"
tcp6       0      0 :::2299                 :::*                    LISTEN

统计流量

由于我希望同时监听IPV4和IPV6, 而接下来要介绍的方法我不敢保证是否支持这一特性, 同时我也暂时没有时间, 因此没有测试, 仅供参考, 来自于利用IPTABLES对Shadowsocks统计流量

原理: ShadowSocks监听内网地址, 通过iptables的网络转发功能把数据转发到内网地址上来实现

1) 添加一个loop back用的内网IP

1
>> ifconfig eth0:ss1 10.10.10.10 netmask 255.255.255.0 up

注意:

  1. 网卡名不是eth0的自己修改

  2. 以这种形式增加的内网地址在重启后会失效, 可以修改网卡的配置文件(/etc/network/interfaces或/etc/sysconfig/network-scripts/)添加IP,或者把添加IP的命令加到/etc/rc.local里面

2) 修改ShadowSocks监听的网络, 并重启 sudo service shadowsocks restart

1
"server":"10.10.10.10",

3) 开启系统的IPV4转发功能

1
>> sudo vim /etc/sysctl.conf

确保 net.ipv4.ip_forward = 1 前没有 #

如果有修改, 执行 sudo sysctl -p 使之生效

4) iptables 设置转发

1
>> iptables -t nat -I PREROUTING -p tcp --dport SERVER_PORT -j DNAT --to-destination 10.10.10.10

5) 设置统计流量

统计内网地址的入网和出网的流量

1
2
>> iptables -I INPUT -d 10.10.10.10
>> iptables -I OUTPUT -s 10.10.10.10

查询流量

1
>> iptables -L -n -v

注意:

这样设置无法清空10.10.10.10的统计数据, 解决办法: 因为加入到FORWARD里面了,不能直接-Z,否则会全部清零,如果要清零单条,最好创建另一个链,把这个记录加入那个链中,再把那个链加入FORWARD中,清零是直接iptables -Z 链名称就行了


  1. 参考自秋水逸冰Debian下shadowsocks-libev一键安装脚本

  2. 参考自ShadowSocks-libevInstall from repository, 包括两份版本的Debian和Ubuntu的源

  3. 参考自shadowsocks-libev作者的Github, 里面有具体的说明