项目需要收集服务器一些进程,计划任务和软件版本信息。
下面为相应的SHELL代码,仅供参考。
#!/bin/bash
source /etc/profile
source ~/.bash_profile
#部署路径
path="/usr/local/japp"
portfile="port.txt"
versionfile="version.txt"
processfile="process.txt"
cronfile="task.txt"
#重复执行先清空上次结果
cat /dev/null > $path/$portfile
cat /dev/null > $path/$versionfile
cat /dev/null > $path/$cronfile
#建立文件索引
updatedb
#收集进程信息
ps -eo pid,user,size,vsize,nice,stat,pcpu,pmem,fname > $path/$processfile
LANG=C sed -i '1,1d' $path/$processfile
#收集端口号和进程信息
netstat -lnptuw|grep -v grep>$path/netstat_status.txt
LANG=C sed -i '1,2d' $path/netstat_status.txt
cat $path/netstat_status.txt|awk -F " " '{print $1 " " $4 " " $6 " " $7}'>$path/port_pid.txt
#echo "protocol,port,process_id,command_name,exe_location"
while read line
do
protocol=`echo $line |awk -F " " '{print $1}'`
port=`echo $line |awk -F " " '{print $2}'|awk -F ":" '{print $NF}'`
if [ $protocol = "udp" ];then
server_pid=`echo $line |awk -F " " '{print $3}'|awk -F "/" '{print $1}'`
command_name=`echo $line |awk -F " " '{print $3}'|awk -F "/" '{print $NF}'`
else
server_pid=`echo $line |awk -F " " '{print $4}'|awk -F "/" '{print $1}'`
command_name=`echo $line |awk -F " " '{print $4}'|awk -F "/" '{print $NF}'`
fi
exe_location=`ls -la /proc/$server_pid|grep "exe ->"|grep -v grep|awk '{print $NF}'`
echo $protocol,$port,$server_pid,$command_name,$exe_location >> $path/$portfile
done<$path/port_pid.txt
rm -rf $path/netstat_status.txt
rm -rf $path/port_pid.txt
#收集crontab任务信息
ls -1 /var/spool/cron > $path/tmp.txt
while read line
do
cat /var/spool/cron/$line|grep -v "SHELL" >> $path/$cronfile
done<$path/tmp.txt
#收集版本信息
#redis
redis_path=$(ps -ef | grep -v grep | grep redis | awk '{print $8}')
if [ A$redis_path != A ];then
$(whereis $redis_path|awk -F " " '{print $2}') -v|awk '{print $1 " " $3}' > $path/tmp.txt
LANG=C sed -i 's/v=//g' $path/tmp.txt
redisver=$(cat $path/tmp.txt)
echo "$redisver $redis_path" >> $path/$versionfile
fi
#nginx
nginx_path=$(ps -ef|grep -v grep | grep -E 'master.*nginx'|awk '{print $11}')
nginx_info=$($nginx_path -v 2>&1)
echo $nginx_info > $path/tmp.txt
if [ A$nginx_path != A ];then
nginx_version=$(cat $path/tmp.txt|awk -F " " '{print $3}'|awk -F "/" '{print $2}')
nginx_name="Nginx "
if [ A$nginx_version != A ];then
echo "$nginx_name$nginx_version $nginx_path" >> $path/$versionfile
fi
fi
#tomcat
ps -ef|grep tomcat|grep -v grep|awk '{print $2}'|xargs pwdx | awk '{print $2}'|uniq > $path/tmp.txt
tomcat_path=$(ps -ef |grep tomcat|grep -v grep | awk '{print $2}'|xargs pwdx|awk '{print $2}'|head -1)
if [ A$tomcat_path != A ];then
while read line
do
tomcat_version=$(cd $line && sh version.sh|awk '/Server version/{gsub("/"," ",$4);print$4}')
if [ A"$tomcat_version" != A ];then
echo "$tomcat_version $line" >> $path/$versionfile
fi
done<$path/tmp.txt
fi
#was
ps -ef|grep -i 'WebSphere'|grep -v grep|awk '{print $2}'|xargs pwdx > /dev/null 2>&1
if [ "$?" = 0 ];then
was_path=$(locate SystemOut.log|head -1)
if [ A$was_path != A ];then
wasver=$(cat $was_path |grep "WebSphere Platform"|awk -F " " '{print $1 " " $5}'|head -1)
waspath=$(locate SystemOut.log|head -1|awk -F "/" '{print "/"$2"/"$3"/"$4"/"$5"/"$6}')
echo $wasver $waspath >> $path/$versionfile
fi
fi
#weblogic
ps -ef|grep startNodeManager|grep -v grep|awk '{print $2}'|xargs pwdx > /dev/null 2>&1
if [ "$?" = 0 ];then
weblogic_path=$(locate -r "/\registry.xml"|head -1)
if [ A$weblogic_path != A ];then
cat $weblogic_path |grep -E 'WebLogic Server.*version'|awk -F "\"" '{print $2$4 " " $6}' > $path/tmp.txt
LANG=C sed -i 's/Server//g' $path/tmp.txt
cat $path/tmp.txt >> $path/$versionfile
fi
fi
#apache
ps -ef | grep -E 'apache.*httpd'| grep -v grep|awk '{print $2}'|xargs pwdx > /dev/null 2>&1
if [ "$?" = 0 ];then
apache_path=$(locate -r "/\apachectl"|grep bin|head -1)
if [ A$apache_path != A ];then
apaver=$($apache_path -v|head -1|awk -F " " '{print $3}'|awk -F "/" '{print $1 " " $2}')
if [ A"$apaver" != A ];then
echo "$apaver $apache_path">> $path/$versionfile
fi
fi
fi
#vsftp
vsftp_path=$(ps -ef|grep vsftp|grep -v grep|awk '{print $8}')
if [ A$vsftp_path != A ];then
strings $vsftp_path|awk '/vsftpd: version/{gsub(": version","",$0);print$0}' >> $path/$versionfile
fi
#openssh
ssh_path=$(ps -ef | grep '/sshd'|grep -v grep|awk '{print $8}')
$ssh_path -V &>$path/tmp.txt
cat $path/tmp.txt | sed -n '2p' |awk -F "," '{print $1}'|awk -F "_" '{print $1 " " $2}' >> $path/$versionfile
#openssl
openssl version >$path/tmp.txt
cat $path/tmp.txt|awk -F " " '{print $1 " " $2}' >> $path/$versionfile
#mysql
mysql_sbin=$(ps -ef|grep mysqld|grep -v mysqld_safe|grep -v grep|awk '{print $8}')
mysql_pid=$(ps -ef|grep mysqld|grep -v mysqld_safe|grep -v grep|awk '{print $2}')
if [ A$mysql_sbin != A ];then
mysqlver=$($mysql_sbin -V|awk '{print "mysql"" "$3}')
mysqlpath=$(pwdx $mysql_pid|awk '{print $2}')
if [ A"$mysqlver" != A ];then
echo "$mysqlver $mysqlpath" >> $path/$versionfile
fi
fi
#JDK
ps -ef|grep jdk|grep -v grep|awk '{print $8}'|uniq > $path/tmp.txt
jdk_path=$(ps -ef|grep jdk|grep -v grep|awk '{print $8}'|head -1)
if [ A$jdk_path != A ];then
while read line
do
$line -version 2>&1 |less > $path/jdktmp.txt
jdk_ver=$(cat $path/jdktmp.txt |awk -F "\"" '/java version/{print $2}')
echo "$jdk_ver $line" >> $path/jdkverpathtmp.txt
echo "$jdk_ver" >> $path/jdkvertmp.txt
done<$path/tmp.txt
sort -k2n $path/jdkvertmp.txt | awk '{if ($0!=line) print;line=$0}' >> $path/jdkvertmp2.txt
while read line2
do
cat $path/jdkverpathtmp.txt|grep -w $line2 |awk '{print $2}'>$path/path.txt
path2=$(cat $path/path.txt |xargs | sed 's/ /,/g')
echo "JDK $line2 $path2" >> $path/$versionfile
done<$path/jdkvertmp2.txt
fi
rm -rf $path/jdkvertmp2.txt
rm -rf $path/jdkvertmp.txt
rm -rf $path/jdkverpathtmp.txt
rm -rf $path/jdktmp.txt
rm -rf $path/tmp.txt
rm -rf $path/path.txt
unset line2
unset line
unset path2
#Struts2
locate jar|grep struts2|grep -o "[0-9]\{1\}\.[0-9]\{1,2\}\.[0-9]\{1,2\}\.[0-9]\{1,2\}"|sort -k2n|awk '{if ($0!=line) print;line=$0}' > $path/tmp.txt
content=$(cat $path/tmp.txt |head -1)
if [ A$content != A ];then
while read line
do
#输出匹配版本号的jar路径
locate jar|grep struts|grep -w $line >> $path/path.txt
#截取到lib的路径
while read line2
do
echo ${line2%/*} >> $path/path2.txt
done < $path/path.txt
#去除重复
cat $path/path2.txt |sort -k2n|awk '{if ($0!=line2) print;line2=$0}' > $path/path3.txt
#合并成一行
path2=$(cat $path/path3.txt |xargs | sed 's/ /,/g')
#输出版本和路径
echo "Struts2 $line $path2" >> $path/$versionfile
done < $path/tmp.txt
fi
rm -rf $path/path2.txt
rm -rf $path/path3.txt
rm -rf $path/path.txt
unset line2
unset line
unset path2
#Spring
locate -r "spring-web.*.jar$"|grep -o "[s][p][r][i][n][g].*"|grep -o "[0-9]\{1\}\.[0-9]\{1,2\}\.[0-9]\{1,2\}"|sort -k2n|awk '{if ($0!=line) print;line=$0}' > $path/tmp.txt
content=$(cat $path/tmp.txt |head -1)
if [ A$content != A ];then
while read line
do
#输出匹配版本号的jar路径
locate -r "spring-web.*.jar$" |grep -w $line >> $path/path.txt
#截取到lib的路径
while read line2
do
echo ${line2%/*} >> $path/path2.txt
done < $path/path.txt
#去除重复
cat $path/path2.txt |sort -k2n|awk '{if ($0!=line2) print;line2=$0}' > $path/path3.txt
#合并成一行
path2=$(cat $path/path3.txt |xargs | sed 's/ /,/g')
#输出版本和路径
echo "Spring $line $path2" >> $path/$versionfile
done < $path/tmp.txt
fi
rm -rf $path/path2.txt
rm -rf $path/path3.txt
rm -rf $path/path.txt
##
rm -rf $path/tmp.txt