文章目錄
- 一、生成随機字元串
- 二、檔案名批量修改
- 三、并發ping
- 四、解決DOS攻擊
- 五、MySQL備份
- 六、入侵檢測與報警
- 七、産生随機數
- 八、子腳本的調用方式
- 九、shell逐行讀取檔案
- 十、測試表達式差別
一、生成随機字元串
# 去掉/\兩個字元,取第5到14位。
openssl rand -base64 40 | sed 's/[/\]//g' | cut -c 5-14
# 或者生成16位随機字元,1個,要包含數字-n和特殊字元-y。
二、檔案名批量修改
- 法一
#!/bin/bash
Filename=_faster.html
Dirname="/test"
cd $Dirname||exit 1
for n in `ls`
do
name=$(echo ${n}|awk -F '_' '{print $1}')
mv $n ${name}${Filename}
done
- 法二
#!/bin/bash
Path="/test"
cd $Path && \
ls | awk -F '_' '{print "mv " "$0" "$1"_faster.html"}' | bash
- 法三
rename
三、并發ping
#!/bin/bash
CMD="ping -W 2 -c 2"
IP="192.168.74."
for n in $(seq 254);do
{
$CMD $IP$n > /dev/null 2>&1
if [ $? -eq 0 ];then
echo "$IP$n
fi
}&
done
wait # 主shell程序需要等待各并發子程序的結束傳回
echo
四、解決DOS攻擊
file=$1
while true; do
awk '{print $1}' $1 | grep -v "^$" | sort | uniq -c > /tmp/tmp.log
exec < /tmp/tmp.log
while read line; do
ip=`echo $line | awk '{print $2}'`
count=`echo $line | awk {print $1}`
if [ $count -gt 500 ] && [ `iptables -nL | grep "$ip" | wc -l` -lt 1 ]; then
iptables -I INPUT -s $ip -j DROP
echo "$line >> /tmp/droplist_$(date +%F).log
fi
done
sleep 3600
done
五、MySQL備份
- 不登入資料庫如何執行sql指令
#!/bin/sh
MYUSER=root
MYPASS=123456
MYCMD="mysql -u$MYUSER -p$MYPASS
for db in db1 db2 db3; do
$MYCMD "use $db;show tables;"
done
- 分庫備份
#!/bin/sh
MYUSER=root
MYPASS=123456
DBPATH=/root/test/db_bak
MYCMD="mysql -u$MYUSER -p$MYPASS
MYDMP="mysqldump -u$MYUSER -p$MYPASS"
[ ! -d $DBPATH ] && mkdir $DBPATH
for db in `$MYCMD "show databases;" | sed '1d' |egrep -v "mysql|schema|sys"`; do
if [ -z `echo $db|grep "test"` ];then # 不包含test字元串
$MYDMP $db | gzip >$DBPATH/${db}_$(date +%F).sql.gz
fi
done
注意文中包含字元串的判斷可有多種方式Shell判斷字元串包含關系的幾種方法 其中“$A =~ $B”是判斷A包含B最簡單的方式。
六、入侵檢測與報警
- 建立初始的檔案指紋庫
find /var/html/www -type f | xargs md5sum >
- 利用指紋庫檢查檔案是否被篡改
md5sum -c --quiet /opt/checksum.bak
- 監測檔案數量及檔案名的變化
find /var/html/www -type f > /opt/filename.bak
find /var/html/www -type f > /opt/filename.now
diff
- cron
* /3 * * * * /bin/sh /path/to/monitor.sh > /dev/null 2>&1
七、産生随機數
# 0~32767
echo $RANDOM
echo "bulabula$RANDOM" | md5sum | cut -c 8-15
openssl rand -base64 8
date +%s%N
head /dev/urandom|cksum
cat /proc/sys/kernel/random/uuid
apt install expect
expect_mkpasswd -l 8 -d 2 -c 3 -C 2 -s 1
yum install expect
mkpasswd -l 8 -d 2 -c 3 -C 2 -s 1
# 參數說明
八、子腳本的調用方式
-
fork方式(分身,複制——産生新的PID)
執行方式
/path/script.sh
/bin/sh /path/script.sh
系統啟動一個子shell執行調用的腳本(生成新的PID——子shell)。子shell執行的時候父shell處于Sleep狀态(S)。子shell執行完畢後傳回到父shell。子shell可以繼承父shell的環境變量,但反之不然。
-
exec方式(變身——沿用原來的PID)
執行方式
exec
被調用的腳本與父腳本在同一個shell内運作(不産生新的PID),但使用exec調用一個新腳本後,父腳本中exec之後的内容就不會再執行了——變身。
-
source方式(類似exec方式,沿用原來的PID)
執行方式
source /path/script.sh
.
source方式開啟的腳本和父腳本在同一個shell中運作(不産生新的PID)。source調用一個新腳本,執行完成後,父腳本source之後的内容還會再執行。
九、shell逐行讀取檔案
- 法一
exec <file
while read line; do
echo $line
done
- 法二
cat file | while read line; do
echo $line
done
- 法三
while read line; do
echo $line
done < file
- 法四
for line in `cat test.txt`; do
echo $line
done
十、測試表達式差別
測試表達式符号 | [ ] | test | [[ ]] | (()) |
邊界是否需要空格 | Y | Y | Y | N |
支援的邏輯運算符 | !,-a,-o | !,-a,-o | !,&&,┃┃ | !,&&,┃┃ |
支援的算數運算符 | -eq,-gt,-lt,-ge,-le | -eq,-gt,-lt,-ge,-le | -eq,-gt,-lt,-ge,-le和=,>,<,>=,<= | -eq,-gt,-lt,-ge,-le和=,>,<,>=,<= |
字元串比較 | =,==,!= | =,==,!= | =,==,!= | =,==,!= |
是否支援通配* | N | N |