操作系统技术,云计算应用

centos中代理的设置

myos阅读(5)

最近在校园网中使用一个centos的主机,链接网络是需要代理的,如果是windows主机在Internet选项里设置一下就可以,可是在linux这个任何配置都要更改配置文件的系统里我还真是纠结了好大一下的。现在把配置的方式总结在下面,一方面留给自己做备忘,另外别人看到也可以少走点弯路嘛。

1.全局http代理

  所有用户(最简单最直接的配置方式,如果你按照这个配置了,后面的就不用看了)

    编辑/etc/profile添加

http_proxy="http://username:password@proxy_ip:port"
export http_proxy

https_proxy="http://username:password@proxy_ip:port"
export https_proxy

ftp_proxy="http://username:password@proxy_ip:port"
export ftp_proxy

    用户名和密码如果不需要的话可以不填写,只写IP地址和端口就可以了,像http://123.123.123.123:8000就可以了

    网上有好多相关的转载的文章都把 export http_proxy 写成了 export_http_proxy

    网上的只几乎都只是把http的那条写上了,运行命令的时候经常就连不上网了,尤其是一些github上的开源项目,地址都是https的,所以必须要加上https的条目哦,顺手把ftp的也加上吧,有备无患嘛。

   单一用户

    编辑~/.bash_profile添加和上面一样的内容

http_proxy="http://username:password@proxy_ip:port"
export http_proxy

https_proxy="http://username:password@proxy_ip:port"
export https_proxy

ftp_proxy="http://username:password@proxy_ip:port"
export ftp_proxy

 

2.yum代理 (yum是centos里面下载软件的命令,和ubuntu里的apt-get相似,只配置这个就可以安装大部分常用软件了)

  编辑/etc/yum.conf添加

proxy=http://username:password@proxy_ip:port

  同样用户名和密码如果不需要的话可以不填写

 

3.wget代理 (wget是下载文件的,后面跟一个url就可以下载对应的文件了)

  编辑/etc/wgetrc添加

https_proxy = http://username:password@proxy_ip:port/
http_proxy = http://username:password@proxy_ip:port/
ftp_proxy = http://username:password@proxy_ip:port/

 

 

MIPS平台移植apache 2.2.7

myos阅读(4)

参考文章:

http://wenku.baidu.com/view/94e08a20a5e9856a561260e2.html

http://httpd.apache.org/docs/2.4/install.html

工作中需要在MIPS平台的板子上移植apache,折腾一个星期,初步搞定,移植过程记录如下:

开发机软硬件平台:

 

开发板软硬件平台:

 

 

移植的宏观思路是:

1. 开发机端

1)配置:./configure

2)交叉编译:make

3)安装:make install

 

2. 开发板端

1)下载apache安装目录到板子的/usr/local下

2)配置httpd.conf

3)验证

 

详细移植过程如下:

1. 开发机端

1.1配置:./configure

首先指定安装目录(prefix),编译器(CC),平台名(host),库的路径(–with-included-apr)

./configure –prefix=/usr/local/apache CC=mips64-octeon-linux-gnu-gcc –host=mips-linux  –with-included-apr

 

 

提示错误:checking for /dev/zero… configure: error: cannot check for file existence when cross compiling

添加配置选项:ac_cv_file__dev_zero=yes 

继续

./configure –prefix=/usr/local/apache CC=mips64-octeon-linux-gnu-gcc –host=mips-linux  –with-included-apr ac_cv_file__dev_zero=yes

 

提示错误:checking whether setpgrp takes no argument… configure: error: cannot check setpgrp when cross compiling

添加配置选项:ac_cv_func_setpgrp_void=yes

继续

./configure –prefix=/usr/local/apache CC=mips64-octeon-linux-gnu-gcc –host=mips-linux  –with-included-apr ac_cv_file__dev_zero=yes ac_cv_func_setpgrp_void=yes

 

错误提示:configure: error: cannot run test program while cross compiling

进入./srclib/apr目录,修改configure文件,搜索cannot run test program while cross compiling

一共三处,将下图中阴影部分注释掉

 

继续

./configure –prefix=/usr/local/apache CC=mips64-octeon-linux-gnu-gcc –host=mips-linux  –with-included-apr ac_cv_file__dev_zero=yes ac_cv_func_setpgrp_void=yes

 

错误提示:configure: error: Size of “void *” is less than size of “long”

添加配置参数:ap_cv_void_ptr_lt_long=no

继续

./configure –prefix=/usr/local/apache CC=mips64-octeon-linux-gnu-gcc –host=mips-linux  –with-included-apr ac_cv_file__dev_zero=yes ac_cv_func_setpgrp_void=yes ap_cv_void_ptr_lt_long=no

 

配置通过

 

1.2 交叉编译:make

执行make命令

 

错误提示:/bin/sh: tools/gen_test_char: cannot execute binary file

进入./srclib/apr/tools/

 

MIPS平台的可执行文件当然不能在X86平台运行,手动生成x86平台的可执行文件,执行

gcc -Wall -O2 -DCROSS_COMPILE gen_test_char.c -s -o gen_test_char

./gen_test_char > ./include/private/apr_escape_test_char.h 

 

修改./srclib/apr/下的Makefile文件,注释掉图示两行

 

返回继续make

 

错误提示:./include/apr_want.h:95: error: redefinition of ‘struct iovec’

修改./srclib/apr/include/apr_want.h,注释掉struct iovec的定义

 

返回继续make

 

 

错误提示:./dftables: ./dftables: cannot execute binary file

进入./srclib/pcre/

执行

gcc -Wall -O2 -DCROSS_COMPILE dftables.c -s -o dftables

 

返回继续make

 

错误提示:/bin/sh: ./gen_test_char: cannot execute binary file

进入./server

执行

gcc -Wall -O2 -DCROSS_COMPILE gen_test_char.c -s -o gen_test_char

 

返回继续make

 

错误提示:undefined reference to `apr_procattr_limit_set’

好吧,这个错误网上查了半天,发现是./configure的时候少了一个配置项,从头再来吧

 

make clean

终极配置命令:

./configure –prefix=/usr/local/apache CC=mips64-octeon-linux-gnu-gcc –host=mips-linux  –with-included-apr ac_cv_file__dev_zero=yes ac_cv_func_setpgrp_void=yes ap_cv_void_ptr_lt_long=no ac_cv_struct_rlimit=yes

make

编译通过

 

1.3 安装:make install

理论上接下来的动作应该是:make install

但是在make install之前,我要临时改一下安装路径(下面的路径不固定,可根据自己的需要修改):

export DESTDIR=$NPU_APP_DIR/portable/cavium/execute/local/apache_tmp

然后再

make install

 

下面讲一下原因:

apache依赖三个库,apr, apr-util, pcre,在httpd-2.2.27版本中,这三个库的源码均与apache源码绑定在一起,在srclib目录下,编译apache的时候,这三个库也一起被编译了

 

上面./configure时,我之所以要把安装目录指定为/usr/local/apache,是因为我打算把apache的安装目录放在板子的/usr/local/apache下,运行/usr/local/apache/bin/httpd时,程序会自动在/usr/local/apache下搜寻依赖的库文件。

 

要生成安装目录就必须make install,make install是将源码目录下的相应文件拷贝到安装目录下,./configure时我指定的安装路径为/usr/local,但是我在开发机上并没有root权限,无法写/usr/local目录,只能写我的home目录(/home/tanghuimin),怎样临时修改make install的安装路径呢?

查看Makefile文件,搜索关键字“install”,发现安装文件都是放在基于$DESTDIR的路径下的,那修改$DESTDIR就能修改安装路径了,终端下执行

export DESTDIR=$NPU_APP_DIR/portable/cavium/execute/local/apache_tmp

make install

$NPU_APP_DIR/portable/cavium/execute/local/apache_tmp/usr/local/apache下便是自动生成的apache安装目录了

 

2 开发板端

2.1 下载apache安装目录到板子的/usr/local下

将$NPU_APP_DIR/portable/cavium/execute/local/apache_tmp/usr/local/下的apache目录打个包,ftp或其他方式,下载到板子的/usr/local/下,解压,进入/usr/local/apache目录

 

2.2 配置httpd.conf

接下来修改相关配置文件:

apache无法以root用户运行,修改/etc/passwd和/etc/group文件,新增nobody用户名和nobody工作组名。

在/etc/passwd中添加一行:

nobody::65534:65533:nobody:/:/bin/sh

 

在/etc/group中添加:

nobody::65533:

nogroup::65534:nobody

 

 

修改/usr/local/apache/conf/httpd.conf文件

1)修改用户名和用户组名为nobody

 

2)修改ServerName为板子的ip地址,我的为192.168.15.29

 

3)修改监听端口,我的为8080

 

 

2.3 验证

在浏览器窗口输入网址:http://192.168.15.29:8080/

 

成功!

后记:曾经试过http 2.4.9的移植,但因为在2.4.9版本中,三个库(apr,apr-util, pcre)的源码没有包含在http源码中,需要外部安装,而我又没有开发机的root权限,导致移植过程中有些动作没有办法完成,故转向低版本的http 2.2.7,http 2.2.7源码中包含了三个库文件的源码,无需外部安装库文件。

附件:

MIPS平台移植apache_2_2_7.zip

草稿_MIPS平台移植apache_2_4_9.zip

命令 tar & zip

myos阅读(23)

安装zip yum install -y unzip zip;

 

 

tar
-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件

这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。

-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出

下面的参数-f是必须的

-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。

# tar -cf all.tar *.jpg 
这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。 

# tar -rf all.tar *.gif 
这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。 

# tar -uf all.tar logo.gif 
这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。 

# tar -tf all.tar 
这条命令是列出all.tar包中所有文件,-t是列出文件的意思 

# tar -xf all.tar 
这条命令是解出all.tar包中所有文件,-x是解开的意思 

压缩
tar –cvf jpg.tar *.jpg //将目录里所有jpg文件打包成tar.jpg
tar –czf jpg.tar.gz *.jpg   //将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz
tar –cjf jpg.tar.bz2 *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2
tar –cZf jpg.tar.Z *.jpg   //将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z
rar a jpg.rar *.jpg //rar格式的压缩,需要先下载rar for linux
zip jpg.zip *.jpg //zip格式的压缩,需要先下载zip for linux

解压
tar –xvf file.tar //解压 tar包
tar -xzvf file.tar.gz //解压tar.gz
tar -xjvf file.tar.bz2   //解压 tar.bz2
tar –xZvf file.tar.Z   //解压tar.Z
unrar e file.rar //解压rar
unzip file.zip //解压zip

总结
1、*.tar 用 tar –xvf 解压
2、*.gz 用 gzip -d或者gunzip 解压
3、*.tar.gz和*.tgz 用 tar –xzf 解压
4、*.bz2 用 bzip2 -d或者用bunzip2 解压
5、*.tar.bz2用tar –xjf 解压
6、*.Z 用 uncompress 解压
7、*.tar.Z 用tar –xZf 解压
8、*.rar 用 unrar e解压
9、*.zip 用 unzip 解压

 

认识与学习shell

myos阅读(3)

linux的终端机执行命令的方式,是通过bash环境来处理的。bash包括变量的设置与使用,、bash操作环境的构建、数据流重定向的功能。下面的知识,对主机的维护与管理有重要的帮助。

 

管理整个计算机硬件的其实是操作系统的内核,这个内核被保护,一般用户只能通过shell来和内核通信(shell将输入的命令与内核通信,内核可以控制硬件来正确无误地工作)。man、chmod、chown、vi、mkfs等命令,都是独立的应用程序,我们可以通过shell(即命令行模式)来操作这些应用程序,让这些应用程序调用内核来运行所需的工作。

 

 bash shell 的内置命令:type

type命令找出可执行文件,而不是一般文件名。

floralin@ubuntu:~/Desktop/linux_study$ type ls   # 未加任何参数的时候,列出ls的最主要使用情况
ls is aliased to `ls --color=auto'
floralin@ubuntu:~/Desktop/linux_study$ type -t ls # 添加参数-t列出ls执行时的依据
alias
floralin@ubuntu:~/Desktop/linux_study$ type -a ls # 添加参数-a会从PATH变量定义中,将所有含有 ls 的命令都列出来,包含alias
ls is aliased to `ls --color=auto'
ls is /bin/ls
floralin@ubuntu:~/Desktop/linux_study$ type cd
cd is a shell builtin                             # cd是shell内置命令

命令的执行

很多时候输入命令过长,会在换行之前加入\,这样做的目的是为了将换行符[enter]转移过来。成功转移过后,下一行最前面就会出现>的符号,可以继续输入命令。

 

shell 变量功能

变量就是用一个特定字符串代表不固定的内容。在linux中要将变量的内容显示出来,可以使用echo这个命令来显示变量,但是变量在被显示时,必须加上$.

floralin@ubuntu:~/Desktop/linux_study$ echo $variable

floralin@ubuntu:~/Desktop/linux_study$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

设置变量

floralin@ubuntu:~/Desktop/linux_study$ echo $myname

floralin@ubuntu:~/Desktop/linux_study$ myname=flora
floralin@ubuntu:~/Desktop/linux_study$ echo $myname
flora

保留原先变量,然后进行设置

floralin@ubuntu:~/Desktop/linux_study$ myname="$myname lin"
floralin@ubuntu:~/Desktop/linux_study$ echo $myname
flora lin

在执行过程中,反单引号(`),之内的命令会被先执行,而执行出来的结果将作为外部的输入信息。locate命令可以列出所有的相关文件名,但是如果我们想知道每个crontab相关文件名的权限:

floralin@ubuntu:~/Desktop/linux_study$ ls -l `locate crontab`
-rw-r--r-- 1 root root      401 Feb 19  2014 /etc/anacrontab
-rw-r--r-- 1 root root      722 Feb  8  2013 /etc/crontab
-rwxr-sr-x 1 root crontab 34824 Feb  8  2013 /usr/bin/crontab
-rw-r--r-- 1 root root     1184 Apr  7  2014 /usr/share/bash-completion/completions/crontab
-rw-r--r-- 1 root root    27684 Feb  8  2013 /usr/share/doc/cron/examples/crontab2english.pl
-rw-r--r-- 1 root root     2521 Feb  8  2013 /usr/share/man/man1/crontab.1.gz
-rw-r--r-- 1 root root      892 Feb 19  2014 /usr/share/man/man5/anacrontab.5.gz
-rw-r--r-- 1 root root     5687 Feb  8  2013 /usr/share/man/man5/crontab.5.gz

 先以locate将文件名数据列出来,然后使用ls命令来处理。

 

环境变量的功能

环境变量能够帮我们达到很多功能,包括主文件夹的变换,提示符的显示,执行文件查找的路径等。

查看默认的环境变量:

floralin@ubuntu:~/Desktop/linux_study$ env
#...... _=/usr/bin/env # 上一次使用的命令的最后一个参数(或命令本身)

随机数

RANDOM变量的内容介于0~32767之间,所以要进行数值计算才能获取一个一位数。

floralin@ubuntu:~/Desktop/linux_study$ declare -i number=$RANDOM*10/32768;echo $number
1
floralin@ubuntu:~/Desktop/linux_study$ declare -i number=$RANDOM*10/32768;echo $number
4
floralin@ubuntu:~/Desktop/linux_study$ declare -i number=$RANDOM*10/32768;echo $number
5

set查看所有变量(含环境变量与自定义变量)

bash不只有环境变量,还有一些比较重要的参数,以及用户自己定义的变量。

floralin@ubuntu:~/Desktop/linux_study$ set

PS1命令提示符

每当我们按下回车键去执行某个命令后,最后要再次出现提示符,会去主动读取这个变量值。

floralin@ubuntu:~/Desktop/linux_study$ cd /home
floralin@ubuntu:/home$ PS1='[\u@\h \w \A #\#]\$'
[floralin@ubuntu /home 08:48 #46]$ls
floralin
[floralin@ubuntu /home 08:51 #47]$                                                                                                    

\w 代表完整的工作目录名称,由更目录写起来的目录名称。但是主文件夹将会用~替代。

\A 显示时间,二十四小时格式“HH:MM”。

\# 执行第几个命令。

\$ 提示符,如果是root时,提示符为#,否则为$。

 

变量键盘读取、数组与声明:read、array、declare

 

read读取来自键盘输入的变量

[floralin@ubuntu /home 09:12 #54]$read atest
This is a test
[floralin@ubuntu /home 09:12 #55]$read -p "Please keyin your name: " -t 30 named
Please keyin your name: floralin
[floralin@ubuntu /home 09:13 #56]$echo $named
floralin

30秒没有任何操作时,该命令会自动略过。

 

declare或typeset,声明变量的类型

如果使用declare后面没有接任何参数,bash就会主动将变量名称数出来。

[floralin@ubuntu /home 09:21 #59]$sum=100+300+50
[floralin@ubuntu /home 09:22 #60]$declare -i sum=100+300+50
[floralin@ubuntu /home 09:22 #61]$echo $sum
450

变量类型默认为字符串,所以不能制定变量类型,则1+2为一个字符串而不是计算式,因此执行第一条命令会直接输出100+300+50.。

将sum变成环境变量:

[floralin@ubuntu /home 09:13 #57]$declare -x sum
[floralin@ubuntu /home 09:21 #58]$export | grep sum
declare -x sum

将sum变成只读属性,不可修改:

[floralin@ubuntu /home 09:25 #62]$declare -r sum
[floralin@ubuntu /home 09:29 #63]$sum=testgting
bash: sum: readonly variable

让sum变成非环境变量的自定义变量:

[floralin@ubuntu /home 09:29 #64]$declare +x sum
[floralin@ubuntu /home 09:30 #65]$declare -p sum
declare -ir sum="450"

 

数组变量类型

[floralin@ubuntu /home 09:30 #66]$var[1]="small min"
[floralin@ubuntu /home 09:32 #67]$var[2]="big min"
[floralin@ubuntu /home 09:32 #68]$var[3]="nice min"
[floralin@ubuntu /home 09:32 #69]$echo "${var[1]},${var[2]},${var[3]}"
small min,big min,nice min

 

与文件系统及程序的限制关系ulimit

列出你目前身份的所有限制数据数值:

[floralin@ubuntu /home 09:33 #70]$ulimit -a

限制用户仅能建立10MB一下的容量文件:

[floralin@ubuntu /home 09:38 #74]$ulimit -f 10240
[floralin@ubuntu /home 09:38 #75]$ulimit -a

尝试创建20M的文件:

[floralin@ubuntu ~/Desktop/linux_study 09:41 #81]$sudo dd if=~/Desktop/linux_study/ of=123 bs=1M count=20

 [floralin@ubuntu ~/Desktop/linux_study 09:41 #82]$ll
 total 8
 drwxrwxr-x 2 floralin floralin 4096 Oct 30 09:41 ./
 drwxr-xr-x 3 floralin floralin 4096 Oct 30 07:43 ../
 -rw-r–r– 1 root root 0 Oct 30 09:41 123

 

变量内容的删除、替换与替代

变量内容的删除与替换

将local这两个目录删除掉:

[floralin@ubuntu ~/Desktop/linux_study 09:47 #85]$echo $path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

  [floralin@ubuntu ~/Desktop/linux_study 09:49 #89]$echo ${path#/*local/bin:}
  /usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

 将sbin替换为SBIN:

floralin@ubuntu ~/Desktop/linux_study 13:06 #95]$echo ${path/sbin/SBIN}
/usr/local/SBIN:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
[floralin@ubuntu ~/Desktop/linux_study 13:06 #96]$echo ${path//sbin/SBIN}
/usr/local/SBIN:/usr/local/bin:/usr/SBIN:/usr/bin:/SBIN:/bin:/usr/games:/usr/local/games

变量的测试与内容替换:

[floralin@ubuntu ~/Desktop/linux_study 13:07 #97]$echo $username
                                                # username可能不存在或者为空字符串
[floralin@ubuntu ~/Desktop/linux_study 13:09 #98]$username=${username-root}
[floralin@ubuntu ~/Desktop/linux_study 13:10 #99]$echo $username
root                                              # 没有设置,所以主动给予名为root的内容
[floralin@ubuntu ~/Desktop/linux_study 13:10 #100]$username="floralin"
[floralin@ubuntu ~/Desktop/linux_study 13:10 #101]$username=${username-root}
[floralin@ubuntu ~/Desktop/linux_study 13:10 #102]$echo $username
floralin

username-root 就得变量,被测试的选项 ; username-root 变量的内容,在本范例中,这个部分是在给予未设置变量的内容。当然 username:-root则是在变量内容为空或者是未设置,都能够以后面的内容替换。

如果旧变量不存在,我们就以新变量内容替换;但是若旧变量存在,则新变量内容以旧变量替换。

[floralin@ubuntu ~/Desktop/linux_study 13:10 #103]$unset str; var=${str-newvar}
[floralin@ubuntu ~/Desktop/linux_study 13:18 #104]$echo var="$var",str="$str"
var=newvar,str=                                        # 因为str不存在,所以var为newvar
[floralin@ubuntu ~/Desktop/linux_study 13:19 #105]$str="oldvar";var=${str-newvar}
[floralin@ubuntu ~/Desktop/linux_study 13:20 #106]$echo var="$var",str="$str"
var=oldvar,str=oldvar                                     # 因为str存在,所以var等于str的内容

关于减号是不会影响旧变量的,如果想要旧变量内容也一起替换掉的话,就需要使用等号=:

[floralin@ubuntu ~/Desktop/linux_study 13:20 #107]$unset str; var=${str=newvar}
[floralin@ubuntu ~/Desktop/linux_study 13:25 #108]$echo var="$var",str="$str"
var=newvar,str=newvar
[floralin@ubuntu ~/Desktop/linux_study 13:25 #111]$str="oldvar";var=${str=newvar}
[floralin@ubuntu ~/Desktop/linux_study 13:25 #112]$echo var="$var",str="$str"
var=oldvar,str=oldvar

 

命令别名和历史命令

命令别名设置alias和unalias

命令别名可以使常用的但是特别长的命令修改成比较简洁的命令,还有增设默认的选项在一些惯用的命令上面,可以预防一些不小心误删文件的情况发生。例如,查询隐藏文件,并且需要长的列出与一页一页翻看,那么需要执行“ls -l | more”,可以使用以下命令将其简化为lm:

[floralin@ubuntu ~ 13:35 #120]$alias lm="ls -l | more"

另外,命名别名的设置还可以替代既有的命令,例如,当以root登录,使用rm命令可以删除所有文件,因此要特别小心,rm提供一个参数让我们确认是否删除该文件-i:

[floralin@ubuntu ~ 13:35 #123]$alias rm="rm -i"
[floralin@ubuntu ~/Desktop/linux_study 13:39 #127]$rm 123
rm: remove write-protected regular empty file123’  y

去掉刚才的命名别名:

[floralin@ubuntu ~/Desktop/linux_study 13:39 #128]$unalias rm

 

历史命令 history

查询曾经执行过的命令,最近4条:

[floralin@ubuntu ~/Desktop/linux_study 13:42 #131]$history 4

 

Bash Shell的操作环境

路径与命令查找顺序

设置echo的别名为echo-n,然后再查看echo执行的顺序:

[floralin@ubuntu ~/Desktop/linux_study 13:45 #132]$alias echo="echo -n"
[floralin@ubuntu ~/Desktop/linux_study 13:47 #134]$type -a echo
echo is aliased to `echo -n'
echo is a shell builtin
echo is /bin/echo

 

bash的登录与欢迎信息:/etc/issue,/etc/motd

终端环境设置:stty.set

如何查阅目前的一些按键内容呢?可以利用stty(setting tty终端机),stty可以帮助设置终端机的输入按钮代表意义。我们可以利用stty-a来列出目前环境中的所有按键列表。

floralin@ubuntu:~$ stty -a
speed 38400 baud; rows 37; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^ ; kill = ^U; eof = ^D; eol = M-^ ; eol2 = M-^ ;
swtch = M-^ ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

如果想要stty进行相关的字符删除:

floralin@ubuntu:~$ stty erase ^h

除了stty之外,其实我们bash还有自己的一些终端机设置值set。

 

管道命令pipe

使用bash命令执行输出数据,要经过几道数据之后才能得到我们想要的格式,这就需要使用管道。

管道命使用的是“|”这个界定符号。另外管道命令与“连续执行命令”不同。

查阅/etc/下面有多少文件,可以利用ls/etc来查阅,使用lese管道,可以使得原本很长的目录具备翻页能力:

 

floralin@ubuntu:~$ ls -al /etc | less

 

选取命令:cut/grep

cut可以使一段信息切出来,处理的信息是以“行”为单位

截取第五行字符串:

floralinfloralin@ubuntu:~$ echo $PATH | cut -d  ':' -f 5

截取第三和五行:

floralinfloralin@ubuntu:~$ echo $PATH | cut -d  ':' -f 3,5

 

 

cut的主要用途是将同一行里面的数据进行分解,最常用使用在分析一些数据或文字数据的时候。这是因为有时候我们会将某些字符串作为切割的参数,然后来将数据加以切割,以取得我们所需要的数据。

grep则是分析一行信息。也就是,grep可以解析一行文字,取得关键字,若该行存在关键字,就会整行列出来。

列出含有“boot”关键字的行:

 

floralinfloralin@ubuntu:~$ last | grep "boot"

 

列出不含有“boot”关键字的行:

 

floralinfloralin@ubuntu:~$ last | grep -v "boot"

 

加上cut,取得第一列:

floralinfloralin@ubuntu:~$ last | grep "boot" | cut -d  " " -f1

取得/etc/man.config 内含MANPATH的那几行:

floralinfloralin@ubuntu:~$ grep  --color=auto ‘MANPATH’ /etc/main.config

 

排序命令:sort、wc、uniq

对/etc/insserv.conf文件进行排序显示:

floralinfloralin@ubuntu:~$ /etc/insserv.conf | sort

对于排序完成的数据,想要将重复的数据仅列出一个显示:

floralinfloralin@ubuntu:~$ last | cut -d ' ' -f1 | sort | uniq

还想知道登录状态:

 

双向重定向:tee

将数据流整个传送给文件或设备。tee会同时将数据流送与文件与屏幕;而输出到屏幕的,其实就是stdout。

将last的输出存一份给last.list文件中:

floralinfloralin@ubuntu:~$ last | tee last.list

将ls的数据存一份到 ~/homefike | more:

floralinfloralin@ubuntu:~$ ls -l /home | tee  ~/homefile | more

tee后面的文件会被覆盖,若加上-a这个参数,则能将信息累加:

floralinfloralin@ubuntu:~$ ls -l /home | tee -a ~/homefile | more

 

字符串转换命令:tr、col、join、paste、expand

tr可以用来删除一段信息当中的文字,或者是进行文字信息的替换。

col可以进行简单处理,经常被用于man page转存为纯文本文件以方便查阅的功能。

join看字面上的意义,是处理两个文件之间的数据。要将两个文件当中相同数据的那一行加起来。

paste将两行贴在一起,中间一tab键隔开。

expand将tab按键转成空格键。

 

Linux下MySQL数据库的备份与还原

myos阅读(5)

昨天对公司数据库进行备份。用了以下的方法
一. 导出
1、导出数据和表结构:
mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql

如果要导出数据库全部:

 mysqldump -uroot -p123456 –all-databases > all-$DAY.sql

或者切换到mysql目录下:
#/usr/local/mysql/bin/   mysqldump -uroot -p haier > haier.sql
敲回车后会提示输入密码

2、只导出表结构
mysqldump -u用户名 -p密码 -d 数据库名 > 数据库名.sql
#/usr/local/mysql/bin/   mysqldump -uroot -p -d haier > haier.sql

2. 还原

法二:
[root@localhost ~]# cd /var/lib/mysql (进入到MySQL库目录,根据自己的MySQL的安装情况调整目录)
[root@localhost mysql]# mysql -u root -p voice<voice.sql,输入密码即可。

mysqldump: Got error: 1016 when using LOCK TABLES
hitidea是一个有很多数据表的数据库(Wordpress MU),搜索了一下,发现只要在mysqldump的时候加上–lock-tables=false就可以解决问题。

mysqldump -uroot -p123456 sq_mvclub –lock-tables=false > /home/bak/35.sql

本文属于转载,但亲自测试过可用。

原文:http://www.cnblogs.com/jiunadianshi/archive/2011/04/20/2022334.html

文件和目录之设置用户ID和设置组ID

myos阅读(4)

与一个进程相关联的ID有6个或更多,它们如表4-4所示:

表4-4 与每个进程相关联的用户ID和组ID

实际用户ID                            我们实际上是谁
实际组ID
有效用户ID                            用于文件访问权限检查
有效组ID
附加组ID
保存的设置用户ID                   由exec函数保存
保存的设置组ID

 

  • 实际用户ID和实际组ID标识我们究竟是谁(执行这个程序的用户和组。这两个字段在登录时取自口令文件中的登录项。通常,在一个登录会话间这些值并不改变,但是超级用户进程有方法改变它们。
  • 有效用户ID,有效组ID以及附加组ID决定了我们的文件访问权限。
  • 保存设置用户ID和保存设置组ID在执行一个程序时包含了有效用户ID和有效组ID的副本

在POSIX.1 2001版中,需要这些保存的ID。在早期POSIX版本中,它们是可选的。一个应用程序在编译时可测试常量_POSIX_SAVED_IDS,或在运行时从参数_SC_SAVED_IDS调用函数sysconf,以判断此实现是否支持这种特征。

通常,有效用户ID等于实际用户ID,有效组ID等于实际组ID。

每个文件都有一个所有者和组所有者,所有者由stat结构中的st_uid成员表示,组所有者则由st_gid成员表示。

当执行一个程序文件时,进程的有效用户ID通常就是实际用户ID,有效组ID通常就是实际组ID。但是可以在文件模式字(st_mode)中设置一个特征标志,其含义是“当执行此文件时,将进程的有效用户ID设置为文件所有者的用户ID(st_uid)”。与此相类似,在文件模式字中可以设置另一位,它使得将执行此文件的进程的有效组ID设置为文件的组所有者ID(st_gid)。在文件模式字中的这两位被称为设置用户ID(set-user-ID)位和设置组ID(set-group-ID)位。

例如,若文件所有者是超级用户,而且设置了该文件的设置用户ID位,然后当该程序由一个进程执行时,则该进程具有超级用户特权。不管执行此文件的进程的实际用户ID是什么,都进行这种处理。例如,UNIX程序passwd(1)允许任一用户改变其口令,该程序是一个设置用户ID程序。因为该程序应能将用户的新口令写入口令文件(一般是/etc/passwd或/etc/shadow)中,而只有超级用户才具有对该文件的写权限,所有需要使用设置用户ID特征。因为运行设置用户ID程序的进程通常得到额外的权限,所以编写这种程序时要特别谨慎。

设置用户ID及设置组ID位都包含在st_mode值中。这两位可用常量S_ISUID和S_ISGID测试。

本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

Linux添加用户(user)到用户组(group)

myos阅读(5)

http://blog.csdn.net/pursue168/article/details/6443046

将一个用户添加到用户组中,千万不能直接用: usermod -G groupA
这样做会使你离开其他用户组,仅仅做为 这个用户组 groupA 的成员。 应该用 加上 -a 选项: usermod -a -G groupA user

(FC4: usermod -G groupA,groupB,groupC user) -a 代表 append, 也就是 将自己添加到 用户组groupA 中,而不必离开 其他用户组。
命令的所有的选项,及其含义: Options: -c, –comment COMMENT         new value of the GECOS field -d, –home HOME_DIR           new home directory for the user account -e, –expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE -f, –inactive INACTIVE       set password inactive after expiration                                 to INACTIVE -g, –gid GROUP               force use GROUP as new primary group -G, –groups GROUPS           new list of supplementary GROUPS -a, –append          append the user to the supplemental GROUPS                                 mentioned by the -G option without removing                                 him/her from other groups -h, –help                    display this help message and exit -l, –login NEW_LOGIN         new value of the login name -L, –lock                    lock the user account -m, –move-home               move contents of the home directory to the new                                 location (use only with -d) -o, –non-unique              allow using duplicate (non-unique) UID -p, –password PASSWORD       use encrypted password for the new password -s, –shell SHELL             new login shell for the user account -u, –uid UID                 new UID for the user account -U, –unlock                  unlock the user account

 

查看用户所属的组使用命令:$ groups user

或者查看文件:$ cat /etc/group

CentOS7 firewall的使用

myos阅读(5)

# 查看区域

firewall-cmd –get-zones

 

# 查看默认区域

firewall-cmd –get-default-zone

 

# 给区域添加永久性服务

firewall-cmd –add-service=http –zone=public  –permanent

 

# 删除区域服务

firewall-cmd –remove-service=http –zone=public

 

# 查看某项服务是否被允许

firewall-cmd –query-service=http –zone=public

# 给指定区域永久性添加端口

firewall-cmd –add-port=80/tcp –zone=public –permanent

 

#给指定区域删除端口

firewall-cmd –remove-port=80/tcp –zone=public

 

# 查看端口在指定区域是否被允许

firewall-cmd –query-port=80/tcp –zone=public

 

# 查看某个区域的所有配置信息

firewall-cmd –list-all

 

 另:

 # 以上–zone=public 都可以省略

 # –permanent 如果不为永久性开启或关闭,则不必写该字段

 

DDoS攻防战(三):ip黑白名单防火墙frdev的原理与实现

myos阅读(3)

 

汤之盘铭曰 苟日新 日日新 又日新

康诰曰 作新民

诗曰 周虽旧邦 其命维新

是故 君子无所不用其极

——礼记·大学

   

 

  在上一篇文章《DDoS攻防战 (二) :CC攻击工具实现与防御理论》中,笔者阐述了一个防御状态机,它可用来抵御来自应用层的DDoS攻击,但是该状态机依赖一个能应对大量条目快速增删的ip黑白名单防火墙,我们目前并没有发现很好的开源实现以供我们使用。

 

·实现方案选择:

  硬件实现或者软件实现?

  在面对诸如大量畸形包这样的攻击时,硬件实现将会是非常好的选择,这是因为在进行此类型的封包过滤时,系统需要记忆的状态很少(对于FPGA、ASIC诸多硬件实现方案来讲,记忆元件的成本决不可忽视,寄存器与静态RAM都非常昂贵,所以当需要记忆的信息很少时,纯硬件方案的速度优势使得其完胜软件方案)。

  但是,当状态机需要处理庞大的记忆信息时,我们就需要选择廉价的存储器——动态随机存储器(如SDRAM中的DDR3)来作为系统状态机的存储介质,以降低系统的成本和复杂度。这时,软件实现更胜一筹。尽管纯硬件实现的速度会比软件的方式高出很多,但我们也从第一篇文章《DDoS攻防战 (一) : 概述》中lvs性能的测试结果中看到,软件实现的、作为服务器前端均衡调度器的lvs,性能理想并且能胜任实际生产环境中的、庞大的用户请求处理,可见,如果设计合理,软件实现的性能无需过多担忧。

  最终,我们决定采用软件的方法来实现所需的ip黑白名单模块。

 

·最终系统鸟瞰:

  笔者花费大约二十天的时间,使用C语言实现了这一模块,其中,内核空间的核心代码约2300行,用户空间管理工具的代码总行数约为700行。下为系统的鸟瞰:

  ·用户空间管理工具fripadm,通过ioctl与工作于内核态的frdev模块进行通信

  ·frdev维护两个double_hash_table的实例,并提供了一个挂在NF_INET_PRE_ROUTING的钩子函数,其通过操作这两个double_hash_table的实例以分别实现ip黑名单、白名单的功能

  ·frdev通过内核中设备驱动的ioctl机制,向用户空间提供这两个double_hash_table实例的操作函数,而我们的用户空间管理工具fripadm正是基于此而实现的

  下面是内核态的主要数据结构与其对应的操作函数:

struct fr_ip_hash_array的功能:
  精确ip查询;
  模糊ip查询;
  自定义hash表的长度;
  自定义hash function,其输入散列随机数为rnd;
  维护精确ip的哈希表;
  维护模糊ip的链表;
  维护精确ip与模糊ip的诸统计信息;

ip字符描述语法:
  /* ips_syntax : RE 
  digit  =: [0-9]
  num    =: (digit){1,3}
  atom   =: num | (num'-'num) | '*'
  ip     =: atom '.' atom '.' atom '.' atom 
  ips    =: (ip ' ')+
  */
  // ret 0 success,otherwise syntax error
  // "1-220.*.100.33 1-220.*.100.33 1-220.*.100.33"

struct fr_ip_hash_array的方法:
  fr_ip_hash_array_malloc / fr_ip_hash_array_destroy
  fr_ip_hash_array_insert_ip  :增加一条精确ip记录
  fr_ip_hash_array_insert_blurip_ptr  :增加一条模糊ip记录(以指针引用的方式)
  fr_ip_hash_array_delete_ip
  fr_ip_hash_array_delete_blurip_ptr
  fr_ip_hash_array_delete_ip_randomly  :随机地删除指定数量的精确ip
  fr_ip_hash_array_insert_ip_bystrings  :通过字符串的表述方式,向fr_ip_hash_array增加精确ip或者模糊ip
  fr_ip_hash_array_delete_ip_bystrings
  fr_ip_hash_array_find_bool  :查找给定的ip是否在已存储的模糊ip范围之内或者精确ip的哈希表之中
  fr_ip_hash_array_find_ip_bool  :查找给定的ip是否在精确ip的哈希表之中
  fr_ip_hash_array_find_ip_bystrings_bool

 

·为什么使用双哈希表缓冲?

  请考虑如下场景:

  情况1:来自应用层的DDoS攻击常常是瞬间涌入大量非法ip请求,例如数万个非法ip,所以,对于防火墙黑白名单功能的要求至少有如下:能在很短的时间内更新大量数据项,且不能造成系统服务停顿。

  分析:如果只使用一个全局的哈希表,当在短时间内进行大量的数据项增删时,例如,成千上万个,此时,即使采用多把读写锁分割哈希表的策略,对共享资源的竞争也依然将严重影响系统响应速度,严重时系统可能会停顿或者更糟,对于生产环境中的高负载服务器,这是无法容忍的。

  解决:以空间换时间

 

  采用双哈希表缓冲的策略,将系统共享资源的竞争热点压缩至两个hash表指针主备切换的极短时间内,此方法能显著降低系统在大量数据项更新时共享资源的竞争。

  系统查询将会直接访问master指向的fr_ip_hash_array,而用户的更新操作将直接针对mirror所指向的另一个fr_ip_hash_array实例,直到switch_mirror_update操作的执行,master将被瞬间“更新”。这是其主要的工作特点。

  对于SMP与多队列网卡的系统,可采用如下策略:多数cpu核心专门负责处理内核的softirq任务,剩下的少数cpu负责进行双哈希表的更新、切换与重建等操作。这样可提高系统对攻击的快速防御响应。

  但此方案将使得系统需要维护两个互为镜像的哈希表,这将加重系统内存的读写负担。

  具体实现细节如下:

struct fr_ip_double_hash的成员:
  struct fr_ip_hash_array * master_ptr;
  rwlock_t master_lock;  
  struct fr_ip_hash_array * mirror_ptr;
  rwlock_t mirror_lock;
struct fr_ip_double_hash的方法: fr_ip_double_hash_malloc / fr_ip_double_hash_destroy fr_ip_double_hash_mirror_insert_ip :只针对mirror的insert ip操作 fr_ip_double_hash_mirror_insert_blurip_ptr fr_ip_double_hash_mirror_insert_bystrings fr_ip_double_hash_mirror_delete_ip fr_ip_double_hash_mirror_delete_blurip_ptr fr_ip_double_hash_mirror_delete_bystrings fr_ip_double_hash_mirror_delete_ip_randomly fr_ip_double_hash_mirror_delete_all :删除mirror中所有的ip记录,即所有的精确ip和模糊ip记录 fr_ip_double_hash_switch_mirror_update :将mirror与master互换,并更新master至mirror(此时的mirror即为之前的master) fr_ip_double_hash_rebuild :将双哈希表重建,可指定新的hash function、rnd以及hash表的长度,这将解决hash表查询效率低下的问题,以防御外界针对hash表的攻击。当然,在重建之后,原有的诸多ip条目不会丢失。 fr_ip_double_hash_find_bool fr_ip_double_hash_find_bystrings_bool

 

挂到协议栈上的钩子函数:

  在模块初始化函数fr_ip_dev_init的最后,即当两个双哈希表实例(分别用作黑名单与白名单)初始化成功、fedev设备注册成功之后,其将会执行nf_register_hook,将指定的钩子函数fr_nf_hook_sample挂到NF_INET_PRE_ROUTING之上。

  fr_nf_hook_sample的主要处理代码如下:

   if(fr_ip_double_hash_find_bool(double_hash_white_ptr,sip)) 
   return NF_ACCEPT; else if(fr_ip_double_hash_find_bool(double_hash_ptr,sip))
   return NF_DROP; else
   return NF_ACCEPT;

其中,double_hash_white_ptr指向白名单fr_ip_double_hash实例,double_hash_ptr则指向黑名单fr_ip_double_hash实例,由于支持模糊ip匹配,故,上述代码使得对源ip过滤的“通”、“堵”策略皆可使用。

 

内核空间frdev的ioctl处理函数:

  目前,ioctl支持来自用户空间的如下操作:

//黑名单操作
/* in-black ip */
#define FR_IP_IOCTL_TYPE_FIND    1
#define FR_IP_IOCTL_TYPE_FIND_BYSTRINGS        2    // *   输入ip字符查找
#define FR_IP_IOCTL_TYPE_MIRROR_INSERT_IP    3    
#define FR_IP_IOCTL_TYPE_MIRROR_INSERT_BYSTRINGS    4    // * 
#define FR_IP_IOCTL_TYPE_MIRROR_DELETE_IP    5        // *  
#define FR_IP_IOCTL_TYPE_MIRROR_DELETE_IP_RANDOMLY        6 //*  
#define FR_IP_IOCTL_TYPE_MIRROR_DELETE_BYSTRINGS    7    // * 
#define FR_IP_IOCTL_TYPE_MIRROR_DELETE_ALL        8    //*  
#define FR_IP_IOCTL_TYPE_SWITCH_MIRROR_UPDATE    9    // *  
#define FR_IP_IOCTL_TYPE_REBUILD    10    // *    
#define FR_IP_IOCTL_TYPE_COPY_HASH_STRUCT     11    // *
#define FR_IP_IOCTL_TYPE_DUMP    12    //*    输出双哈希表的分布情况与统计信息
#define FR_IP_IOCTL_TYPE_MIRROR_INSERT_IP_BINS    13    //*   一次增加大量精确ip,以二进制的方式输入
#define FR_IP_IOCTL_TYPE_MIRROR_DELETE_IP_BINS    14    //*  

//白名单操作
/* in-white ip */
#define FR_IP_IOCTL_TYPE_WHITE_FIND    101
#define FR_IP_IOCTL_TYPE_WHITE_FIND_BYSTRINGS        102  // * 
#define FR_IP_IOCTL_TYPE_WHITE_MIRROR_INSERT_IP        103
#define FR_IP_IOCTL_TYPE_WHITE_MIRROR_INSERT_BYSTRINGS    104  // * 
#define FR_IP_IOCTL_TYPE_WHITE_MIRROR_DELETE_IP        105
#define FR_IP_IOCTL_TYPE_WHITE_MIRROR_DELETE_IP_RANDOMLY        106  // * 
#define FR_IP_IOCTL_TYPE_WHITE_MIRROR_DELETE_BYSTRINGS    107    // * 
#define FR_IP_IOCTL_TYPE_WHITE_MIRROR_DELETE_ALL        108    //*  
#define FR_IP_IOCTL_TYPE_WHITE_SWITCH_MIRROR_UPDATE    109    // *  
#define FR_IP_IOCTL_TYPE_WHITE_REBUILD    110    // *    
#define FR_IP_IOCTL_TYPE_WHITE_COPY_HASH_STRUCT     111    // *
#define FR_IP_IOCTL_TYPE_WHITE_DUMP    112    //*  
#define FR_IP_IOCTL_TYPE_WHITE_MIRROR_INSERT_IP_BINS    113    //*  
#define FR_IP_IOCTL_TYPE_WHITE_MIRROR_DELETE_IP_BINS    114    //*  

  上述各功能的具体实现请阅读frdev源码中的fr_ip_dev_ioctl_routine函数。

 

用户空间管理工具:fripadm

  第一步,实现fripadm_black_in_exe与fripadm_white_in_exe,是分别管理黑白名单的工具,不过,较为简陋,第二步,使用shell脚本对其进行二次封装得到fripadm_black_in.sh与fripadm_white_in.sh这两个较用户友好的工具。

  fripadm为用户空间的C语言开发者们提供了如下API:

//针对ip黑名单的操作
double_hash_find_bystrings(int fd,char * str, unsigned int size) //其中fd为frdev的fd——文件描述符
double_hash_mirror_insert_bystrings(int fd,char * str, unsigned int size)
double_hash_mirror_insert_bins(int fd,char * str, unsigned int size)
double_hash_mirror_delete_bystrings(int fd,char * str, unsigned int size)
double_hash_mirror_delete_bins(int fd,char * str, unsigned int size)
double_hash_mirror_delete_ip_randomly(int fd,unsigned int size)
double_hash_mirror_delete_all(int fd)
double_hash_switch_mirror_update(int fd)
double_hash_rebuild(int fd,unsigned int modular, unsigned int rnd)
double_hash_dump(int fd)
//针对ip白名单的操作
double_hash_white_find_bystrings(int fd,char * str, unsigned int size) //其中fd为frdev的fd——文件描述符
double_hash_white_mirror_insert_bystrings(int fd,char * str, unsigned int size)
double_hash_white_mirror_insert_bins(int fd,char * str, unsigned int size)
double_hash_white_mirror_delete_bystrings(int fd,char * str, unsigned int size)
double_hash_white_mirror_delete_bins(int fd,char * str, unsigned int size)
double_hash_white_mirror_delete_ip_randomly(int fd,unsigned int size)
double_hash_white_mirror_delete_all(int fd)
double_hash_white_switch_mirror_update(int fd)
double_hash_white_rebuild(int fd,unsigned int modular, unsigned int rnd)
double_hash_white_dump(int fd)

  fripadm_black_in_exe、fripadm_white_in_exe、fripadm_black_in.sh与 fripadm_white_in.sh的具体实现请参看frdev源码。

 

最终系统测试:

  按照README所述的过程,编译、安装完毕frdev设备后,便可进行如下测试:

  原本被black所DROP的数据包,在更新了white的ip条目后,被white所ACCEPT,上图红线标出了数据包被截断的icmp_seq的区间。  

  关于frdev的陈述到此为止。

 

  最近笔者在阅读《白帽子讲Web安全》这本书时,发现了雅虎公司用于防护应用层DDoS攻击的系统Yahoo Detecting System Abuse,yahoo为此系统申请了专利保护。下面是关于这个系统的描述: 

 (Patent N0.: US 7,533,414 B1 资料来源 http://patentimages.storage.googleapis.com/pdfs/US7533414.pdf)

   A system continually monitors service requests and detects service abuses.

  First, a screening list is created to identify potential abuse events. A screening list includes event IDs and associated count values. A pointer cyclically selects entries in the table,advancing as events are received. 

  An incoming event ID is compared with the event IDs in the table. If the incoming event ID matches an event ID in the Screening list,the associated count is incremented. Otherwise, the count of a selected table entry is decremented. If the count value of the selected entry falls to Zero, it is replaced With the incoming event. 

  Event IDs can be based on properties of service users,such as user identifications, or of service request contents,such as a search term or message content. The screening list is analyzed to determine whether actual abuse is occurring.

  大概思路如下:

  此系统通过维护一个筛选表来得到用户的请求频率,以判断其是否存在service abuse,然采取相关措施,例如BLOCK。

  这种防御思想,与我们之前所提出的防御状态机有着异曲同工之妙。笔者认为这是必然的。

  前面的文章已经提过,DDoS攻击存在的主要原因之一是网络服务的开放性,我们不可能从下层来解决这样的问题(因为服务的可用性是第一要求),只能从上层分析解决.

  而应用层已经处于协议栈的最高层,所以,要防御应用层DDoS攻击,只能从应用层以上来寻找解法,故,在这种情况下,除了借助数据统计分析,难道还会有更好的方法么?

 

  在实现frdev的过程中,借助互联网解决了很多问题,所以,如果您需要frdev的源码,请在下方留下邮箱 🙂

  这是frdev在github上的地址,https://github.com/swordtao/frdev如果有小伙伴想要一起来增强frdev的功能,热烈欢迎 🙂

  通讯邮箱:at Gmail named yunthanatos 

 

 

 

UNIX网络编程读书笔记:recv和send函数

myos阅读(2)

这两个函数类似于标准的read和write函数,不过需要一个额外的参数。

#include <sys/socket.h>
ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags);
ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);
返回:读入或写出字节数——成功;-1——出错

recv和send的前3个参数等同于read和write的3个参数。flags参数的值或为0,或为下图列出的一个或多个常值的逻辑或。

flags 说明 recv send
MSG_DONTROUTE

MSG_DONTWAIT

MSG_OOB

MSG_PEEK

MSG_WAITALL

绕过路由表查找

仅本次操作非阻塞

发送或接收带外数据

窥看外来消息(recv和recvfrom)

等待所有数据(nbytes)

  热烈的笑脸

  热烈的笑脸

 
  热烈的笑脸

 
  热烈的笑脸

  热烈的笑脸

  热烈的笑脸

  热烈的笑脸

大前端WP主题 更专业 更方便

联系我们联系我们