新聞中心
這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
生產(chǎn)環(huán)境中常用的shell腳本(下)
本文檔介紹30個關(guān)于Shell腳本的經(jīng)典案例(下)

成都創(chuàng)新互聯(lián)主營臨高網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP軟件開發(fā),臨高h(yuǎn)5小程序定制開發(fā)搭建,臨高網(wǎng)站營銷推廣歡迎臨高等地區(qū)企業(yè)咨詢
本文目錄
21、從FTP服務(wù)器下載文件
22、連續(xù)輸入5個100以內(nèi)的數(shù)字,統(tǒng)計和、最小和最大
23、將結(jié)果分別賦值給變量
24、批量修改文件名
25、統(tǒng)計當(dāng)前目錄中以.html結(jié)尾的文件總大
26、掃描主機端口狀態(tài)
27、Expect實現(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 # -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)計和、最小和最大
#!/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
目的:把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、統(tǒng)計當(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、掃描主機端口狀態(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實現(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 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
執(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
done
Linux主機SSH連接信息:
# cat user_info.txt
192.168.1.120 root 123456
28、批量修改服務(wù)器用戶密碼
Linux主機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)程修改密碼腳本:新密碼隨機生成
#!/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++ 方法2: for ((i=1;ido
for ((j=1;jdo
result=$(($i*$j))
echo -n "$j*$i=$result "
done
echo
done
30、getopts工具完善腳本命令行參數(shù)
getopts是一個解析腳本選項參數(shù)的工具。
命令格式:getopts optstring name [arg]
初次使用你要注意這幾點:
腳本位置參數(shù)會與optstring中的單個字母逐個匹配,如果匹配到就賦值給name,否則賦值name為問號;
optstring中單個字母是一個選項,如果字母后面加冒號,表示該選項后面帶參數(shù),參數(shù)值并會賦值給OPTARG變量;
optstring中第一個是冒號,表示屏蔽系統(tǒng)錯誤(test.sh: illegal option -- h);
允許把選項放一起,例如-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)驗總結(jié)的30個Shell腳本案例至此完結(jié),都還是比較實用的,面試筆試題也經(jīng)常會出。希望朋友們多動手練一練,讓你的Shell功底上升一個段位!
文章名稱:生產(chǎn)環(huán)境中常用的shell腳本(下)
分享URL:http://www.dlmjj.cn/article/djhjhgj.html


咨詢
建站咨詢
