shell編程15例(三)
VSole2022-03-25 07:43:19
1、統計當前 Linux 系統中可以登錄計算機的賬戶有多少個
#!/bin/bash
# 統計當前 Linux 系統中可以登錄計算機的賬戶有多少個
#方法 1:
grep "bash$" /etc/passwd | wc -l
#方法 2:
awk -f: '/bash$/{x++}end{print x}' /etc/passwd
2、統計/var/log 有多少個文件,并顯示這些文件名
#!/bin/bash # 統計/var/log 有多少個文件,并顯示這些文件名 # 使用 ls 遞歸顯示所有,再判斷是否為文件,如果是文件則計數器加 1 cd /var/log sum=0 for i in `ls -r *` do if [ -f $i ];then let sum++ echo "文件名:$i" fi done echo "總文件數量為:$sum"
3、自動為其他腳本添加解釋器信息
#!/bin/bash # 自動為其他腳本添加解釋器信息#!/bin/bash,如腳本名為 test.sh 則效果如下: # ./test.sh abc.sh 自動為 abc.sh 添加解釋器信息 # ./test.sh user.sh 自動為 user.sh 添加解釋器信息 # 先使用 grep 判斷對象腳本是否已經有解釋器信息,如果沒有則使用 sed 添加解釋器以及描述信息 if ! grep -q "^#!" $1; then sed '1i #!/bin/bash' $1 sed '2i #Description: ' fi # 因為每個腳本的功能不同,作用不同,所以在給對象腳本添加完解釋器信息,以及 Description 后還希望 # 繼續編輯具體的腳本功能的描述信息,這里直接使用 vim 把對象腳本打開,并且光標跳轉到該文件的第 2 行 vim +2 $1
4、自動化部署 varnish 源碼包軟件
#!/bin/bash # 自動化部署 varnish 源碼包軟件 # 本腳本需要提前下載 varnish‐3.0.6.tar.gz 這樣一個源碼包軟件,該腳本即可用自動源碼安裝部署軟件 yum -y install gcc readline‐devel pcre‐devel useradd -s /sbin/nologin varnish tar -xf varnish‐3.0.6.tar.gz cd varnish‐3.0.6 # 使用 configure,make,make install 源碼安裝軟件包 ./configure ‐‐prefix=/usr/local/varnish make && make install # 在源碼包目錄下,將相應的配置文件拷貝到 Linux 系統文件系統中 # 默認安裝完成后,不會自動拷貝或安裝配置文件到 Linux 系統,所以需要手動 cp 復制配置文件 # 并使用 uuidgen 生成一個隨機密鑰的配置文件 cp redhat/varnish.initrc /etc/init.d/varnish cp redhat/varnish.sysconfig /etc/sysconfig/varnish cp redhat/varnish_reload_vcl /usr/bin/ ln -s /usr/local/varnish/sbin/varnishd /usr/sbin/ ln -s /usr/local/varnish/bin/* /usr/bin mkdir /etc/varnish cp /usr/local/varnish/etc/varnish/default.vcl /etc/varnish/ uuidgen > /etc/varnish/secret
5、編寫 nginx 啟動腳本
#!/bin/bash
# 編寫 nginx 啟動腳本
# 本腳本編寫完成后,放置在/etc/init.d/目錄下,就可以被 Linux 系統自動識別到該腳本
# 如果本腳本名為/etc/init.d/nginx,則 service nginx start 就可以啟動該服務
# service nginx stop 就可以關閉服務
# service nginx restart 可以重啟服務
# service nginx status 可以查看服務狀態
program=/usr/local/nginx/sbin/nginx
pid=/usr/local/nginx/logs/nginx.pid
start(){
if [ -f $pid ];then
echo "nginx 服務已經處于開啟狀態"
else
$program
fi
stop(){
if [ -! -f $pid ];then
echo "nginx 服務已經關閉"
else
$program -s stop
echo "關閉服務 ok"
fi
}
status(){
if [ -f $pid ];then
echo "服務正在運行..."
else
echo "服務已經關閉"
fi
}
case $1 in
start)
start;;
stop)
stop;;
restart)
stop
sleep 1
start;;
status)
status;;
*)
echo "你輸入的語法格式錯誤"
esac
6、自動對磁盤分區、格式化、掛載
#!/bin/bash # 自動對磁盤分區、格式化、掛載 # 對虛擬機的 vdb 磁盤進行分區格式化,使用<<將需要的分區指令導入給程序 fdisk # n(新建分區),p(創建主分區),1(分區編號為 1),兩個空白行(兩個回車,相當于將整個磁盤分一個區) # 注意:1 后面的兩個回車(空白行)是必須的! fdisk /dev/vdb << EOF n p 1 wq EOF #格式化剛剛創建好的分區 mkfs.xfs /dev/vdb1 #創建掛載點目錄 if [ -e /data ]; then exit fi mkdir /data #自動掛載剛剛創建的分區,并設置開機自動掛載該分區 echo '/dev/vdb1 /data xfs defaults 1 2' >> /etc/fstab mount -a
7、自動優化 Linux 內核參數
#!/bin/bash # 自動優化 Linux 內核參數 #腳本針對 RHEL7 cat >> /usr/lib/sysctl.d/00‐system.conf <fs.file‐max=65535 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_synack_retries = 5 net.ipv4.tcp_syn_retries = 5 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 #net.ipv4.tcp_keepalive_time = 120 net.ipv4.ip_local_port_range = 1024 65535 kernel.shmall = 2097152 kernel.shmmax = 2147483648 kernel.shmmni = 4096 kernel.sem = 5010 641280 5010 128 net.core.wmem_default=262144 net.core.wmem_max=262144 net.core.rmem_default=4194304 net.core.rmem_max=4194304 net.ipv4.tcp_fin_timeout = 10 net.ipv4.tcp_keepalive_time = 30 net.ipv4.tcp_window_scaling = 0 net.ipv4.tcp_sack = 0 EOF sysctl –p
8、切割 Nginx 日志文件(防止單個文件過大,后期處理很困難)
#mkdir /data/scripts
#vim /data/scripts/nginx_log.sh
#!/bin/bash
# 切割 Nginx 日志文件(防止單個文件過大,后期處理很困難)
logs_path="/usr/local/nginx/logs/"
mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
# chmod +x /data/scripts/nginx_log.sh
# crontab ‐e #腳本寫完后,將腳本放入計劃任務每天執行一次腳本
0 1 * * * /data/scripts/nginx_log.sh
9、檢測 MySQL 數據庫連接數量
#!/bin/bash
# 檢測 MySQL 數據庫連接數量
# 本腳本每 2 秒檢測一次 MySQL 并發連接數,可以將本腳本設置為開機啟動腳本,或在特定時間段執行
# 以滿足對 MySQL 數據庫的監控需求,查看 MySQL 連接是否正常
# 本案例中的用戶名和密碼需要根據實際情況修改后方可使用
log_file=/var/log/mysql_count.log
user=root
passwd=123456
while :
do
sleep 2
count=`mysqladmin -u "$user" -p "$passwd" status | awk '{print $4}'`
echo "`date +%Y‐%m‐%d` 并發連接數為:$count" >> $log_file
done
10、根據 md5 校驗碼,檢測文件是否被修改
#!/bin/bash # 根據 md5 校驗碼,檢測文件是否被修改 # 本示例腳本檢測的是/etc 目錄下所有的 conf 結尾的文件,根據實際情況,您可以修改為其他目錄或文件 # 本腳本在目標數據沒有被修改時執行一次,當懷疑數據被人篡改,再執行一次 # 將兩次執行的結果做對比,MD5 碼發生改變的文件,就是被人篡改的文件 for i in $(ls /etc/*.conf) do md5sum "$i" >> /var/log/conf_file.log done
11、檢測 MySQL 服務是否存活
#!/bin/bash # 檢測 MySQL 服務是否存活 # host 為你需要檢測的 MySQL 主機的 IP 地址,user 為 MySQL 賬戶名,passwd 為密碼 # 這些信息需要根據實際情況修改后方可使用 host=192.168.51.198 user=root passwd=123456 mysqladmin -h '$host' -u '$user' -p'$passwd' ping &>/dev/null if [ $? -eq 0 ] then echo "MySQL is UP" else echo "MySQL is down" fi
12、備份 MySQL 的 shell 腳本(mysqldump版本)
#!/bin/bash
# 備份 MySQL 的 shell 腳本(mysqldump版本)
# 定義變量 user(數據庫用戶名),passwd(數據庫密碼),date(備份的時間標簽)
# dbname(需要備份的數據庫名稱,根據實際需求需要修改該變量的值,默認備份 mysql 數據庫)
user=root
passwd=123456
dbname=mysql
date=$(date +%Y%m%d)
# 測試備份目錄是否存在,不存在則自動創建該目錄
[ ! -d /mysqlbackup ] && mkdir /mysqlbackup
# 使用 mysqldump 命令備份數據庫
mysqldump -u "$user" -p "$passwd" "$dbname" > /mysqlbackup/"$dbname"-${date}.sql
13、將文件中所有的小寫字母轉換為大寫字母
#!/bin/bash # 將文件中所有的小寫字母轉換為大寫字母 # $1是位置參數,是你需要轉換大小寫字母的文件名稱 # 執行腳本,給定一個文件名作為參數,腳本就會將該文件中所有的小寫字母轉換為大寫字母 tr "[a‐z]" "[A‐Z]" < $1
14、非交互自動生成 SSH 密鑰文件
#!/bin/bash
# 非交互自動生成 SSH 密鑰文件
# ‐t 指定 SSH 密鑰的算法為 RSA 算法;‐N 設置密鑰的密碼為空;‐f 指定生成的密鑰文件>存放在哪里
rm -rf ~/.ssh/{known_hosts,id_rsa*}
ssh‐keygen -t RSA -N '' -f ~/.ssh/id_rsa
15、檢查特定的軟件包是否已經安裝
#!/bin/bash
# 檢查特定的軟件包是否已經安裝
if [ $# -eq 0 ];then
echo "你需要制定一個軟件包名稱作為腳本參數"
echo "用法:$0 軟件包名稱 ..."
fi
# $@提取所有的位置變量的值,相當于$*
for package in "$@"
do
if rpm -q ${package} &>/dev/null ;then
echo -e "${package}\033[32m 已經安裝\033[0m"
else
echo -e "${package}\033[34;1m 未安裝\033[0m"
fi
done
VSole
網絡安全專家