无论是系统运维,还是运用运维,均可分为“纯手工”——> “脚本化”——> “自动化”——>“智能化”几个阶段,个中自动化阶段,紧张是将一些重复性人工操作和运维履历封装为程序或脚本,一方面避免重复性操作及风险,另一方面提高实行效率。在自动化运维的转变过程中,常常利用的可能便是shell脚本了,今天主要分享下shell脚本开拓在运维事情中的一些履历总结。
小脚本有大聪慧,别鄙视几十行代码,夹杂着系统设计、代码规范和操作履历等等细节,在培植自动化运维的事情中,还是很值得我们研究学习的,下面总结这些也都是源于各位脚本达人和我们在自身事情中“碰着的坑”、“摔过的跟头”和“排过的雷”,与大家共享。

<img src=\公众https://pic4.zhimg.com/50/v2-e0bc540a32aa318ce19a51a6c5b0ca8c_hd.jpg\"大众 data-caption=\"大众\"大众 data-size=\"大众normal\公众 data-rawwidth=\"大众1080\"大众 data-rawheight=\"大众249\"大众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\"大众1080\公众 data-original=\"大众https://pic4.zhimg.com/v2-e0bc540a32aa318ce19a51a6c5b0ca8c_r.jpg\"大众/>
这里紧张先容并参考我行已经形成的一些shell编写规范,编写时严格遵守这些规范,不仅使编写人受益,同时也能提高利用者的实行效率。
1)脚本开头部分应有脚本功能解释、参数利用解释、作者姓名、创建/修正日期、版本信息,格式为:
<img src=\公众https://pic2.zhimg.com/50/v2-510225d5417b616844dd09fea57ae203_hd.jpg\公众 data-caption=\"大众\公众 data-size=\公众normal\公众 data-rawwidth=\"大众640\"大众 data-rawheight=\"大众246\"大众 class=\公众origin_image zh-lightbox-thumb\公众 width=\公众640\公众 data-original=\公众https://pic2.zhimg.com/v2-510225d5417b616844dd09fea57ae203_r.jpg\"大众/>
2)脚本编写时,把稳格式对齐,如所有的循环或者判断语句前后的语句进行对齐,以及case的选取完备,如:
<img src=\公众https://pic3.zhimg.com/50/v2-7a29583461b4029098786a1734c95058_hd.jpg\"大众 data-caption=\"大众\"大众 data-size=\"大众normal\"大众 data-rawwidth=\"大众640\"大众 data-rawheight=\公众253\"大众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\公众640\公众 data-original=\"大众https://pic3.zhimg.com/v2-7a29583461b4029098786a1734c95058_r.jpg\"大众/>
3)脚本开头实行时,实行如下命令,在实行过程中若碰着利用了未定义的变量或命令返回值为非零,将直接报错退出:
<img src=\公众https://pic1.zhimg.com/50/v2-7c5c0f5749f31fd2e668bcb3312ff81e_hd.jpg\"大众 data-caption=\"大众\公众 data-size=\"大众normal\"大众 data-rawwidth=\"大众857\公众 data-rawheight=\"大众103\公众 class=\公众origin_image zh-lightbox-thumb\"大众 width=\"大众857\"大众 data-original=\"大众https://pic1.zhimg.com/v2-7c5c0f5749f31fd2e668bcb3312ff81e_r.jpg\"大众/>
4)建议将命令行的每个参数放在单引号、双引号中,特殊是rm、mv等可能对生产现有数据造成修正的操作,建议利用垃圾箱策略:rm操作转意为mv操作,制订文件保存目录,以防回退,并定期清理:
<img src=\"大众https://pic3.zhimg.com/50/v2-479548dd50b9752e46c92cdb2fe081b8_hd.jpg\"大众 data-caption=\"大众\"大众 data-size=\公众normal\公众 data-rawwidth=\"大众857\"大众 data-rawheight=\"大众88\"大众 class=\公众origin_image zh-lightbox-thumb\公众 width=\"大众857\公众 data-original=\"大众https://pic3.zhimg.com/v2-479548dd50b9752e46c92cdb2fe081b8_r.jpg\"大众/>
5)命令行中参数须要利用‘’、‘?’通配符的,应依据最精确匹配原则,如能确定文件、目录名称的前缀、后缀、扩展名及其他可识别关键字的,须在参数中包含该信息,如能确定文件、目录的长度应利用‘?’通配符,不得利用‘’,推举的利用办法:
<img src=\公众https://pic4.zhimg.com/50/v2-fe62c2e6ec0aa53cbdb3bcc88abdf3da_hd.jpg\"大众 data-caption=\"大众\公众 data-size=\"大众normal\公众 data-rawwidth=\"大众856\"大众 data-rawheight=\"大众39\"大众 class=\公众origin_image zh-lightbox-thumb\公众 width=\公众856\"大众 data-original=\"大众https://pic4.zhimg.com/v2-fe62c2e6ec0aa53cbdb3bcc88abdf3da_r.jpg\"大众/>
不推举利用的办法:
<img src=\公众https://pic4.zhimg.com/50/v2-b032aea5604e220b1501105a0b819ba8_hd.jpg\"大众 data-caption=\公众\公众 data-size=\"大众normal\"大众 data-rawwidth=\"大众857\"大众 data-rawheight=\公众92\"大众 class=\"大众origin_image zh-lightbox-thumb\公众 width=\"大众857\"大众 data-original=\"大众https://pic4.zhimg.com/v2-b032aea5604e220b1501105a0b819ba8_r.jpg\公众/>
禁止利用的办法:
<img src=\"大众https://pic3.zhimg.com/50/v2-bda77aac21144a307a80e772d735e858_hd.jpg\"大众 data-caption=\公众\公众 data-size=\"大众normal\"大众 data-rawwidth=\"大众857\"大众 data-rawheight=\公众109\"大众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\"大众857\公众 data-original=\"大众https://pic3.zhimg.com/v2-bda77aac21144a307a80e772d735e858_r.jpg\"大众/>
6)给数值型变量的赋值后,需由手段担保变量的值为数值型,避免在后续的处理中涌现非常:
<img src=\"大众https://pic3.zhimg.com/50/v2-c9df2a82befb42bb2b46f22d822ed2f9_hd.jpg\公众 data-caption=\公众\"大众 data-size=\"大众normal\"大众 data-rawwidth=\"大众850\"大众 data-rawheight=\"大众259\"大众 class=\公众origin_image zh-lightbox-thumb\公众 width=\公众850\公众 data-original=\"大众https://pic3.zhimg.com/v2-c9df2a82befb42bb2b46f22d822ed2f9_r.jpg\"大众/>
7)在判断条件中利用的变量,必须包含在双引号中,如:
<img src=\公众https://pic2.zhimg.com/50/v2-9088d8f4ad3fcc5d4e320040508ea360_hd.jpg\"大众 data-caption=\公众\"大众 data-size=\"大众normal\"大众 data-rawwidth=\"大众850\"大众 data-rawheight=\公众211\"大众 class=\公众origin_image zh-lightbox-thumb\"大众 width=\公众850\公众 data-original=\"大众https://pic2.zhimg.com/v2-9088d8f4ad3fcc5d4e320040508ea360_r.jpg\"大众/>
禁止利用的办法:
<img src=\"大众https://pic4.zhimg.com/50/v2-337ce61623499817f6516b3daca90445_hd.jpg\公众 data-caption=\公众\公众 data-size=\公众normal\公众 data-rawwidth=\"大众850\"大众 data-rawheight=\"大众110\"大众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\"大众850\"大众 data-original=\"大众https://pic4.zhimg.com/v2-337ce61623499817f6516b3daca90445_r.jpg\公众/>
<img src=\公众https://pic3.zhimg.com/50/v2-1d2ce85039fd701b5cebb6a347480bec_hd.jpg\"大众 data-caption=\公众\"大众 data-size=\"大众normal\"大众 data-rawwidth=\公众850\"大众 data-rawheight=\"大众109\"大众 class=\公众origin_image zh-lightbox-thumb\公众 width=\公众850\"大众 data-original=\"大众https://pic3.zhimg.com/v2-1d2ce85039fd701b5cebb6a347480bec_r.jpg\公众/>
8)对文件进行打包备份时,必须利用相对路径进行打包,如:
<img src=\"大众https://pic2.zhimg.com/50/v2-e5af950769f93d803bbfb36dce78da38_hd.jpg\"大众 data-caption=\"大众\"大众 data-size=\"大众normal\"大众 data-rawwidth=\"大众922\"大众 data-rawheight=\"大众39\"大众 class=\公众origin_image zh-lightbox-thumb\"大众 width=\公众922\"大众 data-original=\"大众https://pic2.zhimg.com/v2-e5af950769f93d803bbfb36dce78da38_r.jpg\公众/>
严禁将全路径打入tar包, 如:
<img src=\公众https://pic4.zhimg.com/50/v2-110fe4098545d45912d72ee4afedd8fd_hd.jpg\公众 data-caption=\"大众\公众 data-size=\公众normal\"大众 data-rawwidth=\"大众922\"大众 data-rawheight=\"大众39\"大众 class=\公众origin_image zh-lightbox-thumb\"大众 width=\公众922\"大众 data-original=\公众https://pic4.zhimg.com/v2-110fe4098545d45912d72ee4afedd8fd_r.jpg\"大众/>
9)对付打包后还需进行压缩的文件,建议利用管道进行处理,如:
<img src=\公众https://pic4.zhimg.com/50/v2-913a7e4dfdd8027ed0bc1e0236c4f56a_hd.jpg\"大众 data-caption=\"大众\公众 data-size=\公众normal\"大众 data-rawwidth=\"大众922\公众 data-rawheight=\"大众61\"大众 class=\"大众origin_image zh-lightbox-thumb\公众 width=\"大众922\"大众 data-original=\公众https://pic4.zhimg.com/v2-913a7e4dfdd8027ed0bc1e0236c4f56a_r.jpg\"大众/>
不建议两部分分开实行:
<img src=\"大众https://pic2.zhimg.com/50/v2-988db2f301e501239f4cc007f95e4a23_hd.jpg\"大众 data-caption=\公众\公众 data-size=\"大众normal\"大众 data-rawwidth=\公众922\公众 data-rawheight=\"大众74\公众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\"大众922\公众 data-original=\公众https://pic2.zhimg.com/v2-988db2f301e501239f4cc007f95e4a23_r.jpg\"大众/>
10)利用ps命令筛选进程时,如能确定进程所属用户,必须在参数中指定用户名称,如其输出作为kill命令的输入,则必须指定进程所属用户,如:
<img src=\"大众https://pic3.zhimg.com/50/v2-9b358f6a6613cf6cf8fa5108fe7ac559_hd.jpg\公众 data-caption=\"大众\公众 data-size=\公众normal\公众 data-rawwidth=\"大众922\"大众 data-rawheight=\公众39\"大众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\"大众922\公众 data-original=\"大众https://pic3.zhimg.com/v2-9b358f6a6613cf6cf8fa5108fe7ac559_r.jpg\"大众/>
<img src=\"大众https://pic3.zhimg.com/50/v2-d451e90e3d2fc5d759f881abc162bbc0_hd.jpg\公众 data-caption=\"大众\"大众 data-size=\"大众normal\"大众 data-rawwidth=\"大众1080\"大众 data-rawheight=\"大众250\"大众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\公众1080\"大众 data-original=\"大众https://pic3.zhimg.com/v2-d451e90e3d2fc5d759f881abc162bbc0_r.jpg\"大众/>
这里先容的紧张这天常shell编写中碰着比较暗藏或看似大略,却难以创造的“坑”,编写中应只管即便避免利用,利用更优的方法避免重蹈覆辙。
1)更新文件利用>不用cp
利用>修正和回退文件时,保留原文件的属组和权限,避免利用cp时权限属组被修正。
<img src=\"大众https://pic3.zhimg.com/50/v2-b13a26cf4553abe5340840174ffc1f56_hd.jpg\公众 data-caption=\"大众\"大众 data-size=\公众normal\公众 data-rawwidth=\公众870\"大众 data-rawheight=\"大众63\"大众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\"大众870\公众 data-original=\"大众https://pic3.zhimg.com/v2-b13a26cf4553abe5340840174ffc1f56_r.jpg\公众/>
2)利用kill前确认
关键字用-w 精确匹配字段;
kill前后都保留现场, 两次ps -ef|grep -w 关键字|grep -v grep >>/tmp/kill_进程名_.backup;
删除前要校验,获取进程号是否唯一,避免多杀或误杀的情形。
<img src=\"大众https://pic1.zhimg.com/50/v2-8a665e08ad74781563e2887449615004_hd.jpg\"大众 data-caption=\"大众\"大众 data-size=\"大众normal\公众 data-rawwidth=\"大众861\"大众 data-rawheight=\"大众184\"大众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\"大众861\公众 data-original=\"大众https://pic1.zhimg.com/v2-8a665e08ad74781563e2887449615004_r.jpg\"大众/>
3)利用rm前确认
删除前备份删除工具信息,避免利用变量,直策应用文件和目录名;
如果必须利用时,删除前,建议检讨避免误删,删除目录和文件信息保留:
<img src=\公众https://pic1.zhimg.com/50/v2-3ac6fab9c301afbed527611b9e15e658_hd.jpg\公众 data-caption=\"大众\"大众 data-size=\公众normal\"大众 data-rawwidth=\"大众861\"大众 data-rawheight=\"大众151\"大众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\公众861\公众 data-original=\公众https://pic1.zhimg.com/v2-3ac6fab9c301afbed527611b9e15e658_r.jpg\"大众/>
建议禁用find遍历根目录进行查找,同时删除提高行确认,避免多删或误删的情形。
4)For循环的坑
for循环的in条件按空格来区分,避免进入禁绝确或去世循环。
<img src=\"大众https://pic1.zhimg.com/50/v2-e749fa9136ae9439f47855363738162c_hd.jpg\公众 data-caption=\"大众\公众 data-size=\公众normal\"大众 data-rawwidth=\"大众861\公众 data-rawheight=\"大众151\公众 class=\"大众origin_image zh-lightbox-thumb\公众 width=\"大众861\"大众 data-original=\"大众https://pic1.zhimg.com/v2-e749fa9136ae9439f47855363738162c_r.jpg\"大众/>
5)while循环的禁忌
如果还想利用循环中的变量,不要while结合管道利用。
<img src=\"大众https://pic4.zhimg.com/50/v2-026b870cd39ceaa5b2d17d8e8ef6c27a_hd.jpg\公众 data-caption=\公众\公众 data-size=\公众normal\"大众 data-rawwidth=\公众640\"大众 data-rawheight=\"大众372\"大众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\"大众640\"大众 data-original=\"大众https://pic4.zhimg.com/v2-026b870cd39ceaa5b2d17d8e8ef6c27a_r.jpg\"大众/>
6)慎用cp
这句话基本上精确,但同样有空格分词的问题。以是应该用双引号:
<img src=\"大众https://pic2.zhimg.com/50/v2-d7edfb3e8db566ea3406403e3e0b1d87_hd.jpg\"大众 data-caption=\公众\"大众 data-size=\"大众normal\"大众 data-rawwidth=\"大众885\公众 data-rawheight=\"大众47\公众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\"大众885\"大众 data-original=\"大众https://pic2.zhimg.com/v2-d7edfb3e8db566ea3406403e3e0b1d87_r.jpg\公众/>
但是如果凑巧文件名以 - 开头,这个文件名会被 cp 当作命令行选项来处理。
可以试试下面这个:
<img src=\"大众https://pic4.zhimg.com/50/v2-4cec69faa868d045de6cda7385203135_hd.jpg\"大众 data-caption=\"大众\"大众 data-size=\"大众normal\"大众 data-rawwidth=\公众885\"大众 data-rawheight=\公众47\"大众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\"大众885\"大众 data-original=\"大众https://pic4.zhimg.com/v2-4cec69faa868d045de6cda7385203135_r.jpg\"大众/>
但也可能再碰上一个不支持 -- 选项的系统,以是最好用下面的方法:
<img src=\"大众https://pic1.zhimg.com/50/v2-3870d61348a8de6dc7940bf2629662fb_hd.jpg\"大众 data-caption=\"大众\"大众 data-size=\公众normal\公众 data-rawwidth=\公众885\"大众 data-rawheight=\"大众47\公众 class=\公众origin_image zh-lightbox-thumb\公众 width=\"大众885\"大众 data-original=\"大众https://pic1.zhimg.com/v2-3870d61348a8de6dc7940bf2629662fb_r.jpg\"大众/>
7)慎用cd
避免利用cd到操作目录再操作的办法,可能导致进入目录失落败,误删除,如:
<img src=\"大众https://pic2.zhimg.com/50/v2-c33f655e49675fd45ab77a1733107a37_hd.jpg\公众 data-caption=\"大众\公众 data-size=\公众normal\"大众 data-rawwidth=\公众885\"大众 data-rawheight=\"大众61\公众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\"大众885\"大众 data-original=\"大众https://pic2.zhimg.com/v2-c33f655e49675fd45ab77a1733107a37_r.jpg\公众/>
建议如下:
<img src=\"大众https://pic4.zhimg.com/50/v2-3ec886f55765d11bfbabb5fd3c444e04_hd.jpg\"大众 data-caption=\"大众\公众 data-size=\"大众normal\"大众 data-rawwidth=\"大众885\"大众 data-rawheight=\"大众61\公众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\"大众885\公众 data-original=\公众https://pic4.zhimg.com/v2-3ec886f55765d11bfbabb5fd3c444e04_r.jpg\公众/>
8) 用[[ ]]代替[ ]
<img src=\"大众https://pic4.zhimg.com/50/v2-4a8e15cbd39e2c3cb8aa621fc3c4ad00_hd.jpg\"大众 data-caption=\公众\"大众 data-size=\"大众normal\公众 data-rawwidth=\"大众885\"大众 data-rawheight=\"大众47\公众 class=\公众origin_image zh-lightbox-thumb\"大众 width=\公众885\公众 data-original=\"大众https://pic4.zhimg.com/v2-4a8e15cbd39e2c3cb8aa621fc3c4ad00_r.jpg\"大众/>
当$var为空时,上面的命令就变成了[ =\公众bar\"大众 ]
类似地,当$var包含空格时:
[ space words here = \"大众var\"大众 ]两者都会出错。以是应该用双引号将变量括起来:
[ \"大众$var\"大众 = var ] 险些完美了。
但是,当$var以 - 开头时依然会有问题。在较新的bash中你可以用下面的方法来代替,[[ ]]关键字能精确处理空缺、空格、带横线等问题。
<img src=\公众https://pic4.zhimg.com/50/v2-0352efe306c588aa58e3c15a49f0b018_hd.jpg\"大众 data-caption=\"大众\"大众 data-size=\"大众normal\"大众 data-rawwidth=\公众822\公众 data-rawheight=\"大众62\公众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\公众822\"大众 data-original=\"大众https://pic4.zhimg.com/v2-0352efe306c588aa58e3c15a49f0b018_r.jpg\公众/>
另把稳,[[适用于字符串,如果是数值,要用如:(( $var > 8 ))
9)管道操作中不要同时读写文件
<img src=\公众https://pic3.zhimg.com/50/v2-376f530d5df5cc55657e0e0b501277c8_hd.jpg\"大众 data-caption=\"大众\公众 data-size=\"大众normal\"大众 data-rawwidth=\"大众890\"大众 data-rawheight=\"大众47\"大众 class=\"大众origin_image zh-lightbox-thumb\公众 width=\"大众890\公众 data-original=\公众https://pic3.zhimg.com/v2-376f530d5df5cc55657e0e0b501277c8_r.jpg\"大众/>
你不能在同一条管道操作中同时读写一个文件。根据管道的实现办法,file要么被截断成0字节,要么会无限增长直到填满全体硬盘。如果想改变原文件的内容,只能先将输出写到临时文件中再用mv命令。
<img src=\"大众https://pic3.zhimg.com/50/v2-1542fd3a9cbca7d10bbf2bca0fa98305_hd.jpg\"大众 data-caption=\"大众\"大众 data-size=\"大众normal\"大众 data-rawwidth=\公众890\"大众 data-rawheight=\"大众47\"大众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\"大众890\"大众 data-original=\"大众https://pic3.zhimg.com/v2-1542fd3a9cbca7d10bbf2bca0fa98305_r.jpg\公众/>
10)cd的易错问题
cd 有可能会出错,导致要实行的命令就会在你预想不到的目录里实行了。以是一定要记得判断cd的返回值。
<img src=\"大众https://pic1.zhimg.com/50/v2-39d461a02b5d932f4651b8ceb1996ea9_hd.jpg\"大众 data-caption=\"大众\公众 data-size=\公众normal\"大众 data-rawwidth=\"大众883\"大众 data-rawheight=\公众47\"大众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\公众883\"大众 data-original=\"大众https://pic1.zhimg.com/v2-39d461a02b5d932f4651b8ceb1996ea9_r.jpg\公众/>
如果你要根据cd的返回值实行多条命令,可以用 ||。
<img src=\公众https://pic2.zhimg.com/50/v2-66ccef68c41f227f519059a627f54cb4_hd.jpg\公众 data-caption=\"大众\"大众 data-size=\"大众normal\"大众 data-rawwidth=\公众883\公众 data-rawheight=\"大众47\公众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\"大众883\公众 data-original=\"大众https://pic2.zhimg.com/v2-66ccef68c41f227f519059a627f54cb4_r.jpg\公众/>
关于目录的一点题外话,假设你要在shell程序中频繁变换事情目录,如下面的代码:
<img src=\"大众https://pic2.zhimg.com/50/v2-cf8d812b81444b8f2a9697743247749c_hd.jpg\"大众 data-caption=\公众\公众 data-size=\"大众normal\公众 data-rawwidth=\"大众890\"大众 data-rawheight=\公众83\"大众 class=\公众origin_image zh-lightbox-thumb\"大众 width=\公众890\"大众 data-original=\公众https://pic2.zhimg.com/v2-cf8d812b81444b8f2a9697743247749c_r.jpg\"大众/>
不如这样写:
<img src=\"大众https://pic2.zhimg.com/50/v2-27e5c18b8466d9c0044fe1000e2f0af7_hd.jpg\"大众 data-caption=\公众\公众 data-size=\公众normal\"大众 data-rawwidth=\公众890\公众 data-rawheight=\公众123\"大众 class=\公众origin_image zh-lightbox-thumb\"大众 width=\"大众890\"大众 data-original=\公众https://pic2.zhimg.com/v2-27e5c18b8466d9c0044fe1000e2f0af7_r.jpg\"大众/>
括号会逼迫启动一个子shell,这样在这个子shell中改变事情目录不会影响父shell(实行这个脚本的shell),就可以省却cd - 的麻烦。
<img src=\"大众https://pic1.zhimg.com/50/v2-5c544f818522d8b3ddd91e8773471ff6_hd.jpg\"大众 data-caption=\公众\"大众 data-size=\公众normal\"大众 data-rawwidth=\"大众1080\公众 data-rawheight=\公众249\"大众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\公众1080\公众 data-original=\"大众https://pic1.zhimg.com/v2-5c544f818522d8b3ddd91e8773471ff6_r.jpg\"大众/>
目前行里自动化工具越来越多,无论是运用的MAOP或系统的SMDB,自动化实现都还是日常运维脚本的调用,结合日常运维的一些履历,脚本中就更须要考虑全面和掌握风险。这里先容一些结合运维场景的脚本运用,希望规避以前犯过的错,重点在掌握风险。
1) 支持交互式脚本的运用
很多脚本中须要进行交互,在规避风险的同时,须要通过自动化工具发布来支持交互,可以利用expect,示例如下:
<img src=\"大众https://pic1.zhimg.com/50/v2-d05779b0bc29662e91ae226e665f93c7_hd.jpg\公众 data-caption=\"大众\"大众 data-size=\"大众normal\"大众 data-rawwidth=\公众640\公众 data-rawheight=\公众943\公众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\公众640\公众 data-original=\公众https://pic1.zhimg.com/v2-d05779b0bc29662e91ae226e665f93c7_r.jpg\公众/>
也可以利用curl工具来替代大略的交互:
#FTP SFTP下载
curl-u ftpuser:ftppassword -O \公众sftp://ftp_ip:ftp_port/pathfile\公众
#FTP SFTP上传
curl-u ftpuser:ftppassword --ftp-create-dirs-T upfile \公众sftp://ftp_ip:ftp_port/filepath/upfile\公众
2)脚本规范实行和日志追溯
直接实行的脚本很危险,要提示用户如何利用脚本,并记录日志以便跟踪。
示例如下:
<img src=\公众https://pic2.zhimg.com/50/v2-ed6a36d84fbe94d9bfa89d53999b30a6_hd.jpg\"大众 data-caption=\"大众\"大众 data-size=\"大众normal\"大众 data-rawwidth=\公众640\"大众 data-rawheight=\"大众686\公众 class=\"大众origin_image zh-lightbox-thumb\公众 width=\"大众640\"大众 data-original=\"大众https://pic2.zhimg.com/v2-ed6a36d84fbe94d9bfa89d53999b30a6_r.jpg\"大众/>
3)脚本的并发锁掌握
避免多人同时实行或并发同时实行的非常问题,建议增加锁机制,示例如下:
<img src=\"大众https://pic2.zhimg.com/50/v2-873a1b3a7ef0eaca3eb49e0ee446bbd3_hd.jpg\"大众 data-caption=\"大众\公众 data-size=\"大众normal\公众 data-rawwidth=\"大众640\"大众 data-rawheight=\"大众921\"大众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\公众640\"大众 data-original=\公众https://pic2.zhimg.com/v2-873a1b3a7ef0eaca3eb49e0ee446bbd3_r.jpg\"大众/>
4)掌握脚本不退出的风险
周期频繁实行的脚本,须要防止脚本hang住不退出,导致后续脚本再次实行。
<img src=\公众https://pic4.zhimg.com/50/v2-e3a715abdfba6a91011ca4f0d45757dc_hd.jpg\"大众 data-caption=\"大众\"大众 data-size=\"大众normal\"大众 data-rawwidth=\"大众640\公众 data-rawheight=\"大众249\"大众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\公众640\"大众 data-original=\"大众https://pic4.zhimg.com/v2-e3a715abdfba6a91011ca4f0d45757dc_r.jpg\公众/>
5)避免集中发布脚本造成的风险
利用ftp、sftp传输、下载文件,或者集中访问存储端口时,只管即便增加发布工具散列,避免集中操作造成存储端口拥堵,跨防火墙流量超限报警等影响。
<img src=\"大众https://pic4.zhimg.com/50/v2-4adc7ea83ebc54c68dbc64a1e6d5842e_hd.jpg\公众 data-caption=\公众\"大众 data-size=\"大众normal\"大众 data-rawwidth=\"大众964\"大众 data-rawheight=\公众216\"大众 class=\公众origin_image zh-lightbox-thumb\公众 width=\"大众964\"大众 data-original=\"大众https://pic4.zhimg.com/v2-4adc7ea83ebc54c68dbc64a1e6d5842e_r.jpg\"大众/>
6)避免文件无限增长的风险
向一个文件中追加数据时,一定要设置阀值,必要时清空,避免文件无限增大:
<img src=\公众https://pic3.zhimg.com/50/v2-acf429788d04dcbd0e6f1777f91637e9_hd.jpg\公众 data-caption=\公众\"大众 data-size=\"大众normal\公众 data-rawwidth=\"大众640\"大众 data-rawheight=\"大众272\"大众 class=\"大众origin_image zh-lightbox-thumb\公众 width=\"大众640\"大众 data-original=\公众https://pic3.zhimg.com/v2-acf429788d04dcbd0e6f1777f91637e9_r.jpg\公众/>
目录增加清理过期文件策略,避免产生的文件越来越多,造成文件节点用尽:
<img src=\"大众https://pic2.zhimg.com/50/v2-e09302efe97ca337e3b52fbed441c2eb_hd.jpg\"大众 data-caption=\"大众\"大众 data-size=\公众normal\"大众 data-rawwidth=\"大众964\"大众 data-rawheight=\公众123\"大众 class=\"大众origin_image zh-lightbox-thumb\公众 width=\公众964\公众 data-original=\"大众https://pic2.zhimg.com/v2-e09302efe97ca337e3b52fbed441c2eb_r.jpg\"大众/>
目录中的文件过多,会报参数太长缺点无法删除,建议放在循环中遍历删除:
<img src=\"大众https://pic1.zhimg.com/50/v2-cce24570cd146b1fb9467ae0c37990cb_hd.jpg\"大众 data-caption=\"大众\公众 data-size=\公众normal\"大众 data-rawwidth=\"大众927\公众 data-rawheight=\"大众245\"大众 class=\"大众origin_image zh-lightbox-thumb\"大众 width=\"大众927\公众 data-original=\公众https://pic1.zhimg.com/v2-cce24570cd146b1fb9467ae0c37990cb_r.jpg\公众/>
总结:
鉴于以上脚本,我们可以从中汲取一些履历,规避一些风险:
通过增加日志记录输出和脚本实行的方法解释,并自动交互和通报参数,避免实行脚本的操作风险;利用文件锁机制和运维中一些规避风险的方法,使得脚本自动实行起来更便捷更安全。
1. 通过规范类脚本的定义,标准常量定义、清晰的注释、函数和变量大小写用法,细节中可以看出严谨,纵然只有几行,也能表示出一名精良脚本开拓职员的本色。
2. 通过易错类脚本中的“坑”,使得 shell面向过程的编写更得心应手,让脚本规范的同时,逻辑也更严谨清晰,避免了缺点,也提高了脚本的开拓效率。
3. 通过运维场景的脚本运用,规避各种开拓和实行过程中的风险,使得shell脚本不仅能支持自动化发布,更可以全面智能化的为运维做事。
本文转自公众年夜众号:LD 匠心独运维妙维效







