ubuntu:~$sudoapt-getinstallgit-coreopenssh-serveropenssh-clientgit-core是git版本控制核心软件
安装openssh-server和openssh-client是由于git需要通过ssh协议来在服务器与客户端之间传输文件
然后中间有个确认操作,输入Y后等待系统自动从镜像服务器中下载软件安装,安装完后会回到用户当前目录。如果
安装提示失败,可能是因为系统软件库的索引文件太旧了,先更新一下就可以了,更新命令如下:
ubuntu:~$sudoapt-getupdate
更新完软件库索引后继续执行上面的安装命令即可。
安装python的setuptools和gitosis,由于gitosis的安装需要依赖于python的一些工具,所以我们需要先安装python
的setuptools。
执行下面的命令:
ubuntu:~$sudoapt-getinstallpython-setuptools这个工具比较小,安装也比较快,接下来准备安装gitosis,安装gitosis之前需要初始化一下服务器的git用户信息,这个随便填。
可以通过以下命令获取gitosis版本文件
获取gitosis文件后,进入到文件目录下面
ubuntu:/tmp$cdgitosis/
接着使用python命令安装目录下的setup.py的python脚本进行安装
ubuntu:/tmp/gitosis$sudopythonsetup.pyinstall
到这里,整个安装步骤就完成了,下面就开始对git进行一些基本的配置。
二、创建git管理员账户、配置git
创建一个账户(git)作为git服务器的管理员,可以管理其他用户的项目权限。
ubuntu:/tmp/gitosis$sudouseradd-mgitubuntu:/tmp/gitosis$sudopasswdgit
然后再/home目录下创建一个项目仓库存储点,并设置只有git用户拥有所有权限,其他用户没有任何权限。
ubuntu:/tmp/gitosis$sudomkdir/home/gitrepositoryubuntu:/tmp/gitosis$sudochowngit:git/home/gitrepository/ubuntu:/tmp/gitosis$sudochmod700/home/gitrepository/
由于gitosis默认状态下会将仓库放在用户的repositories目录下,例如git用户的仓库地址默认在/home/git/repositories/目录下,这里我们需要创建一个链接映射。让他指向我们前面创建的专门用于存放项目的仓库目录/home/gitrepository。
ubuntu:/tmp/gitosis$sudoln-s/home/gitrepository/home/git/repositories
这里我将在服务器端生成ssh公钥,如果想在其他机器上管理也可以在其他机器上生成一个ssh的公钥。
ubuntu:/home/git$ssh-keygen-trsa
这里会提示输入密码,我们不输入直接回车即可。
然后用刚生成公钥id_rsa.pub来对gitosis进行初始化。
向gitosis添加公钥并初始化:$cp~/.ssh/id_rsa.pub/tmp
$sudo-H-ugitadmingitosis-init
出现如上信息说明gitosis已经初始化成功。
gitosis主要是通过gitosis-admin.git仓库来管理一些配置文件的,如用户权限的管理。这里我们需要对其中的一个post-update文件添加可执行的权限。
ubuntu:/home/git$sudochmod755/home/gitrepository/gitosis-admin.git/hooks/post-update
三、服务器上创建项目仓库
使用git账户在服务器上创建一个目录(mytestproject.git)并初始化成git项目仓库。
ubuntu:/home/git$sugit$cd/home/gitrepository$mkdirmytestproject.git$gitinit--baremytestproject.git$exit
如果出现以下信息就说明已经成功创建了一个名为mytestproject.git的项目仓库了,新建的这个仓库暂时还是空的,不能被客户端clone,还需要对gitosis进行一些配置操作。
四、使用gitosis管理用户操作项目的权限
首先需要在前面生成ssh公钥(用来初始化gitosis)的机器上将gitosis-admin.git的仓库clone下来。
在客户端机器上新建一个目录用于存放gitosis-admin.git仓库
clone正确会显示以下信息
ubuntu:~$cp/home/aaaaa/Desktop/zhangsan.pub/home/aaaaa/gitadmin/gitosis-admin/keydir/
ubuntu:~$cp/home/aaaaa/Desktop/lisi.pub/home/aaaaa/gitadmin/gitosis-admin/keydir/
继续编辑gitosis.conf文件
[gitosis]
[grouptestwrite]####可写权限组members=zhangsan####组用户writable=mytestproject####可写的项目仓库名
[grouptestread]####只读权限组members=lisi####组用户readonly=mytestproject####只读项目仓库名
因为这些配置的修改只是在本地修改的,还需要推送到服务器中才能生效。
ubuntu:~/gitadmin/gitosis-admin$gitadd.ubuntu:~/gitadmin/gitosis-admin$gitcommit-am"addauserpermission"ubuntu:~/gitadmin/gitosis-admin$gitpushoriginmaster
推送成功会显示下面提示信息
又是后新增的用户不能立即生效,这时候需要重新启动一下sshd服务
ubuntu:~/gitadmin/gitosis-admin$sudo/etc/init.d/sshrestart
现在,服务端的git就已经安装和配置完成了,接下来就需要有权限的组成员在各自的机器上clone服务器上的相应
项目仓库进行相应的工作了。
五、客户端(windows)使用git
在本地新建一个目录,使用git初始化这个目录,然后再里面新建一个文本文件用于测试,最后关联到git服务器仓库
这样服务端就创建好了一个mytestproject.git的仓库的基础版本了,现在其他组员只要从服务端进行clone就可以了。
window下面进入到需要克隆的本地目录下面右键选择gitbash选项,输入
就可以把项目clone到本地仓库了。
下面进行简单的修改和提交操作
$cdmytestproject$echo"thisisanothertextfilecreatedbyother">another.txt$gitadd.$gitcommit-am"addaanotherfilebyother"$gitpushoriginmaster
最后推送到服务器成功会显示如下信息
一、背景
系统管理员,最谨慎的linux就是rm命令了,一不小心数据就没干掉,最恐怖的是数据没有备份,没法还原了,此类事情发生的太多了,针对于此,我们经过多次尝试演练,终于成功的把大部分删除的数据找回来了,下面我把演练过程给大家介绍一下。
二、安装恢复软件
extundelete,该工具官方给出的是可以恢复ext3或者ext4文件系统被删除的文件。
1:通过命令安装
#yuminstallextundelete-y2:通过源码编译安装
首先,我们先删除一个文件,如图:
如上图,我们刚才在/boot目录下删除了个symvers-2.6.32-431.el6.x86_64.gz文件,/boot是落到/dev/sda1下
然后我们开始查找被删除的文件,需要根据分区inode查找,命令如下:
#extundelete/dev/sda1--inode2结果如下图:
我们就可以看到标识为Deleted的被删除数据了。
四、数据恢复
我们就开始恢复,命令如下:
#extundelete/dev/sda1--restore-filesymvers-2.6.32-431.el6.x86_64.gz如图:
还原成功
当然,还有可能删除整个文件夹,我们也举个例子,如下:
#extundelete/dev/sda1--restore-directorytest恢复全部删除数据,如下:
AJP是为Tomcat与HTTP服务器之间通信而定制的协议,能提供较高的通信速度和效率。如果tomcat前端放的是apache的时候,会使用到AJP这个连接器。由于我们公司前端是由nginx做的反向代理,因此不使用此连接器,因此需要注销掉该连接器。
默认Tomcat是开启了对war包的热部署的。为了防止被植入木马等恶意程序,因此我们要关闭自动部署。
修改实例:
3.配置pptp.首先我们要编辑/etc/pptpd.conf文件:
#vim/etc/pptpd.conf
localip192.168.0.1
remoteip192.168.0.234-238,192.168.0.245
注意,这里的IP段设置,将直接影响后面的iptables规则添加命令.请注意匹配的正确性,如果你嫌麻烦,建议就用本文的配置,就可以一直复制命令和文本使用了.
4.接下来我们再编辑/etc/ppp/options.pptpd文件,为VPN添加GoogleDNS:
#vim/etc/ppp/options.pptpd
在末尾添加下面两行:
ms-dns8.8.8.8
ms-dns8.8.4.4
5、设置pptpVPN账号密码.我们需要编辑/etc/ppp/chap-secrets这个文件:
#vim/etc/ppp/chap-secrets
testpptpd1234*
6、修改内核设置,使其支持转发.编辑/etc/sysctl.conf文件:
#vim/etc/sysctl.conf
net.ipv4.ip_forward=1
保存退出,并执行下面的命令来生效它:
#sysctl-p
7、添加iptables转发规则.经过前面的6个步骤,我们的VPN已经可以拨号了,但是还不能访问任何网页.最后一步就是添加iptables转发规则了,输入下面的指令:
#iptables-tnat-APOSTROUTING-s192.168.0.0/24-oeth0-jMASQUERADE
然后我们输入下面的指令让iptables保存我们刚才的转发规则,以便重启系统后不需要再次添加:
#/etc/init.d/iptablessave
然后我们重启iptables:
#/etc/init.d/iptablesrestart
8、重启pptp服务.输入下面的指令重启pptp:
#/etc/init.d/pptpdrestart
现在你已经可以连接自己的VPN并浏览网页了.不过我们还需要做最后的一步.
9、设置开机自动运行服务.我们最后一步是将pptp和iptables设置为开机自动运行,这样就不需要每次重启服务器后手动启动服务了,当然你不需要自动启动服务的话可以忽略这一步,输入指令:
#chkconfigpptpdon
#chkconfigiptableson
备注:
多ip服务器转发指定规则
iptables-tnat-APOSTROUTING-s192.168.8.0/24-jSNAT--to-source192.168.8.1
or
iptables-tnat-APOSTROUTING-s192.168.8.0/24-jSNAT--to-source服务器外网ip
如果iphone之类的设备能连上,访问网页或者youtube特别慢,需要做如下修改:
vi/etc/ppp/ip-up
增加一行
/sbin/ifconfig$1mtu1400
或者修改iptables规则
iptables-AFORWARD-ptcp--syn-s192.168.8.0/24-jTCPMSS--set-mss1356
1356的值可能需要自己调整,调节到能保证网络正常使用情况下的最大值
安装MySQL运行命令:
在安装Nginx之前,如果你已经安装Apache2先删除在安装nginx:
serviceapache2stopupdate-rc.d-fapache2removesudoapt-getremoveapache2
php-fpm是一个守护进程。安装mysql和GD扩展
sudoapt-getinstallcurllibcurl3libcurl3-devphp5-curl
可以通过访问Oracle官网下载,或者直接通过命令行下载。
exportJAVA_HOME=/usr/lib/jvm/jdk1.8.0_25/exportJRE_HOME=/usr/lib/jvm/jdk1.8.0_25/jreexportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATHexportPATH=$JAVA_HOME/bin:$PATH保存退出,并通过命令使脚本生效:
sudoupdate-alternatives--install/usr/bin/javajava/usr/lib/jvm/jdk1.8.0_25/bin/java300sudoupdate-alternatives--install/usr/bin/javacjavac/usr/lib/jvm/jdk1.8.0_25/bin/javac300sudoupdate-alternatives--configjava因为我是在虚拟机中安装的Ubuntu14.04,默认不安装OpenJDK,所以没有需要选择的JDK版本。如果是在物理机上安装的Ubuntu版本,会出现几个候选项,可用于替换java(提供/usr/bin/java)。
====================================
配置版本库#sudovisvnserve.conf#将以下参数去掉注释[general]anon-access=none#匿名访问权限,默认read,none为不允许访问auth-access=write#认证用户权限password-db=passwd#用户信息存放文件,默认在版本库/conf下面,也可以绝对路径指定文件位置authz-db=authz
备份与恢复svnadmindump备份#完整备份svnadmindump/app/svn/prj>YYmmdd_fully_backup.svn#完整压缩备份svnadmindump/app/svn/prj|gzip>YYmmdd_fully_backup.gz#备份恢复svnadminload/app/svn/prj
#备份svnadminhotcopy/app/svn/prjYYmmdd_fully_backup--clean-logs#恢复svnadminhotcopyYYmmdd_fully_backup/app/svn/prjTomcat内存优化
Linux下修改JVM内存大小
要添加在tomcat的bin下catalina.sh里,位置cygwin=false前。注意引号要带上,红色的为新添加的.
#OSspecificsupport.$var_must_besettoeithertrueorfalse.JAVA_OPTS="-server-Xms512M-Xmx512M-Xss256K-Djava.awt.headless=true-Dfile.encoding=utf-8-XX:PermSize=64M-XX:MaxPermSize=128m"cygwin=false
当然一定有人接私活接的很好,只是别人的成功很难複制,但别人的失败可以避免,如果你能避掉我以上所说的陷阱也无法保证你能成功,因为这也只是冰山一角,我已经离开接私活的状态很久,很多事忘了也不想去想,只是希望你在决定接私活前,仔细想一下,你真的只有接私活这个选项吗如果可以,我会建议你应该要开发自己的产品及服务。
在jsp中使用EL表达式时,不可以使用java提供的功能,比如indexOf()等。
WopusIDC一直致力于为广大独立博客用户提供优质实惠的专业博客主机服务,现已积累有超过四年的专业博客主机服务经验,成为众多独立博客们的主机首选。
从国外主机到国内主机,WopusIDC给用户带来多种主机选择,打破访问速度的瓶颈,给广大独立博客用户带来更佳的主机体验。
2.关闭selinuxvi/etc/sysconfig/selinux//将SELINUX=enforcing修改为disabled然后重启生效
13.测试nginx是否解析php输入:192.168.1.105/info.php显示php界面说明解析成功
本文主要讲述如何使用Linux系统中的日志子系统及其命令,来更好地保护系统安全。
Linux系统中的日志子系统对于系统安全来说非常重要,它记录了系统每天发生的各种各样的事情,包括那些用户曾经或者正在使用系统,可以通过日志来检查错误发生的原因,更重要的是在系统受到黑客攻击后,日志可以记录下攻击者留下的痕迹,通过查看这些痕迹,系统管理员可以发现黑客攻击的某些手段以及特点,从而能够进行处理工作,为抵御下一次攻击做好准备。
在Linux系统中,有三类主要的日志子系统:
Linux下日志的使用
1.基本日志命令的使用
utmp文件被各种命令文件使用,包括who、w、users和finger。而wtmp文件被程序last和ac使用。但它们都是二进制文件,不能被诸如tail命令剪贴或合并(使用cat命令)。用户需要使用who、w、users、last和ac来使用这两个文件包含的信息。具体用法如下:
rootpts/0May921:11(10.0.2.128)
rootpts/1May921:16(10.0.2.129)
lhwenpts/7May922:03(10.0.2.27)
日志使用注意事项
另外,尤其提醒管理人员注意的是:日志并不是完全可靠的。高明的黑客在入侵系统后,经常会打扫现场。所以需要综合运用以上的系统命令,全面、综合地进行审查和检测,切忌断章取义,否则很难发现入侵或者做出错误的判断。
devinpts/110.0.2.221MonJul2115:08-down(8+17:46)
devinpts/110.0.2.221MonJul2114:42-14:53(00:11)
changyipts/210.0.2.141MonJul2114:12-14:12(00:00)
devinpts/110.0.2.221MonJul2112:51-14:40(01:49)
rebootsystemboot2.4.18FriJul1815:42(11+17:13)
rebootsystemboot2.4.18FriJul1815:34(00:04)
rebootsystemboot2.4.18FriJul1815:02(00:36)
UsernamePortFromLatest
rootpts/110.0.2.129二5月1010:13:26+08002005
opalpts/110.0.2.129二5月1010:13:26+08002005
2.使用Syslog设备
Syslog已被许多日志函数采纳,被用在许多保护措施中,任何程序都可以通过syslog记录事件。Syslog可以记录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能记录本地事件或通过网络记录另一个主机上的事件。
Syslog设备核心包括一个守护进程(/etc/syslogd守护进程)和一个配置文件(/etc/syslog.conf配置文件)。通常情况下,多数syslog信息被写到/var/adm或/var/log目录下的信息文件中(messages.*)。一个典型的syslog记录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围。
#Logallthemailmessagesinoneplace
mail.*/var/log/maillog
其他设备也有自己的日志。UUCP和news设备能产生许多外部消息。它把这些消息存到自己的日志(/var/log/spooler)中并把级别限为\"err\"或更高。例如:
#Savenewserrorsoflevelcritandhigherinaspecialfile.
uucp,news.crit/var/log/spooler
当一个紧急消息到来时,可能想让所有的用户都得到。也可能想让自己的日志接收并保存。
#Everybodygetsemergencymessages,pluslogthemonanthermachine
*.emerg*
用户可以在一行中指明所有的设备。下面的例子把info或更高级别的消息送到/var/log/messages,除了mail以外。级别\"none\"禁止一个设备:
#Loganything(exceptmail)oflevelinfoorhigher
#Don\'tlogprivateauthenticationmessages!
*.info:mail.none;autHPriv.none/var/log/messages
在有些情况下,可以把日志送到打印机,这样网络入侵者怎么修改日志都不能清除入侵的痕迹。因此,syslog设备是一个攻击者的显著目标,破坏了它将会使用户很难发现入侵以及入侵的痕迹,因此要特别注意保护其守护进程以及配置文件。
3.程序日志的使用
许多程序通过维护日志来反映系统的安全状态。su命令允许用户获得另一个用户的权限,所以它的安全很重要,它的文件为sulog,同样的还有sudolog。另外,诸如Apache等Http的服务器都有两个日志:access_log(客户端访问日志)以及error_log(服务出错日志)。FTP服务的日志记录在xferlog文件当中,Linux下邮件传送服务(sendmail)的日志一般存放在maillog文件当中。
有效选项:-d[--daemon]:后台模式--listen-port参数:监听端口(后台模式)--listen-host参数:监听主机名或IP地址(后台模式)--foreground:在前台运行(调试时有用)-h[--help]:显示这个帮助--version:显示程序版本信息-i[--inetd]:inetd模式-r[--root]参数:服务根目录-R[--read-only]:强制只读成;优先于仓库配置文件-t[--tunnel]:隧道模式--tunnel-user参数:隧道用户名(模式是当前用户UID的名字)-X[--listen-once]:监听一次(调试时有用)--pid-file参数:将服务进程ID写入文件ARG中--service:作为windows服务运行(仅SCM)[/quote]
你可以用--listen-port指定端口
为svnserve加上--listen-port参数,比如svnserve-d-rd:\svn--listen-port81
导出:
$svnadmindumprepos>dumpfile//将指定的版本库导出成文件dumpfile
新建:
$svnadmincreatenewrepos
导入:
$svnadminloadnewrepos DNS是域名系统(DomainNameSystem)的缩写,它的作用是将主机名解析成IP(正向解析),从IP地址查询其主机名(反向解析)。 3.唯高速缓存服务器(hint)缓存服务器负责临时存储主域名服务器己解析过域名记录。 打算用两个vps,一个做主域名服务器,一个做辅助域名服务器。系统用的是CentOS5.6(32bit)。 Linux上常用的是bind,包括以下软件包:bindbind-libsbind-utilsbind-chrootcaching-nameserver bind是DNS服务器软件bind-libs是bind使用的库bind-utils是bind查询工具caching-nameserver唯高速缓存服务器 一、安装DNS服务器 1.开始安装DNS服务器: yuminstallbindbind-libsbind-utilsbind-chroot 这里更新源上的版本是bind9.3.6-16.P1.el5,DNS的配置文件放在/var/named/chroot目录下。 2.复制配置规范文件: cp/usr/share/doc/bind-9.3.6/sample/etc/*/var/named/chroot/etccp-a/usr/share/doc/bind-9.3.6/sample/var/named/*/var/named/chroot/var/named 3.尝试启动DNS服务器: servicenamedrestart 显示: Stoppingnamed:[OK]Startingnamed:[FAILED] 查看系统日志: cat/var/log/messages|grepnamed 发现错误: /usr/sbin/dns-keygen5L6JQccNVZ53CHA3iW4VnPgDZXdcX3U3pnhL2txKUsaPqwBRddE58LpA7uiI 编辑/var/named/chroot/etc/named.conf文件,添加ddns_key: vim/var/named/chroot/etc/named.conf 修改如下: 添加好ddns_key后,重启named服务成功,但是DNS服务器还不能使用,需要进行其他配置。 5.首先设置/var/named/chroot/var/named/data目录的用户和组为named:named: cd/var/named/chroot/var/namedchownnamed:nameddata 6.为/var/named/chroot/var/named目录添加写权限: cd/var/named/chroot/varchmodg+wnamed vim/var/named/chroot/etc/named.confrecursionyes;//打开递归allow-query-cache{any;};//允许查询缓存 8.再重启DNS服务器: servicenamedrestartStoppingnamed:[OK]Startingnamed:[OK] 启动成功。 此时查看日志: tail-30/var/log/messages|grepnamed 没有报错即可。 9.设置开机自启动: 此时这个DNS服务器就可以使用了。windows系统下修改网络连接里的DNS服务器地址用ping、nslookup命令测试。linux系统修改/etc/resolv.conf里的nameserver地址,使用host、dig、nslookup命令测试。 二、配置区域主域名服务器以test.com域为例子:www.test.com192.168.1.100//web服务ns.test.com192.168.1.101//域名服务work.test.com192.168.1.100mail.test.com192.168.1.103//邮件服务ftp.test.com192.168.1.104//文件服务 1.编辑/var/named/chroot/etc/named.rfc1912.zones文件: vim/var/named/chroot/etc/named.rfc1912.zones 在最后添加正向解析区域test.com: 然后添加反向解析区域1.168.192.in-addr.arpa: 2.创建正向解析数据文件/var/named/chroot/var/named/test.com.zone: cd/var/named/chroot/var/namedcplocalhost.zonetest.com.zone 3.编辑test.com.zone文件: vimtest.com.zone 修改如下 4.创建反向解析数据文件/var/named/chroot/var/named/test.com.resv: cpnamed.localtest.com.resv 5.编辑test.com.resv文件: vimtest.com.resv 7.重启服务: 此时客户端请求解析test.com域会直接使用设置的参数,不会向根去询问。 三、配置辅域名服务器配置辅域名服务器相对来说简单不少,只要主配置文件中加入一个区域,然后指定可以更新信息的主域名服务器就可以了,无需配置区域数据库文件。 3.设置/var/named/chroot/var/named/slaves目录用户和组为root:named: cd/var/named/chroot/var/namedchownroot:namedslaves 为/var/named/chroot/var/named/slaves添加写权限: chmodg+wslaves named用户对slaves目录没有写权限会同步不了主域名服务器上的解析数据文件。 4.重启DNS服务: 5.查看/var/named/chroot/var/named/slaves目录:产生test.com.hoststest.com.resv文件,说明更新成功。 需要注意:1)主从服务器中正/反向zone名称必须一致。2)从服务器中file可指定相对路径,也可指定绝对路径。3)需将辅助DNS服务器的首选DNS服务器指向为主DNS服务器。 与其他Linux发行版相比,Gentoo确实有其优势的地方,如内核基于源代码编译,可以自动优化与定制,升级方便等! Host机环境:Win2008+VMware7.1 下载安装包 下载安装CD和stage3包: 开始安装 将安装CD插入虚拟机,默认引导进入终端。 先配置好网络,之后的操作可以全部通过ssh连接来操作。 设置root用户密码: passwdroot 启动sshd服务: /etc/init.d/sshdstart 磁盘分区 先分区,建议使用cfdisk,先查看分区情况: cfdisk/dev/sda 我的分区表(/boot分区我单独分出来),/dev/sda2是/根分区,/dev/sda3是swap分区: 格式化分区: mkfs.ext3/dev/sda1mkfs.ext3/dev/sda2mkswap/dev/sda3 激活swap交换分区: swapon/dev/sda3 将分区信息写入fstab配置文件:(注:gentoo-minimal没带vi编辑器,只带有nano编辑器。) nano-w/etc/fstab 写入下面的分区信息: /dev/sda1/bootext3noauto,noatime12/dev/sda2/ext3noatime01/dev/sda3noneswapsw00 解压stage3和portage 创建基本目录结构: mount/dev/sda2/mnt/gentoomkdir/mnt/gentoo/bootmount/dev/sda1/mnt/gentoo/bootcd/mnt/gentoo 使用WinSCP或CuteFTP上传stage3软件包到/mnt/gentoo下,然后解压: (注:上面标签的地址之前没改过来,实际地址是192.168.80.133) tarjxvfstage3-i686-20100608.tar.bz2rm-fstage3-i686-20100608.tar.bz2 上传portage包到/mnt/gentoo/usr,然后解压: tarjxvfportage-20100617.tar.bz2rm-fportage-20100617.tar.bz2 切换系统 主机域名设置 编译安装内核 lsmod 找到网卡驱动模块: floppy557360rtc79600tg31032280libphy249521tg3e10001146360fuse593440jfs1531040raid10206480 下载源码,配置内核: 在配置界面输入/e1000,搜索e1000,找到驱动所在位置: |Symbol:E1000[=y]|Prompt:Intel(R)PRO/1000GigabitEthernetsupport|Definedatdrivers/net/Kconfig:2020|Dependson:NETDEVICES&&NETDEV_1000&&PCI|Location:|->DeviceDrivers|->Networkdevicesupport(NETDEVICES[=y])|->Ethernet(1000Mbit)(NETDEV_1000[=y]) (这里一定要注意,选对内核的网卡驱动!) 虚拟机的硬盘使用的SCSI适配器为LSILogic。 需要增加对FusionMPTbasedriver的支持(见dmesg日志): 必须添加这个驱动,否则系统启动时可能出现类似以下错误: 增加对ext4文件系统的支持: 开始编译内核: make-j2makemodules_installcparch/x86/boot/bzImage/boot/kernel 安装配置grub emergegrub grub>root(hd0,0)>setup(hd0)>quit 编辑启动配置文件grub.conf: nano-w/boot/grub/grub.conf grub.conf内容如下: default0timeout9 titleGentooroot(hd0,0)kernel/boot/kernelroot=/dev/sda2 系统配置 文件系统挂载点: nano-w/etc/fstab/dev/sda1/bootext3noauto,noatime12/dev/sda2/ext3noatime01/dev/sda3noneswapsw00 网络设置: SSH服务设置: rc-updateaddsshddefault 时区设置: cp/usr/share/zoneinfo/Asia/Shanghai/etc/localtimenano-w/etc/conf.d/clock 设置root密码: 重启,完成安装 exitumount/mnt/gentoo/dev/mnt/gentoo/proc/mnt/gentoo/boot/mnt/gentooreboot 如图,Gentoo启动成功: OK,完成! 接著找到 ##compressmodule 在下面加入 做完上面的动作后,基本上.txt.html.css.js的文件都会被Gzip压缩了。但php此时还没有压缩 编译后配置: 如果你的Linux是RedHat/CentOS,那么: 如果你的Linux是SuSE,那么: 改为 2)server.document-root,server.error-log,accesslog.filename需要指定相应的目录 5)配置rubyonrails 最简单的配置如下: 则www.domain.cn为主机的网址都交给tomcat处理,tomcat的端口号为8080.在tomcat的虚拟主机中,需要捕获www.domain.cn这个主机名,设置这个虚拟主机。这里的host都是跟tomcat里面的虚拟主机对应的。 gettext zlib libpng jpeg mkdir/usr/local/jpeg6/binmkdir-p/usr/local/jpeg6/binmkdir-p/usr/local/jpeg6/man/man1mkdir-p/usr/local/jpeg6/libmkdir-p/usr/local/jpeg6/includemakeinstall-libmakeinstall freetype gd PHP 可以使用php-m查看你安装的模块 eAcceleratoreAccelerator是一个开源的PHP加速器 执行好后,会提示安装到的路径,下面会用到,如我的被安装到这里/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613编辑php.ini中的内容vim/etc/php.ini zend_extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"eaccelerator.shm_size="16"eaccelerator.cache_dir="/tmp/eaccelerator"eaccelerator.enable="1"eaccelerator.optimizer="1"eaccelerator.check_mtime="1"eaccelerator.debug="0"eaccelerator.filter=""eaccelerator.shm_max="0"eaccelerator.shm_ttl="0"eaccelerator.shm_prune_period="0"eaccelerator.shm_only="0"eaccelerator.compress="1"eaccelerator.compress_level="9" 如果一切顺利,你可以通过下面命令来验证是否安装成功 语法结构 如: 再如: 当一个服务器宕机后,它上面的请求将被转移给其他设备server 数据的唯一性是所有应用程序非常基本的要求,由开发者或者用户来维护这种唯一性存在着较大的风险,因此,由系统自动产生唯一标识是一种常见的做法。OpenJPA中支持四种不同的实体标识自动生成策略: 这四种方式各有优缺点,开发者可以根据实际情况进行选择。 可选择的注释 要让容器和数据库结合管理实体标识的自动生成,根据实际情况的不同,开发者可以选择javax.persistence.*包下面的GeneratedValue、SequenceGenerator、TableGenerator三个注释来描述实体的标识字段。 每一个需要自动生成实体标识的实体都需要为它的实体标识字段提供GeneratedValue注释和相应的参数,OpenJPA框架会根据注释和参数来处理实体标识的自动生成。 使用GeneratedValue注释自动生成的实体标识可以是数值类型字段如byte、short、int、long等,或者它们对应的包装器类型Byte、Short、Integer、Long等,也可以是字符串类型。 GeneratedValue注释可以支持两个属性strategy和generator。 如果实体标识的自动生策略是GenerationType.SEQUENCE,开发者需要为实体标识字段提供SequenceGenerator注释,它的参数描述了使用序列号生成实体标识的具体细节。该注释支持以下四个属性: 如果实体标识的自动生策略是GenerationType.TABLE,开发者需要为实体标识字段提供TableGenerator注释,它的参数描述了使用数据库表生成实体标识的具体细节。该注释支持下列属性: 实体标识自动生成 我们首先假设有一个Animal实体需要被持久化,它包括ID和NAME属性,其中ID是它的主键字段。Animal实体的标识需要自动生成,我们将分析在这四种不用的情况下,如何使用OpenJPA提供的注释,结合具体数据库支持的特性,如自增长字段、序列号等来实现实体标识的自动生成。 容器自动生成 OpenJPA容器默认的实体标识自动生成策略是由容器管理实体标识的自动生成,容器管理的实体标识可以支持数值型和字符型两种。当容器管理的实体标识是数字型时,OpenJPA容器自动创建一个数据库表OPENJPA_SEQUENCE_TABLE,用其中的SEQUENCE_VALUE字段来记录实体的实体标识的增长。 当容器管理的实体标识是字符串类型时,OpenJPA支持使用uuid-string和uuid-hex两种方式生成相应的实体标识。如果我们选择使用uuid-string方式生成实体标识时,OpenJPA框架会自动为实体生成一个128位的UUID,并且将这个UUID转化为使用16位字符表示的字符串。如果我们选择使用uuid-hex方式生成实体标识时,OpenJPA框架会自动为实体生成一个128位的UUID,并且将这个UUID转化为使用32位字符表示的16进制的字符串。 数值标识 容器管理的实体标识可以是数值型的,OpenJPA框架管理的实体标识借助于数据库的表来实现,在运行时OpenJPA框架会自动在数据库中创建表OPENJPA_SEQUENCE_TABLE。它有两个字段:ID和SEQUENCE_VALUE,这两个字段都是数值类型,其中ID是表的主键字段,它的内容是查询当前实体标识时所使用的关键词,默认值是0。而SEQUENCE_VALUE记录了当前OpenJPA框架中当前实体标识的历史数据,内容是已经被获取实体标识的最大数值加1。 我们要使用注释描述Animal实体的标识由容器自动生成,只需要为它的标识字段提供GeneratedValue注释,并且把它的strategy属性设置为GenerationType.AUTO,Animal实体类的代码片断如下: 容器管理实体标识的情况下,为了获得实体标识,应用程序将不得不频繁地和数据库交互,这会影响应用程序的运行效率。OpenJPA中使用实体标识缓存机制解决这个问题。默认情况下,当应用程序第一次获取实体标识时,OpenJPA框架从数据库中一次性获取50个连续的实体标识缓存起来,当下一次应用程序需要获取实体标识时,OpenJPA将首先检测缓存中是否存在实体标识,如果存在,OpenJPA将直接使用缓存中的实体标识,如果不存在,OpenJPA框架将会从数据库中再次获取50个连续的实体标识缓存起来,如此类推。这样的处理方式可以大大减少由于获取实体标识而产生的数据库交互,提升应用程序的运行效率。 OpenJPA缓存的实体标识不是永久存在的,只能在同一个EntityManagerFactory管理范围内起作用,也就是说,当获取实体标识的EntityManagerFactory对象被关闭后,这些被获取的实体标识中没有用掉的那一部分标识就丢失了,这会造成实体标识的不连续。由同一个EntityManagerFactory对象创建的EntityManager上下文之间则能够共享OpenJPA框架获取的实体标识,这意味着,我们可以使用同一个EntityManagerFactory对象创建多个EntityManager对象,用它来持久化实体,然后关闭它,在持久化过程中所需要的实体表示将会使用同一个实体标识的缓存区,因此不会引起实体标识的丢失。 容器管理的实体标识还有一个非常重要的特性:所有被容器管理的实体标识都是共享的。不管OpenJPA容器中存在多少个不同的被容器管理的实体标识,它们都会从同一个实体标识缓存中获取实体标识。我们可以用下面的例子说明这种情况:假设OpenJPA容器中存在两个实体类Dog和Fish,它们的实体标识字段都是数值型,并且都由OpenJPA管理。当我们首先持久化一个Dog对象时,它的实体标识将会是1,紧接着我们持久化一个Fish对象,它的实体标识就是2,依次类推。 uuid-string 要使用uuid-string机制自动生成实体标识,我们需要将实体主键字段的GeneratedValue注释的strategy属性设置为GenarationType.AUTO,然后将GeneratedValue注释的generator属性设置为uuid-string。以Animal实体类为例,我们只需要将Animal实体修改为如下内容: 要使用uuid-hex机制自动生成实体标识,我们必须将实体主键字段的GeneratedValue注释的strategy属性设置为GenarationType.AUTO,然后将GeneratedValue注释的generator属性设置为uuid-hex。以Animal实体类为例,我们只需要将Animal实体修改为如下内容: 自增长字段是HSQL、SQLServer、MySQL、DB2、Derby等数据库提供的一种特性,用于为数据库的记录提供自动增长的编号,应用程序的设计者通常期望将实体标识的自动生成委托给数据库的这种特性,OpenJPA框架中的实体标识能够满足应用程序设计者的要求,使用数据库的自增长字段为实体自动生成标识。 要将实体标识的自动生成委托给数据库的自增长字段特性,需要数据库和实体定义的双方配合才能够达到:首先,必须将实体标识字段对应的数据库列修改为自动增长列,另外还需要将实体类中实体标识字段的GeneratedValue注释的stragety属性的值设置为GenerationType.IDENTITY。 我们以Animal实体在HSQL数据库中的持久化来说明如何使用自增长字段自动生成实体标识所需要采取的步骤: 首先,我们使用下面的SQL语句创建Animal表,把它的ID字段设置为自动增长类型: CREATETEXTTABLEANIMAL(IDINTEGERGENERATEDBYDEFAULTASIDENTITY(STARTWITH0)NOTNULLPRIMARYKEY,NAMEVARCHAR(255)NOTNULL)在数据库部分将表的主键字段设置为自动增长字段后,在实体Animal的定义中,我们需要将id字段GeneratedValue注释的stragety属性的值设置为GenerationType.IDENTITY。Animal实体类修改后的代码片段如下。 序列号是Oracle、PostgreSQL等数据库提供的一种特性,用于为数据库的记录提供自动增长的编号,使用Oracle、PostgreSQL等数据库应用程序的设计者通常期望将实体标识的自动生成委托给数据库的这种特性,OpenJPA框架中的实体标识能够满足应用程序设计者的要求,使用数据库的序列号为实体自动生成标识。 要将实体标识的自动生成委托给数据库的序列号特性,需要数据库和实体定义的双方配合才能够达到:首先,必须在数据库中创建合适的序列号,另外还需要为实体标识字段提供SequenceGenerator注释,设置它的参数,为实体类提供关于序列号的信息,同时将实体类中实体标识字段的GeneratedValue注释的stragety属性的值设置为GenerationType.SEQUENCE,将generator属性的值设置为SequenceGenerator注释的name属性的值。 我们以Animal实体在Oracle数据库中的持久化来说明如何使用自增长字段自动生成实体标识所需要采取的步骤: 首先,在Oracle数据库中运行下面的SQL语句创建名为HelloWorldSequence的序列号,序列号支持cache,大小为50: CREATESEQUENCEHELLOWORLDSEQUENCESTARTWITH0INCREMENTBY1MINVALUE1CACHE50NOCYCLENOORDER然后,在Oracle数据库中,我们使用下面的SQL语句创建ANIMAL表: 除了使用容器生成的实体标识,或者借助于数据库的自增长字段或者序列号等方式生成实体标识之外,我们还可以选择借助数据库表来自动生成实体标识。原理是我们提供一个独立的数据库表,该表的主键列(假设列名ID)记录实体编号的特征字符串(假设存在一条记录的ID为customID),另外一列(假设列名为SEQUENCE_VALUE)记录该特征字符串对应实体标识的最大值。编写实体代码时,我们指定实体标识由数据库表中指定的特征字符串(如customID)对应的列SEQUENCE_VALUE处理,当有新的实体被持久化时,容器将获取行customID、列SEQUENCE_VALUE对应的数值+1后作为新实体的标识,同时将该列的值也自动+1。 要将实体标识的自动生成委托给数据库表,需要数据库和实体定义的双方配合才能够达到:首先,必须在数据库中创建合适的保存实体标识的表,另外还需要为实体标识字段提供TableGenerator注释,设置它的参数,为实体类提供关于数据库表、字段的信息,同时将实体类中实体标识字段的GeneratedValue注释的stragety属性的值设置为GenerationType.Table,将generator属性的值设置为SequenceGenerator注释的name属性的值。 我们以Animal实体类来说明使用数据库表自动生成实体标识所需要采取的步骤:我们假设存在这样的场景,Animal实体的标识由应用程序中自定义的数据库表MY_KEYS自动生成,MY_KEYS表中有两列,一列是KEYID,它保存实体标识的特征值,一列是KEYVALUE,它保存实体当前的最大编号,除此之外,我们还决定使用ANIMALID作为Animal实体标识的特征字符串。 首先,在数据库中使用下面的SQL语句创建名为MY_KEYS的数据库表。在OpenJPA容器中,如果我们没有创建MY_KEYS表,OpenJPA容器将帮我们自动生成对应的表结构。 CREATETABLEMY_KEYS(KEYIDVARCHAR(255)NOTNULL,KEYVALUEBIGINT,PRIMARYKEY(KEYID))在数据库部分创建合适的数据库表后,在实体Animal的定义中,我们需要将id字段GeneratedValue注释的stragety属性的值设置为GenerationType.TABLE,设置它的generator属性的值为TableGenerator。我们还需要为id字段提供另外一个注释TableGenerator,设置它的name属性为TableGenerator,设置它的table属性为MYKEYS、pkColumnName属性为KEYID、valueColumnName属性为KEYVALUE、ANIMALID属性为ANIMALID。Animal实体类修改后的代码片段如下。 调用代码 上面的章节中我们学习了分别使用四种方式来自动生成实体的标识,由于这四种情况下,Animal实体的标识都由OpenJPA和数据库协作后自动生成,对于开发者而言,这个过程是透明的,因此我们可以使用相同的方式来创建这些实体:创建新的Animal实例的时候不再需要为主键字段提供属性值,只需要设置Animal实例的非标识字段name的值即可。下面的代码演示了Animal实例的持久化代码,请注意代码中并没有调用Animal实例的setId方法。 总结 本文介绍了开发者使用OpenJPA实现实体标识自动生成时可选择使用的注释,并且结合简单的例子,分别介绍了OpenJPA中实现容器管理的实体标识自动生成、结合数据库自增长字段、序列号、数据库表等特性实现实体标识自动生成时注释的具体用法和操作步骤。 1,oracle中实例的创建:oracle中实例创建即SID的创建,通常在安装完oracle后,启动配置和移植工具中的(数据库配置向导) databaseconfigurationassistant,按照向导去创建SID,当日利用databaseconfigurationassistant还可以创建数据库、配置数据选件、删除数据库、管理模板、配置自动存储管理。 2,oracle中服务的创建:在oracle实例创建完后,就可以创建服务名了。注意:连接一个实例可以有多个服务名。启动配置和移植工具中的netmanager(网络配置),按照向导开始配置网络服务名==》TCP/IP协议==》主机名(服务端的IP地址)==》oracle8i或更高版本服务名(即SID实例名称)==》测试==》完成。 3,框架中db.properties的配置: c3p0.minPoolSize=1c3p0.maxPoolSize=30hibernate.dialect=org.hibernate.dialect.Oracle10gDialecthibernate.jdbc.batch_size=25hibernate.jdbc.fetch_size=50hibernate.show_sql=true 如何为代码选择开源许可证,这是一个问题。 下面是我制作的中文版,请点击看大图。 一、简介:BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。二、用法:BeanUtils是这个包里比较常用的一个工具类,这里只介绍它的copyProperties()方法。该方法定义如下: publicstaticvoidcopyProperties(java.lang.Objectdest,java.lang.Objectorig)throwsjava.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException如果你有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm,例如Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐个赋值: //得到TeacherFormTeacherFormteacherForm=(TeacherForm)form;//构造Teacher对象Teacherteacher=newTeacher();//赋值teacher.setName(teacherForm.getName());teacher.setAge(teacherForm.getAge());teacher.setGender(teacherForm.getGender());teacher.setMajor(teacherForm.getMajor());teacher.setDepartment(teacherForm.getDepartment());//持久化Teacher对象到数据库HibernateDAO=;HibernateDAO.save(teacher);而使用BeanUtils后,代码就大大改观了,如下所示://得到TeacherFormTeacherFormteacherForm=(TeacherForm)form;//构造Teacher对象Teacherteacher=newTeacher();//赋值BeanUtils.copyProperties(teacher,teacherForm);//持久化Teacher对象到数据库HibernateDAO=;HibernateDAO.save(teacher);如果Teacher和TeacherForm间存在名称不相同的属性,则BeanUtils不对这些属性进行处理,需要程序员手动处理。例如Teacher包含modifyDate(该属性记录最后修改日期,不需要用户在界面中输入)属性而TeacherForm无此属性,那么在上面代码的copyProperties()后还要加上一句: .tar.bz2 解压:tarjxvfFileName.tar.bz2压缩:tarjcvfFileName.tar.bz2DirName .gz解压1:gunzipFileName.gz解压2:gzip-dFileName.gz压缩:gzipFileName.tar.gz和.tgz解压:tarzxvfFileName.tar.gz压缩:tarzcvfFileName.tar.gzDirName .rpm解包:rpm2cpioFileName.rpm|cpio-div.deb解包:arpFileName.debdata.tar.gz|tarzxf- 从远程scp到本地: 从本地scp到远程: 使用方式:chmod[-cfvR][--help][--version]modefile... 使用方式:chownjessie:usersfile1.txt 正在使用的端口:netstat-ant 挂载USB:mount/dev/sdc/mnt/usb 改IP地址:ifconfigeth0192.168.2.29netmask255.255.255.0 改DNS:nano-w/etc/resolv.conf导出表结构:mysqldump-uroot-p-d--add-drop-tabledbNametableName>/opt/name.sql 导入表结构:mysqldbName 修复Mysql表:mysqlrepair--auto-repair-F-rdbNametableName 加字段:ALTERTABLEtable_nameADDfield_namefield_type; 删字段:altertablet2dropcolumnc; 字段重命名:altertablet1changeabinteger; 表重命名:altertablet1renamet2; 删索引:altertabletablenamedropindexemp_name; 最近在寻找这方面的资料: 2,查看80端口的tcp连接:netstat-tan|grep"ESTABLISHED"|grep":80"|wc-l 3,通过日志查看当天ip连接数,过滤重复: cataccess_log|grep"24/Jul/2007"|awk'{print$2}'|sort|uniq-c|sort-nr 4,当天ip连接数最高的ip都在干些什么(原来是蜘蛛):cataccess_log|grep"24/Jul/2007:00"|grep"61.135.166.230"|awk'{print$8}'|sort|uniq-c|sort-nr|head-n10 5,当天访问页面排前10的url: cataccess_log|grep"24/Jul/2007:00"|awk'{print$8}'|sort|uniq-c|sort-nr|head-n10 6,用tcpdump嗅探80端口的访问看看谁最高tcpdump-ieth0-tnndstport80-c1000|awk-F"."'{print$1"."$2"."$3"."$4}'|sort|uniq-c|sort-nr接着从日志里查看该ip在干嘛:cataccess_log|grep220.181.38.183|awk'{print$1"\t"$8}'|sort|uniq-c|sort-nr|less 删除JSP编译后的空行办法如下: 1.支持JSP2.1+,在每个要去空行的页面里包含下面代码: 2.支持servlet2.5+,即web.xml的XSD版本为2.5,在web.xml中加入如下代码 3.Tomcat5.5.x+,在Tomcat安装目录/conf/web.xml中找到名叫"jsp"的servlet,添加下面一段代码: trimSpacesShouldwhitespacesintemplatetextbetweenactionsordirectivesbetrimmed[false] 在实际操作中我加入了5.5的配置到页面中并反复启动了几次tomcat但是还是没有成功,后来才想到JSP已经编译成servlet了所以没有能改变,进入到tomcat中的work目录把已经进行JSP编译的class全部删除,哇哈哈,整个世界清净了,成功删除空行 MySQL对于字符集的指定可以细化到一个数据库,一张表,一列,应该用什么字符集。 但是,传统的程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢? 简单的总结一下,如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用latin1存储,不过我们如果安装MySQL,一般都会选择多语言支持,也就是说,安装程序会自动在配置文件中把default_character_set设置为UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用UTF-8存储。 SETNAMES'utf8'; 查看了Mysql的文档,以及Connector/J的文档以及在线说明发现,出现这种异常的原因是: 解决的方法有3种: 当然最好的办法是同时综合使用上述3种方法,下面就DBCP和C3P0分别做一说明,假设wait_timeout为默认的8小时 DBCP增加以下配置信息: C3P0增加以下配置信息: 更多的配置信息大家可以查看C3P0文档,Connector/J文档,以及DBCP的文档。 我自己的配置: jdbc.driverClass=com.mysql.jdbc.Driverjdbc.jdbcUrl=jdbc:mysql://localhost:3306/testjdbc.user=rootjdbc.password=12345jdbc.miniPoolSize=1jdbc.maxPoolSize=20jdbc.initialPoolSize=1jdbc.maxIdleTime=25000jdbc.acquireIncrement=1 jdbc.acquireRetryAttempts=30jdbc.acquireRetryDelay=1000jdbc.testConnectionOnCheckin=truejdbc.automaticTestTable=c3p0TestTablejdbc.idleConnectionTestPeriod=18000jdbc.checkoutTimeout=3000 在 catalina.bat 找到 setDEBUG_OPTS=setJPDA= 在下面添加 setJAVA_OPTS=%JAVA_OPTS%-Dcom.sun.management.jmxremote.port=1090-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false 保存 通过startup。bat启动tomcat 启动jconsole(jdk1.6.0_02\lib):输入 localhost:1090 用户名口令为空 进入即可查看 第五,坏男人的约会经验通常比好男人多得多。参照第一条,坏男人一有机会就出手,即使不成功也积累了经验,逐渐了解了女人的心理。女人大多不理智,有种种莫名其妙完全不合逻辑的偏见(比如:一个鞋上有污点的男人一定靠不住)。坏男人通过大量的实战经验在约会时把这些表面工作做得很好,而好男人却懵然不知,被唰了都不明白为什么,还以为是自己实力不够。第六,双方发生争执时,好男人自尊心,原则性强,不会轻易迁就对方,往往为些小事谁都不让步,最后只能分手。而坏男人脸皮厚,认个错比喝稀饭都容易,往往轻而易举就能哄得对方回心转意;当然,那是在他还没有玩腻的时候,否则即使女方让步他也能找出借口分手,有时候女人反而会一再让步,彻底沦为坏男人的玩物。第七,好男人原则性强,循规蹈矩,往往显得乏味。而坏男人一心追求刺激,变化多端,常常给女人以新鲜感。不知不觉中,女人就被坏男人迷惑住,控制住了。 第八,如果女人认识到双方不合适,提出主动分手。好男人只会采取光明正大的手段,实际效果有限;而坏男人可以不择手段,死缠滥打,威逼利诱。女人的惰性强,情感多变,又容易向强势低头,常常摆脱不了坏男人的下三滥手段。