shell脚本统计apache日志中页面访问量

需求:在程序中有两个页面,用于某种用途,现需要统计这两个页面在每分钟内的访问量,包括总访问次数,成功次数(状态码200),失败次数。然后写入到mysql中。

mysql字段:id(自增长)、time(实际统计时间)、year、month、day、hour、visit(总访问量)、success、fail、target(目标)

脚本下载地址:https://www.rootop.org/rs/shell_scripts/analysis_apache_log.sh

#!/bin/bash
#Create By  : www.rootop.org
#MailAddress: venus@rootop.org
#Version    : analysis_apache_log ver1.0
#Data       : 2014/11/12
#Desc       : analysis apache log for witch pages with one minutes
#install bc packages with yum install -y bc if not found bc command

logdir=/var/log/httpd/80/access
logfile=$logdir/$(date +%Y%m%d)_access_log

month=$(date|awk '{print$2}')
day=$(date|awk '{print$3}')
year=$(date|awk '{print$6}')
hour=$(date|awk '{print$4}'|cut -d: -f1)
min=$(date|awk '{print$4}'|cut -d: -f2)

# get current system times to /tmp
echo $month > /tmp/month.txt
echo $day > /tmp/day.txt
echo $year > /tmp/year.txt
echo $hour > /tmp/hour.txt
echo $min > /tmp/min.txt

# compute run minute
if [ "$min" == "00" ]; then
        RUN_MINUTE=59
        else
                if [ "$(awk -F '' '{print$(NF-1)}' /tmp/min.txt)" == "0" ]; then
			echo $(awk -F '' '{print$NF}' /tmp/min.txt) > /tmp/min2.txt
                        echo $(cat /tmp/min2.txt) -1|bc > /tmp/run_minute.txt

				if [ "cat /tmp/run_minute.txt" == "0" ]; then
                                	RUN_MINUTE=00
				else
					RUN_MINUTE=0$(cat /tmp/run_minute.txt)
                                fi

                else

                         echo $(cat /tmp/min.txt) -1|bc > /tmp/run_minute.txt
				if [ "$(cat /tmp/run_minute.txt)" == "9" ]; then
					RUN_MINUTE=09
				else
	                        	RUN_MINUTE=$(cat /tmp/run_minute.txt)
				fi
                fi

fi

# compute run hour
if [ "$hour" == "00" ]; then
        if [ "$min" == "00" ]; then
        RUN_HOUR=23
	else
		RUN_HOUR=$hour
        fi
	else
		if [ "$min" == "00" ]; then
			if [ "$(awk -F '' '{print$(NF-1)}' /tmp/hour.txt)" == "0" ]; then
			echo $(awk -F '' '{print$NF}' /tmp/hour.txt) > /tmp/hour2.txt
			echo $(cat /tmp/hour2.txt) -1|bc >/tmp/run_hour.txt
				if [ "$(cat /tmp/run_hour.txt)" == "0" ]; then
					RUN_HOUR=00
	                          else
                                	RUN_HOUR=0$(cat /tmp/run_hour.txt)
				fi
			else
				echo $(cat /tmp/hour.txt) -1|bc >/tmp/run_hour.txt
				RUN_HOUR=$(cat /tmp/run_hour.txt)
			fi
		else
			RUN_HOUR=$hour
		fi
fi

# get run log file
if [ "$hour" == "00" ]; then
	if [ "$min" == "00" ]; then
	RUN_LOG=$logdir/$(date -d last-day +%Y%m%d_access_log)
		else
		RUN_LOG=$logfile
	fi
	else
		RUN_LOG=$logfile
fi

# begin log analysis
p1=cnbpush.php
p2=jlpush.php

if [ "$hour" == "00" ]; then
	if [ "$min" == "00" ]; then
		INSERT_TIME=$(date -d '-1 hours' +%Y%m%d |cut -c 3-8)$RUN_HOUR$RUN_MINUTE
		else
		INSERT_TIME=$(date +%Y%m%d |cut -c 3-8)$RUN_HOUR$RUN_MINUTE
	fi
	else
		INSERT_TIME=$(date +%Y%m%d |cut -c 3-8)$RUN_HOUR$RUN_MINUTE

fi

echo $INSERT_TIME | cut -c 1-2 > /tmp/IY
echo $INSERT_TIME | cut -c 3-4 > /tmp/IM
echo $INSERT_TIME | cut -c 5-6 > /tmp/ID
echo $INSERT_TIME | cut -c 7-8 > /tmp/IH
INSERT_YEAR=20$(cat /tmp/IY)
INSERT_MONTH=$(cat /tmp/IM)
INSERT_DAY=$(cat /tmp/ID)
INSERT_HOUR=$(cat /tmp/IH)

CN_TOTAL_ACCESS=$(cat $RUN_LOG | grep "$p1" | awk -F ':' '{print$2$3}'| grep "$RUN_HOUR$RUN_MINUTE" | wc -l)
CN_SUCC_ACCESS=$(cat $RUN_LOG | grep "$p1" | grep "200" | awk -F ':' '{print$2$3}'| grep "$RUN_HOUR$RUN_MINUTE" | wc -l)
CN_FAIL_ACCESS=$(cat $RUN_LOG | grep "$p1" | grep -v "200" | awk -F ':' '{print$2$3}'| grep "$RUN_HOUR$RUN_MINUTE" | wc -l)

JL_TOTAL_ACCESS=$(cat $RUN_LOG | grep "$p2" | awk -F ':' '{print$2$3}'| grep "$RUN_HOUR$RUN_MINUTE" | wc -l)
JL_SUCC_ACCESS=$(cat $RUN_LOG | grep "$p2" | grep "200" | awk -F ':' '{print$2$3}'| grep "$RUN_HOUR$RUN_MINUTE" | wc -l)
JL_FAIL_ACCESS=$(cat $RUN_LOG | grep "$p2" | grep -v "200" | awk -F ':' '{print$2$3}'| grep "$RUN_HOUR$RUN_MINUTE" | wc -l)

DB_NAME=shell_log
DB_USER=root
DB_PASS=root
DB_TAB=log

mysql -u$DB_USER -p$DB_PASS $DB_NAME -e "INSERT INTO $DB_TAB(time,year,month,day,hour,visit,success,fail,target) VALUES ('$INSERT_TIME', '$INSERT_YEAR', '$INSERT_MONTH', '$INSERT_DAY', '$INSERT_HOUR', '$CN_TOTAL_ACCESS', '$CN_SUCC_ACCESS', '$CN_FAIL_ACCESS', 'cnbpush');"
mysql -u$DB_USER -p$DB_PASS $DB_NAME -e "INSERT INTO $DB_TAB(time,year,month,day,hour,visit,success,fail,target) VALUES ('$INSERT_TIME', '$INSERT_YEAR', '$INSERT_MONTH', '$INSERT_DAY', '$INSERT_HOUR', '$JL_TOTAL_ACCESS', '$JL_SUCC_ACCESS', '$JL_FAIL_ACCESS', 'jlpush');"

exit

放到任务计划,一分钟一执行。

vsftpd一键安装配置脚本 ver1.0

vsftpd一键安装配置脚本,可配合 lnmp1.0 使用(为lnmp1.0而扩展编写)。

接受用户输入ftp指定的用户名密码,可锁定用户家目录为nginx站点默认根目录,比如/usr/local/nginx/html 。在开启iptables服务时,需手动修改iptables,放行21、30000到30100端口。

下载地址:https://www.rootop.org/rs/onekey/install_vsftpd1.0.sh  推荐wget方式下载。

安装方法:

sh install_vsftpd1.0.sh  #适用于新系统,没有安装过vsftpd的机器

SourceCode:

#!/bin/bash
#Create By : www.rootop.org
#MailAddress: venus@rootop.org
#Version : install_vsftpd1.0
#Data : 2014/10/30
#Desc : for yum version
#Tested : CentOS6

# install vsftpd service
yum install -y vsftpd
clear
echo -e "\033[31m vsftpd service install done\033[0m"
echo "----------------------------------------------"
# add system user map to virtual user
#useradd -s /sbin/nologin vuser

cd /etc/vsftpd/
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

read -p "pls input a username: " user
echo "----------------------------------------------"
read -p "pls input a password: " pass
echo "----------------------------------------------"
echo -e "\033[31m whitch directory would u wanna to lock in? input full path. for example: /usr/local/nginx/html\033[0m"
echo -e "\033[31m the last character don't be end with /. use ctrl+c to go back command line. \033[0m"
echo "----------------------------------------------"
read -p "pls input a full path: " dire
echo "----------------------------------------------"
echo "your username is \"$user\" ,password is \"$pass\" , directory is \"$dire\" ."
echo "----------------------------------------------"

echo "initializaton vsftpd configuraton"
echo "----------------------------------------------"
# add virtual user from user in put
echo $user > vuser && echo $pass >> vuser

# create database file
db_load -T -t hash -f /etc/vsftpd/vuser /etc/vsftpd/vuser.db

# open virtual user
echo guest_enable=yes >> vsftpd.conf
# set map to system user
echo guest_username=www >> vsftpd.conf
# set vuser profile directory
echo user_config_dir=/etc/vsftpd/user_config >> vsftpd.conf
# set passive modu and port
echo pasv_enable=YES >> vsftpd.conf
echo pasv_min_port=30000 >> vsftpd.conf
echo pasv_max_port=30100 >> vsftpd.conf

# set pam
mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
touch /etc/pam.d/vsftpd

if [ "$(uname -a | grep x86_64 | wc -l)" == "1" ]; then

cat >/etc/pam.d/vsftpd<<EOF
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser
EOF

 else
cat >/etc/pam.d/vsftpd<<EOF
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vuser
account required /lib/security/pam_userdb.so db=/etc/vsftpd/vuser
EOF
fi
# make directory for vuser
mkdir user_config
cd user_config
touch $user

cat >$user<<EOF
local_root=$dire
download_enable=yes
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
local_umask=022
anon_umask=022
file_open_mode=0755
EOF

chown -R www:www $dire
 if [ "$(echo $?)" == "0" ]; then
 echo "change permission for $dire done"
 echo "----------------------------------------------"
 else
 echo -e "\033[31m change permission for $dire false\033[0m"
 echo -e "\033[31m install ignore\033[0m"
 exit
 fi

echo "config vsftpd done"
echo "----------------------------------------------"
if [ "$(ps aux | grep vsftpd | grep -v "grep" | wc -l)" == "1" ]; then
 service httpd restart && chkconfig vsftpd on
 echo "----------------------------------------------"
else
service vsftpd start && chkconfig vsftpd on
echo "----------------------------------------------"
fi
echo -e "\033[31m if your iptables is open ,pls accept 21,30000-30100 port\033[0m"
echo "----------------------------------------------"
echo "vsftpd install done"
echo "----------------------------------------------"
exit

如果作为单独安装,需要修改:
#useradd -s /sbin/nologin vuser
去掉前面注释
echo guest_username=www >> vsftpd.conf
www改为vuser
chown -R www:www $dire
www:www改为vuser:vuser

linux用户登录时发送邮件到指定邮箱—安全审计

linux用户在登录时,会执行 ~/.bashrc 文件(包括打开新的shell时),所以写一个脚本记录用户登录时的用户名密码以及来源地址。

首先安装mail命令包mailx和sendmail组件
[root@Rootop ~]# yum install -y mailx sendmail
[root@Rootop ~]# service postfix stop #停掉postfix,以防冲突
[root@Rootop ~]# service sendmail start #启动sendmail服务
[root@Rootop ~]# chkconfig sendmail on
[root@Rootop ~]# chkconfig postfix off

脚本如下:

#!/bin/bash
add=158534570@qq.com

echo User "\"$(whoami)\" Login At \"$(date)"\" From IP Address : \""$(w|sed -n '3p'|awk '{print$3}')"\" | mail -s LoginMessage $add
exit

编辑:
[root@Rootop ~]# vi ~/.bashrc
添加:
sh /root/mail.sh  #脚本路径

下次登录时,就会发送邮件了。

PS:
当同一个用户,或者多个用户登录时,取值会只取第三行,所以可以修改脚本,获取当前所有登录的用户,或者来自于同一个ip的同一个用户的多次登录,需要去重。这里提供思路,自行拓展。

lnmp一键安装包1.0版本发布

之前对shell不怎么研究,最近学习了下尝试写一个lnmp安装脚本。
正式发布lnmp一键安装包,水平有限,大神勿喷:

下载地址:
链接:http://pan.baidu.com/s/1mgFv34k
密码:vfos

各软件版本:

cmake-2.8.12.2.tar.gz
libiconv-1.14.tar.gz
libmcrypt-2.5.8.tar.gz
mcrypt-2.6.8.tar.gz
mhash-0.9.9.9.tar.gz
mysql-5.6.19.tar.gz
nginx-1.6.0.tar.gz
pcre-8.10.tar.gz
php-5.5.14.tar.gz
phpMyAdmin-4.2.5-all-languages.tar.gz

默认安装路径:
/usr/local/nginx
/usr/local/php
/usr/local/mysql

管理方式:
nginx : service nginx start/stop/restart/reload
mysql : service mysqld start/stop/restart/reload
php-fpm: service php-fpm start/stop/restart/reload

默认nginx根目录:
/usr/local/nginx/html/

默认mysql用户名密码为:
root redhat
mysql中root用户已允许远程访问。

phpmyadmin:
pma 路径为 /usr/local/nginx/html/pma
访问URL:
http://IPADDRESS/pma/index.php

默认脚本会关闭iptables服务。不同机器开通的端口众多,遂自行修改。注意放行22、80、3306端口。

第一版没有添加虚拟主机脚本,下一个版本会补上。

所有服务开机启动

建议大于1G内存用户使用。512内存测试时,会无法启动mysql(内存不足)。

目录结构:
[root@Rootop onekey]# tree lnmp1.0
lnmp1.0                #主目录
├── bin              #执行文件目录
│   └── nginx     #nginx管理脚本
├── conf            #配置文件目录
│   ├── mysql.sql  #设置root密码脚本
│   └── nginx.conf  #nginx配置文件
├── lnmp.sh         #安装脚本
└── source             #源代码目录
├── cmake-2.8.12.2.tar.gz
├── libiconv-1.14.tar.gz
├── libmcrypt-2.5.8.tar.gz
├── mcrypt-2.6.8.tar.gz
├── mhash-0.9.9.9.tar.gz
├── mysql-5.6.19.tar.gz
├── nginx-1.6.0.tar.gz
├── pcre-8.10.tar.gz
├── php-5.5.14.tar.gz
└── phpMyAdmin-4.2.5-all-languages.tar.gz

3 directories, 14 files

安装方法:
[root@Rootop onekey]# tar zxvf lnmp1.0.tar.gz #解压
[root@Rootop onekey]# cd lnmp1.0 #进入目录
[root@Rootop lnmp1.0]# sh lnmp.sh #执行安装脚本

安装成功截图:

在windows/linux下部署weblogic12.1

下载windows的jdk7:
地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
这里下载的版本为:jdk-7u67-windows-x64.exe

weblogic12.1部署程序:http://www.oracle.com/technetwork/middleware/fusion-middleware/downloads/index.html
这里下载的版本为:fmw_12.1.3.0.0_wls.jar (Generic WebLogic Server and Coherence installer (881MB))

安装jdk7,完成后设置环境变量:
新建 系统变量

变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.7.0_67

修改 系统变量 的Path变量,在原有变量值前面加上:

变量值: .;%JAVA_HOME%\bin;

新建 系统变量

变量名:CLASS_PATH 变量值: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\toos.jar;

设置完环境变量,重启下机器。

开始安装weblogic,到命令提示符执行:
C:\>java -d64 -jar e:\fmw_12.1.3.0.0_wls.jar
Launcher log file is C:\Users\Administrator\AppData\Local\Temp\2\OraInstall2014-
10-12_07-12-42AM\launcher2014-10-12_07-12-42AM.log.
Extracting files…………………..
Starting Oracle Universal Installer

Checking if CPU speed is above 300 MHz. Actual 2200 Passed
Checking monitor: must be configured to display at least 256 colors. Actual 65
536 Passed
Checking swap space: must be greater than 512 MB Passed
Checking if this platform requires a 64-bit JVM. Actual 64 Passed (64-bit n
ot required)

Preparing to launch the Oracle Universal Installer from C:\Users\Administrator\A
ppData\Local\Temp\2\OraInstall2014-10-12_07-12-42AM
Log: C:\Users\Administrator\AppData\Local\Temp\2\OraInstall2014-10-12_07-12-42AM
\install2014-10-12_07-12-42AM.log
You can find the log of this install session at:
C:\Users\Administrator\AppData\Local\Temp\2\OraInstall2014-10-12_07-12-42AM\ins
tall2014-10-12_07-12-42AM.log

安装过程很简单,基本都是默认配置,完成后,勾选 “automatically launch the configuration wizard” 配置weblogic。

主要配置weblogic控制台的用户密码,默认监听7001端口,https端口监听在7002,最后一步启动服务,启动的时候要求用户名密码,即为之前设置的用户名密码。服务启动后可通过浏览器 http://192.168.0.119:7001/console/ 访问了:

这里写了一个jsp测试页面,打印当前时间。将其打成war包,在weblogic中部署。

<%@page language="java" import="java.util.*"%>
now time is : <% out.println(new Date()); %>

保存为index.jsp即可。

打包:
D:\jsp>dir
驱动器 D 中的卷没有标签。
卷的序列号是 86D3-C946

D:\jsp 的目录

2014/10/14 10:13 <DIR> .
2014/10/14 10:13 <DIR> ..
2014/10/13 08:50 92 index.jsp
1 个文件 92 字节
2 个目录 21,448,970,240 可用字节

D:\jsp>jar -cvf jsp.war *
已添加清单
正在添加: index.jsp(输入 = 92) (输出 = 87)(压缩了 5%)

D:\jsp>dir
驱动器 D 中的卷没有标签。
卷的序列号是 86D3-C946

D:\jsp 的目录

2014/10/14 10:14 <DIR> .
2014/10/14 10:14 <DIR> ..
2014/10/13 08:50 92 index.jsp
2014/10/14 10:14 538 jsp.war
2 个文件 630 字节
2 个目录 21,448,970,240 可用字节

开始部署,因为部署比较简单,可以百度下weblogic部署war包。就不截图了。

通过浏览器访问测试:

这样weblogic的基础搭建就完成了。

PS:

如果之前没有配置控制台,可以从开始菜单中 “Configuration Wizard”配置。

如果控制台服务没有启动,可以从以下路径启动:C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\startWebLogic.cmd

Linux下安装:

JDK7下载页面:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
jdk-7u67-linux-x64.rpm
fmw_12.1.3.0.0_wls.jar

jdk默认安装到/usr/java下,对jdk做了一个软链接:
[root@mfsmaster java]# ln -s jdk1.7.0_67/  jdk

修改环境配置文件 /etc/profile 最底下添加下面3行:

JAVA_HOME=/usr/java/jdk
CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/lib/servlet-api.jar
PATH=$JAVA_HOME/bin:$PATH

执行 source /etc/profile 使修改的环境变量生效。

添加oracle账户:
[root@mfsmaster ~]# useradd oracle
[root@mfsmaster ~]# passwd oracle
将fmw_12.1.3.0.0_wls.jar拷贝到oracle用户的家目录中,切换到oracle用户安装
[oracle@mfsmaster ~]$ java -d64 -jar fmw_12.1.3.0.0_wls.jar
安装过程跟windows下一样,路径不同而已。

默认脚本路径:
配置weblogic控制台脚本:在/home/oracle/Oracle/Middleware/Oracle_Home/wlserver/common/bin/config.sh
weblogic控制台服务启动脚本:在/home/oracle/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/startWebLogic.sh

每次启动weblogic,都需要手动输入用户名密码,比较麻烦,修改启动脚本实现自动启动。

修改:/home/oracle/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/bin/startWebLogic.sh
在#!/bin/sh下添加一行:

WLS_USER="weblogic" export WLS_USER WLS_PW="123xxx321#" export WLS_PW

另一种方法说创建boot.properties文件定义username=和password=,但是我这里没成功。直接用第一种方法。