當前位置:首頁 > 公眾號精選 > 嵌入式大雜燴
[導讀]前言:今天給大家分享一篇在我工作中常用的一個shell腳本,里面有一些我們常用到的shell操作。該腳本用于本地電腦和服務器交互上,實現(xiàn)以下功能:自動拉取自己個人電腦上的源碼到服務器上yocto包的源碼文件夾。自動運行compile、strip自動把編譯好的結果回傳到個人電腦上。...

前言:

今天給大家分享一篇在我工作中常用的一個shell腳本,里面有一些我們常用到的shell操作。該腳本用于本地電腦和服務器交互上,實現(xiàn)以下功能:


  1. 自動拉取自己個人電腦上的源碼到服務器上yocto包的源碼文件夾。
  2. 自動運行compile 、strip
  3. 自動把編譯好的結果回傳到個人電腦上。
  4. 拷貝執(zhí)行文件到機器中
作者:良知猶存


轉載授權以及圍觀:歡迎關注微信公眾號:羽林君


或者添加作者個人微信:become_me


情節(jié)介紹:

在工作中,我們經(jīng)常會遇到需要把修改的代碼放到服務器去編譯,然后把編譯好的文件放到機器板卡對應的文件。這個過程如果我們使用命令的話,大概有七八條,完成操作完之后 ,大約會花費一分。雖然花費的時間不算多,但是你也會一直關注終端,然后等待輸入命令,需要花費不小精力。但是我們可以寫一些shell腳本來輔助我們的工作。今天就是給大家分享使用的腳本,一邊分享使用過程,一邊分享里面用到的shell技術點。包含,if判斷、switch case條件、字符截取、遠程調用腳本、兩種免密登陸等。


三者的使用過程為:本地通過腳本輸入?yún)?shù)選擇使用wifi分配的ip還是網(wǎng)線分配的ip,然后進行ip數(shù)據(jù)傳參形式 遠程調用預先放置好的——服務器編譯腳本,服務器腳本通過傳入的ip參數(shù),免密scp拷貝本地的文件到服務器執(zhí)行目錄,服務器執(zhí)行編譯工作,然后拷貝到本地的指定目錄,最后調用本地的expect免密登陸的腳本,拷貝文件到機器中。


腳本一:本地選擇腳本auto_build.sh

腳本內(nèi)容如下:


#/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地址的篩選,因為的在調試過程中,我的電腦有時候用網(wǎng)線連接,有時候會去測試房去測試,用wifi連接,這個時候會進行網(wǎng)絡ip地址的區(qū)分,當我輸入./auto_build.sh 1的時候,腳本會進行解析eno1網(wǎng)線分配的ip地址,當我輸入./auto_build.sh 2的時候則會解析wlo1wifi分配的ip。


在里面我還用了顏色打印,進行關鍵詞的標注,如下所示:

關于顏色打印的部分這個是另一個知識,這是一個轉義的實際使用過程,通過特定符號的轉義識別,我們在Linux終端去顯示不同顏色的打印輸出,這個是我們經(jīng)常使用的操作,例如log等級分級打印時候,error是紅色,正常是綠色,普通是白色等。


顏色打印大致介紹如下:


轉義序列以控制字符'ESC'開頭。該字符的ASCII碼十進制表示為27,十六進制表示為0x1B,八進制表示為033。多數(shù)轉義序列超過兩個字符,故通常以'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'用于恢復默認的終端輸出屬性,否則會影響后續(xù)的輸出。


示例:我在此處使用 echo -e '\033[0;42m Ethernet dhcp \033[0m' 進行網(wǎng)線端口ip分配的打印,通過轉義之后,打印顏色為帶背景色的綠色顯示。具體對應的顏色,大家可以看一下小麥老兄寫的這篇文章 printf打印還能這么玩。


注:打印log時候記得echo 要使用 -e參數(shù)。


其次還有組合使用命令實現(xiàn)獲取本地ip

HOST_IP=$(ifconfig $VAR | grep "inet" | grep -v inet6| awk '{ print $2}' | awk -F: '{print $1}')
我們一步步查看執(zhí)行情況


第一步: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
    我們經(jīng)常使用ifconfig查看ip,但是使用ifconfig返回的數(shù)據(jù)過多,而我們實際使用的部分只是一部分而已。


    所以我們使用ifconfig指定設備查找ip,篩去無用信息。


    第二步:ifconfig eno1    | grep "inet"


    把第一步查詢的信息通過 | 產(chǎn)生一個管道傳遞給下一個命令,用grep查找有inet字符的行數(shù)據(jù),顯示如下:


    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協(xié)議的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處理文本文件的語言進行處理數(shù)據(jù),$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的使用大家也可以網(wǎng)上具體查看一下,但是我們一般使用過程中,grep 更適合單純的查找或匹配文本, sed 更適合編輯匹配到的文本,awk 更適合格式化文本,對文本進行較復雜格式處理。


    這個時候我們從本機得到了ip地址。我們需要進行遠程調用服務器腳本,并把ip以參數(shù)形式傳入。


    其次ssh免密登陸和ssh遠程執(zhí)行任務

    首先第一個部分就是ssh免密登陸


    本地執(zhí)行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文件夾下創(chuàng)建公私鑰,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 (公鑰)內(nèi)容。


    3.測試免密登錄 客戶端通過ssh連接遠程服務器,就可以免密登錄了。


    ssh lyn@172.160.111.32
    第二個部分就是ssh遠程執(zhí)行服務器腳本


    有時候我們需要遠程執(zhí)行一些有交互操作的命令。這個時候我們就可以使用ssh加參數(shù)進去進行遠程執(zhí)行。


    格式如下:


    遠程執(zhí)行一個命令


    ssh lyn@172.160.111.32 "ls -l"
    執(zhí)行多條命令,使用分號把不同的命令隔起來


    ssh lyn@172.160.111.32 "ls;cat test.txt "
    遠程執(zhí)行本地腳本


    ssh lyn@172.160.111.32 < test.sh
    遠程執(zhí)行本地的腳本(執(zhí)行帶有參數(shù)的腳本),需要為 bash 指定 -s 參數(shù):


    ssh lyn@172.160.111.32 'bash -s' < test.sh helloworld
    執(zhí)行遠程的腳本


    ssh lyn@172.160.111.32 "/home/lyn/test.sh"
    注,此時需要指定腳本的絕對路徑!


    而我們使用的為遠程執(zhí)行腳本,最終ssh遠程執(zhí)行如下:


    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

    腳本內(nèi)容如下:


    #!/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}" ]] 
  • 本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
    換一批
    延伸閱讀

    電感是導線內(nèi)通過交流電流時,在導線的內(nèi)部及其周圍產(chǎn)生交變磁通,導線的磁通量與生產(chǎn)此磁通的電流之比。電感器也叫電感線圈,是利用電磁感應原理制成的,由導線在絕緣管上單層或多層繞制而成的,導線彼此互相絕緣,而絕緣管可以是空心的...

    關鍵字: 電感 磁通量 電感器

    根據(jù)交通運輸部水運科學研究院提出的智慧港口的概念,智慧港口是利用新一代信息技術,將港口相關業(yè)務和管理創(chuàng)新深度融合,使港口更加集約、高效、便捷、安全、綠色,創(chuàng)新港口發(fā)展模式,實現(xiàn)港口科學可持續(xù)發(fā)展。

    關鍵字: 智慧港口 信息技術 業(yè)務

    近年來,世界主要汽車大國紛紛加強新能源汽車戰(zhàn)略謀劃、強化政策支持、完善產(chǎn)業(yè)布局,新能源汽車已成為全球汽車產(chǎn)業(yè)轉型發(fā)展的主要方向和促進世界經(jīng)濟持續(xù)增長的重要引擎。2021年,全國新能源汽車實現(xiàn)產(chǎn)量354.5萬輛,銷量352...

    關鍵字: 新能源 汽車 引擎

    2007-2021年,全球針狀焦行業(yè)專利申請人數(shù)量及專利申請量總體呈現(xiàn)增長態(tài)勢。雖然2021年全球針狀焦行業(yè)專利申請人數(shù)量及專利申請量有所下降,但是這兩大指標數(shù)量仍較多。整體來看,全球針狀焦技術處于成長期。

    關鍵字: 針狀焦行業(yè) 專利申請人 增長態(tài)勢

    按企業(yè)主營業(yè)務類型分,我國智能家居行業(yè)競爭派系可分為傳統(tǒng)家電企業(yè)、互聯(lián)網(wǎng)企業(yè)以及其他企業(yè)三派。傳統(tǒng)家電企業(yè)代表有海爾智家、美的集團、格力電器等,具有供應鏈和銷售渠道,制造能力和品牌優(yōu)勢突出;互聯(lián)網(wǎng)企業(yè)代表有小米集團、百度...

    關鍵字: 智能家居 互聯(lián)網(wǎng)企業(yè) 供應鏈

    軍工電子是集紅外技術、激光技術、半導體及嵌入式技術與虛擬仿真技術為一體的綜合性軍工技術體系,是國防信息化建設的基石。軍工電子行業(yè)包含在軍工行業(yè)內(nèi),專注于軍工行業(yè)電子產(chǎn)品布局。根據(jù)其軍工產(chǎn)品的不同可分為衛(wèi)星導航、通信指揮、...

    關鍵字: 軍工電子 嵌入式技術 信息化建設

    我國汽車零配件行業(yè)細分種類眾多,從汽車零配件主要產(chǎn)品來看,發(fā)動機系統(tǒng)行業(yè)內(nèi)有濰柴動力、華域汽車等主要從業(yè)企業(yè);在車身零部件領域內(nèi),福耀玻璃、中策橡膠具有一定的規(guī)模優(yōu)勢;行駛系統(tǒng)領域內(nèi)有中策橡膠提供的輪胎以及華為等企業(yè)提供...

    關鍵字: 汽車零配件 發(fā)動機 行駛系統(tǒng)

    茶飲料是指以茶葉或茶葉的水提取液、濃縮液、茶粉(包括速溶茶粉、研磨茶粉)或直接以茶的鮮葉為原料添加或不添加食品原輔料和(或)食品添加劑,經(jīng)加工制成的液體飲料。根據(jù)國家標準《茶飲料(GB/T 21733-2008)》的規(guī)定...

    關鍵字: 茶飲料 茶葉的水 食品添加劑

    全球液壓行業(yè)專利技術在21世紀初得到初步發(fā)展,這一時期液壓專利申請人數(shù)量和申請量處于較低水平。2011-2012年,液壓行業(yè)專利技術的發(fā)展總體處于成長期,2012年以后中全球液壓行業(yè)專利技術申請量或申請人數(shù)量整體處于波動...

    關鍵字: 液壓行業(yè) 專利授權 技術類型

    從上市企業(yè)的總市值情況來看,2022年7月28日,中芯國際、紫光國微和韋爾股份總市值遙遙領先,中芯國際總市值達到3238.21億元,紫光國微總市值達到1358.77億元,韋爾股份總市值達到1277.07億元;其次是兆易創(chuàng)...

    關鍵字: 上市企業(yè) 集成電路 行業(yè)

    嵌入式大雜燴

    461 篇文章

    關注

    發(fā)布文章

    編輯精選

    技術子站

    關閉