“test-jb-setup”
在vi中比较方面的可以定位,但是在命令行如何要修改内容,定位就比较麻烦了,所以就想到找相关快捷键,然后就找到了
移动光标快捷键
编辑命令行快捷键
剪切、粘贴快捷键
“test-jb-setup”
shell脚本在运维中非常实用,但是也因为是脚本语言,书写调试等方面都会比较困难。以下记录学习过程中用到的内容。当然下面介绍的应该是基于bash的,曾经用过AIX下面的ksh,不太习惯。
应景,shell脚本以sh为扩展名,实际上这个没关系。只要有执行权限即可。
vi xxx.sh
chmod +x xxx.sh
./xxx.sh
参数传递比较简单,命令行后面用空格分开就可以,如
./xxx.sh 参数1 参数2
脚本中如果要使用通过$符号加序号即可获取,如
param1=$1
param2=$2
……
从上面我们看到变量其实可以简单的用 $ 显示,变量的定义比较简单,直接设置即可,引用的时候需要用$包裹,如
var1=test
echo $var1
echo ${var1}
从上面可以看出来,用 $ 或者 ${} 加变量名都可以,建议包裹一下,不容易混起来。
注意事项
如果想把一个命令的执行结果放到变量里面,可以用$()包裹,如
var1=$(ps -ef|grep tomcat)
echo ${var1}
还有一个比较特别的用法,获取当前脚本里面指定前缀或者后缀的变量,形成一个数组,如
var1=“var1”
var2=“var2”
vars=${!var*}
echo ${vars} # var1 var2
vars2=${!1@} # var1
拼接字符串
在脚本里面字符串拼接倒是比较简单,直接2个变量放一起就行了
var1=$(ps -ef|grep tomcat)
echo ${var1}”hello”
var1=“hello”
echo ${var1:1}
echo ${var1:1:3}
原始字符串var1: 123heolhhlo
替换字符串var2: o
${var1:1} ==\> 23heolhhlo
${var1:2:2} ==\> 3h
${var1\#*${var2}} ==\> lhhlo
${var1\#*h} ==\> eolhhlo
${var1#\#*$var2} ==\>
${var1#\#*h} ==\>
==============
${var1%*$var2} ==\> 123heolhhl
${var1%%*$var2} ==\>
${var1%%*h} ==\> 123heolhhlo
==============
${var1/h/i} ==\> 123ieolhhlo
${var1//h/i} ==\> 123ieoliilo
==============
${var1/%h/i} ==\> 123heolhhlo
${var1/${var2}/i} ==\> 123heilhhlo
==============
${var1//${var2}/i} ==\> 123heilhhli
${var1/%${var2}/i} ==\> 123heolhhli
可以用来处理获取文件名,扩展名,路径等等。总的来说,# 表示前缀,% 表示后缀
脚本写多,多半会碰到需要用到数组的地方,生成数组的方法比较多,用得比较多还是通过其他命令获取出来的。
arr=$(ls)
arr=(1 2 3 4 5)
echo ${#arr[ @ ]()}
echo ${arr[2]()}
echo ${arr[*]()}
arr[0]()=0
unset arr
unset arr[1]()
主要介绍数组循环,
for vv in ${arr[@]()}
do
echo ${vv}
done
function test(){
p1=$1
p2=$2
return 0
}
函数如果要有参数,不用在括号里面写,引用的时候,用 $加数字即可,当然也有可能没有,但是变量的作用域默认是全局的,也就是说这个函数里面定义了一个变量,出了函数还能用,如果是局部用,可以在变量前面加 local关键字
如果代码很多,需要重复引用,可以整理到一个单独的文件,其他文件包含它即可。引用很简单,文件名前面一个 .即可。
. 文件名
注意这里的空格。文件名可以用相对路径也可以是绝对路径,各有利弊,但是需要注意,相对路径指运行命令的路径。
使用变量的时候,不要加空格
shell 文件包含
参考资料
http://www.runoob.com/linux/linux-shell-include-file.html
http://arganzheng.iteye.com/blog/1174470
http://www.cnblogs.com/chengmo/archive/2010/10/17/1853356.html
shell 返回字符串 http://tinyweb.blog.51cto.com/2462673/982616
http://www.coder4.com/archives/3853
shell如何判断参数是一个文件还是一个文件夹? if [ -d $1 ];then ehco “$1 是目录” elif [ -f $1 ];then echo “$1 是文件” fi
http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html
这里的东西比较全面,特别是字符串相关的
function contains() { local n=$# local value=${!n} for ((i=1;i < $#;i++)) { if ”${!i}” == “${value}” ; then echo “y” return 0 fi } echo “n” return 1 }
pidc=$(pgrep -f tomcat) echo “>>>12.jstack<<<” >>${filename} echo “ pid: “${pidc}”, 对应线程情况:” >>${filename} ps -mp ${pidc} -o THREAD,tid,time |awk ‘{print $2 “ “$8}’ |sort|tail -n 6|head -n 4 >>${filename} tidcs=$(ps -mp ${pidc} -o THREAD,tid,time |awk ‘{print $2 “ “$8}’ |sort|tail -n 6|head -n 4|awk ‘{print $2}’)
for tidc in ${tidcs@} do echo “ tid:”${tidc}>>${filename} ttidc=$(printf “%x\n” ${tidc}) jstack ${pidc} |grep ${ttidc} -A 100 >>${filename} echo “ =====”>>${filename} done
echo “============”>>${filename}
su - <user> -c “bash -c ‘cd $DIR ;<service name>’”
shell的服务脚本里面加这个
==
在shell脚本中,无法对浮点数进行比较,如:
max=0.1
min=0.01
if ”$max” -gt “$min”
then
echo “YES”
else
echo “NO”
fi
这样的比较,运行后得到错误:
line 4: : 0.1: integer expression expected
因为bc和awk都支持浮点数,可以使用bc进行处理:
max=0.1
min=0.01
if echo "$max > $min" | bc
-eq 1
then
echo “YES”
else
echo “NO”
fi
也可以写成if $(echo “$max < $min”|bc) -eq 1
http://www.cnblogs.com/sunyubo/archive/2011/10/17/2282047.html 判断文件是否存在
几个坑,因为以前为了代码美观,= 号两头有空格,现在shell公然不支持,
“test-jb-setup”
希望通过脚本发送邮件,起因是zabbix里面有个地方需要发邮件。而它在Web上提供的方式比较简单,smtp服务器和helo啥啥啥的,在现在安全连接的时代,显然是不够的,可配置的项很少。好在它提供了另外一种方式,即采用脚本发送的方式。
根据以往Domino的经验,通常是一来就把sendmail干掉了,发送邮件不能随便一个服务器,马上就被当垃圾邮件被拒信了,而且就算弄个MX记录也麻烦,整个黑名单啥的。所以比较靠谱的方式,还是利用现有的服务器来发,注册一个免费邮箱。
service sendmail stop
chkconfig sendmail off
service postfix stop
chkconfig postfix off
通过
rpm -qa|grep mailx
命令可以看到系统是否安装了mail。不过发现mail和mailx在centos 7下面是一样的
见识了一下 echo命令,这大概就是Linux系列的强大之处吧,用echo就发邮件了。
echo -e "Email content" | mailx -v -s "Email subject" -S smtp-auth=login -S smtp=smtp.163.com -S from="username@gmail.com(John Doe)" -S smtp-auth-user=test@163.com -S smtp-auth-password=passw0rd recipient@some.com
用上面的命令行确实可行,但是配置有点乱,所以还有个解决方案是把配置放到 mail.rc里面去
# vim /etc/mail.rc
set from=test@163.com
set smtp=smtp.163.com
set smtp-auth-user=test
set smtp-auth-password=password
set smtp-auth=login
发送邮件的时候,使用
echo "内容" | mail -s " 标题" sendto@163.com
如果碰到需要多个smtp账号就无法处理了,其实它还有另外一种做法。
accout 163 {
set from=test@163.com
set smtp=smtp.163.com
set smtp-auth-user=test
set smtp-auth-password=password
set smtp-auth=login
}
相应的,发送命令也需要做调整,如下
echo "内容" | mail -A 163 -s " 标题" sendto@163.com
即,这里多了一个 -A 参数
用上面的方法无法实现发送带安全验证的邮件。找到参考资料的里面的老外的做法。
account exmail {
set ssl-verify=ignore
set nss-config-dir=~/.cert
set from=jenkins@yaomaitong.cn
set smtp=smtps://smtp.exmail.qq.com:465
set smtp-auth-user=username@qymail.com
set smtp-auth-password=s0m3p@zzW0rD
set smtp-auth=login
}
类似这样的,但是会报错,
#echo "内容" | mail -A exmail -v -s " 标题" sendto@163.com
Resolving host smtp.exmail.qq.com . . . done.
Connecting to 163.177.72.143:465 . . . connected.
Error initializing NSS: Unknown error -8015.
"/root/dead.letter" 11/300
. . . message not sent.
可以理解成是没有证书文件,老外的做法是获取生成证书文件。
mkdir ~/.certs && certutil -N -d ~/.certs
这个时候会发现,下面生成了几个key和cert文件
echo -n | openssl s_client -connect smtp.exmail.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/exmail.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/exmail.crt
这里的 GeoTrust SSL CA,是打开 https://exmail.qq.com,然后点开看, exmail.qq.com 上一级证书的名字,实际测试发现,其实根本也没关系
#echo "内容" | mail -A exmail -v -s " 标题" sendto@163.com
Resolving host smtp.exmail.qq.com . . . done.
Connecting to 163.177.72.143:465 . . . connected.
Error in certificate: Peer's certificate issuer is not recognized.
Comparing DNS name: "mx3.qq.com"
Comparing DNS name: "mx2.qq.com"
Comparing DNS name: "mx1.qq.com"
Comparing DNS name: "mxbiz1.qq.com"
Comparing DNS name: "mxbiz2.qq.com"
Comparing DNS name: "imap.qq.com"
Comparing DNS name: "smtp.qq.com"
Comparing DNS name: "pop.exmail.qq.com"
Comparing DNS name: "imap.exmail.qq.com"
Comparing DNS name: "smtp.exmail.qq.com"
SSL parameters: cipher=RC4, keysize=128, secretkeysize=128,
issuer=CN=GeoTrust SSL CA - G2,O=GeoTrust Inc.,C=US
subject=CN=pop.qq.com,OU=R&D,O=Shenzhen Tencent Computer Systems Company Limited,L=Shenzhen,ST=Guangdong,C=CN
220 smtp.qq.com Esmtp QQ Mail Server
>>> EHLO iZ23458bi3lZ
250-smtp.qq.com
250-PIPELINING
250-SIZE 73400320
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN
250-MAILCOMPRESS
250 8BITMIME
>>> AUTH LOGIN
334 xxxxxxx
>>> xxxxxxx
334 xxxxxxx
>>> xxxxxxx==
235 Authentication successful
>>> MAIL FROM:<51xpages@ymtest.cn>
250 Ok
>>> RCPT TO:<51xpages@ymtest.cn>
250 Ok
>>> DATA
354 End data with <CR><LF>.<CR><LF>
>>> .
250 Ok: queued as
>>> QUIT
221 Bye
其实应该来讲,用上面的方法就可以了。但是当时没有配置成功,所以采用了另外的办法。 找到一个装了 firefox的电脑,把~/.mozilla/firefox/xxxxxxxx.default/ 的 cert.db 与 key.db 拷贝到 ~/.certs文件夹下。效果居然是一样的。
因为是给zabbix用的,是一个单独的nologin账户,但是测试的时候,是在root用户下做的,通了,但是zabbix无法发邮件,后来发现问题出在 certs路径上,它指向的是当前用户的 .certs文件夹。 然后拷贝过来,发现另外一个问题,权限不对,zabbix没有 r权限,都是root用户的
Error in certificate: Peer’s certificate issuer is not recognized.
不加v参数会有这个问题
Error in certificate: Peer’s certificate issuer is not recognized.
参数说明
-r 指定发件人
-c 指定抄送人
-b 指定密送人
-s 邮件主题
-V 显示版本
-v 发送过程
多个收件人之间用逗号分隔
“test-jb-setup”
买了一个TP-Link ,还有点贵的 安装里面没有linux驱动,官网倒是有,结果装不上,编译的时候各种报错
后来别人说这个是Realteck的什么鬼,估计是内核
lsusb。可以看到一些东西,
然后有些人就说这个东西,里面有个型号,估计是注册到use什么什么鬼的东西吧,也没装上.编译各种错
https://sites.google.com/site/easylinuxtipsproject/reserve-7#TOC-Realtek-RTL8192EU-chipset-0bda:818b-
http://blog.163.com/thinki_cao/blog/static/83944875201311481635188
http://askubuntu.com/questions/346919/does-anyone-have-drivers-for-a-tp-link-tl-wn823n-usb-wireless
http://www.linux-hardware-guide.com/zh/2013-04-21-tp-link-tl-wn823n-mini-wireless-n-usb-300mbps
http://ubuntuforums.org/showthread.php?t=2266703
https://wikidevi.com/wiki/TP-LINK_TL-WN823N_v1
于是,换了一个东西。
https://drive.google.com/file/d/0B_PyshAvItmPX3pwVEhKNEdDRTA/view
用这个东西可以装了。也可以搜索信号了,但是最后报错了
Bus 001 Device 006: ID 0bda:8178 Realtek Semiconductor Corp. RTL8192CU 802.11n WLAN Adapter
iwlist
iwconfig
http://lyjilu.iteye.com/blog/2059084
https://sites.google.com/site/easylinuxtipsproject/reserve-7
https://forum.ubuntu.org.cn/viewtopic.php?f=116&t=468417
https://wireless.wiki.kernel.org/en/users/Drivers
想不到echo命令功能这么强大, 能发邮件,还能下载东西什么的
“test-jb-setup”
想要上一套监控系统,所以研究了一点点ngix对外提供监控的方法,目前了解的情况,nginx对外提供监控的方法是设置一个url地址,里面加一个特殊的参数。
#2.1、 nginx配置
在location里面顶一个监控需要的地址,如下:
location /ngx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
allow 10.162.67.111;
deny all;
}
这里有3个关键参数:
#2.2、 zabbix-agent配置
本质上,zabbix对nginx的监控是通过zabbix-agent来完成的,所以需要借助zabbix-agent的功能来实现。
mkdir /etc/zabbix/scripts
vim /etc/zabbix/scripts/ngx_status.sh
#!/bin/bash
# DateTime: 2015-10-25
# AUTHOR:凉白开
# WEBSITE: http://www.ttlsa.com
# Description:zabbix监控nginx性能以及进程状态
# Note:此脚本需要配置在被监控端,否则ping检测将会得到不符合预期的结果
HOST="127.0.0.1"
PORT="80"
# 检测nginx进程是否存在
function ping {
/sbin/pidof nginx | wc -l
}
# 检测nginx性能
function active {
/usr/bin/curl "http://$HOST:$PORT/ngx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
function reading {
/usr/bin/curl "http://$HOST:$PORT/ngx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
function writing {
/usr/bin/curl "http://$HOST:$PORT/ngx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
function waiting {
/usr/bin/curl "http://$HOST:$PORT/ngx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
function accepts {
/usr/bin/curl "http://$HOST:$PORT/ngx_status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
function handled {
/usr/bin/curl "http://$HOST:$PORT/ngx_status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
function requests {
/usr/bin/curl "http://$HOST:$PORT/ngx_status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
# 执行function
$1
chmod +x /etc/zabbix/scripts/ngx_status.sh
cat << EOF > /etc/zabbix/zabbix_agent.d/userparameter_nginx.conf
>UserParameter=nginx.status[*],/etc/zabbix/scripts/ngx_status.sh $1
>EOF
service zabbix-agent restart
导入模板即可
有种可能是ngx_status.sh 没有加执行权限,可以通过 /var/zabbix/zabbix_agent.log查看