<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    10 個實用的 Shell 腳本!

    一顆小胡椒2022-04-03 06:49:49

    在生產環境中,我們會經常編寫一些 Shell 命令或腳本幫我們的工作,本文分享了最近用到的幾例 shell 實用腳本,感興趣的朋友跟隨杰哥一起看看吧。

    很多人認為 Shell 腳本簡單,但其實 Shell 小腳本卻有大智慧。別小看幾十行代碼,它夾雜著系統設計、代碼規范和操作經驗等等細節,在建設自動化運維的工作中,還是很值得我們研究學習的。

    編寫腳本的注意事項:

    • 開頭加解釋器:#!/bin/bash
    • 語法縮進,使用四個空格;多加注釋說明。
    • 命名建議規則:變量名大寫、局部變量小寫,函數名小寫,名字體現出實際作用。
    • 默認變量是全局的,在函數中變量local指定為局部變量,避免污染其他作用域。
    • 有兩個命令能幫助我調試腳本:set -e 遇到執行非0時退出腳本,set-x 打印執行過程。
    • 寫腳本一定先測試再到生產上。

    1、備份當前日期文件

    #!/bin/bash
    #一月前
    historyTime=$(date "+%Y-%m-%d %H" -d '1 month ago')
    echo ${historyTime}
    historyTimeStamp=$(date -d "$historyTime" +%s)
    echo ${historyTimeStamp}
    #一周前
    $(date "+%Y-%m-%d %H" -d '7 day ago')
    #本月一月一日
    date_this_month=`date +%Y%m01`
    #一天前
    date_today=`date -d '1 day ago' +%Y%m%d`
    #一小時前
    $(date "+%Y-%m-%d %H" -d '-1 hours')
    

    2、DOS攻擊防范(自動屏蔽攻擊IP)

    #!/bin/bash
    DATE=$(date +%d/%b/%Y:%H:%M)
    #nginx日志
    LOG_FILE=/usr/local/nginx/logs/demo2.access.log
    #分析ip的訪問情況
    ABNORMAL_IP=$(tail -n5000 $LOG_FILE |grep $DATE |awk '{a[$1]++}END{for(i in a)if(a[i]>10)print i}')
    for IP in $ABNORMAL_IP; do
        if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then
            iptables -I INPUT -s $IP -j DROP
            echo "$(date +'%F_%T') $IP" >> /tmp/drop_ip.log
        fi
    done
    

    3、批量創建多少個用戶并設置密碼

    #!/bin/bash
    USER_LIST=$@
    USER_FILE=./user.info
    for USER in $USER_LIST;do
      if ! id $USER &>/dev/null; then
        PASS=$(echo $RANDOM |md5sum |cut -c 1-8)
        useradd $USER
        echo $PASS | passwd --stdin $USER &>/dev/null
        echo "$USER   $PASS" >> $USER_FILE
        echo "$USER User create successful."
      else
        echo "$USER User already exists!"
      fi
    done
    

    4、快速在Ubuntu 20.04上架設LAMP服務器及WordPress博客

    詳情見:https://www.linuxmi.com/ubuntu-20-04-lamp-wordpress.html

    #/bin/sh
    install_dir="/var/www/html"
    #Creating Random WP Database Credenitals
    db_name="wp`date +%s`"
    db_user=$db_name
    db_password=`date |md5sum |cut -c '1-12'`
    sleep 1
    mysqlrootpass=`date |md5sum |cut -c '1-12'`
    sleep 1
    #### Install Packages for https and mysql
    apt -y install apache2
    apt -y install mysql-server
    #### Start http
    rm /var/www/html/index.html
    systemctl enable apache2
    systemctl start apache2
    #### Start mysql and set root password
    systemctl enable mysql
    systemctl start mysql
    /usr/bin/mysql -e "USE mysql;"
    /usr/bin/mysql -e "UPDATE user SET Password=PASSWORD($mysqlrootpass) WHERE user='root';"
    /usr/bin/mysql -e "FLUSH PRIVILEGES;"
    touch /root/.my.cnf
    chmod 640 /root/.my.cnf
    echo "[client]">>/root/.my.cnf
    echo "user=root">>/root/.my.cnf
    echo "password="$mysqlrootpass>>/root/.my.cnf
    ####Install PHP
    apt -y install php
    apt -y php-mysql 
    apt -y php-gd  
    sed -i '0,/AllowOverride\ None/! {0,/AllowOverride\ None/ s/AllowOverride\ None/AllowOverride\ All/}' /etc/apache2/apache2.conf #Allow htaccess usage
    systemctl restart apache2
    ####Download and extract latest WordPress Package
    if test -f /tmp/latest.tar.gz
    then
    echo "WP is already downloaded."
    else
    echo "Downloading WordPress"
    cd /tmp/ && wget "http://wordpress.org/latest.tar.gz";
    fi
    /bin/tar -C $install_dir -zxf /tmp/latest.tar.gz --strip-components=1
    chown www-data: $install_dir -R
    #### Create WP-config and set DB credentials
    /bin/mv $install_dir/wp-config-sample.php $install_dir/wp-config.php
    /bin/sed -i "s/database_name_here/$db_name/g" $install_dir/wp-config.php
    /bin/sed -i "s/username_here/$db_user/g" $install_dir/wp-config.php
    /bin/sed -i "s/password_here/$db_password/g" $install_dir/wp-config.php
    cat << EOF >> $install_dir/wp-config.php
    define('FS_METHOD', 'direct');
    EOF
    cat << EOF >> $install_dir/.htaccess
    # BEGIN WordPress
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index.php$ – [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    # END WordPress
    EOF
    chown www-data: $install_dir -R
    ##### Set WP Salts
    grep -A50 'table_prefix' $install_dir/wp-config.php > /tmp/wp-tmp-config
    /bin/sed -i '/**#@/,/$p/d' $install_dir/wp-config.php
    /usr/bin/lynx --dump -width 200 https://api.wordpress.org/secret-key/1.1/salt/ >> $install_dir/wp-config.php
    /bin/cat /tmp/wp-tmp-config >> $install_dir/wp-config.php && rm /tmp/wp-tmp-config -f
    /usr/bin/mysql -u root -e "CREATE DATABASE $db_name"
    /usr/bin/mysql -u root -e "CREATE USER '$db_name'@'localhost' IDENTIFIED WITH mysql_native_password BY '$db_password';"
    /usr/bin/mysql -u root -e "GRANT ALL PRIVILEGES ON $db_name.* TO '$db_user'@'localhost';"
    ######Display generated passwords to log file.
    echo "Database Name: " $db_name
    echo "Database User: " $db_user
    echo "Database Password: " $db_password
    echo "Mysql root password: " $mysqlrootpass
    

    5、每天自動備份 MySQL 數據庫

    #!/bin/sh
    # Database info
    DB_USER="batsing"
    DB_PASS="batsingpw"
    DB_HOST="localhost"
    DB_NAME="timepusher"
    # 一些變量
    BIN_DIR="/usr/bin"            #mysql bin路徑
    BCK_DIR="/mnt/mysqlBackup"    #備份文件目錄
    DATE=`date +%F`
    # TODO
    # /usr/bin/mysqldump --opt -ubatsing -pbatsingpw -hlocalhost timepusher > /mnt/mysqlBackup/db_`date +%F`.sql
    $BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME > $BCK_DIR/db_$DATE.sql
    #還原數據庫
    #用mysql-front導入前一天的 *.sql 文件即可恢復數據
    

    6、MySQL 數據庫備份單循環

    #!/bin/bash
    DATE=$(date +%F_%H-%M-%S)
    HOST=localhost
    USER=backup
    PASS=123.com
    BACKUP_DIR=/data/db_backup
    DB_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "show databases;" 2>/dev/null |egrep -v "Database|information_schema|mysql|performance_schema|sys")
    for DB in $DB_LIST; do
        BACKUP_NAME=$BACKUP_DIR/${DB}_${DATE}.sql
        if ! mysqldump -h$HOST -u$USER -p$PASS -B $DB > $BACKUP_NAME 2>/dev/null; then
            echo "$BACKUP_NAME 備份失敗!"
        fi
    done
    

    7、MySQL 數據庫備份多循環

    #!/bin/bash
    DATE=$(date +%F_%H-%M-%S)
    HOST=localhost
    USER=backup
    PASS=123.com
    BACKUP_DIR=/data/db_backup
    DB_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "show databases;" 2>/dev/null |egrep -v "Database|information_schema|mysql|performance_schema|sys")
    for DB in $DB_LIST; do
        BACKUP_DB_DIR=$BACKUP_DIR/${DB}_${DATE}
        [ ! -d $BACKUP_DB_DIR ] && mkdir -p $BACKUP_DB_DIR &>/dev/null
        TABLE_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "use $DB;show tables;" 2>/dev/null)
        for TABLE in $TABLE_LIST; do
            BACKUP_NAME=$BACKUP_DB_DIR/${TABLE}.sql
            if ! mysqldump -h$HOST -u$USER -p$PASS $DB $TABLE > $BACKUP_NAME 2>/dev/null; then
                echo "$BACKUP_NAME 備份失敗!"
            fi
        done
    done
    

    8、Nginx 日志按要求切割

    #!/bin/bash
    #安裝目錄下日志文件
    base_log_path='/usr/local/openresty/nginx/logs/access.log'
    base_error_path='/usr/local/openresty/nginx/logs/error.log'
    #需要保存的目錄位置
    log_path='/data_lytdev_dir/nginx/logs/'
    #獲取月份
    log_month=$(date -d yesterday +"%Y%m")
    #獲取前一天日期 (第二天凌晨備份,即保存的日志就是當天時間的日志)
    log_day=$(date -d yesterday +"%d")
    #在指定位置創建文件夾
    mkdir -p $log_path/$log_month
    #將安裝目錄下的日志文件,移動到指定存儲位置
    mv $base_log_path $log_path/$log_month/access_$log_day.log
    mv $base_error_path $log_path/$log_month/error_$log_day.log
    #再使用信號控制切割日志
    #USR1 表示nginx信號控制,切割日志
    kill -USR1 `cat /usr/local/openresty/nginx/logs/nginx.pid`
    #每天凌晨1點切割日志
    * 1 * * * /usr/local/openresty/nginx/logs/log_rotate.sh
    

    9、生成10個隨機數保存于數組中并找出其最大值和最小值

    #!/bin/bash
    declare -i min max
    declare -a nums
    for ((i=0;i<10;i++));do
        nums[$i]=$RANDOM
        [ $i -eq 0 ] && min=${nums[0]} &&  max=${nums[0]}&& continue
        [ ${nums[$i]} -gt $max ] && max=${nums[$i]}
        [ ${nums[$i]} -lt $min ] && min=${nums[$i]}
    done
    echo "All numbers are ${nums[*]}"
    echo Max is $max
    echo Min is $min
    

    10、查看網卡實時流量

    #!/bin/bash
    NIC=$1
    echo -e " In ------ Out"
    while true; do
        OLD_IN=$(awk '$0~"'$NIC'"{print $2}' /proc/net/dev)
        OLD_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
        sleep 1
        NEW_IN=$(awk  '$0~"'$NIC'"{print $2}' /proc/net/dev)
        NEW_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
        IN=$(printf "%.1f%s" "$((($NEW_IN-$OLD_IN)/1024))" "KB/s")
        OUT=$(printf "%.1f%s" "$((($NEW_OUT-$OLD_OUT)/1024))" "KB/s")
        echo "$IN $OUT"
        sleep 1
    done
    

    log文件date函數
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    20個Unix-Linux命令技巧
    2023-03-13 10:10:11
    刪除一個大文件我在生產服務器上有一個很大的 200GB 的日志文件需要刪除。我的 rm 和 ls 命令已經崩潰,我擔心這是由于巨大的磁盤 IO 造成的,要刪除這個大文件,輸入:>?試試使用 script 命令行工具來為你的終端輸出創建輸出記錄。還原被刪除的 /tmp 文件夾我在文章 Linux 和 Unix shell,我犯了一些錯誤。我意外地刪除了 / tmp 文件夾。root 用戶仍舊可以訪問,而 ls 和 cd 命令則不工作。以易讀的形式顯示每個文件的大小
    在生產環境中,我們會經常編寫一些 Shell 命令或腳本幫我們的工作,本文分享了最近用到的幾例 shell 實用腳本,感興趣的朋友跟隨杰哥一起看看吧。很多人認為 Shell 腳本簡單,但其實 Shell 小腳本卻有大智慧。/bin/bash語法縮進,使用四個空格;多加注釋說明。默認變量是全局的,在函數中變量local指定為局部變量,避免污染其他作用域。
    文件上傳前端JS 防護,通過抓包修改,或插件js禁用來繞過。后端黑名單上傳陌生后綴 .php3 php5上傳配置文件 .htaccess通過 雙寫 ,大小寫,基于windows 特性
    最近由于筆者所在的研發集團產品需要,需要支持高性能的大文件(大都數是4GB以上)的http上傳,并且要求支持http斷點續傳。筆者在以前的博客如何實現支持大文件的高性能HTTP文件上傳服務器已經介紹了實現大文件上傳的一些基本概念,其實非常簡單,這里在簡要歸納一下,方便記憶:
    bang加固簡單分析
    2022-07-31 16:59:14
    dex加固,可以使用frida-dexdump可以直接dump下來。
    獲取到類之后,我們就可以通過反射來間接調用里面的方法,獲取里面的變量等。
    一般安全廠商都會有針對web后門的掃描工具,此次拿到了一批網站被植入后門的攻擊線索,由于疫情原因,現場排查取證條件比較苛刻,所以此次溯源是在開局一個后門情況下開展,大致思路是連接后門->查看日志->漏洞溯源。
    滲透技巧總結
    2022-01-28 21:33:52
    聲明以下技巧不應用于非法用途Tips 1. 手動端口探測nmap的-sV可以探測出服務版本,但有些情況下必須手動探測去驗證使用Wireshark獲取響應包未免大材小用,可通過nc簡單判斷eg.對于8001端口,nc連接上去,隨便輸入一個字符串,
    一顆小胡椒
    暫無描述
      亚洲 欧美 自拍 唯美 另类