背景
之前做了个数据平台系统的自动部署脚本开发,期间主要使用shell脚本来实现整个系统的部署,有些印象较深的脚本语句,这边做一个整理。
脚本语句
1. 验证服务器中安装的python版本
PY_VERSION=`python3 -V 2>&1|awk '{print $2}'|awk -F '.' '{print $1}'`
2. 安装rpm格式的yum软件
rpm -ivh dos2unix-6.0.3-7.el7.x86_64.rpm
3. 执行python脚本
python3 -c 'import func_python; func_python.modifyConfigServerYaml();'
4. 重写指定字符串所在行
sed -i s#BASE_USER_PATH=.*#BASE_USER_PATH=/home/test# test.sh
注:#号换成/号也可
5. 指定文件夹所属用户和用户组(一般由root用户使用)
chown -R test:test /home/log/
6. 查找某字符串所在行并注释掉(例子中为redis)
#这个只是我使用的脚本,应该有更简洁的脚本
num=$(sed -n '/redis/=' filename)
sed -i "$num s/^/#&/" filename
7. 注释掉某字符串出现的所有行
sed -i 's/^[^#].*password*/#&/g' filename
8. 根据指定符号(例子为“:”)截取字符串(第三个/后的空格是必须的)
#esPass的格式类似于 elastic:123456
array=(${esPass//:/ })
esUserName=${array[0]}
esPassword=${array[1]}
9. 远程登录服务器并切换用户执行shell命令(shell命令为执行postgresql库的sql命令),并将结果输出到指定文件
ssh -l root $serverip "su - $gpuser -c 'cd /home/$gpuser; psql -h $serverip $dbname -U $gpuser -f get_authFilePath.sql >> res.txt;'"
10. res.txt中的文件格式是数据库中select命令的结果格式,对该文件指定行的数据进行提取(第三行)
authFilePath=$(sed -n '3p' res.txt)
11. 获取指定字符串出现的所有行,根据行号,重写该行
例1:
#$authFilePath此处表示一个路径地址,可忽略
line1=$(grep -n "keyTab" jaas.conf | cut -d ":" -f 1)
var=${line1// / }
for element in $var
do
#去除$authFilePath自带的所有空格
authFilePath=`echo $authFilePath | sed -e 's/^[ \t]*//g'`
line1=$element"c keyTab=\"$authFilePath/user.keytab\""
sed -i "$line1" jaas.conf
done
例2:
line2=$(grep -n "principal" jaas.conf | cut -d ":" -f 1)
echo $line2
var=${line2// / }
for element in $var
do
line2=$element"c principal=\"$esUserName\""
sed -i "$line2" jaas.conf
done
注:1.脚本中的 keyTab=\"$authFilePath/user.keytab\" 以及 principal=\"$esUserName\" 便是重写的内容
2.这个基本就是三行脚本改一行代码,当需要改的地方比较多了之后,会显得脚本很笨重。开发的时候忙着出版本,并且改的量很小。我觉得该脚本有非常大的优化空间