8月 02

linux远程通过ssh启停tomcat

  在linux上远程通过ssh启停tomcat,因为存在环境变量加载问题,所以写一个shell脚本,放在tomcat的bin目录下。CentOS测试通过。需要使用bash。因为脚本中包含脚本名字,在查找时要过滤掉自己,所以如果需要修改脚本名字,在脚本内也要相应的修改。

#!/bin/bash
# -------------------------------------------------------------------------------
# Filename:    tomcatcomm.sh
# Revision:    1.0
# Date:        2013-7-29
# Author:      simonzhang
# Email:       simon-zzm@163.com
# Description: 
# -------------------------------------------------------------------------------
# Source function library.
. /etc/init.d/functions
source /etc/profile

#### shell env
path=$(dirname $0)
if [ ${path:0:1} == . ]; then
   path=${path/./$(pwd)}
fi
my_name="tomcatcomm.sh"

###### delete tomcat`s work dir and startup server
del_start()
{
    /bin/rm -rf ${1}work/*
}

######main()
case "$1" in
  start)
       get_pid_count=`/bin/ps -ef|grep -v grep|grep -v ${my_name}|grep ${path}|wc -l`
       if [ ${get_pid_count} -gt 0 ] ; then
          /bin/ps -ef|grep -v grep|grep -v ${my_name}|grep ${path}|awk ' ''{print $2}'|xargs kill -9
          sleep 1
          get_pid_count=`/bin/ps -ef|grep -v grep|grep -v ${my_name}|grep ${path}|wc -l`
           if [ ${get_pid_count} -gt 0 ] ; then
              echo "Error"
           else
              del_start ${path}
              ${path}/startup.sh
           fi
        else
            del_start ${path}
            ${path}/startup.sh
        fi
        ;;
  stop)
        ${path}/shutdown.sh
        del_start ${path}
        sleep 1
        ;;
  restart)
	$0 stop
	$0 start
	;;
  *)
        echo $"Usage: $0 {start|stop|restart}"
        exit 1
esac

tomcat远程启停脚本

6月 20

nginx 自动封 ip 过高连接

  用命令查看web连接过高的IP地址,但是需要人工智能去封,太麻烦了,直接写个脚本自动解决。web服务器是用nginx,python为2.6
  首先在nignx的config中建立空文件deny.ip, 然后在nginx.conf 的http标签中添加“include deny.ip;”。在nginx下sbin的目录中放入自动脚本。脚本可以查到连接最大的IP,并插入屏蔽列表中,验证正确性后导入配置。全部完成或者出错后发送邮件。被封ip再次访问会报403错误,如果不希望报错可以跳转到其它页面。源码如下:

check_deny_up.py

#!/bin/python
#-*- coding:utf-8 -*-
# Filename:    main.py
# Revision:    1.0
# Date:        2012-06-20
# Author:      simonzhang
# web:         www.simonzhang.net
# Email:       simon-zzm@163.com
### END INIT INFO
import os
from string import strip
from email.mime.text import MIMEText
import smtplib

####
check_comm = "/bin/netstat -antp|grep :80|awk ' ''{print $5}'|awk -F: '{print $1}'|sort -r|uniq -c|sort -n -k1 -r"
max_ip = 100
mail_host = ‘’;
mail_user = ‘’;
mail_pwd = ‘’;
mail_to = ‘’;
mail_cc = ‘’;


def reboot_nginx_sendmail(ip_list):
    #### reboot nginx
    _get_check_confile = os.popen('./nginx -t').readlines()
    if str(_get_check_confile.find('ok')) != '-1':
        os.system('./nginx -s reload')
        _mail_content = ip_list
    else:
        _mail_content = 'Error'
    #### send mail
    msg = MIMEText(_mail_content)
    msg['From'] = mail_user
    msg['Subject'] = ' force ip.'
    msg['To'] = mail_to
    try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user, mail_pwd)
        s.sendmail(mail_user, [mail_to, mail_cc], msg.as_string())
        s.close()
    except Exception, e:
        print e


#### force out IP
def force_out(_deny_ip):
    _write_status = 0
    _read_force_file = open('../conf/deny.ip', 'rb').read()
    if  str(_read_force_file.find(_deny_ip)) == '-1':
        try:
            _get_force_file = open('../conf/deny.ip', 'ab')
            _get_force_file.write('deny %s ;\n' % _deny_ip)
            _get_force_file.close()
            _write_status = 1
            return _write_status
        except:
            return _write_status
            reboot_nginx_sendmail("Error !")
    return _write_status


def main():
    get_high_ip = os.popen('%s' % check_comm).readlines()
    _count_force_ip = 0
    _force_ip_list = ''
    for i in xrange(3):
        try:
            _get_count = strip(get_high_ip[i]).split(' ')[0]
            _get_ip = strip(strip(get_high_ip[i]).split(' ')[1])
        except:
            _get_count = 0
            _get_ip = ''
        # Maximum connection IP is Beyond the limit value
        if (int(_get_count) > max_ip) and (len(_get_ip) > 0):
            force_ip = _get_ip
            _get_status = force_out(force_ip)
            # check maximum is added in the deny.ip file
            if str(_get_status) == '1':
                _count_force_ip += 1
                _force_ip_list += ' %s ' % force_ip
#    if _count_force_ip > 0:
#        reboot_nginx_sendmail(_force_ip_list)


if __name__ == '__main__':
    main()

启动i脚本
check_deny_up.sh

#! /bin/bash
#
# make simon-zzm@163.com
#
#
### END INIT INFO

# Source function library.
. /etc/profile
cd /Data/apps/nginx/sbin/

# See how we were called.
case "$1" in
  start)
      /usr/local/bin/python check_ip_deny.py
      ;;
  *)
        echo $"Usage: $0 {start}"
        exit 1
esac

exit

将启动脚本放在crontab中运行。

6月 06

linux 两个文件取交集命令

  有两个文件a和b,a中包含b中所有数据。需要找出a文件中包含b文件内容的数据。具体操作如下:
a.txt文件
http://www.simonzhang.net/msg?phone=12320421&msg=hfeaf
http://www.simonzhang.net/msg?phone=13219543&msg=efweff3
http://www.simonzhang.net/msg?phone=12765745&msg=f3fds
http://www.simonzhang.net/msg?phone=12432321&msg=3r2r322
http://www.simonzhang.net/msg?phone=14142142&msg=rgewo3
http://www.simonzhang.net/msg?phone=14212412&msg=iv9e
http://www.simonzhang.net/msg?phone=12321243&msg=e

b.txt文件
12320421
12432321
12321243

  查找a对b的交集命令:grep -f b.txt a.txt
结果如下:
http://www.baidu.com/msg?phone=12320421&msg=hfeaf
http://www.baidu.com/msg?phone=12432321&msg=3r2r322
http://www.baidu.com/msg?phone=12321243&msg=e

举一反三,如果要找差集命令为:grep -v -f b.txt a.txt

3月 25

导出mysql 上传到ftp备份

导出mysql的库上传到ftp服务器备份,上传完毕删除本地文件。用crontab定时运行。用shell也很容以实现,毕竟在学习python,练习一下。

#!/usr/bin/env python
#-*- coding: utf-8 -*-
# ——————————————————————————-
# Filename: Back mysql
# Revision: 1.0
# Date: 2010-03-24
# Author: simon-zzm
# Email: simon-zzm@163.com
# Description:
# ——————————————————————————-
import os,time,sys
from ftplib import FTP
import datetime

###################设置参数
mysql_user=’root’
mysql_pass=’123456′
mysql_comm=’/usr/local/mysql/bin/mysqldump’
mysql_data=[‘test_a’,’test_b’] ###可以填写多个库
mysql_local_path=’/usr/local/checksystem/’
ftp_ip=’x.x.x.x’
ftp_user=’ftpuser’
ftp_pass=’test’
admin_mail=’simon-zzm@163.com’
###################开始运行
#导出的文件为gz的压缩文件,命名格式为ip地址、库名、导出日期组成。
###获得当前时间
get_time_now=time.strftime(‘%Y-%m-%d’)
###获得本机IP地址
ip = os.popen(“/sbin/ifconfig | grep ‘inet addr’ | awk ‘{print $2}'”).read()
get_local_ip = ip[ip.find(‘:’)+1:ip.find(‘n’)]
for i in mysql_data:
###拼成包名
mysql_back_name=mysql_local_path+get_local_ip+’_’+i+’_’+get_time_now+’.gz’
###拼成导出命令
gzip_command = “%s -u%s -p%s –opt %s |gzip >%s” %(mysql_comm,mysql_user,mysql_pass,i,mysql_back_name)
###导出并判断是否成功
if os.system(gzip_command)==0:
print ‘Back Successful’
###导出成功上传到ftp服务器
ftp=FTP()
ftp.set_debuglevel(2)
ftp.connect(ftp_ip,’21’)
ftp.login(ftp_user,ftp_pass)
file_handler = open(mysql_back_name,’rb’)
bufsize = 1024
ftp.storbinary(‘STOR %s’ % os.path.basename(mysql_back_name),file_handler,bufsize)
ftp.set_debuglevel(0)
file_handler.close()
ftp.quit()
print ‘up load over!’
###偷个懒使用linux命令将本地文件删掉。
os.popen(“/usr/bin/find “+mysql_local_path+”* -name *.gz -exec rm -rf {} ; “)
else:
print ‘false’
###如果导出失败,给管理员发个信,偷个懒使用linux命令解决。
mail_url=”/bin/mail -s “+get_local_ip+”back fail “+admin_mail+” os.popen(mail_url)

3月 21

linux 简单搭建vpn服务器

[整理 :张子萌 如有转载请保留整理人信息]

测试系统为redhat linux

搭建pptpd VPN服务需要内核支持mppe,内核为2.6以后的内核支持该选项。

查看内核命名# uname -r。注意:如果要远程安装调试,首先将防火墙设置为

不随操作系统启动。

1. 需要安装ppp和pptp服务,本文为使用yum安装。如果希望手动安装请到

http://poptop.sourceforge.net下载pptp源码包。

#yum -y install ppp

#yum -y install pptpd

查看内核是否加载 mppe 模块

# lsmod | grep ppp

如下图:

linux 简单搭建vpn服务器   - simon-zzm - simon个人观点

说明pptp 所又模块加载成功

2. 修改配置文件

安装完成后修改配置文件

2.1 配置pptpd.conf文件

#vi /etc/pptpd.conf

option /etc/ppp/options.pptpd # PPP使用的配置文件位置

stimeout 10 # 控制pptp连接超时,单位为秒

localip 192.168.0.1 # 服务器VPN虚拟接口将分配的IP地址

remoteip 192.168.0.234-238,192.168.0.245 # 客户端VPN连接成功后将分配的IP或IP地址范围。

说明localip和remoteip 不需要必须在同一网段,网络可以连通网段均可。

2.2 配置options.pptpd文件,此处只是对配置文件中部分配置做说明,如无特殊要求可以使用默认配置。

# vi /etc/ppp/options.pptpd

lock

auth # 启用身份验证

name cc3 # 相当于身份验证时的域,这里填上VPN服务器的名字

refuse-pap # 拒绝pap身份验证

refuse-chap # 拒绝chap身份验证

refuse-mschap # 拒绝mschap身份验证

refuse-eap # 拒绝eap身份验证

require-mschap-v2 #使用mschap-v2身份验证,使用windows可以直接建客户端

require-mppe-128 # 要求128位MPPE加密

nomppe-stateful # 无状态,有状态有mppe-stateful

ms-dns 202.106.46.151 # VPN客户端连接成功后将被分配的DNS参数,如只是ip访问可以不用此项

ms-wins 64.32.16.8 # VPN客户端连接成功后将被分配的WINS参数

proxyarp # 启用ARP代理

2.3 创建用户名和密码,可以再文件中直接编写,也可以使用命令创建。推荐使用命令创建。

2.3.1 创建用户

账户为vpntest 密码为123

#vpnuser add vpntest 123

2.3.2 删除用户:

删除 vpntest账户

#vpnuser del vpntest

2.3.3 查看当前用户表

# vpnuser show

2.3.4 直接文件编辑修改账户

#vi /etc/ppp/chap-secrets

格式如下

test pptpd 123 *

注:末尾“*”为分配给vpn客户端ip池的地址,也就是上面设置的remoteip部分。如需要分配指定IP,可以直接打入IP地址。

3. 启动pptpd服务

#service pptpd start

# /etc/init.d/pptpd start

pptpd参数有start|stop|restart|restart-kill|status,分别为启动、停止、重启、直接杀进程后重启、查看进程运行状态。

要查看连入vpn服务器的客户端信息,可以使用route命令,Use Iface列为ppp的为连入vpn服务器的客户信息。也可以使用ifconfig查看。

到此linux pptp vpn配置完成,可以使用windows来连接看看是否正常。

4. 安全防范

VPN使用GRE协议用的47端口 也需要开放 1723,如果使用防火墙需要添加如下配置。

#i ptables -A INPUT -p gre -j ACCEPT

如果开启selinux 还需要设置

#setsebool pppd_disable_trans 1

#setsebool pptp_disable_trans 1

如果客户端想用vpn server来上网的话,需要打开vpn server上的ip_forward

# echo “1” > /proc/sys/net/ipv4/ip_forward

永久更改:

# vi /etc/sysctl.conf

net.ipv4.ip_forward = 0 将 0 改为 1

保存后运行# sysctl –p 是参数生效。

设置ip伪装

#iptables -t nat -A POSTROUTING -o eth0 -j SNAT –to-source XXX.XXX.XXX.XXX (vpn 服务器公网ip)

#iptables -t nat -A FORWARD -o eth0 -j ACCEPT

如果还想访问vpn server所在的局域网,还需要在vpn server上添加路由

* 使用route 命令配置路由表 */

//添加到主机路由

# route add –host 192.168.168.110 dev eth0:1

# route add –host 192.168.168.119 gw 192.168.168.1

//添加到网络的路由

# route add –net IP netmask MASK eth0

# route add –net IP netmask MASK gw IP

# route add –net IP/24 eth1

//添加默认网关

# route add default gw IP

//删除路由

# route del –host 192.168.168.110 dev eth0

5. 常见问题处理

a) MGR: Maximum of 10 connections reduced to 3, not enough IP addresses given

说明配置文件中最大连接为10,但是只分配了3个地址。通过/etc/pptpd.conf配置文件修改

b)连接vpn后经常断线
pppd[18052]: Terminating on signal 15
pppd[18052]: Modem hangup
pppd[18052]: Connect time 1.0 minutes.
pppd[18052]: Sent 12143 bytes, received 4968 bytes.
pppd[18052]: MPPE disabled
pppd[18052]: Connection terminated.
pppd[18052]: Exit.

查看日志发现以上信息:

“Connect time 1.0 minutes.”说明用户连接vpn服务器后只连接了1分钟就断开了。

“Sent 12143 bytes, received 4968 bytes.”说明客户在连接后与vpn服务器间的传输量也不大。如

果流量过大,需要注意检查是否存在攻击。

“Terminating on signal 15”此条信息比较主要,说明vpn程序是被系统其它程序发出停止命令后强行

中断连接的。具体信号可以查看http://simon-zzm.blog.163.com/blog/static/8880952220103110240877/