今天给大家分享一篇在我工作中常用的一个shell脚本,里面有一些我们常用到的shell操作。该脚本用于本地电脑和服务器交互上,实现以下功能:
- 自动拉取自己个人电脑上的源码到服务器上yocto包的源码文件夹。
- 自动运行compile 、strip
- 自动把编译好的结果回传到个人电脑上。
- 拷贝执行文件到机器中
作者:良知犹存
转载授权以及围观:欢迎关注微信公众号:羽林君
或者添加作者个人微信:become_me
情节介绍:
在工作中,我们经常会遇到需要把修改的代码放到服务器去编译,然后把编译好的文件放到机器板卡对应的文件。这个过程如果我们使用命令的话,大概有七八条,完成操作完之后 ,大约会花费一分。虽然花费的时间不算多,但是你也会一直关注终端,然后等待输入命令,需要花费不小精力。但是我们可以写一些shell脚本来辅助我们的工作。今天就是给大家分享使用的脚本,一边分享使用过程,一边分享里面用到的shell技术点。包含,if判断、switch case条件、字符截取、远程调用脚本、两种免密登陆等。
三者的使用过程为:本地通过脚本输入参数选择使用wifi分配的ip还是网线分配的ip,然后进行ip数据传参形式 远程调用预先放置好的——服务器编译脚本,服务器脚本通过传入的ip参数,免密scp拷贝本地的文件到服务器执行目录,服务器执行编译工作,然后拷贝到本地的指定目录,最后调用本地的expect免密登陆的脚本,拷贝文件到机器中。
脚本一:本地选择脚本auto_build.sh脚本内容如下:
#/bin/bash remote_ip=172.160.111.32 remote_hostname=lyn case $1 in 1) echo -e ' 33[0;42m Ethernet dhcp 33[0m' VAR="eno1" ;; 2) echo -e ' 33[0;46m wireless dhcp 33[0m' VAR="wlo1" ;; esac HOST_IP=$(ifconfig $VAR | grep "inet" | grep -v inet6| awk '{ print $2}' | awk -F: '{print $1}') echo "parse ip is:" $HOST_IP if [[ ! -n "${HOST_IP}" ]] ;then echo -e " 33[0;31m input local ip 33[0m" read local_ip else if [[ ! $(echo "${HOST_IP}" | awk -F. '{printf $1}') == "192" ]] ;then local_ip=$HOST_IP else echo -e " 33[0;31m error ip 33[0m" exit 0 fi fi #exit 0 if [[ $2 == 1 ]];then build_opt="all_build" else build_opt= fi ssh -t ${remote_hostname}@${remote_ip} "/home/lyn/build.sh ip=${local_ip} ${build_opt}"
这个部分有几处技术使用:
switch case使用,if else、免密登陆,远程调用脚本。
首先是一个switch case此处作用是进行ip地址的筛选,因为的在调试过程中,我的电脑有时候用网线连接,有时候会去测试房去测试,用wifi连接,这个时候会进行网络ip地址的区分,当我输入./auto_build.sh 1的时候,脚本会进行解析eno1网线分配的ip地址,当我输入./auto_build.sh 2的时候则会解析wlo1wifi分配的ip。
在里面我还用了颜色打印,进行关键词的标注,如下所示:关于颜色打印的部分这个是另一个知识,这是一个转义的实际使用过程,通过特定符号的转义识别,我们在Linux终端去显示不同颜色的打印输出,这个是我们经常使用的操作,例如log等级分级打印时候,error是红色,正常是绿色,普通是白色等。
颜色打印大致介绍如下:
转义序列以控制字符’ESC’开头。该字符的ASCII码十进制表示为27,十六进制表示为0x1B,八进制表示为033。多数转义序列超过两个字符,故通常以’ESC’和左括号’['开头。该起始序列称为控制序列引导符(CSI,Control Sequence Intro),通常由 ‘ 33[’ 或 ‘e[’ 代替。
通过转义序列设置终端显示属性时,可采用以下格式: