溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

30個關(guān)于Shell腳本的經(jīng)典案例(下)

發(fā)布時間:2020-07-11 02:56:32 來源:網(wǎng)絡(luò) 閱讀:340 作者:mdadmmeng 欄目:系統(tǒng)運(yùn)維

本文目錄

21、從FTP服務(wù)器下載文件
22、連續(xù)輸入5個100以內(nèi)的數(shù)字,統(tǒng)計(jì)和、最小和最大
23、將結(jié)果分別賦值給變量
24、批量修改文件名
25、統(tǒng)計(jì)當(dāng)前目錄中以.html結(jié)尾的文件總大
26、掃描主機(jī)端口狀態(tài)
27、Expect實(shí)現(xiàn)SSH免交互執(zhí)行命令28、批量修改服務(wù)器用戶密碼
29、打印乘法口訣
30、getopts工具完善腳本命令行參數(shù)

21、從FTP服務(wù)器下載文件

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

22、連續(xù)輸入5個100以內(nèi)的數(shù)字,統(tǒng)計(jì)和、最小和最大

#!/bin/bash
COUNT=1
SUM=0
MIN=0
MAX=100
while?[?$COUNT?-le?5?];?do
????read?-p?"請輸入1-10個整數(shù):"?INT
????if?[[?!?$INT?=~?^[0-9]+$?]];?then
????????echo?"輸入必須是整數(shù)!"
????????exit?1
????elif?[[?$INT?-gt?100?]];?then
????????echo?"輸入必須是100以內(nèi)!"
????????exit?1
????fi
????SUM=$(($SUM+$INT))
????[?$MIN?-lt?$INT?]?&&?MIN=$INT
????[?$MAX?-gt?$INT?]?&&?MAX=$INT
????let?COUNT++
done
echo?"SUM:?$SUM"
echo?"MIN:?$MIN"
echo?"MAX:?$MAX"

23、將結(jié)果分別賦值給變量

應(yīng)用場景:希望將執(zhí)行結(jié)果或者位置參數(shù)賦值給變量,以便后續(xù)使用。

方法1:

for?i?in?$(echo?"4?5?6");?do
???eval?a$i=$i
done
echo?$a4?$a5?$a6
方法2:將位置參數(shù)192.168.1.1{1,2}拆分為到每個變量

num=0
for?i?in?$(eval?echo?$*);do???#eval將{1,2}分解為1?2
???let?num+=1
???eval?node${num}="$i"
done
echo?$node1?$node2?$node3
#?bash?a.sh?192.168.1.1{1,2}
192.168.1.11?192.168.1.12
方法3:

arr=(4?5?6)
INDEX1=$(echo?${arr[0]})
INDEX2=$(echo?${arr[1]})
INDEX3=$(echo?${arr[2]})

24、批量修改文件名

示例:

#?touch?article_{1..3}.html
#?ls
article_1.html??article_2.html??article_3.html
目的:把a(bǔ)rticle改為bbs

方法1:

for?file?in?$(ls?*html);?do
????mv?$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");?do
?????mv?$file?bbs_${file#*_}
done
方法3:

#?rename?article?bbs?*.html

25、統(tǒng)計(jì)當(dāng)前目錄中以.html結(jié)尾的文件總大

方法1:

#?find?.?-name?"*.html"?-exec?du?-k?{}?\;?|awk?'{sum+=$1}END{print?sum}'

方法2:

for?size?in?$(ls?-l?*.html?|awk?'{print?$5}');?do
????sum=$(($sum+$size))
done
echo?$sum

26、掃描主機(jī)端口狀態(tài)

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

27、Expect實(shí)現(xiàn)SSH免交互執(zhí)行命令

Expect是一個自動交互式應(yīng)用程序的工具,如telnet,ftp,passwd等。

需先安裝expect軟件包。

方法1:EOF標(biāo)準(zhǔn)輸出作為expect標(biāo)準(zhǔn)輸入

#!/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@$IP
????expect?{
????????\"(yes/no)\"?{send?\"yes\r\";?exp_continue}
????????\"password:\"?{send?\"$PASS\r\";?exp_continue}
????????\"$USER@*\"?{send?\"df?-h\r?exit\r\";?exp_continue}
????}"
方法3:將expect腳本獨(dú)立出來

登錄腳本:

#?cat?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
執(zhí)行命令腳本:寫個循環(huán)可以批量操作多臺服務(wù)器

#!/bin/bash
HOST_INFO=user_info.txt
for?ip?in?$(awk?'{print?$1}'?$HOST_INFO)
do
????user=$(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
doneLinux主機(jī)SSH連接信息:

#?cat?user_info.txt
192.168.1.120?root?123456

28、批量修改服務(wù)器用戶密碼

Linux主機(jī)SSH連接信息:舊密碼

#?cat?old_pass.txt?
192.168.18.217??root????123456?????22
192.168.18.218??root????123456?????22
內(nèi)容格式:IP?User?Password?Port

SSH遠(yuǎn)程修改密碼腳本:新密碼隨機(jī)生成

#!/bin/bash
OLD_INFO=old_pass.txt
NEW_INFO=new_pass.txt
for?IP?in?$(awk?'/^[^#]/{print?$1}'?$OLD_INFO);?do
????USER=$(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)??#?隨機(jī)密碼
????echo?"$IP???$USER???$NEW_PASS???$PORT"?>>?$NEW_INFO
????expect?-c?"
????spawn?ssh?-p$PORT?$USER@$IP
????set?timeout?2
????expect?{
????????\"(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
生成新密碼文件:

#?cat?new_pass.txt?
192.168.18.217??root????n8wX3mU%??????22
192.168.18.218??root????c87;ZnnL??????22

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++));?do
???for?((j=1;j<=i;j++));?do
?????result=$(($i*$j))
?????echo?-n?"$j*$i=$result?"
???done
???echo
done

30、getopts工具完善腳本命令行參數(shù)

getopts是一個解析腳本選項(xiàng)參數(shù)的工具。

命令格式:getopts?optstring?name?[arg]

初次使用你要注意這幾點(diǎn):

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

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

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

允許把選項(xiàng)放一起,例如-ab



下面寫一個打印文件指定行的簡單例子,引導(dǎo)你思路:

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

根據(jù)工作經(jīng)驗(yàn)總結(jié)的30個Shell腳本案例至此完結(jié),都還是比較實(shí)用的,面試筆試題也經(jīng)常會出。希望朋友們多動手練一練,讓你的Shell功底上升一個段位!


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI