环球军事
shell脚本编程(Linux系统Shell脚本编程的基本知识)

脚本一写,任务全废,这操作真这么神?

最近在捣鼓公司的服务器,天天手动查日志、清理临时文件,烦得要死。每次都要输一堆命令,一不小心还敲错,搞得系统报警好几次。同事看我累得够呛,说你咋不用 shell 脚本偷个懒?我说那玩意儿不是程序员才用的吗?他说扯啥呢,咱运维人天天都靠它活着。

其实 shell 就是个命令解释器,你在终端里敲的那些 ls、cd、ps,都是它帮你翻译给系统内核听的。而 shell 脚本呢,就是把这些命令存到一个文件里,一次运行就全执行了。就像做饭前把调料都配好,开火直接下锅,省事多了。最常用的解释器是 bash,开头那句 !/bin/bash 就是告诉系统:别用别的,就用它来跑这个脚本。

第一次写脚本是在测试机上搞了个 hello world。新建个文件叫 hello.sh,写上:
!/bin/bash
echo "Hello, JasonTang!"

然后 chmod +x 加个执行权限,再 sh hello.sh,屏幕上就蹦出那句话。看着挺傻,但那一刻感觉像是打通了任督二脉。原来自动化就这么简单,不用啥高深语言,几行命令就能搞定。

后来开始干正事。公司每天都要统计能登录系统的用户有多少。以前是手动打 cat /etc/passwd | grep /bin/bash,今天忘了明天漏了,领导一查发现数据断了好几天。没办法,写了第一个实用脚本 user.sh。内容也不复杂:

!/bin/bash
count=$(cat /etc/passwd | grep '/bin/bash' | wc -l)
echo "当前可登录账户数量: $count"

保存,加权限,以后每天早上跑一遍就行。还能加个时间戳,记录每次的结果。时间久了,还能看出账户增长趋势,有没有人偷偷开后门也一清二楚。

再往后更懒了。我们服务器老被乱七八糟的 IP 扫端口,想看看现在到底有多少人在连。本来 netstat 能看,但输出太乱,找起来费劲。就用脚本搞了个 ip 统计。ip.sh 里这么写:

!/bin/bash
echo "正在连接的IP地址列表:"
netstat -an | grep :22 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr

这堆命令连起来的意思是:抓所有网络连接,筛出走 22 端口的(也就是 SSH 登录),取出对方 IP,去重统计数量,再按大小排序。跑完之后谁连得多、连得久,一眼就知道。有一次发现某个 IP 死活连个没完,一看就是暴力破解密码,直接丢防火墙里拉黑。

最有意思的是写了个彩色国际象棋棋盘的脚本。本来是纯属好玩,就是想试试能不能在终端里画个图案。chess.sh 用了循环和颜色输出:

!/bin/bash
for i in {1..8}; do
for j in {1..8}; do
if (((i+j)%2==0)); then
echo -e -n "\033[47m \033[0m"
else
echo -e -n "\033[40m \033[0m"
fi
done
echo
done

\033[47m 是白底,\033[40m 是黑底,\033[0m 是重置颜色。跑起来之后真是整整齐齐一个棋盘。虽然没啥实际用处,但发朋友圈被一堆人问怎么写的,还挺得意。

写多了才发现,shell 脚本最厉害的不是能偷懒,而是能组合。比如你想定时备份日志,就把 tar 命令和 date 写一起,文件名带上日期。再配上 crontab,每周五自动执行,完全不用操心。想监控硬盘空间?写个脚本,df 看使用率,超了90%就发邮件提醒。还能批量改文件名、自动部署服务、查异常进程。

刚开始怕写错,加 set -e 让脚本出错就停,set -u 检查未定义变量,debug 时用 set -x 能看到每一步执行啥。慢慢胆子大了,写的也复杂了。现在公司好几个自动化流程都靠我写的脚本撑着。

前几天主管说有个新项目要对接三个系统,手动操作得三四个人盯两天。我花了半天写了个集成脚本,把所有步骤串起来,现在点一下就自动完成。他看了直摇头,说你这属于“合法偷懒”。

脚本这东西,会了就觉得平常,不会就总觉得神乎其技。其实真没多难,就是把重复的事交给机器干。你现在打开终端,写个第一行 !/bin/bash,就已经算入门了。


顶一下()     踩一下()

热门推荐

发表评论
0评