Linux—shell腳本實例進階篇

2022-01-02 LemonSec
實驗一利用case語句編寫腳本,滿足下列要求1.執行create時根據userfile和passfile建立用戶2.執行delete時根據userfile刪除用戶1.編寫腳本:

[root@localhost mnt]#!/bin/bashread -p "Please input the operation (create or delete ): " OPERATION //輸入你要執行的動作case $OPERATION in create) //第一種情況:create read -p "Please input the userfile : " USERFILE //提示輸入文件 [ -e $USERFILE ] || { //判斷是否存在 echo "$USERFILE is not exist " exit 1 } read -p "Please input the passwdfile :" PASSFILE [ -e $PASSFILE ] || { echo "$PASSFILE is not exist " exit 1 } USERLINE=`awk 'BEGIN{N=0}{N++}END{print N}' $USERFILE` //計算userfile文件行數 for LINE_NUM in `seq 1 $USERLINE` //利用循環建立 do USERNAME=`sed -n "${LINE_NUM}p" $USERFILE` //截取userfile文件第一行內容 PASSWORD=`sed -n "${LINE_NUM}p" $PASSFILE` //截取passfile文件第一行內容 useradd $USERNAME //建立用戶 echo $PASSWORD | passwd --stdin $USERNAME done ;; delete) //第二種情況:delete read -p "Please input the userfile :" USERFILE [ -e $USERFILE ] || { echo "$USERFILE is not exist " exit 1 } USERLINE=`awk 'BEGIN{N=0}{N++}END{print N}' $USERFILE` for LINE_NUM in `seq 1 $USERLINE` do USERNAME=`sed -n "${LINE_NUM}p" $USERFILE` userdel -r $USERNAME done ;; *) //第三種情況:其餘各種情況 echo Eorror! ;;esac

2.執行:

[root@localhost mnt]user1user2user3[root@localhost mnt]123456789[root@localhost mnt]Please input the operation (create or delete ): hello   //輸入錯誤動作Eorror![root@localhost mnt]Please input the operation (create or delete ): createPlease input the userfile : user                        //輸入錯誤文件user is not exist [root@localhost mnt]Please input the operation (create or delete ): createPlease input the userfile : userfilePlease input the passwdfile :passfile               //建立用戶Changing password for user user1.passwd: all authentication tokens updated successfully.Changing password for user user2.passwd: all authentication tokens updated successfully.Changing password for user user3.passwd: all authentication tokens updated successfully.[root@localhost mnt]Please input the operation (create or delete ): delete   //刪除用戶Please input the userfile :userfile[root@localhost mnt]id: user1: no such user

實驗二編寫腳本auto_connect.exp滿足要求:執行:/mnt/auto_connect.exp IP password 時 密碼正確,則通過 ssh 連接到該 IP 主機,並保持登陸。1.編寫腳本:
[root@foundation71 mnt]#!/bin/bash/usr/bin/expect << EOF     //切換到expect環境spawn ssh root@$1        //ssh連接IPexpect {    "yes/no" { send "yes\r";exp_continue }   //確認連接    "password" { send "$2\r" }              //輸入密碼}Interact               //保留EOF                   //退出

2.執行:

[root@foundation71 mnt][root@foundation71 mnt]spawn ssh root@172.25.254.226The authenticity of host '172.25.254.226 (172.25.254.226)' can't be established.ECDSA key fingerprint is eb:24:0e:07:96:26:b1:04:c2:37:0c:78:2d:bc:b0:08.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added '172.25.254.226' (ECDSA) to the list of known hosts.root@172.25.254.226's password: [root@foundation71 mnt]

實驗三編寫腳本,當執行腳本host_ping.sh時,ping各個主機IP ,ping通,顯示該IP的 hostname以及IP ,不能 ping 通,報錯並顯示 IP。1.編寫腳本:
#!/bin/bashAuto_Connect(){/usr/bin/expect << EOFset timeout 5spawn ssh root@172.25.254.$IP_NUM hostnameexpect {    "yes/no" { send "yes\r";exp_continue }    "password:" { send "westos\r" }}expect eofEOF}for IP_NUM in {71..72}do    ping -c1 -w1 172.25.254.$IP_NUM &> /dev/null && {    Host_Name=`Auto_Connect | grep -E "authenticity|fingerprint|connecting|password|spawn|Warning" -v`   //過濾掉警告等語句    }    echo "      $Host_Name 172.25.254.$IP_NUM"done

2.執行:##注意此時會出現一個覆蓋問題
[root@foundation71 mnt] 172.25.254.226  172.25.254.227 [root@foundation71 mnt]+ for IP_NUM in '{226..227}'+ ping -c1 -w1 172.25.254.226++ Auto_Connect++ grep -E 'authenticity|fingerprint|connecting|password|spawn|Warning' -v++ /usr/bin/expect+ Host_Name=$'localhost\r'         //此時這裡有主機名,但是後面自動加了/r,這是因為expect是unix工具,在unix系統中/r是換行,但在linux中成了回車,會覆蓋之前內容。 172.25.254.226 ' 172.25.254.226 + for IP_NUM in '{226..227}'+ ping -c1 -w1 172.25.254.227 172.25.254.227 ' 172.25.254.227 

3.我們將腳本做一個調整

#!/bin/bashAuto_Connect(){/usr/bin/expect << EOFset timeout 5spawn ssh root@172.25.254.$IP_NUM hostnameexpect {    yes/no { send "yes\r";exp_continue }    password { send "redhat\r" }}expect eofEOF}for IP_NUM in {226..227}do    ping -c1 -w1 172.25.254.$IP_NUM &> /dev/null && {        Host_Name=`Auto_Connect | grep -E "authenticity|fingerprint|connecting|password|spawn|Warning" -v`    }    echo  "$Host_Name 172.25.254.$IP_NUM " | sed 's/\r//g'     //將全文的/r換為空。done

4.此時執行

[root@foundation71 mnt]# sh host_ping.sh   //成功localhost 172.25.254.226 localhost 172.25.254.227 

實驗四

利用case語句備份資料庫,要求

1.執行db_dump.sh westos (資料庫密碼)

2.腳本執行後會備份資料庫中的所有數據到/mnt/mysqldump目錄下

3.備份文件名稱為「庫名稱.sql」,當此文件存在是跳過,並詢問動作

4.輸入」s「跳過備份,輸入」b「備份「庫名稱.sql」文件為」庫名稱_backup.sql」,輸入」o「覆蓋原文件

1.編寫腳本:

#!/bin/bashDATABASE=`mysql -uroot -EN -e "show databases;" | grep -E "^\*|schema$" -v`mkdir -p /mnt/mysqldump   //建立目錄for DATABASE_NAME in $DATABASEdo    [ -e "/mnt/mysqldump/${DATABASE_NAME}.sql" ] || {    mysqldump -uroot $DATABASE_NAME > /mnt/mysqldump/${DATABASE_NAME}.sql    echo -e "${DATABASE_NAME}.sql is backup!!"    //文件不存在,備份    } && {                                            //文件存在時詢問動作    read -p "[S]kip [B]ackup [O]verwrite  Please input action: " ACTION    ACTION=`echo $ACTION | tr 'A-Z' 'a-z'`    case $ACTION in        s)                      //直接跳過        ;;        b)                     //更新名字備份        mysqldump -uroot $DATABASE_NAME > /mnt/mysqldump/${DATABASE_NAME}_backup.sql        echo  "${DATABASE_NAME}_backup.sql is backup!!"        ;;        o)                      //覆蓋備份        mysqldump -uroot $DATABASE_NAME > /mnt/mysqldump/${DATABASE_NAME}.sql        echo  "${DATABASE_NAME}.sql is overwrite!!"        ;;        exit)                    //退出        echo  "bye"        exit 0        ;;        *)                     //其他顯示錯誤        echo  error    esac    }done

2.執行

[root@localhost mnt]# sh db_dump.sh         linux.sql is backup!![S]kip [B]ackup [O]verwrite  Please input action: smysql.sql is backup!![S]kip [B]ackup [O]verwrite  Please input action: exitbye[root@localhost mnt]# sh db_dump.sh [S]kip [B]ackup [O]verwrite  Please input action: blinux_backup.sql is backup!![S]kip [B]ackup [O]verwrite  Please input action: exitbye[root@localhost mnt]# sh db_dump.sh [S]kip [B]ackup [O]verwrite  Please input action: olinux.sql is overwrite!![S]kip [B]ackup [O]verwrite  Please input action: exitbye

實驗五腳本要求:1執行腳本 lamp.sh2.腳本執行後部署好論壇,並設定 apache 的網絡接口為 80801.編寫腳本:
真機中執行腳本#!/bin/bashAuto_Discuz(){/usr/bin/expect << EOFset timeout 30spawn ssh root@$1expect {    "yes/no" { send "yes\r";exp_continue }    "password:" { send "westos\r" }}expect "]#" { send "yum install httpd -y\r" }expect "]#" { send "yum install mariadb-server -y\r"}expect "]#" { send "yum install php-mysql.x86_64 -y\r"}expect "]#" { send "systemctl start httpd\r" }expect "]#" { send "systemctl start mariadb\r" }expect eofEOF}Auto_Connect(){/usr/bin/expect  << EOFset timeout 30spawn ssh root@$1expect {    "yes/no" { send "yes\r";exp_continue }    "password:" { send "westos\r" }}expect "]#" { send "cd /var/www/html/\r" }expect "]#" { send "unzip /var/www/html/Discuz_X3.2_SC_UTF8.zip >> /dev/null \r" }expect "]#" { send "chmod 777 /var/www/html/upload/ -R\r" }expect "]#" { send "systemctl restart httpd\r" }expect eofEOF}Auto_Httpd(){/usr/bin/expect << EOFset timeout 30spawn ssh root@$1expect {    "yes/no" { send "yes\r";exp_continue }    "password:" { send "westos\r" }}expect "]#" { send "sed "/^Listen/cListen 8080" -i /etc/httpd/conf/httpd.conf\r" }expect "]#" { send "yum restart httpd -y\r" }expect eofEOF}yum install expect -yAuto_Discuz $1scp /home/kiosk/Downloads/Discuz_X3.2_SC_UTF8.zip root@$1:/var/www/htmlAuto_Connect $1firefox -new-tab $1/upload/installAuto_Httpd $1

推薦:一個從不寫廢話的公眾號

覺得不錯點個「贊」、「在看」哦

相關焦點

  • Linux——Shell腳本的應用1(基礎)
    Shell腳本的應用(基礎)簡介:隨著linux系統在企業中的應用越來越多,伺服器的自動化管理也變得越來越重要。在linux伺服器的自動化維護工作中,除了計劃任務的設置以外,shell腳本的應用也是非常重要的一部分。
  • 《Linux shell腳本攻略》限免
    作為與作業系統進行溝通的原生界面,shell能夠控制整個作業系統的運作。理解shell腳本可以讓你更好地了解作業系統,同時還能幫助你通過短短幾行腳本自動地將大部分手頭工作搞定,從而節省大量的時間。shell腳本可以和許多外部命令行工具結合起來完成信息查詢、簡化文本處理、調度任務運行時間、生成報表以及發送郵件之類的工作。儘管不少shell命令也配有對應的文檔,但是仍然不太好理解。
  • Linux中Shell腳本基礎筆記
    shell腳本都是以"#!"作為開頭。這是腳本開始的標記,它是告訴linux系統執行該腳本文件需要使用相應的解釋器,緊挨著的/bin/bash指定了解釋器的具體路徑。shell主要用#作為注釋標記。後面可以加腳本的注釋,建議寫shell腳本要根據情況多寫注釋,便於以後腳本的維護。shell腳本的運行方式:1、可以在shell腳本第一行加上"#!/bin/bash"的話。可以按照以下方式執行:bash test.sh #要保證目錄中存在該腳本文件。2、給腳本加上可執行的權限,然後使用".
  • Linux命令行與Shell腳本編程學習筆記20
    trap命令允許你來指定shell腳本要觀察哪些linux信號並從shell中攔截。如果腳本收到了trap命令中列出的信號,它會阻止它被shell處理,而在本地處理它。2. trap命令的格式是: trap commands signals3. 當&符放到命令後時,它會將命令和bash shell分離開來,並將它作為系統上的獨立後臺進程運行。
  • Linux常用Shell腳本,值得學習及收藏
    在運維中,尤其是linux運維,都知道腳本的重要性,腳本會讓我們的 運維事半功倍,所以學會寫腳本是我們每個linux運維必須學會的一門功課,這裡收藏
  • Linux常用Shell腳本知多少
    在運維中,尤其是linux運維,都知道腳本的重要性,腳本會讓我們的 運維事半功倍,所以學會寫腳本是我們每個linux運維必須學會的一門功課,這裡收藏linux運維常用的腳本。如何學好腳本,最關鍵的是就是大量的練習 和實踐。根據以下腳本我們可以拓展,這樣我們提高的很快!舉一反三!小夥伴要是不熟悉linux的話可以在公眾號內回復 「linux」 獲取linux的教程 之後咱們再來回過頭來學一學腳本1.用Shell編程,判斷一文件是不是字符設備文件,如果是將其拷貝到 /dev 目錄下。
  • 玩轉Linux - shell 編程基礎(一)
    簡述使用 linux 就離不開 shell,那麼也就是說也離不開 shell 編程。
  • 平常寫shell腳本遇到的問題匯總
    最近也是在linux下寫了很多的shell腳本,之前也自己總結過遇到的一些問題及解決方法,最近又遇到並且整理了一下,下面簡單說下最近遇到的問題以及解決方法。."[: too many arguments"錯誤問題:最近在寫 shell腳本的時候發現了這樣一個問題:PID=`cat ****`while [ !
  • shell腳本的使用該熟練起來了,你說呢?(篇二)
    n 代表一個數字,1 為執行腳本的第一個參數,2 為執行腳本的第二個參數,以此類推……實例以下實例我們向腳本傳遞三個參數,並分別輸出,其中 $0 為執行的文件名(包含文件路徑):echo "Shell 傳遞參數實例!"
  • shell腳本極簡教程
    注意:bash是 Bourne Again Shell 的縮寫,是linux標準的默認shell ,它基於Bourne shell,吸收了C shell和Korn shell的一些特性。bash完全兼容sh,也就是說,用sh寫的腳本可以不加修改的在bash中執行。大體上,可以將程序設計語言可以分為兩類:編譯型語言和解釋型語言。
  • Linux 中實用的 4種 shell 腳本查看網站是否正常
    linux系統運維過程中,經常會遇到些問題,有時候問題會比較麻煩,此時shell腳本的優勢就體現出來,下面我來介紹幾種查看網站是否正常的shell腳本。文內含長段代碼可複製可往左滑,希望對大家有幫助!#!
  • 玩轉 Linux - shell 編程基礎
    shell腳本(shell script),是一種為shell編寫的腳本程序。業界所說的shell通常都是指shell腳本,但讀者朋友要知道,shell和shell script是兩個不同的概念。由於習慣的原因,簡潔起見,本文出現的「shell編程」都是指shell腳本編程,不是指開發shell自身(如Windows Explorer擴展開發)。
  • Linux shell腳本編程入門系列一:認識shell腳本
    1、什麼是shell腳本將多個shell命令按語法組合在一起,並保存在文本文件中即得到我們所說的shell腳本(shell script)。shell腳本可以方便地與系統交互,完成系統管理以及批處理任務。shell處於作業系統與應用之間,起到橋梁的作用。
  • linux shell 腳本入門
    Linux 腳本編寫基礎1.1 語法基本介紹1.1.1 開頭程序必須以下面的行開始(必須方在文件的第一行):#!/bin/sh符號#!用來告訴系統它後面的參數是用來執行該文件的程序。在這個例子中我們使用/bin/sh來執行程序。當編輯好腳本時,如果要執行該腳本,還必須使其可執行。
  • 【Linux】shell高級編程視頻教程(含經典案例)
    shell的最強大的重要特性是它自身就是一個解釋型的程序設計語言,shell 程序設計語言支持在高級語言裡所能見到的絕大多數程序控制結構,比如循環,函數,變量和數組。shell 程式語言很易學,並且一旦掌握後它將成為你的得力工具。任何在提示符下能鍵入的命令都能放到一個可執行的shell程序裡,這意味著用shell語言能簡單地重複執行某一任務。
  • 為什麼Shell腳本執行不成功?原來是這樣
    Shell腳本語言是linux系統中內置的一門非常強大的語言,非常善於處理作業系統層面的應用,我們從網上下載的很多應用的安裝和啟動往往都是用Shell腳本語言寫的。可是初步開始使用linux的小夥伴是不是經常會有些應用下載下來,不知道怎麼安裝或者啟動,甚至有的根據作者的安裝說明都操作錯誤。
  • Linux中編寫Shell腳本
    Shell 腳本的類型Shell腳本語言是弱類型語言(無須定義變量的類型即可使用),在Unix/Linux中主要有兩大類shell: 一類是 Bourne shell ,另一類是 C shellBourne shell 包括 Bourne shell (sh)、Korn shell(ksh)、Bourne Again Shell 三種類型。
  • Linux入門-shell編程-適合小白
    三、 腳本的創建和執行shell腳本並不能作為正式的程式語言,因為它是在Linux的shell中運行的,所以稱他為shell腳本。 事實上,shell腳本就是一些命令的集合。 我們通常把所有的操作都記錄到一個文檔中,然後去調用文檔中的命令,這樣一步操作就可以完成了 一般shell腳本都是放在/usr/local/sbin的目錄下。
  • 【shell】shell 腳本編程基礎
    初識1.1 第一個 shell 腳本1.2 運行 shell 腳本的兩種方法2. 變量2.1 變量2.2 字符串2.3 數組2.4 注釋3. 傳遞參數4.初識1.1 第一個 shell 腳本test.sh :#!/bin/bashecho "Hello,World"#! 告訴系統其後路徑所指定的程序即是解釋此腳本文件的 Shell 程序。
  • 編寫Linux Shell腳本的最佳實踐
    前言 由於工作需要,最近重新開始拾掇shell腳本。雖然絕大部分命令自己平時也經常使用,但是在寫成腳本的時候總覺得寫的很難看。而且當我在看其他人寫的腳本的時候,總覺得難以閱讀。