第十二章 Shell腳本編寫及常見面試題(三)

本章目錄:

wKiom1kuG2Dij8H6AAAuNhrwFhc739.png

12.21 FTP下載文件

#!/bin/bash
if?[?$#?-ne?1?];?thenecho?"Usage:?$0?filename"
fi
dir=$(dirname?$1)
file=$(basename?$1)
ftp?-n?-v?<<?EOF???#?-n?自動登錄
open?192.168.1.10
user?admin?adminpass
binary???#?設置ftp傳輸模式為二進制,避免MD5值不同或.tar.gz壓縮包格式錯誤
cd?$dir
get?"$file"
EOF

12.22 輸入五個100數之內的字符,統計和、最小和最大

COUNT=1
SUM=0
MIN=0
MAX=100
while?[?$COUNT?-le?5?];?doread?-p?"請輸入1-10個整數:"?INTif?[[?!?$INT?=~?^[0-9]+$?]];?thenecho?"輸入必須是整數!"exit?1elif?[[?$INT?-gt?100?]];?thenecho?"輸入必須是100以內!"exit?1fiSUM=$(($SUM+$INT))[?$MIN?-lt?$INT?]?&&?MIN=$INT[?$MAX?-gt?$INT?]?&&?MAX=$INTlet?COUNT++
done
echo?"SUM:?$SUM"
echo?"MIN:?$MIN"
echo?"MAX:?$MAX"

wKioL1kuHZCQQNrOAAAloooYaNM429.png

12.23 將結果分別賦值給變量

方法1:
for?i?in?$(echo?"4?5?6");?doeval?a$i=$i
done
echo?$a4?$a5?$a6
方法2:將位置參數192.168.18.1{1,2}拆分為到每個變量
num=0
for?i?in?$(eval?echo?$*);do???#eval將{1,2}分解為1?2let?num+=1eval?node${num}="$i"
done
echo?$node1?$node2?$node3
#?bash?a.sh?192.168.18.1{1,2}
192.168.18.11?192.168.18.12
方法3:
arr=(4?5?6)
INDEX1=$(echo?${arr[0]})
INDEX2=$(echo?${arr[1]})
INDEX3=$(echo?${arr[2]})

12.24 批量修改文件名

#?touch?article_{1..3}.html
#?ls
article_1.html??article_2.html??article_3.html
現在想把article改為bbs:
方法1:
for?file?in?$(ls?*html);?domv?$file?bbs_${file#*_}#?mv?$file?$(echo?$file?|sed?-r?'s/.*(_.*)/bbs\1/')#?mv?$file?$(echo?$file?|echo?bbs_$(cut?-d_?-f2)?
done
方法2:
for?file?in?$(find?.?-maxdepth?1?-name?"*html");?domv?$file?bbs_${file#*_}
done
方法3:
#?rename?article?bbs?*.html

12.25 統計當前目錄中以.html結尾的文件總大小

方法1:
#?find?.?-name?"*.html"?-maxdepth?1?-exec?du?-b?{}?\;?|awk?'{sum+=$1}END{print?sum}'
方法2:
for?size?in?$(ls?-l?*.html?|awk?'{print?$5}');?dosum=$(($sum+$size))
done
echo?$sum
遞歸統計:
#?find?.?-name?"*.html"?-exec?du?-k?{}?\;?|awk?'{sum+=$1}END{print?sum}'

12.26 掃描主機端口狀態

#!/bin/bash
HOST=$1
PORT="22?25?80?8080"
for?PORT?in?$PORT;?doif?echo?&>/dev/null?>?/dev/tcp/$HOST/$PORT;?thenecho?"$PORT?open"elseecho?"$PORT?close"fi
done

wKiom1kuIdyj5UkEAAAONQjBJ3c657.png

12.27 Expect實現SSH免交互執行命令

需要先安裝expect工具。

expect涉及用法說明:

命令描述

set可以設置超時,也可以設置變量

timeout超時等待時間,默認10s

spawn執行一個命令

expect ""匹配輸出的內容

exp_continue繼續執行下面匹配

\r回車

$argc統計位置參數數量

[lindex $argv 0]位置參數

puts打印字符串,類似于echo

expect{...}輸入多行記錄

方法1:EOF標準輸出作為expect標準輸入

#!/bin/bash
USER=root
PASS=123.com
IP=192.168.1.120
expect?<<?EOF
set?timeout?30
spawn?ssh?$USER@$IP???
expect?{"(yes/no)"?{send?"yes\r";?exp_continue}"password:"?{send?"$PASS\r"}
}
expect?"$USER@*"??{send?"$1\r"}
expect?"$USER@*"??{send?"exit\r"}
expect?eof?
EOF

方法2:

#!/bin/bash
USER=root
PASS=123.com
IP=192.168.1.120
expect?-c?"spawn?ssh?$USER@$IPexpect?{\"(yes/no)\"?{send?\"yes\r\";?exp_continue}\"password:\"?{send?\"$PASS\r\";?exp_continue}\"$USER@*\"?{send?\"df?-h\r?exit\r\";?exp_continue}}"

方法3:將expect腳本獨立出來

login.exp登錄文件:

#!/usr/bin/expect?
set?ip?[lindex?$argv?0]
set?user?[lindex?$argv?1]
set?passwd?[lindex?$argv?2]
set?cmd?[lindex?$argv?3]
if?{?$argc?!=?4?}?{
puts?"Usage:?expect?login.exp?ip?user?passwd"
exit?1
}
set?timeout?30
spawn?ssh?$user@$ip
expect?{"(yes/no)"?{send?"yes\r";?exp_continue}"password:"?{send?"$passwd\r"}
}
expect?"$user@*"??{send?"$cmd\r"}
expect?"$user@*"??{send?"exit\r"}
expect?eof

執行命令腳本:

#!/bin/bash
HOST_INFO=user_info
for?ip?in?$(awk?'{print?$1}'?$HOST_INFO)
douser=$(awk?-v?I="$ip"?'I==$1{print?$2}'?$HOST_INFO)pass=$(awk?-v?I="$ip"?'I==$1{print?$3}'?$HOST_INFO)expect?login.exp?$ip?$user?$pass?$1
done

SSH連接信息文件:

# cat user_info?

192.168.1.120 root 123456

12.28 批量修改服務器用戶密碼

舊密碼SSH主機信息old_info文件:

# ? ? ip ? ? user ? ?passwd ? ?port

#--------------------------------------

192.168.18.217 ?root ? ?123456 ? ? 22

192.168.18.218 ?root ? ?123456 ? ? 22

修改密碼腳本:

#!/bin/bash
OLD_INFO=old_info
NEW_INFO=new_info
for?IP?in?$(awk?'/^[^#]/{print?$1}'?$OLD_INFO);?doUSER=$(awk?-v?I=$IP?'I==$1{print?$2}'?$OLD_INFO)PASS=$(awk?-v?I=$IP?'I==$1{print?$3}'?$OLD_INFO)PORT=$(awk?-v?I=$IP?'I==$1{print?$4}'?$OLD_INFO)NEW_PASS=$(mkpasswd?-l?8)echo?"$IP???$USER???$NEW_PASS???$PORT"?>>?$NEW_INFOexpect?-c?"spawn?ssh?-p$PORT?$USER@$IPset?timeout?2expect?{\"(yes/no)\"?{send?\"yes\r\";exp_continue}\"password:\"?{send?\"$PASS\r\";exp_continue}\"$USER@*\"?{send?\"echo?\'$NEW_PASS\'?|passwd?--stdin?$USER\r?exit\r\";exp_continue}}"
done

生成新密碼new_info文件:

192.168.18.217 ?root ? ?n8wX3mU% ? ? ? ?22

192.168.18.218 ?root ? ?c87;ZnnL ? ? ? ?22

12.29 打印乘法口訣

方法1:
#?awk?'BEGIN{for(n=0;n++<9;){for(i=0;i++<n;)printf?i"x"n"="i*n"?";print?""}}'
方法2:
for?((i=1;i<=9;i++));?dofor?((j=1;j<=i;j++));?doresult=$(($i*$j))echo?-n?"$j*$i=$result?"doneecho
done

wKioL1kuHgrQ_XPxAABhsSZCEJg877.png-wh_50

12.30 getopts工具完善腳本命令行參數

getopts是一個解析腳本選項參數的工具。

命令格式:getopts optstring name [arg]

初次使用你要注意這幾點:

1)腳本位置參數會與optstring中的單個字母逐個匹配,如果匹配到就賦值給name,否則賦值name為問號;

2)optstring中單個字母是一個選項,如果字母后面加冒號,表示該選項后面帶參數,參數值并會賦值給OPTARG變量;

3)optstring中第一個是冒號,表示屏蔽系統錯誤(test.sh: illegal option -- h);

4)允許把選項放一起,例如-ab

下面寫一個打印文件指定行的簡單例子,用于引導你思路,擴展你的腳本選項功能:

#!/bin/bash
while?getopts?:f:n:?option;?docase?$option?in?f)FILE=$OPTARG[?!?-f?$FILE?]?&&?echo?"$FILE?File?not?exist!"?&&?exit;;n)sed?-n?"${OPTARG}p"?$FILE;;?)echo?"Usage:?$0?-f?<file_path>?-n?<line_number>"echo?"-f,?--file???????????specified?file"echo?"-n,?--line-number????print?specified?line"exit?1;;esac
done

wKioL1kuID3zfLJWAAAeiazGKzY694.png

思路擴展:限定腳本參數,將參數保存變量,下面調用變量繼續操作。


本章寫的Shell腳本例子都比較實用,在面試題中也經常出現,希望大家多動手練習,不要復制粘貼就拿來跑,這樣是學不會的!有問題請加群交流:323779636(Shell/Python運維開發群)


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395608.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395608.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395608.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

亞馬遜面試有幾輪_經過幾個月的Google面試準備,我被亞馬遜錄用

亞馬遜面試有幾輪by Googley as Heck由Googley飾演Heck 經過幾個月的Google面試準備&#xff0c;我被亞馬遜錄用 (After months of preparing for the Google interview, I got hired by Amazon) As you may know, the last 11 months have been very difficult for me. As a …

省選前的考試記錄

日拱一卒功不唐捐 什么沙雕玩意兒 2018.12.24 T1 如果對 \(A\) 數組求出來高度遞減的單調棧的話&#xff0c;會發現只有單調棧里的元素是有用的。因為如果有 \(A[i]<A[j] \And i<j\)&#xff0c;那電梯就可以在帶 \(j\) 上樓的時候順便把 \(i\) 帶上并不會影響結果。所以…

軟件工程課設-----日程管理系統

這學期進行了軟件工程課設&#xff0c;題目是&#xff1a;日程管理系統&#xff08;JavaWeb&#xff09;&#xff0c;為期3周。這三周只有前兩天是企業老師講解是企業老師講解相關的基礎知識(老師講的水平實在是不可恭維。。。。。。)。 多的不多說。直接進行對相關項目的介紹。…

matlab中的神經網絡訓練,MATLAB中的神經網絡訓練

我試圖向前饋送反向傳播&#xff0c;但是在網絡訓練之后&#xff0c;當模擬和打印模擬輸出時&#xff0c;我看不到任何靠近目標的值&#xff0c;但它只是一個數字。代碼如下。什么是錯&#xff0c;什么是問題&#xff1f;前饋反向傳播&#xff1a;>> load(E:/Inputdata.t…

Spring For All 頂級Spring綜合社區服務平臺

Spring For All 玩最純粹的技術&#xff01;做最專業的 Spring 民間組織~ 歡迎加入&#xff1a;http://spring4all.com/ image.png

chromium 桌面_如何使用Chromium和PyInstaller將Web應用程序轉換為桌面應用程序

chromium 桌面Packaging and distributing your app sounds simple in principle. It’s just software. But in practice, it’s quite challenging.打包和分發應用程序在原理上聽起來很簡單。 這只是軟件。 但是在實踐中&#xff0c;這非常具有挑戰性。 I’ve been working …

PHP面向對象(三)

一、繼承概念 繼承性也是面向對象程序設計中的重要特性之一。它是指建立一個新的派生類&#xff0c;從一個先前定義的類中繼承數據和函數&#xff0c;而且可以重新定義新的數據類型和函數&#xff0c;從而建立累的層次或等級關系。 格式&#xff1a;     [修飾符] class 子…

python數據結構的應用場景不包括,Python 數據結構學習

Python 數據結構學習列表list.append(x)在列表的末尾添加一個元素。相當于 a[len(a):] [x] 。list.extend(iterable)使用可迭代對象中的所有元素來擴展列表。相當于 a[len(a):] iterable 。list.insert(i, x)在給定的位置插入一個元素。第一個參數是要插入的元素的索引&#…

[Jinkey 原創]震驚!iOS 系統居然自帶懸浮窗口調試工具

原文鏈接 : 震驚&#xff01;iOS 系統居然自帶懸浮窗口調試工具 —— Jinkey 原創原文作者 : Jinkey1 背景 英文原文&#xff1a;http://ryanipete.com/blog/ios/swift/objective-c/uidebugginginformationoverlay/ 我寫得這個并不是翻譯而是用自己的理解重新表述這個功能&…

盲人編程_盲人如何編碼

盲人編程About one out of every 200 software developers is blind. We know this because Stack Overflow asked 64,000 developers about this a few months ago.每200名軟件開發人員中大約有1名是盲人。 我們之所以知道這一點&#xff0c;是因為幾個月前 Stack Overflow 向…

hadoop環境搭建筆記

一、配置Linux &#xff08;1&#xff09;cat /etc/networks &#xff08;2&#xff09;cat /etc/sysconfig/network &#xff08;3&#xff09;vi /etc/udev/rules.d/70-persistent-net.rules eth1 改為eth0 &#xff08;4&#xff09;vi /etc/sysconfig/network-scripts/ifc…

邊分治講解

前言&#xff1a; 邊分治和點分治一樣屬于樹分治的一部分&#xff0c;相比于點分治&#xff0c;邊分治對于與度數相關的問題有著很大的優勢&#xff0c;同時邊分治也是解決樹上最優化問題的一種重要的算法。 分治過程&#xff1a; 邊分治的分治過程與點分治類似&#xff0c;同樣…

準確性 敏感性 特異性_如何掌握類型特異性的藝術

準確性 敏感性 特異性Do more specific definitions result in less flexibility?更具體的定義會導致靈活性降低嗎&#xff1f; In this post I will try to avoid the debate about strong/static vs. weak/dynamic types (what more could possibly be said?), or even sc…

Pycharm社區版配置Django

Pycharm開發版(收費)自帶Django模板&#xff0c;社區版(免費)需要通過命令行創建Django項目。 通過pip安裝Django&#xff1a;pip install django2.0.2(版本號)&#xff0c;可通過以下命令檢查是否安裝成功 在命令行下創建Django項目(項目存放在D:\PyCharm) 1.創建項目 進入D:\…

家里也是不知不覺就電腦有不能開啟了

一如既往的把電腦搬上去&#xff0c;我推測就是因為內存條金手指的接觸不好了&#xff0c;然后多次的強制關機讓我心疼&#xff0c;還有是花了30元裝系統還是有些不服氣&#xff0c;最后還是要回去弄好。 轉載于:https://www.cnblogs.com/bkchengzheng/p/5662222.html

oracle model 分組,【已解決】關于Oracle分組函數高級用法(按照N條分組并生成唯一號)...

prompt PL/SQL Developer import fileprompt Created on 2018年3月30日 byset feedback offset define offprompt Creating T_TEST_GROUP...create table T_TEST_GROUP(code VARCHAR2(100),supplier VARCHAR2(100),item_id VARCHAR2(100),num NUMBER,lot VARCHA…

用Mesos分布式架構進行工作

引言&#xff1a;2010年&#xff0c;一個旨在解決擴容問題的項目誕生——Apache Mesos&#xff0c;它在某種程度上對CPU、內存、磁盤資源進行抽象&#xff0c;從而允許整個數據中心如同單臺大服務器般運轉。無需虛擬機和操作系統&#xff0c;Mesos創造了一個單獨底層的集群為應…

angular和react_如何在Angular中驗證默認和自定義React形式

angular和reactby Luuk GruijsLuuk Gruijs著 如何在Angular中驗證默認和自定義React形式 (How to validate default and custom reactive forms in Angular) When presenting forms to your users, it’s considered very user-friendly to give them immediate feedback on w…

POJ 1502 MPI Maelstrom 最短路

最短路模板。 題意&#xff1a;從‘1’點發出一個信號到各個點&#xff0c;不同的點可以同時發出一個信號但到達目標的時間不同&#xff0c;問所有點接受到信號所耗費的最短時間為多少。 思路&#xff1a;迪杰斯特拉求出1點到各個點的最短路&#xff0c;遍歷一遍找到其中的最大…