亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

30個關于Shell腳本的經典案例(下)

發布時間:2020-07-11 02:56:32 來源:網絡 閱讀:342 作者:mdadmmeng 欄目:系統運維

本文目錄

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

21、從FTP服務器下載文件

#!/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服務器
user?admin?password
binary???#?設置ftp傳輸模式為二進制,避免MD5值不同或.tar.gz壓縮包格式錯誤
cd?$dir
get?"$file"
EOF

22、連續輸入5個100以內的數字,統計和、最小和最大

#!/bin/bash
COUNT=1
SUM=0
MIN=0
MAX=100
while?[?$COUNT?-le?5?];?do
????read?-p?"請輸入1-10個整數:"?INT
????if?[[?!?$INT?=~?^[0-9]+$?]];?then
????????echo?"輸入必須是整數!"
????????exit?1
????elif?[[?$INT?-gt?100?]];?then
????????echo?"輸入必須是100以內!"
????????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、將結果分別賦值給變量

應用場景:希望將執行結果或者位置參數賦值給變量,以便后續使用。

方法1:

for?i?in?$(echo?"4?5?6");?do
???eval?a$i=$i
done
echo?$a4?$a5?$a6
方法2:將位置參數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
目的:把article改為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、統計當前目錄中以.html結尾的文件總大

方法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、掃描主機端口狀態

#!/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實現SSH免交互執行命令

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

需先安裝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@$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腳本獨立出來

登錄腳本:

#?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
執行命令腳本:寫個循環可以批量操作多臺服務器

#!/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主機SSH連接信息:

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

28、批量修改服務器用戶密碼

Linux主機SSH連接信息:舊密碼

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

SSH遠程修改密碼腳本:新密碼隨機生成

#!/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)??#?隨機密碼
????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工具完善腳本命令行參數

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

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

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

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

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

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

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



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

#!/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

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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绵竹市| 桂平市| 自贡市| 科尔| 吴堡县| 天祝| 垦利县| 仁寿县| 嘉禾县| 北宁市| 台中市| 上杭县| 百色市| 全州县| 信宜市| 周至县| 吴忠市| 东乌| 麦盖提县| 浙江省| 惠安县| 宿迁市| 双鸭山市| 黄石市| 合肥市| 廊坊市| 唐山市| 阜城县| 温宿县| 淳化县| 庆安县| 张家界市| 子长县| 南通市| 临夏市| 鲜城| 吴川市| 新沂市| 东至县| 五莲县| 阳原县|