当前位置:首页 > 公众号精选 > 嵌入式大杂烩
[导读]前言:今天给大家分享一篇在我工作中常用的一个shell脚本,里面有一些我们常用到的shell操作。该脚本用于本地电脑和服务器交互上,实现以下功能:自动拉取自己个人电脑上的源码到服务器上yocto包的源码文件夹。自动运行compile、strip自动把编译好的结果回传到个人电脑上。...

前言:

今天给大家分享一篇在我工作中常用的一个shell脚本,里面有一些我们常用到的shell操作。该脚本用于本地电脑和服务器交互上,实现以下功能:


  1. 自动拉取自己个人电脑上的源码到服务器上yocto包的源码文件夹。
  2. 自动运行compile 、strip
  3. 自动把编译好的结果回传到个人电脑上。
  4. 拷贝执行文件到机器中
作者:良知犹存


转载授权以及围观:欢迎关注微信公众号:羽林君


或者添加作者个人微信: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 '\033[0;42m Ethernet dhcp \033[0m'
VAR="eno1"
;;
2) echo -e '\033[0;46m wireless dhcp \033[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 "\033[0;31m input local ip \033[0m"
read local_ip
else
if [[ ! $(echo "${HOST_IP}" | awk -F. '{printf $1}') == "192" ]] ;then
local_ip=$HOST_IP
else
echo -e "\033[0;31m error ip \033[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),通常由 '\033[' 或 '\e[' 代替。


通过转义序列设置终端显示属性时,可采用以下格式:


\033[ Param {;Param;...}m



\e[ Param {;Param;...}m
其中,'\033['或'\e['引导转义序列,'m'表示设置属性并结束转义序列。


因此,通过转义序列设置终端显示属性时,常见格式为:


\033[显示方式;前景色;背景色m输出字符串\033[0m

或\e[显示方式;前景色;背景色m输出字符串\033[0m
其中 ,'\033[0m'用于恢复默认的终端输出属性,否则会影响后续的输出。


示例:我在此处使用 echo -e '\033[0;42m Ethernet dhcp \033[0m' 进行网线端口ip分配的打印,通过转义之后,打印颜色为带背景色的绿色显示。具体对应的颜色,大家可以看一下小麦老兄写的这篇文章 printf打印还能这么玩。


注:打印log时候记得echo 要使用 -e参数。


其次还有组合使用命令实现获取本地ip

HOST_IP=$(ifconfig $VAR | grep "inet" | grep -v inet6| awk '{ print $2}' | awk -F: '{print $1}')
我们一步步查看执行情况


第一步:ifconfig eno1


lyn@lyn:~/Documents/work-data/download_data$ ifconfig eno1
eno1: flags=4163  mtu 1500
inet 172.16.30.147  netmask 255.255.255.0  broadcast 172.16.30.255
inet6 fe80::ca7:d954:67e0:7c60  prefixlen 64  scopeid 0x20

  • ether f8:b4:6a:bd:dd:92  txqueuelen 1000  (Ethernet)
    RX packets 3678600  bytes 3470673356 (3.4 GB)
    RX errors 0  dropped 36842  overruns 0  frame 0
    TX packets 2229431  bytes 995696588 (995.6 MB)
    TX errors 0
    我们经常使用ifconfig查看ip,但是使用ifconfig返回的数据过多,而我们实际使用的部分只是一部分而已。


    所以我们使用ifconfig指定设备查找ip,筛去无用信息。


    第二步:ifconfig eno1    | grep "inet"


    把第一步查询的信息通过 | 产生一个管道传递给下一个命令,用grep查找有inet字符的行数据,显示如下:


    lyn@lyn:~/Documents/work-data/download_data$ ifconfig eno1  | grep "inet"
    inet 172.16.30.147  netmask 255.255.255.0  broadcast 172.16.30.255
    inet6 fe80::ca7:d954:67e0:7c60  prefixlen 64  scopeid 0x20

  • 因为我们只需要ipv4协议的ip,所以我们要去掉inet6对应的地址


    第三步:ifconfig eno1  | grep "inet" | grep -v inet6


    使用grep -v命令去掉 inet6 关键词的对应一行信息


    lyn@lyn:~/Documents/work-data/download_data$ ifconfig eno1  | grep "inet" | grep -v inet6
    inet 172.16.30.147  netmask 255.255.255.0  broadcast 172.16.30.255
    第四步:ifconfig eno1  | grep "inet" | grep -v inet6 | awk '{ print$2}'


    使用 awk处理文本文件的语言进行处理数据,$2 表示默认以空格分割的第二组 ,-F:-F指定分隔符为 ‘ : ’


    lyn@lyn:~/Documents/work-data/download_data$ ifconfig eno1  | grep "inet" | grep -v inet6| awk '{ print$2}'
    172.16.30.147
    关于grep sed awk的使用大家也可以网上具体查看一下,但是我们一般使用过程中,grep 更适合单纯的查找或匹配文本, sed 更适合编辑匹配到的文本,awk 更适合格式化文本,对文本进行较复杂格式处理。


    这个时候我们从本机得到了ip地址。我们需要进行远程调用服务器脚本,并把ip以参数形式传入。


    其次ssh免密登陆和ssh远程执行任务

    首先第一个部分就是ssh免密登陆


    本地执行ssh到服务的相关操作命令需要免密,服务器scp本地文件也要免密登陆,那么如何设置我们ssh相关命令操作,无需密码呢?


    SSH分客户端openssh-client和服务器openssh-server如果你只是想登陆别的机器,只需要安装openssh-client(ubuntu有默认安装,如果没有则sudo apt-get install openssh-client),如果要使别的机器登陆本机就需要在本机安装openssh-server(sudo apt-get install openssh-server)


    我们可以使用 ps -e | grep ssh  来查看对应的openssh-client和openssh-server运行情况,其中ssh是client ,sshd是server,哪个缺我们就使用apt-get install 。


    sudo service ssh start 安装之后可以使用这个命令启动。


    准备好了对应的server和client接下来,把我们生成的rsa公钥拷贝要对应要登陆的机器,即可免密登陆。


    1.客户端生成公私钥


    ssh-keygen 命令一路回车默认生成


    这个命令会在用户目录.ssh文件夹下创建公私钥,id_rsa (私钥),id_rsa.pub (公钥)。


    2.上传公钥到服务器


    ssh-copy-id -i ~/.ssh/id_rsa.pub lyn@172.160.111.32
    上面这条命令是写到服务器上的ssh目录下去了


    vi  ~/.ssh/authorized_keys
    可以看到客户端写入到服务器的 id_rsa.pub (公钥)内容。


    3.测试免密登录 客户端通过ssh连接远程服务器,就可以免密登录了。


    ssh lyn@172.160.111.32
    第二个部分就是ssh远程执行服务器脚本


    有时候我们需要远程执行一些有交互操作的命令。这个时候我们就可以使用ssh加参数进去进行远程执行。


    格式如下:


    远程执行一个命令


    ssh lyn@172.160.111.32 "ls -l"
    执行多条命令,使用分号把不同的命令隔起来


    ssh lyn@172.160.111.32 "ls;cat test.txt "
    远程执行本地脚本


    ssh lyn@172.160.111.32 < test.sh
    远程执行本地的脚本(执行带有参数的脚本),需要为 bash 指定 -s 参数:


    ssh lyn@172.160.111.32 'bash -s' < test.sh helloworld
    执行远程的脚本


    ssh lyn@172.160.111.32 "/home/lyn/test.sh"
    注,此时需要指定脚本的绝对路径!


    而我们使用的为远程执行脚本,最终ssh远程执行如下:


    remote_ip=172.160.111.32
    remote_hostname=lyn
    local_ip=172.16.30.147
    build_opt=
    ssh -t ${remote_hostname}@${remote_ip} "/home/lyn/build.sh ip=${local_ip} ${build_opt}"

    脚本二:服务器编译脚本 build.sh

    脚本内容如下:


    #!/bin/bash -e
    scp_dir=/media/lyn/win_data/lyn_workdata/working/robot-ctl
    download_data=/home/lyn/Documents/work-data/download_data

    build_dir=/home/lyn/projects/yocto/yocto-build/tmp/work/aarch64-poky-linux/robot-ctl/git-r0/git/
    image_dir=/home/lyn/projects/yocto/yocto-build/tmp/work/aarch64-poky-linux/robot-ctl/git-r0/image/robot-ctl/

    remote_exec_file_dir=/home/lyn/Documents/work-data/download_data/scp_exec.sh

    all_build=No
    wifi_src=No
    only_scp_robot=No
    strip_mode=No
    ip_wireless_dhcp=170.160.111.45
    ip_ethernet_dhcp=170.160.111.147
    local_ip=${ip_wireless_dhcp}
    host_name=lyn

    date
    echo -e "\033[0;31m Loading options.\033[0m"

    # Load all the options.

    if [ $# -eq 0 ];then
    echo -e "\033[33;5m no argument \033[0m"
    fi
    for arg in "${@}"
    do
    if [[ -n "${arg}" ]] 
  • 本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
    换一批
    延伸阅读

    电感是导线内通过交流电流时,在导线的内部及其周围产生交变磁通,导线的磁通量与生产此磁通的电流之比。电感器也叫电感线圈,是利用电磁感应原理制成的,由导线在绝缘管上单层或多层绕制而成的,导线彼此互相绝缘,而绝缘管可以是空心的...

    关键字: 电感 磁通量 电感器

    根据交通运输部水运科学研究院提出的智慧港口的概念,智慧港口是利用新一代信息技术,将港口相关业务和管理创新深度融合,使港口更加集约、高效、便捷、安全、绿色,创新港口发展模式,实现港口科学可持续发展。

    关键字: 智慧港口 信息技术 业务

    近年来,世界主要汽车大国纷纷加强新能源汽车战略谋划、强化政策支持、完善产业布局,新能源汽车已成为全球汽车产业转型发展的主要方向和促进世界经济持续增长的重要引擎。2021年,全国新能源汽车实现产量354.5万辆,销量352...

    关键字: 新能源 汽车 引擎

    2007-2021年,全球针状焦行业专利申请人数量及专利申请量总体呈现增长态势。虽然2021年全球针状焦行业专利申请人数量及专利申请量有所下降,但是这两大指标数量仍较多。整体来看,全球针状焦技术处于成长期。

    关键字: 针状焦行业 专利申请人 增长态势

    按企业主营业务类型分,我国智能家居行业竞争派系可分为传统家电企业、互联网企业以及其他企业三派。传统家电企业代表有海尔智家、美的集团、格力电器等,具有供应链和销售渠道,制造能力和品牌优势突出;互联网企业代表有小米集团、百度...

    关键字: 智能家居 互联网企业 供应链

    军工电子是集红外技术、激光技术、半导体及嵌入式技术与虚拟仿真技术为一体的综合性军工技术体系,是国防信息化建设的基石。军工电子行业包含在军工行业内,专注于军工行业电子产品布局。根据其军工产品的不同可分为卫星导航、通信指挥、...

    关键字: 军工电子 嵌入式技术 信息化建设

    我国汽车零配件行业细分种类众多,从汽车零配件主要产品来看,发动机系统行业内有潍柴动力、华域汽车等主要从业企业;在车身零部件领域内,福耀玻璃、中策橡胶具有一定的规模优势;行驶系统领域内有中策橡胶提供的轮胎以及华为等企业提供...

    关键字: 汽车零配件 发动机 行驶系统

    茶饮料是指以茶叶或茶叶的水提取液、浓缩液、茶粉(包括速溶茶粉、研磨茶粉)或直接以茶的鲜叶为原料添加或不添加食品原辅料和(或)食品添加剂,经加工制成的液体饮料。根据国家标准《茶饮料(GB/T 21733-2008)》的规定...

    关键字: 茶饮料 茶叶的水 食品添加剂

    全球液压行业专利技术在21世纪初得到初步发展,这一时期液压专利申请人数量和申请量处于较低水平。2011-2012年,液压行业专利技术的发展总体处于成长期,2012年以后中全球液压行业专利技术申请量或申请人数量整体处于波动...

    关键字: 液压行业 专利授权 技术类型

    从上市企业的总市值情况来看,2022年7月28日,中芯国际、紫光国微和韦尔股份总市值遥遥领先,中芯国际总市值达到3238.21亿元,紫光国微总市值达到1358.77亿元,韦尔股份总市值达到1277.07亿元;其次是兆易创...

    关键字: 上市企业 集成电路 行业

    嵌入式大杂烩

    461 篇文章

    关注

    发布文章

    编辑精选

    技术子站

    关闭